Tuesday, June 23, 2020

ViewPoint Compressed Packet Video (CPV)



Doing a little but of code Archaeology on old video conferencing code from 25 years ago.

Ran across an Interesting codec I wasn't familiar with.  CPV


In the early days the same codec keep getting referenced, some like JPEG and H.261 are ubiquitous and still around.  Others like CPV, NV, PicW are still mysteries at least to me and about to be forgotten in time.


     CelB: The CELL-B encoding is a proprietary encoding proposed by Sun
          Microsystems. The byte stream format is described in RFC TBD.

     CPV: This proprietary encoding, "Compressed Packet Video is  imple-
          mented by Concept, Bolter, and ViewPoint Systems video codecs.
          For further information, contact:  Glenn Norem, President
          ViewPoint Systems, Inc.
          2247 Wisconsin Street, Suite 110
          Dallas, TX 75229-2037
          United States
          Phone: +1-214-243-0634

     JPEG: The encoding  is  specified  in  ISO  Standards  10918-1  and
          10918-2. The RTP payload format is as specified in RFC TBD.


     H261: The encoding is specified in CCITT/ITU-T standard H.261.  The
          packetization and RTP-specific properties are described in RFC
          TBD.

     HDCC: The HDCC encoding is a proprietary encoding used  by  Silicon
          Graphics. Contact

          inperson@sgi.com for further details.

     MPV: MPV designates the use MPEG-I and MPEG-II video encoding  ele-
          mentary  streams  as  specified in ISO Standards ISO/IEC 11172
          and 13818-2, respectively. The RTP payload format is as speci-
          fied in RFC TBD, Section 3.

     MP2T: MP2T designates the use of  MPEG-II  transport  streams,  for
          either  audio  or video. The encapsulation is described in RFC
          TBD, Section 2.

     nv:  The encoding is implemented in the program 'nv'  developed  at
          Xerox PARC by Ron Frederick.

     CUSM: The encoding is implemented in the program CU-SeeMe developed
          at  Cornell  University by Dick Cogger, Scott Brim, Tim Dorcey
          and John Lynn.

     PicW: The encoding is  implemented  in  the  program  PictureWindow
          developed at Bolt, Beranek and Newman (BBN).


https://tools.ietf.org/html/draft-ietf-avt-profile-00  December 15, 1992

Internet Engineering Task Force          Audio-Video Transport Working Group
INTERNET-DRAFT                                                H. Schulzrinne
                                                      AT&T Bell Laboratories
                                                           December 15, 1992
                                                            Expires:  5/1/93


   Sample Profile for the Use of RTP for Audio and Video Conferences with
                              Minimal Control
_number__name_ 31 H261 30 Bolt 29 dvc 28 nv Table 2: Default Video Encodings



Bolt is Bolter - CPV

V2 of this document extended to: 
                               _number__name_
                                31      H261
                                30      Bolt
                                29      PicW
                                28      nv
                                27      CUSM
                                26      JPEG


                     Table 2:  Standard Video Encodings


