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

📄 umc_h264_segment_decoder_templates.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 5 页
字号:
/*
//
//              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 + -