hvdecode.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:14k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. /*  Header File Includes        */
  36. #include "machine.h"
  37. #include <stdio.h>
  38. #include <stddef.h>
  39. #include <string.h>
  40. #ifdef FOR_MAC
  41. #include <stdlib.h>
  42. #else
  43. #include <malloc.h>
  44. #endif
  45. #include "dllindex.h"
  46. #include "h261func.h"
  47. #include "h261defs.h"
  48. #include "hvscodes.h"
  49. /*  Defines, Typedefs, & Enums  */
  50. //#define DEBUG_VVDECODE(a) a
  51. #define DEBUG_VVDECODE(a)
  52. /*  Globals                     */
  53. extern H261Decoder *DecoderRegistry[MAX_NUM_DECODERS];
  54. /*  File-wide Statics           */
  55. /******************************************************************************
  56. * clearChromaFrame (PICTURE *newIn)
  57. *
  58. *
  59. */
  60. static void clearChromaComponent (COMPONENT *c)
  61. {
  62.    PIXEL    *p;
  63.    S32      nRows, nCols;
  64.     
  65.     /* clear the chroma image component */  
  66.     p = c->ptr;
  67.     nRows = c->nvert;  
  68.     while (nRows--) {
  69.         nCols = c->nhor;
  70.         while (nCols--) {
  71.          *p++ = 0x80;
  72.         }
  73.         p += (c->hoffset - c->nhor);
  74.     }
  75. }
  76. static void clearChromaFrame ( PICTURE *newIn)
  77. {
  78.     /* clear both image components  */
  79.     clearChromaComponent (&newIn->cr);
  80.     clearChromaComponent (&newIn->cb);
  81.     return;
  82. }
  83. /*-----------------------------------------------------------------------------
  84.  *  Function:   VvDecode
  85.  *
  86.  *  DESCRIPTION
  87.  *      Starts bitstream decoding.
  88.  *
  89.  *  CALLING SYNTAX
  90.  *      VvDecode    S16 index
  91.  *                  U32 PBframeCap
  92.  *                  U32 picdesc
  93.  *                  U32 bsStart
  94.  *                  U32 bsEnd
  95.  *                  U32 nextGOB
  96.  *                  U32 newPic
  97.  *                  U32 status
  98.  *                  U32 newBS
  99.  *
  100.  *      index:      Indicates which decoder is being called.
  101.  *      PBframeCap  If 0: no B-frame reconstruction; otherwise, reconstruct B-frame
  102.  *      picdesc:    Pointer to a PICTURE DESCR struct used for the decoded picture layer info
  103.  *      bsStart:    Offset into bistream indicating where to begin decoding:
  104.  *                      high word indicates offset to a byte,lo word indicates bit number.
  105.  *      bsEnd:      Offset into bistream indicating where to stop decoding (worst case):
  106.  *                      high word indicates offset to a byte,lo word indicates bit number.
  107.  *      nextGOB:    Pointer to S16 indicating which GOB to decode next. If zero, the routine
  108.  *                  skips all GOBs until it finds a PSC (Picture Start Code ).
  109.  *      newPic:     Pointer to a PICTURE struct used for the decoded image
  110.  *      status:     Pointer to an array containing status info
  111.  *      newBs:      Pointer to offset into bitstream indicating where the decoder actually stopped decoding 
  112.  *                      high word indicates offset to a byte,lo word indicates bit number.
  113.  * 
  114.  *  RETURNS
  115.  *      Returns type U32 containing status; YES = completed decoding an entire image
  116.  *
  117.  *  Author:     Mary Deshon     7/21/93
  118.  *  Inspected:  <<not inspected yet>>
  119.  *  Revised:
  120.  -----------------------------------------------------------------------------*/
  121. #define NUM_STATUS_WORDS    4
  122. extern U32 VvDecode ( S16 index, U32 PBframeCap, PICTURE_DESCR* picdesc,
  123.                           U32 bsStart, U32 bsEnd, S16* nextGOB, PICTURE* newPic, 
  124.                           VvDecoderStats* status, U32 newBs )
  125. {
  126.     H261Decoder     *dec;
  127.     PICTURE_DESCR   *far32_picdesc;
  128.     PICTURE         *far32_newPic;
  129.     PICTURE         temp_pic;
  130.     U32             *far32_newBs;
  131.     VvDecoderStats  *far32_status;
  132.     S16             *far32_nextGOB;
  133.     int             retval, oldFormat, numMBs;
  134.     DEBUG_VVDECODE  (char   buf[128];) /* Flawfinder: ignore */
  135.     static int      StaticOldColor=1;
  136.     int             resetChroma = 0;
  137.     dec = DecoderRegistry[index-1];
  138.     // Get pointers we can use
  139.     far32_picdesc   =  picdesc; 
  140.     far32_status    =  status;  
  141.     far32_nextGOB   =  nextGOB; 
  142.     far32_newPic    =  newPic;  
  143.     far32_newBs     =  (void*) newBs;
  144.     if ( !far32_picdesc->decodingInProgress ) {
  145.         far32_picdesc->rows = ((far32_picdesc->rows + 15)>>4)<<4;
  146.         far32_picdesc->cols = ((far32_picdesc->cols + 15)>>4)<<4;
  147. #ifdef BIG_ENDIAN // Mac
  148.         // Setup H261Decoder structure
  149.         dec->bsStart.byteptr = dec->bsAbs.byteptr + (bsStart & 0xffff) ;
  150.         dec->bsStart.bitptr =  (bsStart >> 16) & 0xff;
  151.         dec->bsEnd.byteptr = dec->bsAbs.byteptr + (bsEnd & 0xffff) ;
  152.         dec->bsEnd.bitptr =  (bsEnd >> 16) & 0xff;
  153. #else
  154.         // Setup H261Decoder structure
  155.         dec->bsStart.byteptr = dec->bsAbs.byteptr + (bsStart >> 16) ;
  156.         dec->bsStart.bitptr =  bsStart & 0xff ;
  157.         dec->bsEnd.byteptr = dec->bsAbs.byteptr + (bsEnd >> 16) ;
  158.         dec->bsEnd.bitptr =  bsEnd & 0xff ;
  159. #endif
  160.         // Set nextGOB
  161.         dec->next_gob = *far32_nextGOB;
  162.         // Set picture size (if ANYSIZE), coding method, and PB capability
  163.         dec->pic_layer.rows = far32_picdesc->rows;
  164.         dec->pic_layer.cols = far32_picdesc->cols;
  165.         dec->pic_layer.decodingInProgress = FALSE;
  166. //#define VTEL_M261
  167. #ifdef VTEL_M261
  168.         dec->codingMethod   = H261_CODING;
  169. #else
  170.         dec->codingMethod   = H263_CODING; 
  171. #endif
  172.         dec->PBframeCap     = PBframeCap;    // Enable B-frame reconstruction
  173.         //dec->maxComp  = 0;    // No time-out
  174.         dec->maxComp  = 396;    // Set time-out limit
  175.         // Set oldFormat
  176.         oldFormat = dec->decMB.format;
  177.         // Are arrays big enough?
  178.         numMBs = ((dec->pic_layer.rows + 15) >> 4) *
  179.                  ((dec->pic_layer.cols + 15) >> 4);
  180.         if (numMBs > dec->maxMbnum) {
  181.             // Reallocate arrays
  182.             FreeVarStructsDecoder( dec );
  183.             retval = AllocVarStructsDecoder( dec, (short)numMBs );
  184.             if (retval)  return NO;
  185.         }
  186.         // Initialize structures according to color parameter passed in.
  187.         dec->newOut.color = far32_newPic->color;
  188.         dec->oldOut.color = far32_newPic->color;
  189.         dec->B_Out.color  = far32_newPic->color;
  190.     }
  191.     // Call Decoder
  192.     retval = H261Decode( dec );
  193.     
  194.     // Check if we are done
  195.     far32_picdesc->decodingInProgress = dec->pic_layer.decodingInProgress;
  196.     if ( dec->pic_layer.decodingInProgress )
  197.         return 0;   // Not done yet
  198.     // Copy to return areas
  199.     memcpy ( far32_picdesc, (void *)&dec->pic_layer, sizeof ( PICTURE_DESCR ) ); /* Flawfinder: ignore */
  200.     memcpy ( far32_status, (void *)&dec->status, sizeof (VvDecoderStats) ); /* Flawfinder: ignore */
  201.     memcpy ( far32_nextGOB, (void *)&dec->next_gob, sizeof ( S32 ) ); /* Flawfinder: ignore */
  202.     // Return updated bitstream
  203. #ifdef BIG_ENDIAN // e.g. Mac
  204.     *far32_newBs = (( dec->newBs.byteptr - dec->bsAbs.byteptr ) && 0xffff) |
  205.                     ( (dec->newBs.bitptr << 16) & 0xff );
  206. #else
  207.     *far32_newBs = (( dec->newBs.byteptr - dec->bsAbs.byteptr ) << 16) |
  208.                     ( dec->newBs.bitptr & 0xff );
  209. #endif
  210.     /* check to see if chroma needs to be cleared  */
  211.     if ( dec->newOut.color == FALSE && StaticOldColor == TRUE )
  212.         resetChroma = 1;
  213.     StaticOldColor = dec->newOut.color;
  214. //    if ( ( oldFormat == CIF && dec->formatCap == QCIF ) && ( dec->newOut.color == FALSE ) )
  215.     if ( (oldFormat == CIF && dec->decMB.format == QCIF) && (dec->newOut.color == FALSE) )
  216.         resetChroma = 1;
  217.     /* reset the chroma image components if necessary   */
  218.     if ( resetChroma ) {
  219.         clearChromaFrame (&dec->newOut);
  220.         clearChromaFrame (&dec->B_Out);
  221.         clearChromaFrame (&dec->oldOut);
  222.         clearChromaFrame (&dec->prevOldOut);
  223.     }        
  224.     // If retval is YES, then the decoder has completed decoding of an entire frame.
  225.     // The new frame becomes the old.  Aliases are set up for return.
  226.     // For PB-frames, return the B-frame first, and the P-frame on next call.
  227.     // Doublebuffered output: prevOldOut holds previous output frame
  228.     if ( retval == YES ) {
  229.         temp_pic = dec->prevOldOut;         // Reuse oldest frame
  230.         if ( dec->PBframeCap  &&  dec->pic_layer.PBframeMode ) {
  231.             // We have reconstructed B-frame and P-frame
  232.             dec->prevOldOut = dec->B_Out;   // Will become PrevOut after next call
  233.             dec->B_Out      = temp_pic;     // Reuse oldest frame
  234.             temp_pic        = dec->oldOut;
  235.             dec->oldOut     = dec->newOut;  // New P-frame becomes old
  236.             dec->newOut     = temp_pic;     // Reuse prev. output (after it's been displayed)
  237.             dec->pPrevPic = &dec->newOut;       // Old P-frame (reuse after display)
  238.             dec->pNewPic  = &dec->prevOldOut;   // Return B-frame
  239.             dec->pendingFrame = 1;              // Hold on to P-frame
  240.         } else {
  241.             dec->prevOldOut = dec->oldOut;  // Previous output frame
  242.             dec->oldOut     = dec->newOut;  // New P-frame becomes old
  243.             dec->newOut     = temp_pic;     // Reuse oldest frame
  244.             dec->pPrevPic   = &dec->prevOldOut; // Previous output frame
  245.             dec->pNewPic    = &dec->oldOut;     // Output frame
  246.             dec->pendingFrame = 0;              // No frame left awaiting output
  247.         }
  248.         *far32_newPic  = *dec->pNewPic;
  249.         //*far32_prevPic = *dec->pPrevPic;
  250.     } else if ( dec->pendingFrame ) {
  251.         // P-frame is intact even if next frame is being decoded
  252.         dec->pPrevPic  = dec->pNewPic;      // B-frame was previous output
  253.         dec->pNewPic   = &dec->oldOut;      // Return P-frame
  254.         *far32_newPic  = *dec->pNewPic;
  255.         //*far32_prevPic = *dec->pPrevPic;
  256.         dec->pendingFrame = 0;          // No frame left awaiting output
  257.         retval = YES;                   // We have a frame to return
  258.     }
  259.     // Report to higher layer whether we are returning a B-frame
  260.     far32_status->dwBframe = dec->pendingFrame;
  261.     /*if ( retval == YES ) {
  262.           // Exchange pointers to newOut and oldOut
  263.         temp_pic    = dec->oldOut;
  264.         dec->oldOut  = dec->newOut; // This is the output P (or I) frame
  265.         dec->newOut  = temp_pic;
  266.         if ( dec->PBframeCap  &&  dec->pic_layer.PBframeMode ) {
  267.             // We have reconstructed a B-frame
  268.             *far32_newPic = dec->B_Out; // Return B-frame
  269.             dec->pendingFrame = 1;      // Hold on to P-frame
  270.         } else {
  271.             *far32_newPic = dec->oldOut;    // Return P (or I) frame
  272.             dec->pendingFrame = 0;          // No frame left awaiting output
  273.         }
  274.     } else if ( dec->pendingFrame ) {
  275.         // P-frame is intact even if next frame is being decoded
  276.         *far32_newPic = dec->oldOut;    // Return P (or I) frame
  277.         dec->pendingFrame = 0;          // No frame left awaiting output
  278.         retval = YES;                   // We have a frame to return
  279.     }*/
  280.     // Return status; YES = completed decoding a picture, otherwise N0.
  281.     return ( (U32) retval );
  282. }
  283. /*-----------------------------------------------------------------------------
  284.  *  Function:   VvDecGetMBMap
  285.  *
  286.  *  DESCRIPTION
  287.  *      Get decoder macroblock map.
  288.  *
  289.  *  CALLING SYNTAX
  290.  *      VvDecGetMBMap   S16 index
  291.  *                      U32 mapType
  292.  *                      U32 outMap
  293.  *
  294.  *      index:      Input. Indicates which decoder is being called.
  295.  *      mapType:    Input. Indicates which map to ouput.
  296.  *      outMap:     Output. 16:16 pointer to output map.
  297.  * 
  298.  *  Author:         Mary Deshon             02/23/94
  299.  *  Inspected:      <<not inspected yet>>
  300.  *  Revised:
  301.  -----------------------------------------------------------------------------*/
  302. extern U32 VvDecGetMBMap ( S16 index, U32 mapType, U32 outMap )
  303. {
  304.     H261Decoder *dec;
  305.     U16 *fpOutMap;
  306. /*    int   mapHorz = 11;
  307.     int mapVert = 9;*/
  308.   
  309.     dec = DecoderRegistry[index-1];
  310.    
  311.     // Get a pointer we can work with
  312.     fpOutMap = (U16 *)(void *)outMap;
  313.   
  314. /*  if (dec->decMB.format == CIF) { 
  315.         mapHorz = 22;
  316.         mapVert = 18;
  317.     }*/
  318.     
  319.     switch ( mapType ) {
  320.     case DECODER_MAP:
  321.         /* Copy map to pointed at area */
  322.         memcpy ( (void *)fpOutMap, (void *)&dec->decMB, sizeof (MBMap)); /* Flawfinder: ignore */
  323.         break;
  324.     default:
  325.         break;
  326.     }
  327.     return ( OK );    
  328. }