rvxvdec.cpp

来自「symbian 下的helix player源代码」· C++ 代码 · 共 610 行 · 第 1/2 页

CPP
610
字号
	    DEBUG_OUTF("C:\\RVX.TXT",
		(s, "     Segment%2d: Valid=%s Offset=%d\n",
		    i,
		    pCodecData->Segments[i].bIsValid ? "T" : "F",
		    pCodecData->Segments[i].ulSegmentOffset));
	    HX_ASSERT(pCodecData->Segments[i].ulSegmentOffset < pCodecData->dataLength);
	    HX_ASSERT(pCodecData->Segments[i].ulSegmentOffset < 100000);
	}
    }
#endif	// _TRACK_CODEC_INPUT

    retVal = CheckCallback(m_pStream);
    if (SUCCEEDED(retVal))
    {
        retVal = m_pCodecLib->PNStream_Input(m_pStream, NULL,
                                    (HXCODEC_DATA*) pFrameToDecode->m_pData);
        if(pFrameToDecode->m_pData)
        {
            ((HXCODEC_DATA*) pFrameToDecode->m_pData)->data = NULL;
        }
    }
#endif	// _DRY_RUN

    return retVal;
}


/****************************************************************************
 *  Method:
 *    CRVDecoder::DecodeDone
 */
HX_RESULT CRVXVDecoder::DecodeDone(HXCODEC_DATA* pData)
{
    if (pData)
    {
	m_ulLastTimeStamp = pData->timestamp;
    }

    return m_pVideoFormat->DecodeDone(pData);
}


/****************************************************************************
 *  Method:
 *    CRVDecoder::GetImageInfo
 */
HX_RESULT CRVXVDecoder::GetImageInfo(HX_MOF* &pImageInfo)
{
    ULONG32 ulSize;
    ULONG32* pMofBuf = NULL;
    HX_RESULT retVal = HXR_OK;

    HX_VECTOR_DELETE(m_pImageInfoBuffer);

    retVal = m_pCodecLib->PNStream_GetStreamHeaderSize(m_pStream,
						       &ulSize);

    if (retVal == HXR_OK)
    {
	HX_ASSERT((ulSize == sizeof(HX_FORMAT_IMAGE)) ||
		  (ulSize == sizeof(HX_FORMAT_IMAGE2)));

	pMofBuf = new ULONG32[ulSize / 4 + 1];

	retVal = HXR_FAIL;
	if (pMofBuf && (ulSize >= sizeof(HX_MOF)))
	{
	    retVal = HXR_OK;
	}
    }

    if (retVal == HXR_OK)
    {
	retVal = m_pCodecLib->PNStream_GetStreamHeader(m_pStream,
						       (HX_MOF *) pMofBuf);
    }

    if (retVal == HXR_OK)
    {
	m_pImageInfoBuffer = pMofBuf;
	pMofBuf = NULL;
	pImageInfo = (HX_MOF*) m_pImageInfoBuffer;
    }

    HX_VECTOR_DELETE(pMofBuf);

    return retVal;
}


/****************************************************************************
 *  Method:
 *    CRVDecoder::OnNewImage
 */
HX_RESULT CRVXVDecoder::OnNewImage(HXSTREAM streamRef,
				   HXSTREAM fromStreamRef,
				   HXCODEC_DATA* pData)
{
    CRVXVDecoder* pDecoder = (CRVXVDecoder*) streamRef;

    return pDecoder->DecodeDone(pData);
}


/****************************************************************************
 *  Method:
 *    CRVXVDecoder::ResetSequence()
 */
void CRVXVDecoder::ResetSequence(ULONG32 ulNewSequenceStartTS)
{
    m_ulSequenceStartTS = ulNewSequenceStartTS;
    m_bNewSequence = TRUE;
}

CRADynamicCodecLibrary* CRVXVDecoder::CreateCodecLibrary()
{
    return new CRADynamicCodecLibrary(m_pContext);
}

/****************************************************************************
 *  Private Methods
 */
/****************************************************************************
 *  Method:
 *    CRVXVDecoder::OpenCodec()
 */
HX_RESULT CRVXVDecoder::OpenCodec(const HX_MOF* pMofIn)
{
    HX_MOFTAG mofTag = 0;
    HX_RESULT retVal = HXR_OK;

    HX_ASSERT(pMofIn);

    mofTag = pMofIn->submoftag;
    m_moftagIn = mofTag;

    HX_DELETE(m_pCodecLib);

    // Create Codec Library
    m_pCodecLib = CreateCodecLibrary();

    retVal = HXR_OUTOFMEMORY;
    if (m_pCodecLib != NULL)
    {
	retVal = HXR_OK;
    }

    // Load Codec into library
    if (SUCCEEDED(retVal))
    {
	retVal = m_pCodecLib->LoadCodecLib(mofTag);
    }

    // Open the codec
    if (SUCCEEDED(retVal))
    {
	retVal = m_pCodecLib->PNCodec_Open(mofTag, &m_pCodec);

	if (FAILED(retVal))
	{
	    retVal = HXR_REQUEST_UPGRADE;
	}
    }

    return retVal;
}