I just got a hold of the NV source code.  (Xerox Park, Net Video _ which is plan to make sure it's available somewhere on github.

https://tools.ietf.org/html/draft-ietf-avt-profile-03  October 20, 1993

CPV: This encoding, "Compressed Packet Video" is implemented by Concept, Bolter, and ViewPoint Systems video codecs.
RFC 1890                       AV Profile                   January 1996


      PT         encoding      audio/video    clock rate    channels
                 name          (A/V)          (Hz)          (audio)
      _______________________________________________________________
      0          PCMU          A              8000          1
      1          1016          A              8000          1
      2          G721          A              8000          1
      3          GSM           A              8000          1
      4          unassigned    A              8000          1
      5          DVI4          A              8000          1
      6          DVI4          A              16000         1
      7          LPC           A              8000          1
      8          PCMA          A              8000          1
      9          G722          A              8000          1
      10         L16           A              44100         2
      11         L16           A              44100         1
      12         unassigned    A
      13         unassigned    A
      14         MPA           A              90000        (see text)
      15         G728          A              8000          1
      16--23     unassigned    A
      24         unassigned    V
      25         CelB          V              90000
      26         JPEG          V              90000
      27         unassigned    V
      28         nv            V              90000
      29         unassigned    V
      30         unassigned    V
      31         H261          V              90000
      32         MPV           V              90000
      33         MP2T          AV             90000
      34--71     unassigned    ?
      72--76     reserved      N/A            N/A           N/A
      77--95     unassigned    ?
      96--127    dynamic       ?

   Table 2: Payload types (PT) for standard audio and video encodings


From NV 2.7 code and similar in the 3.2 tree.

more bolter_decode.h
/****************************************************************************//* bolter_decode.h -- Return codes from Bolter_Decode subroutine *//****************************************************************************/ #define VxSUCCESS 0 /* Packet successfully decoded */#define VxEXTRAPIXEL 1 /* Extra pixel past end of pixmap */#define VxBADADDRESS 2 /* Bad address in video data */#define VxUNTERMINATED 3 /* Packet not terminated */#define VxBADHEADER 4 /* Bad video header format */#define VxBADLENGTH 5 /* Unreasonable packet length */#define VxNONMOTION 6 /* Non-motion video packet found */ src/nv.c:#ifdef BOLTERsrc/nv.c: (void) Bolter_Decode(source[i].image, packet+8, len-8);src/nv.c:#endif BOLTER



From NV (Xerox Park, Net Video version 3.3)
There are Binary object for it.

7592 Feb 22  1994 cpv_decode-alpha.o
2849 Nov  1  1994 cpv_decode-bsdi.o
4176 Feb 18  1994 cpv_decode-dec5k.o
3120 Feb 18  1994 cpv_decode-hp.o
4112 Feb 17  1994 cpv_decode-irix4.o
5156 Mar  7  1994 cpv_decode-irix5.o
2764 Feb 17  1994 cpv_decode-sunos4.o
4132 Mar  7  1994 cpv_decode-sunos5.o


/src/cpv.h Feb 3, 1994
/****************************************************************************/
/*                                                                          */
/*      cpv.h -- Return codes from CPV_Decode subroutine to decode          */
/*      Concept/Bolter/ViewPoint Compressed Packet Video (CPV) (TM)         */
/*                                                                          */
/****************************************************************************/
/*                                                                          */
/*      Copyright (c) 1994 by the University of Southern California.        */
/*      All rights reserved.                                                */
/*                                                                          */
/*      COMMERCIAL USE OF THIS CODE IS STRICTLY PROHIBITED WITHOUT THE      */
/*      SPECIFIC PRIOR WRITTEN AUTHORIZATION OF VIEWPOINT SYSTEMS, INC.     */
/*      de-CPV-ware(TM), CPV(TM), and Compressed Packet Video(TM) are       */
/*      trademarks of VIEWPOINT SYSTEMS, INC., 2247 Wisconsin Street        */
/*      #110, DALLAS, TEXAS 75229                                           */
/*                                                                          */
/*      Permission to use, copy, and distribute this software and its       */
/*      documentation in binary form for non-commercial purposes and        */
/*      without fee is hereby granted, provided that the above copyright    */
/*      notice appears in all copies, that both the copyright notice and    */
/*      this permission notice appear in supporting documentation, and      */
/*      that any documentation, advertising materials, and other            */
/*      materials related to such distribution and use acknowledge that     */
/*      the software was developed by the University of Southern            */
/*      California, Information Sciences Institute.  The name of the        */
/*      University may not be used to endorse or promote products derived   */
/*      from this software without specific prior written permission.       */
/*                                                                          */
/*      THE UNIVERSITY OF SOUTHERN CALIFORNIA makes no representations      */
/*      about the suitability of this software for any purpose.  THIS       */
/*      SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED     */
/*      WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES   */
/*      OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.            */
/*                                                                          */
/*      Other copyrights might apply to parts of this software and are      */
/*      so noted when applicable.                                           */
/*                                                                          */
/****************************************************************************/
/*                                                                          */
/*      This software decompression function is also known as               */
/*      "de-CPV-ware", Version 1.0.                                         */
/*                                                                          */
/****************************************************************************/
/*                                                                          */
/*      Author:           Stephen Casner, casner@isi.edu                    */
/*                        USC Information Sciences Institute                */
/*                        4676 Admiralty Way                                */
/*                        Marina del Rey, CA 90292-6695                     */
/*                                                                          */
/****************************************************************************/
/*                                                                          */
/*      Programming Interface                                               */
/*                                                                          */
/*      int CPV_Decode(image, pktptr, pktlen)                               */
/*          struct vidimage {      Output image arrays CPV_WIDTHxCPV_HEIGHT */
/*              unsigned char *y_data;    Pixel luminance image             */
/*              char *uv_data;            Pixel chrominance image           */
/*              short width, height;      Size of pixel image               */
/*                                        Other stuff here that we ignore   */
/*          } *image;              Pointer to output image array struct     */
/*          unsigned char *pktptr; Pointer to start of video data in packet */
/*          int pktlen;            Length of video data as received         */
/*                                                                          */
/*      The caller is responsible for allocating the image output           */
/*      arrays y_data and uv_data; these arrays continuously maintain       */
/*      the output image as it is updated for each call.  For each          */
/*      call, one packet of compressed video data is decompressed and       */
/*      written as Y and UV pixels at the addressed locations in the        */
/*      y_data and uv_data output arrays.  The image is in "4:2:2"          */
/*      format; that is, for each horizontal pair of Y pixels there is      */
/*      one U and one V pixel that together form the chrominance shared     */
/*      by both Y pixels.  The conversion from the encoding of video        */
/*      data in the packet to Y and UV pixels is accomplished with          */
/*      lookup tables indexed by an RGB value of 5 bits each.  These        */
/*      tables occupy a total of 98304 bytes.  These lookup tables may      */
/*      be supplied by the caller in the two arrays:                        */
/*                                                                          */
/*      extern unsigned char rgb2y[32768];     RGB to Y or B&W table    */
/*      extern unsigned short rgb2uv[32768];   RGB to U & V table       */
/*                                                                          */
/*      Or, if this module is compiled with FIRST_ENTRY defined,            */
/*      static arrays will be allocated and on the first call tables        */
/*      values will be calculated.                                          */
/*                                                                          */
/*      For each rectangular area of the image which has been updated,      */
/*      a call is made to the following routine to allow the caller to      */
/*      further process and display those parts of the image:               */
/*                                                                          */
/*      extern void VidImage_UpdateRect(image, x, y, width, height);        */
/*          struct vidimage *image; Pointer to output image array struct    */
/*          int x,y;                Offsets of area within image (left,top) */
/*          int width,height;       Size of update area in pixels           */
/*                                                                          */
/*      The return value from CPV_decode is an integer success/failure      */
/*      code.                                                               */
/*                                                                          */
/****************************************************************************/

#define CPV_SUCCESS     0       /* Packet successfully decoded */
#define CPV_EXTRAPIXEL  1       /* Extra pixel past end of pixmap */
#define CPV_BADADDRESS  2       /* Bad address in video data */
#define CPV_UNTERM      3       /* Packet not terminated */
#define CPV_BADHEADER   4       /* Bad video header format */
#define CPV_BADLENGTH   5       /* Unreasonable packet length */
#define CPV_NONMOTION   6       /* Non-motion video packet found */

#define CPV_WIDTH       256
#define CPV_HEIGHT      200

extern int CPV_Decode(vidimage_t *image, unsigned char *data, int len);

x

No comments: