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

Symbian

开发平台:

Visual C++

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