⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_avs_dec_processing_unit_cc.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
字号:
/*
//
//              INTEL CORPORATION PROPRIETARY INFORMATION
//  This software is supplied under the terms of a license  agreement or
//  nondisclosure agreement with Intel Corporation and may not be copied
//  or disclosed except in  accordance  with the terms of that agreement.
//    Copyright (c) 2007 Intel Corporation. All Rights Reserved.
//
//
*/

#include "umc_defs.h"
#if defined(UMC_ENABLE_AVS_VIDEO_DECODER)

#include "umc_avs_dec_processing_unit_cc.h"
#include "umc_avs_dec_pic.h"
#include "umc_base_codec.h"
#include "umc_mutex.h"
#include "umc_automatic_mutex.h"

namespace UMC
{

AVSColorProcessingUnit::AVSColorProcessingUnit(void)
{

} // AVSColorProcessingUnit::AVSColorProcessingUnit(void)

AVSColorProcessingUnit::~AVSColorProcessingUnit(void)
{

} // AVSColorProcessingUnit::~AVSColorProcessingUnit(void)

Status AVSColorProcessingUnit::Init(Mutex *pGuard)
{
    // touch unreferenced parameter
    pGuard = pGuard;

    // it is not a correct function to initialize
    return UMC_ERR_FAILED;

} // Status AVSColorProcessingUnit::Init(Mutex *pGuard)

Status AVSColorProcessingUnit::Init(Mutex *pGuard, BaseCodec *pConverter)
{
    Status umcRes;

    // call the parent's method
    umcRes = AVSProcessingUnit::Init(pGuard);
    if (UMC_OK != umcRes)
        return umcRes;

    m_pConverter = pConverter;

    return UMC_OK;

} // Status AVSColorProcessingUnit::Init(Mutex *pGuard, BaseCodec *pConverter)

bool AVSColorProcessingUnit::LoadJob(AVSListElement<AVSFrame> *pFrameList)
{
    AVSListElement<AVSFrame> *pToShow, *pPrevRef;

    pToShow = NULL;
    pPrevRef = NULL;

    // run through the list and find the unshown item
    while ((pFrameList) &&
           (pFrameList->IsReady()))
    {
        if (false == pFrameList->IsShown())
        {
            if (pFrameList->IsReference())
            {
                // first reference frame should be shown first
                if (NULL == pPrevRef)
                {
                    pToShow = pFrameList;
                    break;
                }
                else if (false == pPrevRef->IsShown())
                {
                    pToShow = pPrevRef;
                    break;
                }
            }
            else
            {
                // any non-reference frame can be shown
                pToShow = pFrameList;
                break;
            }
        }

        // save the previous reference frame
        if (pFrameList->IsReference())
             pPrevRef = pFrameList;

        // get the next frame
        pFrameList = pFrameList->GetNext();
    }
    // show the last reference
    if (NULL == pFrameList)
    {
        pToShow = pPrevRef;
    }

    if (pToShow)
    {
        // save parameters
        m_pFrame = pToShow;

        return true;
    }

    return false;

} // bool AVSColorProcessingUnit::LoadJob(AVSListElement<AVSFrame> *pFrameList)

void AVSColorProcessingUnit::DoJob(void)
{
    AVS_COLOR_CONVERTING_CONTEXT &ctx = m_pFrame->m_cnvCtx;
    Status umcRes;

    // prepare source data
    umcRes = ctx.m_picSrc.Init(m_pFrame->m_sizeLuma.width,
                               m_pFrame->m_sizeLuma.height,
                               m_pFrame->m_colorFormat);
    if (UMC_OK == umcRes)
    {
        size_t nFrameSize = m_pFrame->GetBufferSize();
        ctx.m_picSrc.SetBufferPointer(m_pFrame->m_pPlanes8u[0],
                                      nFrameSize);
        ctx.m_picSrc.SetPlanePointer(m_pFrame->m_pPlanes8u[0], 0);
        ctx.m_picSrc.SetPlanePitch(m_pFrame->m_iPitch, 0);
        ctx.m_picSrc.SetPlanePointer(m_pFrame->m_pPlanes8u[1], 1);
        ctx.m_picSrc.SetPlanePitch(m_pFrame->m_iPitch, 1);
        ctx.m_picSrc.SetPlanePointer(m_pFrame->m_pPlanes8u[2], 2);
        ctx.m_picSrc.SetPlanePitch(m_pFrame->m_iPitch, 2);
        ctx.m_picSrc.SetDataSize(nFrameSize);

        // do color conversion
        m_pConverter->GetFrame(&ctx.m_picSrc, ctx.m_pPicDst);
    }

    // adjust parameters
    UnloadJob();

} // void AVSColorProcessingUnit::DoJob(void)

void AVSColorProcessingUnit::HandleError(void)
{
    // adjust parameters
    UnloadJob();

} // void AVSColorProcessingUnit::HandleError(void)

AVSTaskID AVSColorProcessingUnit::GetTaskID(void)
{
    return AVS_TASK_COLOR_CONVERSION;

} // AVSTaskID AVSColorProcessingUnit::GetTaskID(void)

void AVSColorProcessingUnit::UnloadJob(void)
{
    AutomaticMutex guard(m_pGuard->ExtractHandle());

    m_pFrame->SetShown();

} // void AVSColorProcessingUnit::UnloadJob(void)

} // namespace UMC

#endif // #if defined(UMC_ENABLE_AVS_VIDEO_DECODER)

⌨️ 快捷键说明

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