hvdecode.c
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:14k
源码类别:

Symbian

开发平台:

Visual C++

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