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

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 <stdio.h>
  37. //#include <stddef.h>
  38. #include "machine.h"
  39. #ifdef FOR_MAC
  40. #include <stdlib.h>
  41. #else
  42. #include <malloc.h>
  43. #endif
  44. #include <string.h>         // _fmemset
  45. #include "dllindex.h"
  46. #include "h261func.h"
  47. #include "h261defs.h"
  48. #include "hvscodes.h"
  49. /*  Defines, Typedefs, & Enums  */
  50. //#define DEBUG_VVOPCL(a)   a
  51. #define DEBUG_VVOPCL(a)
  52. /*  Globals                     */
  53. #ifdef COMPILE_MMX
  54. #include "mmxcpuid.h"
  55. #endif
  56. H261Decoder     *DecoderRegistry[MAX_NUM_DECODERS] = { 0, 0 };
  57. U32             GAliasDec[MAX_NUM_DECODERS] = { 0, 0 };
  58. /*  File-wide Statics           */
  59. static int      DecCount = 0;       // Number of decoders open.
  60. static short    makeDecoder( short formatCap );
  61. static void     *vvMalloc( size_t size );
  62. static void vvFree(void *ptr);
  63. /*
  64.  * Function:    GrayFill()
  65.  * Purpose:     Set unused image areas to constant value.
  66.  */
  67. static void
  68. GrayFill( PICTURE *pic, long lumaSize, long chrSize )
  69. {
  70.     U8  *y = pic->y.ptr;
  71.     U8  *cb = pic->y.ptr + lumaSize;
  72.     _fmemset ( y, 128, lumaSize );
  73.     _fmemset ( cb, 128, chrSize );
  74. }
  75. /*-----------------------------------------------------------------------------
  76.  *  Function:   VvOpenDecoder
  77.  *
  78.  *  DESCRIPTION
  79.  *      Opens a decoder instance. Returns the decoder registry number
  80.  *      or an error code.
  81.  *
  82.  *  NOTES:
  83.  *      1. Encoder tables are static storage.
  84.  *
  85.  *  Author:     Mary Deshon     6/28/93
  86.  *  Inspected:  <<not inspected yet>>
  87.  *  Revised:
  88.  -----------------------------------------------------------------------------*/
  89. extern U32 VvOpenDecoder( S16 formatCap )    
  90. {
  91.     H261Decoder   *dec; 
  92.     short         i, index;
  93. #ifdef COMPILE_MMX
  94. //for mmx support
  95. cpuid_init();
  96. #endif
  97.     // If this is the first open call, set up read-only tables
  98.     // and initialize decoder registry 
  99.     if (DecCount == 0 ) {
  100.         InitFindSC();
  101.         InitDecodeTable(); 
  102.     
  103.         for (i = 0; i < MAX_NUM_DECODERS; i++)
  104.             DecoderRegistry[i] = NULL;
  105.     }                 
  106.     // Init Recon tables
  107.     InitReconTables ();
  108.     //InitYUVToRGB ();
  109.   
  110.     // Do not exceed maximum number of decoders allowed
  111.     if ( DecCount == MAX_NUM_DECODERS ) return( MAX_DECODERS_OPEN );
  112.   
  113.     // Try to make a decoder.
  114.     // If successful, then return_value is an DecoderRegistry entry 
  115.     //                  which is <= MAX_NUM_DECODERS
  116.     // otherwise, return_value is > MAX_NUM_DECODERS and indicates
  117.     //  an error code (see dllindex.h for codes)
  118.     
  119.     index = makeDecoder( formatCap );
  120.   
  121.     dec = DecoderRegistry[index-1];   // Do this so that I can look at struct with the Wild & Wacky 
  122.                                     // Watcom Debugger
  123.     return ( (U32) index );
  124. }
  125. /*-----------------------------------------------------------------------------
  126.  *  Function:   VvGetDecoderPtr
  127.  *
  128.  *  DESCRIPTION
  129.  *      Returns a bitStream pointer.
  130.  *
  131.  *  NOTES:
  132.  *      1. Encoder tables are static storage.
  133.  *
  134.  *  Author:     Mary Deshon     9/22/94
  135.  *  Inspected:  <<not inspected yet>>
  136.  *  Revised:
  137.  -----------------------------------------------------------------------------*/
  138. extern U32 VvGetDecoderPtr( S16 index )    
  139. {
  140.     if ( DecoderRegistry[index-1] ) {
  141.         GAliasDec[index-1] =  (U32) DecoderRegistry[index-1]->bsAbs.byteptr;
  142.         return ( (U32) GAliasDec[index-1] );
  143.     }
  144.     else return (U32)NULL;
  145. }
  146. /*-----------------------------------------------------------------------------
  147.  *  Function:   VvCloseDecoder
  148.  *
  149.  *  DESCRIPTION
  150.  *      Closes a decoder instance.
  151.  *
  152.  *  Author:     Mary Deshon     7/04/93
  153.  *  Inspected:  <<not inspected yet>>
  154.  *  Revised:
  155.  -----------------------------------------------------------------------------*/
  156. extern U32  VvCloseDecoder( short hDecf )    
  157. {
  158.   H261Decoder   *dec;
  159.   short         hDec = hDecf - 1;
  160.   dec  = DecoderRegistry[hDec];
  161.   // Free memory associated with decoder
  162.   if (DecCount > 0 ) {
  163. //#define VVPROFILER
  164. #ifdef VVPROFILER
  165. extern  void GetLogShutDownAllAccuTimes(void);
  166. GetLogShutDownAllAccuTimes();
  167. #endif
  168. FreeVarStructsDecoder( dec );
  169. vvFree ( DecoderRegistry[hDec]->bsAbs.byteptr );
  170. GAliasDec[hDec] = 0;
  171. vvFree ( DecoderRegistry[hDec] );
  172. DecoderRegistry[hDec] = NULL;
  173. DecCount--;
  174. return ( NO_ERROR );
  175.   }  else return ( NO_DECODERS_OPEN );
  176. }
  177. /*-----------------------------------------------------------------------------
  178.  *  Function:   AllocVarStructsDecoder
  179.  *
  180.  *  DESCRIPTION
  181.  *      Malloc variable size structures for a decoder instance
  182.  *      Returns zero if no errors occurred; otherwise, error code is returned
  183.  *
  184.  *  Author:     Staffan Ericsson    1/13/97
  185.  *  Inspected:  <<not inspected yet>>
  186.  *  Revised:
  187.  -----------------------------------------------------------------------------*/
  188. #define MBNUM_QCIF  (9*11)
  189. #define MBNUM_CIF   (4 * MBNUM_QCIF)
  190. #define BITS_PER_SYMBOL (3)
  191. #define MAXSYM_QCIF (65536 / BITS_PER_SYMBOL)
  192. #define MAXSYM_CIF  (4 * MAXSYM_QCIF)
  193. extern int AllocVarStructsDecoder( H261Decoder *dec, short formatCap_or_numMBs )
  194. {
  195.   long          imgSize, lumaSize, chromaLineLength, chromaRows, maxsym, memSize;
  196.   short         numGOBs, numMBs, retval, formatCap;
  197.   
  198.   // Get image parms needed for memory allocations: imgSize, lumaSize, and numMBs
  199.   if (formatCap_or_numMBs > MBNUM_QCIF) {   // Indicates non-standard image size
  200.     numMBs = formatCap_or_numMBs;
  201.     lumaSize = 256 * numMBs;
  202.     imgSize  = 384 * numMBs;
  203.   } else {
  204.     formatCap = formatCap_or_numMBs;
  205.     retval = getImgParms( formatCap, &numGOBs, &numMBs, &imgSize,
  206.                         &lumaSize, &chromaLineLength, & chromaRows, &maxsym);
  207.     if ( retval ) return ( (int)retval );
  208.   }
  209.   // Determine maxsym and formatCap
  210.   if (numMBs <= MBNUM_QCIF) {
  211.     maxsym = MAXSYM_QCIF;
  212.   } else {
  213.     maxsym = MAXSYM_CIF;
  214.   }
  215.   if (numMBs < MBNUM_CIF) {
  216.     dec->formatCap = QCIF;
  217.   } else {
  218.     dec->formatCap = CIF;
  219.   }
  220.     // Allocate memory for frame store
  221.   if ( ( dec->newOut.y.ptr = vvMalloc( imgSize ) ) == NULL )
  222.     return( FAILED_MALLOC );
  223.   if ( ( dec->B_Out.y.ptr  = vvMalloc( imgSize ) ) == NULL )
  224.     return( FAILED_MALLOC );
  225.   if ( ( dec->oldOut.y.ptr = vvMalloc( imgSize ) ) == NULL )
  226.     return( FAILED_MALLOC );
  227.   if ( ( dec->prevOldOut.y.ptr = vvMalloc( imgSize ) ) == NULL )
  228.     return( FAILED_MALLOC );
  229.     
  230.   //GrayFill ( &dec->newOut, lumaSize, imgSize-lumaSize );
  231.   GrayFill ( &dec->oldOut, lumaSize, imgSize-lumaSize );           
  232.     
  233.   // Allocate work arrays
  234.   dec->maxMbnum = numMBs;
  235.   memSize = numMBs * sizeof(MACROBLOCK_DESCR);
  236.   if ( ( dec->mb = vvMalloc( memSize ) ) == NULL )
  237.     return( FAILED_MALLOC );
  238.   //dec->maxSym = lumaSize;    // Probably bigger than necessary
  239.   //memSize = lumaSize * sizeof(SYMBOL);
  240.   dec->maxSym = maxsym;
  241.   memSize = maxsym * sizeof(SYMBOL);
  242.   if ( ( dec->sym = vvMalloc( memSize ) ) == NULL )
  243.     return( FAILED_MALLOC );
  244.   // NULL out the upsampling workspace array - we mightn't need it at all
  245.   _fmemset(&dec->convertPic, 0, sizeof(PICTURE));
  246.   dec->pendingFrame = 0; // No pending frame to be displayed
  247.   return 0;     // Errorcode = 0
  248. }
  249. /*-----------------------------------------------------------------------------
  250.  *  Function:   FreeVarStructsDecoder
  251.  *
  252.  *  DESCRIPTION
  253.  *      Free variable size structures for a decoder instance.
  254.  *
  255.  *  Author:     Staffan Ericsson    1/13/97
  256.  *  Inspected:  <<not inspected yet>>
  257.  *  Revised:
  258.  -----------------------------------------------------------------------------*/
  259. extern void FreeVarStructsDecoder( H261Decoder *dec )
  260. {
  261.     vvFree ( dec->oldOut.y.ptr );
  262.     dec->oldOut.y.ptr = NULL;
  263.     vvFree ( dec->newOut.y.ptr );
  264.     dec->newOut.y.ptr = NULL;
  265.     vvFree ( dec->B_Out.y.ptr );
  266.     dec->B_Out.y.ptr = NULL;
  267.     vvFree ( dec->prevOldOut.y.ptr );
  268.     dec->prevOldOut.y.ptr = NULL;
  269.     vvFree ( dec->mb );
  270.     dec->mb = NULL;
  271.     dec->maxMbnum = 0;
  272.     vvFree ( dec->sym );
  273.     dec->sym = NULL;
  274.     dec->maxSym = 0;
  275.     if( dec->convertPic.y.ptr ) {
  276.         free( dec->convertPic.y.ptr );
  277.         dec->convertPic.y.ptr = NULL;
  278.         dec->convertPic.cb.ptr = NULL;
  279.         dec->convertPic.cr.ptr = NULL;
  280.     }
  281. }
  282. /*-----------------------------------------------------------------------------
  283.  *  Function:   makeDecoder
  284.  *
  285.  *  DESCRIPTION
  286.  *      Make a decoder instance
  287.  *
  288.  *  Author:     Mary Deshon     7/01/93
  289.  *  Inspected:  <<not inspected yet>>
  290.  *  Revised:
  291.  *  11/15/93    J Bruder    Commented out unnecessary stuff.
  292.  -----------------------------------------------------------------------------*/
  293. static short makeDecoder( short formatCap)
  294. {
  295.   H261Decoder   *dec;
  296.   int           i, retval;
  297.   
  298.     // Find an open slot in the DecoderRegistry, we know that there 
  299.     // is at least one available              
  300.   for (i = 0; DecoderRegistry[i]; i++) {};
  301.     // Allocate memory for decoder structure
  302.   if ( ( DecoderRegistry[i] = vvMalloc( sizeof ( H261Decoder ) ) ) == NULL )
  303.     return( FAILED_MALLOC );
  304.  
  305.   dec = DecoderRegistry[i];                 // For looking at with the W2D
  306.   
  307.     // Allocate memory for frame store and work arrays
  308.   retval = AllocVarStructsDecoder( dec, formatCap );
  309.   if (retval) return (short)retval;
  310.     // Allocate memory for bitstream
  311.   if ( ( DecoderRegistry[i]->bsAbs.byteptr = vvMalloc( MAX_BITSTR_SIZE ) ) == NULL )
  312.     return( FAILED_MALLOC );
  313.   DecoderRegistry[i]->bsAbs.bitptr = 0;
  314.   
  315.   DecCount++;
  316.   return ( ++i );   // Decoders are numbered 1,2,...
  317. }
  318. /*-----------------------------------------------------------------------------
  319.  *  Function:   VvMalloc
  320.  *
  321.  *  DESCRIPTION
  322.  *      Wrapper for malloc.
  323.  *
  324.  *  ASSUMPTIONS
  325.  *      1. Malloc returns quad-aligned pointers for all compilers.
  326.  *
  327.  * CAUTION:
  328.  * There's a serious bug here! If a given implementation does not return
  329.  * longword-aligned data, then this function will return a long-aligned
  330.  * pointer but free won't free it because it won't be a recognized
  331.  * pointer. This will lead to a memory leak or a crash. I haven't fixed
  332.  * it because I'm not aware of any systems that don't return long-aligned
  333.  * data, so the problem won't occur. tkent, 8/20/96
  334.  *
  335.  *  Author:     Mary Deshon     7/01/93
  336.  *  Inspected:  <<not inspected yet>>
  337.  *  Revised:
  338.  *  02/15/94    M Deshon    Force quad-alignment.
  339.  -----------------------------------------------------------------------------*/
  340. static void *vvMalloc( size_t size )
  341. {
  342.     char    *ptr;
  343.     U32     addr;
  344. #ifdef FOR_MAC
  345.     ptr = NewPtrClear(size+4);
  346. #else
  347.     ptr = (char *)calloc( size + 4, 1 ); /* calloc should zero memory */
  348. #endif
  349.     addr = (U32)ptr & 0x3L;
  350.     
  351. //    assert(addr == 0); // To trap the problem described above
  352.    
  353.     /* Assume returned address can have low-order bits 00, 01, 10, or 11. */
  354.     if ( addr == 1 ) ptr += 3;
  355.     else if (addr == 2 ) ptr += 2;
  356.     else if ( addr == 3 ) ptr += 1;
  357.     else {}
  358.     return ( (void *) ptr );
  359. //  return ( (void *)calloc( size, 1 ) );
  360. }
  361. void vvFree(void *ptr)
  362. {
  363. #ifdef FOR_MAC
  364. DisposePtr(ptr);
  365. #else
  366. free(ptr);
  367. #endif
  368. }