/****************************************************************************
 *  Method:
 *    CRVXVDecoder::OpenStream
 */
HX_RESULT CRVXVDecoder::OpenStream(const HX_MOF* pMofIn)
{
    ULONG32 ulMofInDataSize = 0;
    ULONG32* pMofInData = NULL;
    HX_FORMAT_IMAGE2 mofOut;
    HXCODEC_INIT codecInit;
    HX_RESULT retVal = HXR_OK;

    HX_ASSERT(pMofIn);

    // Open Stream in some format: try most preferred first
    if (SUCCEEDED(retVal))
    {
	mofOut.cbLength = sizeof(HX_FORMAT_IMAGE2);
	mofOut.moftag = HX_MEDIA_IMAGE2;
	mofOut.submoftag = HX_YUV420_ID;
	m_moftagOut = HX_YUV420_ID;
    }

    if (SUCCEEDED(retVal))
    {
	codecInit.pInMof = (HX_MOF*) pMofIn;
	codecInit.pOutMof = (HX_MOF*) &mofOut;
	codecInit.memoryRef = (HXMEMORY) m_pInputAllocator;
	codecInit.pContext = m_pContext;
    }

    if (retVal == HXR_OK)
    {
	retVal = m_pCodecLib->PNCodec_StreamOpen(m_pCodec,
						 &m_pStream,
						 &codecInit);

	// TODO: If this fails, try other formats...
    }

    if (retVal == HXR_OK)
    {
	retVal = m_pCodecLib->PNStream_SetDataCallback(
		    m_pStream,
		    this,
		    (HXMEMORY) m_pOutputAllocator,
		    OnNewImage);
    }

    if (retVal == HXR_OK)
    {
	SetCodecQuality();
    }

    if (retVal == HXR_OK)
    {
	BOOL bAllowDifferentOutputSizes = TRUE;

	//  tell codec we can handle different output sizes
	m_pCodecLib->PNStream_SetProperty(m_pStream,
					  SP_ALLOW_DIFFERENT_OUPUT_SIZES,
					  &bAllowDifferentOutputSizes);
    }

    // TODO: Setup image format based on codec output format

    return retVal;
}


/****************************************************************************
 *  Method:
 *    CRVXVDecoder::GetQualityPreference
 */
HX_RESULT CRVXVDecoder::GetQualityPreference(UINT16 &usQuality)
{
    HX_RESULT pnr = HXR_OK;

#if defined(HELIX_FEATURE_PREFERENCES)
    IHXBuffer* pBuffer = NULL;
    IHXPreferences* pPreferences = 0;

    if (!m_pContext ||
	(m_pContext->QueryInterface(IID_IHXPreferences, (void**) &pPreferences) !=
	 HXR_OK))
    {
	pnr = HXR_INVALID_PARAMETER;
    }
    else
    {
	ReadPrefINT16(pPreferences, "Quality", usQuality);
    }

    HX_RELEASE(pPreferences);
#endif

    return pnr;
}


/****************************************************************************
 *  Method:
 *    CRVXVDecoder::GetQualityPreference
 */
void CRVXVDecoder::SetCodecQuality(void)
{
    BOOL bOn, bOff;
    UINT16 usQualityPreference = 4;

    GetQualityPreference(usQualityPreference);

    // Turn on or off post filter based on flags in source URL
    // if the URL turns off post filter or the TLC quality
    // preference is < 4 we turn off the post filter
    bOn = (usQualityPreference >= 4);

    m_pCodecLib->PNStream_SetProperty (m_pStream, SP_POSTFILTER, &bOn);

    // Turn on or off FRU based on flags in source URL
    bOn = (usQualityPreference >= 4);

    m_pCodecLib->PNStream_SetProperty (m_pStream, SP_TEMPORALINTERP, &bOn);

    // Turn on or off full decoding of B frames (reverse switch)
    bOff = (usQualityPreference < 2);
    m_pCodecLib->PNStream_SetProperty (m_pStream, SP_NOFULLDECODE, &bOff);

    // Turn on or off deblocking of B frames (reverse switch)
    bOff = (usQualityPreference < 3);
    m_pCodecLib->PNStream_SetProperty (m_pStream, SP_NODEBLOCKBFRAMES, &bOff);

    // Turn on or off decode of B-frames based on flags in source URL
    bOn = (usQualityPreference >= 1);

    m_pCodecLib->PNStream_SetProperty (m_pStream, SP_DECODE_B_FRAMES, &bOn);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?