📄 umc_avs_dec_processing_unit_cc.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 + -