ref: f062c225caf7295256e631a643b8659b8374891b
dir: /codec/decoder/plus/inc/welsDecoderExt.h/
/*! * \copy * Copyright (c) 2009-2013, Cisco Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * * WelsDecoderExt.h * * Abstract * Cisco OpenH264 decoder extension utilization interface * * History * 3/12/2009 Created * * *************************************************************************/ #if !defined(WELS_PLUS_WELSDECODEREXT_H) #define WELS_PLUS_WELSDECODEREXT_H #include "codec_api.h" #include "codec_app_def.h" #include "decoder_context.h" #include "welsCodecTrace.h" #include "cpu.h" class ISVCDecoder; namespace WelsDec { //#define OUTPUT_BIT_STREAM ////for test to output bitstream class CWelsDecoder : public ISVCDecoder { public: CWelsDecoder (void); virtual ~CWelsDecoder(); virtual long EXTAPI Initialize (const SDecodingParam* pParam); virtual long EXTAPI Uninitialize(); /*************************************************************************** * Description: * Decompress one frame, and output I420 or RGB24(in the future) decoded stream and its length. * Input parameters: * Parameter TYPE Description * pSrc unsigned char* the h264 stream to decode * srcLength int the length of h264 steam * pDst unsigned char* buffer pointer of decoded data * pDstInfo SBufferInfo& information provided to API including width, height, SW/HW option, etc * * return: if decode frame success return 0, otherwise corresponding error returned. ***************************************************************************/ virtual DECODING_STATE EXTAPI DecodeFrame (const unsigned char* kpSrc, const int kiSrcLen, unsigned char** ppDst, int* pStride, int& iWidth, int& iHeight); virtual DECODING_STATE EXTAPI DecodeFrameNoDelay (const unsigned char* kpSrc, const int kiSrcLen, unsigned char** ppDst, SBufferInfo* pDstInfo); virtual DECODING_STATE EXTAPI DecodeFrame2 (const unsigned char* kpSrc, const int kiSrcLen, unsigned char** ppDst, SBufferInfo* pDstInfo); virtual DECODING_STATE EXTAPI FlushFrame (unsigned char** ppDst, SBufferInfo* pDstInfo); virtual DECODING_STATE EXTAPI DecodeParser (const unsigned char* kpSrc, const int kiSrcLen, SParserBsInfo* pDstInfo); virtual DECODING_STATE EXTAPI DecodeFrameEx (const unsigned char* kpSrc, const int kiSrcLen, unsigned char* pDst, int iDstStride, int& iDstLen, int& iWidth, int& iHeight, int& color_format); virtual long EXTAPI SetOption (DECODER_OPTION eOptID, void* pOption); virtual long EXTAPI GetOption (DECODER_OPTION eOptID, void* pOption); public: DECODING_STATE DecodeFrame2WithCtx (PWelsDecoderContext pCtx, const unsigned char* kpSrc, const int kiSrcLen, unsigned char** ppDst, SBufferInfo* pDstInfo); DECODING_STATE ParseAccessUnit (SWelsDecoderThreadCTX& sThreadCtx); private: welsCodecTrace* m_pWelsTrace; uint32_t m_uiDecodeTimeStamp; bool m_bIsBaseline; int32_t m_iCpuCount; int32_t m_iThreadCount; int32_t m_iCtxCount; PPicBuff m_pPicBuff; bool m_bParamSetsLostFlag; bool m_bFreezeOutput; int32_t m_DecCtxActiveCount; PWelsDecoderThreadCTX m_pDecThrCtx; PWelsDecoderThreadCTX m_pLastDecThrCtx; int32_t m_iLastBufferedIdx; WELS_MUTEX m_csDecoder; SWelsDecEvent m_sBufferingEvent; SWelsDecEvent m_sReleaseBufferEvent; SWelsDecSemphore m_sIsBusy; SPictInfo m_sPictInfoList[16]; SPictReoderingStatus m_sReoderingStatus; PWelsDecoderThreadCTX m_pDecThrCtxActive[WELS_DEC_MAX_NUM_CPU]; SVlcTable m_sVlcTable; SWelsLastDecPicInfo m_sLastDecPicInfo; SDecoderStatistics m_sDecoderStatistics;// For real time debugging private: int32_t InitDecoder (const SDecodingParam* pParam); void UninitDecoder (void); int32_t InitDecoderCtx (PWelsDecoderContext& pCtx, const SDecodingParam* pParam); void UninitDecoderCtx (PWelsDecoderContext& pCtx); int32_t ResetDecoder (PWelsDecoderContext& pCtx); int32_t ThreadResetDecoder (PWelsDecoderContext& pCtx); void OutputStatisticsLog (SDecoderStatistics& sDecoderStatistics); DECODING_STATE ReorderPicturesInDisplay (PWelsDecoderContext pCtx, unsigned char** ppDst, SBufferInfo* pDstInfo); int ThreadDecodeFrameInternal (const unsigned char* kpSrc, const int kiSrcLen, unsigned char** ppDst, SBufferInfo* pDstInfo); void BufferingReadyPicture (PWelsDecoderContext pCtx, unsigned char** ppDst, SBufferInfo* pDstInfo); void ReleaseBufferedReadyPicture (PWelsDecoderContext pCtx, unsigned char** ppDst, SBufferInfo* pDstInfo); void OpenDecoderThreads(); void CloseDecoderThreads(); #ifdef OUTPUT_BIT_STREAM WelsFileHandle* m_pFBS; WelsFileHandle* m_pFBSSize; #endif//OUTPUT_BIT_STREAM }; } // namespace WelsDec #endif // !defined(WELS_PLUS_WELSDECODEREXT_H)