📄 hxcinst.cpp
字号:
/* ***** BEGIN LICENSE BLOCK ***** * Source last modified: $Id: hxcinst.cpp,v 1.4.10.1 2004/07/09 01:56:06 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 ***** */#include "hxvamain.h"#include "hvenc.h"#include "h261defs.h"#include "hvscodes.h"#include "hxcinst.h"#include "h263codecf.h"#include "memory.h"#ifdef _MACINTOSH#include <string.h> // for memcpy#endif#ifdef __cplusplusextern "C" {#endif/* Function Protos */U32 VvOpenDecoder ( S16 format );U32 VvGetDecoderPtr ( S16 index );U32 VvDecode ( S16 index, U32 PBframeCap, PICTURE_DESCR* picdesc, U32 bsStart, U32 bsEnd, S16* nextGOB, PICTURE* newPic, VvDecoderStats* status, U32 newBs ); U32 VvCloseDecoder (S16 index );U32 VvDecGetMBMap ( S16 index, U32 mapType, U32 outMap );}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inline DWORD WIDTHBYTES(DWORD bits) { return (((bits) + 31) / 32 * 4);}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inline DWORD ROUNDTO16(DWORD a) { return ((a+15)>>4)<<4;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inline BOOL IsOpenDecoder(S16 hDecoder){ return 1<=hDecoder && hDecoder<=MAX_NUM_DECODERS;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inline void MarkDecoderClosed(S16& hDecoder){ hDecoder = MAX_NUM_DECODERS+1;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inline U32 BITNUM(VvBitIndex q) { return ((((q).l >> 13) &0x7FFF8) + ((q).l&7));}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inline U32 BITSDIFF(VvBitIndex start,VvBitIndex finish) { return (BITNUM(finish)-BITNUM(start));}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inline U32 BYTESDIFF(VvBitIndex start,VvBitIndex finish){ return (BITSDIFF(start,finish) + 7) >> 3;}const S16 HXH263CodecInstance::capsCIF(CIF);const U32 HXH263CodecInstance::effFactor(56);const U32 HXH263CodecInstance::h263MaxInterFrames(31);const U32 HXH263CodecInstance::bogusId(1);const U32 HXH263CodecInstance::cifHeight(288);const U32 HXH263CodecInstance::cifWidth(352);const U32 HXH263CodecInstance::qcifHeight(144);const U32 HXH263CodecInstance::qcifWidth(176);const U32 HXH263CodecInstance::sqcifHeight(96);const U32 HXH263CodecInstance::sqcifWidth(128);///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////HXH263CodecInstance::HXH263CodecInstance() :m_fccType(0),m_openFlags(0),m_vcmVersion(0),m_lpDecoderPtr(NULL){ MarkDecoderClosed(m_hDecoder);}BOOL HXH263CodecInstance::Initialize(void){ // make sure we're being opened as a video compressor m_fccType = 1; m_openFlags = 0; m_vcmVersion = 1; return TRUE;} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////HX_RESULT HXH263CodecInstance::DecompressStart( const HXVA_Image_Format &srcFormat, HXVA_Image_Format &dstFormat){ // Somebody called start without end //if(IsOpenDecoder(m_hDecoder)) // DecompressEnd(); // open decoder with CIF capabilities // FIX: must check for success here m_hDecoder = (S16) VvOpenDecoder(capsCIF); if(m_hDecoder > MAX_NUM_DECODERS) { MarkDecoderClosed(m_hDecoder); return HXR_OUTOFMEMORY; } // Initialize picture descriptor m_PicDesc.rows = ROUNDTO16(srcFormat.dimensions.height); m_PicDesc.cols = ROUNDTO16(srcFormat.dimensions.width); // Initialize the output picture m_PicOut.picLayout = VIVO_YUV12; m_PicOut.color = 1; // initialize remaining decoder state m_nextGob = 0; // Grab the decoder pointer m_lpDecoderPtr = (LPBYTE) VvGetDecoderPtr(m_hDecoder); if(m_lpDecoderPtr==NULL) { DecompressEnd(); return HXR_OUTOFMEMORY; } return HXR_OK;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////HX_RESULT HXH263CodecInstance::DecompressEnd(){ if(IsOpenDecoder(m_hDecoder)) VvCloseDecoder(m_hDecoder); MarkDecoderClosed(m_hDecoder); m_lpDecoderPtr = NULL; return HXR_OK;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////HX_RESULT HXH263CodecInstance::DecompressConvert( const HXVA_Image &src, HXVA_Image &dst){ static U32 EOS(0x00FC0000); // Cool, the NetShow player seems to send ICM_DECOMPRESS_CONVERT before // sending ICM_DECOMPRESS_BEGIN (at least sometimes!) if(!IsOpenDecoder(m_hDecoder)) DecompressStart(src.format, dst.format); VvBitIndex begin,end,ret; // if biSizeImage == 1 it means we have the second half of a PB frame; set it to 0 and decode //if(lpDEX->lpbiSrc->biSizeImage == 1) // lpDEX->lpbiSrc->biSizeImage = 0; begin.l = 0; end.ww.byte = (U16)(src.size) + 4; // make room for EOS end.l = end.ww.byte * 8 + 1; U32 result = 1; // copy the incoming data to the decoder buffer LPBYTE lpData = GetDecoderPtr(); U32 *lpEOS = &EOS; // WIN16 days r over if(!lpData) {//decoder was obviously closed already return HXR_FAIL; } memcpy(lpData, src.GetBasePointer(), src.size); /* Flawfinder: ignore */ memcpy(lpData+(int)src.size, lpEOS, 4); /* Flawfinder: ignore */ static const U32 PBFrameCap(1); m_PicDesc.decodingInProgress = FALSE; PICTURE *lpPicOut = &m_PicOut; PICTURE_DESCR *lpPicDesc = &m_PicDesc; S16 *lpNextGob = &m_nextGob; VvDecoderStats *lpDecoderStats = &m_DecoderStats; VvBitIndex *lpRet = &ret; do { result = VvDecode ( m_hDecoder, // decoder index PBFrameCap, // reconstruct B frames lpPicDesc, // frame data (U32) begin.l, // first bit to decode (U32) end.l, // last bit (+1) to decode lpNextGob, // next gob to process lpPicOut, // pointer to output pix lpDecoderStats, // pointer to stats block (U32) lpRet ); // pos of first bit } while(m_PicDesc.decodingInProgress); // copy decoded frame to the destination buffer // YUV Do something.. unsigned char* pDst = (unsigned char*)dst.GetBasePointer(); S32 lumaHeight = dst.format.dimensions.height; S32 chromaHeight = (lumaHeight+1)>1; // Now turn YUV pointers upside down before passing to DoRGB16 unsigned char* pY = m_PicOut.y.ptr; unsigned char* pCr = m_PicOut.cr.ptr; unsigned char* pCb = m_PicOut.cb.ptr; int yOffset = m_PicOut.y.hoffset; int crOffset = m_PicOut.cr.hoffset; int cbOffset = m_PicOut.cb.hoffset; int chromaLines = m_PicOut.cb.nvert; int chromaBytes = m_PicOut.cb.nhor; int memsz = lumaHeight*yOffset; if(m_PicOut.picLayout == VVS_LAYOUT_YUV12) memsz += (memsz>>1); memcpy(pDst, pY, memsz); /* Flawfinder: ignore */ if(m_PicOut.picLayout == VVS_LAYOUT_TEE) { // optimised layout for color conversion. pDst += lumaHeight*yOffset; unsigned char * pDst2 = pDst+(chromaLines*chromaBytes); for(int i=0;i<chromaLines;i++) { memcpy(pDst2, pCr, chromaBytes); /* Flawfinder: ignore */ memcpy(pDst, pCb, chromaBytes); /* Flawfinder: ignore */ pCr+=crOffset; pCb+=cbOffset; pDst+=chromaBytes; pDst2+=chromaBytes; } } return HXR_OK;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////HX_RESULT HXH263CodecInstance::DecompressVerifyParams(void){ return HXR_OK;} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////HX_RESULT HXH263CodecInstance::DecompressGetOutputFormat( void){ return HXR_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -