📄 umc_h264_segment_decoder_templates.h
字号:
/*
//
// 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) 2003-2007 Intel Corporation. All Rights Reserved.
//
//
*/
#include "umc_defs.h"
#if defined (UMC_ENABLE_H264_VIDEO_DECODER)
#ifndef __UMC_H264_SEGMENT_DECODER_TEMPLATES_H
#define __UMC_H264_SEGMENT_DECODER_TEMPLATES_H
#include "umc_h264_dec_internal_cabac.h"
#include "umc_h264_reconstruct_templates.h"
#include "umc_h264_redual_decoder_templates.h"
#include "umc_h264_timing.h"
namespace UMC
{
#pragma warning(disable: 4127)
template <Ipp32s color_format, typename Coeffs, typename PlaneY, typename PlaneUV, Ipp32s is_field>
class ColorSpecific
{
public:
static inline void UpdateNeighbouringBlocks(H264SegmentDecoderMultiThreaded * sd)
{
switch(color_format)
{
case 3:
sd->UpdateNeighbouringBlocksH4();
break;
case 2:
sd->UpdateNeighbouringBlocksH2();
break;
default:
// field of frame case
if (!sd->m_isMBAFF)
{
H264DecoderBlockNeighboursInfo *p = &(sd->m_cur_mb.CurrentBlockNeighbours);
H264DecoderMacroblockNeighboursInfo *pMBs = &(sd->m_cur_mb.CurrentMacroblockNeighbours);
p->mbs_left[0].mb_num =
p->mbs_left[1].mb_num =
p->mbs_left[2].mb_num =
p->mbs_left[3].mb_num = pMBs->mb_A;
p->mb_above.mb_num = pMBs->mb_B;
p->mb_above_right.mb_num = pMBs->mb_C;
p->mb_above_left.mb_num = pMBs->mb_D;
p->mbs_left_chroma[0][0].mb_num =
p->mbs_left_chroma[0][1].mb_num =
p->mbs_left_chroma[1][0].mb_num =
p->mbs_left_chroma[1][1].mb_num = pMBs->mb_A;
p->mb_above_chroma[0].mb_num =
p->mb_above_chroma[1].mb_num = pMBs->mb_B;
if (0 == p->m_bInited)
{
p->mbs_left[0].block_num = 3;
p->mbs_left[1].block_num = 7;
p->mbs_left[2].block_num = 11;
p->mbs_left[3].block_num = 15;
p->mb_above.block_num = 12;
p->mb_above_right.block_num = 12;
p->mb_above_left.block_num = 15;
p->mbs_left_chroma[0][0].block_num = 17;
p->mbs_left_chroma[0][1].block_num = 19;
p->mbs_left_chroma[1][0].block_num = 21;
p->mbs_left_chroma[1][1].block_num = 23;
p->mb_above_chroma[0].block_num = 18;
p->mb_above_chroma[1].block_num = 22;
// set the init flag
p->m_bInited = 1;
}
}
else
{
sd->UpdateNeighbouringBlocksBMEH();
}
break;
}
}
static inline Ipp32u GetChromaAC()
{
switch(color_format)
{
case 3:
return D_CBP_CHROMA_AC_444;
case 2:
return D_CBP_CHROMA_AC_422;
default:
return D_CBP_CHROMA_AC_420;
}
}
static inline IppStatus ReconstructChromaIntra4x4MB_Swit(Coeffs **ppSrcDstCoeff,
PlaneUV *pSrcDstUPlane,
PlaneUV *pSrcDstVPlane,
Ipp32u srcdstUVStep,
IppIntraChromaPredMode_H264 intra_chroma_mode,
Ipp32u cbpU,
Ipp32u cbpV,
Ipp32u chromaQPU,
Ipp32u chromaQPV,
Ipp32u levelScaleDCU,
Ipp32u levelScaleDCV,
Ipp8u edge_type,
Ipp16s *pQuantTableU,
Ipp16s *pQuantTableV,
Ipp8u bypass_flag,
Ipp32s bit_depth = 8)
{
switch(color_format)
{
case 3:
return ReconstructChromaIntra4x4MB444(ppSrcDstCoeff,
pSrcDstUPlane,
pSrcDstVPlane,
srcdstUVStep,
intra_chroma_mode,
cbpU,
cbpV,
chromaQPU,
chromaQPV,
edge_type,
pQuantTableU,
pQuantTableV,
bypass_flag,
bit_depth);
case 2:
return ReconstructChromaIntra4x4MB422(ppSrcDstCoeff,
pSrcDstUPlane,
pSrcDstVPlane,
srcdstUVStep,
intra_chroma_mode,
cbpU,
cbpV,
chromaQPU,
chromaQPV,
levelScaleDCU,
levelScaleDCV,
edge_type,
pQuantTableU,
pQuantTableV,
bypass_flag,
bit_depth);
default:
return ReconstructChromaIntra4x4MB(ppSrcDstCoeff,
pSrcDstUPlane,
pSrcDstVPlane,
srcdstUVStep,
intra_chroma_mode,
cbpU,
cbpV,
chromaQPU,
chromaQPV,
edge_type,
pQuantTableU,
pQuantTableV,
bypass_flag,
bit_depth);
}
}
static inline IppStatus ReconstructChromaInter4x4MB_Swit(Coeffs **ppSrcDstCoeff,
PlaneUV *pSrcDstUPlane,
PlaneUV *pSrcDstVPlane,
Ipp32u srcdstUVStep,
Ipp32u cbpU,
Ipp32u cbpV,
Ipp32u chromaQPU,
Ipp32u chromaQPV,
Ipp32u levelScaleDCU,
Ipp32u levelScaleDCV,
Ipp16s *pQuantTableU,
Ipp16s *pQuantTableV,
Ipp8u bypass_flag,
Ipp32s bit_depth = 8)
{
switch(color_format)
{
case 3:
return ReconstructChromaInter4x4MB444(ppSrcDstCoeff,
pSrcDstUPlane,
pSrcDstVPlane,
srcdstUVStep,
cbpU,
cbpV,
chromaQPU,
chromaQPV,
pQuantTableU,
pQuantTableV,
bypass_flag,
bit_depth);
case 2:
return ReconstructChromaInter4x4MB422(ppSrcDstCoeff,
pSrcDstUPlane,
pSrcDstVPlane,
srcdstUVStep,
cbpU,
cbpV,
chromaQPU,
chromaQPV,
levelScaleDCU,
levelScaleDCV,
pQuantTableU,
pQuantTableV,
bypass_flag,
bit_depth);
default:
return ReconstructChromaInter4x4MB(ppSrcDstCoeff,
pSrcDstUPlane,
pSrcDstVPlane,
srcdstUVStep,
cbpU,
cbpV,
chromaQPU,
chromaQPV,
pQuantTableU,
pQuantTableV,
bypass_flag,
bit_depth);
}
}
};
class SegmentDecoderHPBase
{
public:
virtual ~SegmentDecoderHPBase() {}
virtual Status DecodeSegmentCAVLC(Ipp32u nCurMBNumber, Ipp32u &nMaxMBNumber,
H264SegmentDecoderMultiThreaded * sd) = 0;
virtual Status DecodeSegmentCAVLC_Single(Ipp32s *pnCurMBNumber, Ipp32s nMacroBlocksToDecode,
H264SegmentDecoderMultiThreaded * sd) = 0;
virtual Status DecodeSegmentCABAC(Ipp32u nCurMBNumber, Ipp32u &nMaxMBNumber, H264SegmentDecoderMultiThreaded * sd) = 0;
virtual Status DecodeSegmentCABAC_Single(Ipp32s *pnCurMBNumber, Ipp32s nMacroBlocksToDecode,
H264SegmentDecoderMultiThreaded * sd) = 0;
virtual Status ReconstructSegment(Ipp32u nCurMBNumber,Ipp32u nMaxMBNumber,
H264SegmentDecoderMultiThreaded * sd) = 0;
virtual Status Reconstruct_DXVA_Single(Ipp32s *pnCurMBNumber, Ipp32s nMacroBlocksToDecode,
H264SegmentDecoderMultiThreaded * sd) = 0;
virtual void RestoreErrorRect(Ipp32s startMb, Ipp32s endMb, H264DecoderFrame *pRefFrame,
H264SegmentDecoderMultiThreaded * sd) = 0;
};
template <typename Coeffs, typename PlaneY, typename PlaneUV, Ipp32s color_format, Ipp32s is_field, bool is_high_profile>
class MBDecoder :
public ResidualDecoderCABAC<Coeffs, color_format, is_field>,
public ResidualDecoderCAVLC<Coeffs, color_format, is_field>,
public ResidualDecoderPCM<Coeffs, PlaneY, PlaneUV, color_format, is_field>
{
public:
void DecodeMacroblock_ISlice_CABAC(H264SegmentDecoderMultiThreaded *sd)
{
// reset macroblock info
memset(sd->m_cur_mb.LocalMacroblockInfo, 0, sizeof(H264DecoderMacroblockLocalInfo));
memset(sd->m_cur_mb.GlobalMacroblockInfo->sbtype, 0, sizeof(sd->m_cur_mb.GlobalMacroblockInfo->sbtype));
sd->m_cur_mb.LocalMacroblockInfo->QP = (Ipp8s) sd->m_QuantPrev;
sd->m_cur_mb.GlobalMacroblockInfo->slice_id = (Ipp16s) sd->m_pSlice->GetSliceNum();
memset((void *) sd->m_cur_mb.RefIdxs[0], -1, sizeof(H264DecoderMacroblockRefIdxs));
memset((void *) sd->m_cur_mb.RefIdxs[1], -1, sizeof(H264DecoderMacroblockRefIdxs));
// decode macroblock field flag
if (sd->m_isMBAFF)
{
if (0 == (sd->m_CurMBAddr & 1))
sd->DecodeMBFieldDecodingFlag_CABAC();
}
else
pSetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo, 0);
// update neighbouring addresses
sd->UpdateNeighbouringAddresses();
// update neighbouring block positions
ColorSpecific<color_format, Coeffs, PlaneY, PlaneUV, is_field>::UpdateNeighbouringBlocks(sd);
// First decode the "macroblock header", e.g., macroblock type,
// intra-coding types.
sd->DecodeMBTypeISlice_CABAC();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -