📄 hvdecode.c
字号:
/* ***** BEGIN LICENSE BLOCK ***** * Source last modified: $Id: hvdecode.c,v 1.2.40.1 2004/07/09 01:56:22 hubbe Exp $ * * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. * * The contents of this file, and the files included with this file, * are subject to the current version of the RealNetworks Public * Source License (the "RPSL") available at * http://www.helixcommunity.org/content/rpsl unless you have licensed * the file under the current version of the RealNetworks Community * Source License (the "RCSL") available at * http://www.helixcommunity.org/content/rcsl, in which case the RCSL * will apply. You may also obtain the license terms directly from * RealNetworks. You may not use this file except in compliance with * the RPSL or, if you have a valid RCSL with RealNetworks applicable * to this file, the RCSL. Please see the applicable RPSL or RCSL for * the rights, obligations and limitations governing use of the * contents of the file. * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL") in which case the provisions of the GPL are applicable * instead of those above. If you wish to allow use of your version of * this file only under the terms of the GPL, and not to allow others * to use your version of this file under the terms of either the RPSL * or RCSL, indicate your decision by deleting the provisions above * and replace them with the notice and other provisions required by * the GPL. If you do not delete the provisions above, a recipient may * use your version of this file under the terms of any one of the * RPSL, the RCSL or the GPL. * * This file is part of the Helix DNA Technology. RealNetworks is the * developer of the Original Code and owns the copyrights in the * portions it created. * * This file, and the files included with this file, is distributed * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET * ENJOYMENT OR NON-INFRINGEMENT. * * Technology Compatibility Kit Test Suite(s) Location: * http://www.helixcommunity.org/content/tck * * Contributor(s): * * ***** END LICENSE BLOCK ***** *//* Header File Includes */#include "machine.h"#include <stdio.h>#include <stddef.h>#include <string.h>#ifdef FOR_MAC#include <stdlib.h>#else#include <malloc.h>#endif#include "dllindex.h"#include "h261func.h"#include "h261defs.h"#include "hvscodes.h"/* Defines, Typedefs, & Enums *///#define DEBUG_VVDECODE(a) a#define DEBUG_VVDECODE(a)/* Globals */extern H261Decoder *DecoderRegistry[MAX_NUM_DECODERS];/* File-wide Statics *//******************************************************************************* clearChromaFrame (PICTURE *newIn)***/static void clearChromaComponent (COMPONENT *c){ PIXEL *p; S32 nRows, nCols; /* clear the chroma image component */ p = c->ptr; nRows = c->nvert; while (nRows--) { nCols = c->nhor; while (nCols--) { *p++ = 0x80; } p += (c->hoffset - c->nhor); }}static void clearChromaFrame ( PICTURE *newIn){ /* clear both image components */ clearChromaComponent (&newIn->cr); clearChromaComponent (&newIn->cb); return;}/*----------------------------------------------------------------------------- * Function: VvDecode * * DESCRIPTION * Starts bitstream decoding. * * CALLING SYNTAX * VvDecode S16 index * U32 PBframeCap * U32 picdesc * U32 bsStart * U32 bsEnd * U32 nextGOB * U32 newPic * U32 status * U32 newBS * * index: Indicates which decoder is being called. * PBframeCap If 0: no B-frame reconstruction; otherwise, reconstruct B-frame * picdesc: Pointer to a PICTURE DESCR struct used for the decoded picture layer info * bsStart: Offset into bistream indicating where to begin decoding: * high word indicates offset to a byte,lo word indicates bit number. * bsEnd: Offset into bistream indicating where to stop decoding (worst case): * high word indicates offset to a byte,lo word indicates bit number. * nextGOB: Pointer to S16 indicating which GOB to decode next. If zero, the routine * skips all GOBs until it finds a PSC (Picture Start Code ). * newPic: Pointer to a PICTURE struct used for the decoded image * status: Pointer to an array containing status info * newBs: Pointer to offset into bitstream indicating where the decoder actually stopped decoding * high word indicates offset to a byte,lo word indicates bit number. * * RETURNS * Returns type U32 containing status; YES = completed decoding an entire image * * Author: Mary Deshon 7/21/93 * Inspected: <<not inspected yet>> * Revised: -----------------------------------------------------------------------------*/#define NUM_STATUS_WORDS 4extern U32 VvDecode ( S16 index, U32 PBframeCap, PICTURE_DESCR* picdesc, U32 bsStart, U32 bsEnd, S16* nextGOB, PICTURE* newPic, VvDecoderStats* status, U32 newBs ){ H261Decoder *dec; PICTURE_DESCR *far32_picdesc; PICTURE *far32_newPic; PICTURE temp_pic; U32 *far32_newBs; VvDecoderStats *far32_status; S16 *far32_nextGOB; int retval, oldFormat, numMBs; DEBUG_VVDECODE (char buf[128];) /* Flawfinder: ignore */ static int StaticOldColor=1; int resetChroma = 0; dec = DecoderRegistry[index-1]; // Get pointers we can use far32_picdesc = picdesc; far32_status = status; far32_nextGOB = nextGOB; far32_newPic = newPic; far32_newBs = (void*) newBs; if ( !far32_picdesc->decodingInProgress ) { far32_picdesc->rows = ((far32_picdesc->rows + 15)>>4)<<4; far32_picdesc->cols = ((far32_picdesc->cols + 15)>>4)<<4;#ifdef BIG_ENDIAN // Mac // Setup H261Decoder structure dec->bsStart.byteptr = dec->bsAbs.byteptr + (bsStart & 0xffff) ; dec->bsStart.bitptr = (bsStart >> 16) & 0xff; dec->bsEnd.byteptr = dec->bsAbs.byteptr + (bsEnd & 0xffff) ; dec->bsEnd.bitptr = (bsEnd >> 16) & 0xff;#else // Setup H261Decoder structure dec->bsStart.byteptr = dec->bsAbs.byteptr + (bsStart >> 16) ; dec->bsStart.bitptr = bsStart & 0xff ; dec->bsEnd.byteptr = dec->bsAbs.byteptr + (bsEnd >> 16) ; dec->bsEnd.bitptr = bsEnd & 0xff ;#endif // Set nextGOB dec->next_gob = *far32_nextGOB; // Set picture size (if ANYSIZE), coding method, and PB capability dec->pic_layer.rows = far32_picdesc->rows; dec->pic_layer.cols = far32_picdesc->cols; dec->pic_layer.decodingInProgress = FALSE;//#define VTEL_M261#ifdef VTEL_M261 dec->codingMethod = H261_CODING;#else dec->codingMethod = H263_CODING; #endif dec->PBframeCap = PBframeCap; // Enable B-frame reconstruction //dec->maxComp = 0; // No time-out dec->maxComp = 396; // Set time-out limit // Set oldFormat oldFormat = dec->decMB.format; // Are arrays big enough? numMBs = ((dec->pic_layer.rows + 15) >> 4) * ((dec->pic_layer.cols + 15) >> 4); if (numMBs > dec->maxMbnum) { // Reallocate arrays FreeVarStructsDecoder( dec ); retval = AllocVarStructsDecoder( dec, (short)numMBs ); if (retval) return NO; } // Initialize structures according to color parameter passed in. dec->newOut.color = far32_newPic->color; dec->oldOut.color = far32_newPic->color; dec->B_Out.color = far32_newPic->color; } // Call Decoder retval = H261Decode( dec ); // Check if we are done far32_picdesc->decodingInProgress = dec->pic_layer.decodingInProgress; if ( dec->pic_layer.decodingInProgress ) return 0; // Not done yet // Copy to return areas memcpy ( far32_picdesc, (void *)&dec->pic_layer, sizeof ( PICTURE_DESCR ) ); /* Flawfinder: ignore */ memcpy ( far32_status, (void *)&dec->status, sizeof (VvDecoderStats) ); /* Flawfinder: ignore */ memcpy ( far32_nextGOB, (void *)&dec->next_gob, sizeof ( S32 ) ); /* Flawfinder: ignore */ // Return updated bitstream#ifdef BIG_ENDIAN // e.g. Mac *far32_newBs = (( dec->newBs.byteptr - dec->bsAbs.byteptr ) && 0xffff) | ( (dec->newBs.bitptr << 16) & 0xff );#else *far32_newBs = (( dec->newBs.byteptr - dec->bsAbs.byteptr ) << 16) | ( dec->newBs.bitptr & 0xff );#endif /* check to see if chroma needs to be cleared */ if ( dec->newOut.color == FALSE && StaticOldColor == TRUE ) resetChroma = 1; StaticOldColor = dec->newOut.color;// if ( ( oldFormat == CIF && dec->formatCap == QCIF ) && ( dec->newOut.color == FALSE ) ) if ( (oldFormat == CIF && dec->decMB.format == QCIF) && (dec->newOut.color == FALSE) ) resetChroma = 1; /* reset the chroma image components if necessary */ if ( resetChroma ) { clearChromaFrame (&dec->newOut); clearChromaFrame (&dec->B_Out); clearChromaFrame (&dec->oldOut); clearChromaFrame (&dec->prevOldOut); } // If retval is YES, then the decoder has completed decoding of an entire frame. // The new frame becomes the old. Aliases are set up for return. // For PB-frames, return the B-frame first, and the P-frame on next call. // Doublebuffered output: prevOldOut holds previous output frame if ( retval == YES ) { temp_pic = dec->prevOldOut; // Reuse oldest frame if ( dec->PBframeCap && dec->pic_layer.PBframeMode ) { // We have reconstructed B-frame and P-frame dec->prevOldOut = dec->B_Out; // Will become PrevOut after next call dec->B_Out = temp_pic; // Reuse oldest frame temp_pic = dec->oldOut; dec->oldOut = dec->newOut; // New P-frame becomes old dec->newOut = temp_pic; // Reuse prev. output (after it's been displayed) dec->pPrevPic = &dec->newOut; // Old P-frame (reuse after display) dec->pNewPic = &dec->prevOldOut; // Return B-frame dec->pendingFrame = 1; // Hold on to P-frame } else { dec->prevOldOut = dec->oldOut; // Previous output frame dec->oldOut = dec->newOut; // New P-frame becomes old dec->newOut = temp_pic; // Reuse oldest frame dec->pPrevPic = &dec->prevOldOut; // Previous output frame dec->pNewPic = &dec->oldOut; // Output frame dec->pendingFrame = 0; // No frame left awaiting output } *far32_newPic = *dec->pNewPic; //*far32_prevPic = *dec->pPrevPic; } else if ( dec->pendingFrame ) { // P-frame is intact even if next frame is being decoded dec->pPrevPic = dec->pNewPic; // B-frame was previous output dec->pNewPic = &dec->oldOut; // Return P-frame *far32_newPic = *dec->pNewPic; //*far32_prevPic = *dec->pPrevPic; dec->pendingFrame = 0; // No frame left awaiting output retval = YES; // We have a frame to return } // Report to higher layer whether we are returning a B-frame far32_status->dwBframe = dec->pendingFrame; /*if ( retval == YES ) { // Exchange pointers to newOut and oldOut temp_pic = dec->oldOut; dec->oldOut = dec->newOut; // This is the output P (or I) frame dec->newOut = temp_pic; if ( dec->PBframeCap && dec->pic_layer.PBframeMode ) { // We have reconstructed a B-frame *far32_newPic = dec->B_Out; // Return B-frame dec->pendingFrame = 1; // Hold on to P-frame } else { *far32_newPic = dec->oldOut; // Return P (or I) frame dec->pendingFrame = 0; // No frame left awaiting output } } else if ( dec->pendingFrame ) { // P-frame is intact even if next frame is being decoded *far32_newPic = dec->oldOut; // Return P (or I) frame dec->pendingFrame = 0; // No frame left awaiting output retval = YES; // We have a frame to return }*/ // Return status; YES = completed decoding a picture, otherwise N0. return ( (U32) retval );}/*----------------------------------------------------------------------------- * Function: VvDecGetMBMap * * DESCRIPTION * Get decoder macroblock map. * * CALLING SYNTAX * VvDecGetMBMap S16 index * U32 mapType * U32 outMap * * index: Input. Indicates which decoder is being called. * mapType: Input. Indicates which map to ouput. * outMap: Output. 16:16 pointer to output map. * * Author: Mary Deshon 02/23/94 * Inspected: <<not inspected yet>> * Revised: -----------------------------------------------------------------------------*/extern U32 VvDecGetMBMap ( S16 index, U32 mapType, U32 outMap ){ H261Decoder *dec; U16 *fpOutMap;/* int mapHorz = 11; int mapVert = 9;*/ dec = DecoderRegistry[index-1]; // Get a pointer we can work with fpOutMap = (U16 *)(void *)outMap; /* if (dec->decMB.format == CIF) { mapHorz = 22; mapVert = 18; }*/ switch ( mapType ) { case DECODER_MAP: /* Copy map to pointed at area */ memcpy ( (void *)fpOutMap, (void *)&dec->decMB, sizeof (MBMap)); /* Flawfinder: ignore */ break; default: break; } return ( OK ); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -