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

📄 umc_vc1_dec_pic_com_adv.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        (DecoderPicHeader)(DecodeFieldHeaderParams_InterlaceFieldBpicture_Adv),
        (DecoderPicHeader)(DecodeFieldHeaderParams_InterlaceFieldIpicture_Adv),
        (DecoderPicHeader)(DecodeSkippicture)
    }
};

VC1Status DecodePicHeader(VC1Context* pContext)
{
   VC1Status vc1Sts = VC1_OK;

   vc1Sts = DecoderPicHeader_table[pContext->m_picLayerHeader->FCM][pContext->m_picLayerHeader->PTYPE](pContext);

   return vc1Sts;
}

VC1Status DecodeSkippicture(VC1Context* pContext)
{
    VC1Status vc1Sts = VC1_OK;

    ippsCopy_8u(pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
                pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iCurrIndex].m_pAllocatedMemory,
                pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);

    return vc1Sts;
}

VC1Status DecodePictHeaderParams_InterlaceFieldPicture_Adv (VC1Context* pContext)
{
    VC1Status vc1Sts = VC1_OK;
    Ipp32u i = 0;
    Ipp32u tempValue;
    Ipp32u RFF = 0;
    Ipp32u number_of_pan_scan_window;
    VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader;
    VC1SequenceLayerHeader* seqLayerHeader = pContext->m_seqLayerHeader;


    VC1_GET_BITS(3, tempValue);
    switch(tempValue)
    {
    case 0:
        //000  - I,I
        picLayerHeader->PTypeField1 = VC1_I_FRAME;
        picLayerHeader->PTypeField2 = VC1_I_FRAME;
        break;
    case 1:
        //001 - I,P
        picLayerHeader->PTypeField1 = VC1_I_FRAME;
        picLayerHeader->PTypeField2 = VC1_P_FRAME;
        break;
    case 2:
        //010 - P,I
        picLayerHeader->PTypeField1 = VC1_P_FRAME;
        picLayerHeader->PTypeField2 = VC1_I_FRAME;
        break;
    case 3:
        //011 - P,P
        picLayerHeader->PTypeField1 = VC1_P_FRAME;
        picLayerHeader->PTypeField2 = VC1_P_FRAME;
        break;
    case 4:
        //100 - B,B
        picLayerHeader->PTypeField1 = VC1_B_FRAME;
        picLayerHeader->PTypeField2 = VC1_B_FRAME;
        break;
    case 5:
        //101 - B,BI
        picLayerHeader->PTypeField1 = VC1_B_FRAME;
        picLayerHeader->PTypeField2 = VC1_BI_FRAME;
        break;
    case 6:
        //110 - BI,B
        picLayerHeader->PTypeField1 = VC1_BI_FRAME;
        picLayerHeader->PTypeField2 = VC1_B_FRAME;
        break;
    case 7:
        //111 - BI,BI
        picLayerHeader->PTypeField1 = VC1_BI_FRAME;
        picLayerHeader->PTypeField2 = VC1_BI_FRAME;
        break;
    default:
        VM_ASSERT(0);
        break;
    }

    if(seqLayerHeader->TFCNTRFLAG)
    {
        //temporal reference frame counter
        VC1_GET_BITS(8, tempValue);       //TFCNTR
    }

    if(seqLayerHeader->PULLDOWN)
    {
       if(!(seqLayerHeader->INTERLACE))
       {
          //repeat frame count
          VC1_GET_BITS(2,tempValue);//RPTFRM
       }
       else
       {
           Ipp32u tff;
          //top field first
          VC1_GET_BITS(1, tff);
          picLayerHeader->TFF = (Ipp8u)tff;
          //repeat first field
          VC1_GET_BITS(1, RFF);
       }
    } else
        picLayerHeader->TFF = 1;

    if(seqLayerHeader->PANSCAN_FLAG)
    {
        //pan scan present flag
        VC1_GET_BITS(1,tempValue);       //PS_PRESENT

        if(tempValue)       //PS_PRESENT
        {
         //calculate number ofpan scan window, see standard, p177

          if(seqLayerHeader->PULLDOWN)
          {
            number_of_pan_scan_window = 2 + RFF;
          }
          else
          {
             number_of_pan_scan_window = 2;
          }

          //fill in pan scan window struture
          for (i = 0; i<number_of_pan_scan_window; i++)
          {
             //PS_HOFFSET
             VC1_GET_BITS(18,tempValue);
             //PS_VOFFSET
             VC1_GET_BITS(18,tempValue);
             //PS_WIDTH
             VC1_GET_BITS(14,tempValue);
             //PS_HEIGHT
             VC1_GET_BITS(14,tempValue);
           }
        }
    }
        //rounding control
        VC1_GET_BITS(1,picLayerHeader->RNDCTRL);

        //UV sampling format
        VC1_GET_BITS(1,tempValue);//UVSAMP

        if(seqLayerHeader->REFDIST_FLAG == 1 &&
            (picLayerHeader->PTypeField1 < VC1_B_FRAME &&
             picLayerHeader->PTypeField2 < VC1_B_FRAME
           /* (picLayerHeader->PTypeField1 == VC1_I_FRAME) &&
            (picLayerHeader->PTypeField2 == VC1_I_FRAME) ||
            (picLayerHeader->PTypeField1 == VC1_I_FRAME) &&
            (picLayerHeader->PTypeField2 == VC1_P_FRAME) ||
            (picLayerHeader->PTypeField1 == VC1_P_FRAME) &&
            (picLayerHeader->PTypeField2 == VC1_I_FRAME) ||
            (m_picLayerHeader->PTypeField1 == VC1_P_FRAME) &&
            (picLayerHeader->PTypeField2 == VC1_P_FRAME) */))
        {
                Ipp32s ret;
                ret = ippiDecodeHuffmanOne_1u32s (
                                    &pContext->m_bitstream.pBitstream,
                                    &pContext->m_bitstream.bitOffset,
                                    &picLayerHeader->REFDIST,
                                    pContext->m_vlcTbl->REFDIST_TABLE);
                VM_ASSERT(ret == ippStsNoErr);

                *pContext->pRefDist = picLayerHeader->REFDIST;
        }
        else if(seqLayerHeader->REFDIST_FLAG == 0)
        {
             *pContext->pRefDist = 0;
             picLayerHeader->REFDIST = 0;
        }
        else
        {
            picLayerHeader->REFDIST = 0;
        }

        if(seqLayerHeader->REFDIST_FLAG == 1 &&
        (
              (picLayerHeader->PTypeField1 >= VC1_B_FRAME &&
             picLayerHeader->PTypeField2 >= VC1_B_FRAME))
              /*(picLayerHeader->PTypeField1 == VC1_B_FRAME) &&
              (picLayerHeader->PTypeField2 == VC1_B_FRAME) ||
              (picLayerHeader->PTypeField1 == VC1_B_FRAME) &&
              (picLayerHeader->PTypeField2 == VC1_BI_FRAME)||
              (picLayerHeader->PTypeField1 == VC1_BI_FRAME)&&
              (picLayerHeader->PTypeField2 == VC1_B_FRAME) ||
              (picLayerHeader->PTypeField1 == VC1_BI_FRAME)&&
              (picLayerHeader->PTypeField2 == VC1_BI_FRAME)*/
         )
        {
           //B picture fraction
           Ipp8s  z1;
           Ipp16s z2;
           ippiDecodeHuffmanPair_1u16s(&pContext->m_bitstream.pBitstream,
                                        &pContext->m_bitstream.bitOffset,
                                         pContext->m_vlcTbl->BFRACTION,
                                        &z1, &z2);
           VM_ASSERT (z2 != VC1_BRACTION_INVALID);
           VM_ASSERT (!(z2 == VC1_BRACTION_BI && seqLayerHeader->PROFILE==VC1_PROFILE_ADVANCED));

           picLayerHeader->BFRACTION = (z1*2>=z2)?1:0;
           picLayerHeader->ScaleFactor = ((256+z2/2)/z2)*z1;
        }

    if(picLayerHeader->CurrField == 0)
    {
        picLayerHeader->PTYPE = picLayerHeader->PTypeField1;
        picLayerHeader->BottomField = (Ipp8u)(1 - picLayerHeader->TFF);
    }
    else
    {
        picLayerHeader->BottomField = (Ipp8u)(picLayerHeader->TFF);
        picLayerHeader->PTYPE = picLayerHeader->PTypeField2;
    }

        return vc1Sts;
}

VC1Status Decode_FirstField_Adv(VC1Context* pContext)
{
    VC1Status vc1Sts = VC1_OK;
    VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader;

    picLayerHeader->BottomField = (Ipp8u)(1 - picLayerHeader->TFF);
    picLayerHeader->CurrField = 0;

    pContext->m_pSingleMB->slice_currMBYpos = 0;
    pContext->m_pSingleMB->m_currMBXpos = 0;

    picLayerHeader->PTYPE = picLayerHeader->PTypeField1;
    switch(picLayerHeader->PTypeField1)
    {
    case VC1_I_FRAME:
#ifdef VC1_DEBUG_ON
        VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES,
                                                VM_STRING("I frame type  \n"));
#endif
        Decode_InterlaceFieldIpicture_Adv(pContext);
        break;

    case VC1_P_FRAME:
#ifdef VC1_DEBUG_ON
        VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES,
                                                VM_STRING("P frame type  \n"));
#endif
        Decode_InterlaceFieldPpicture_Adv(pContext);
        break;

    case VC1_B_FRAME:
#ifdef VC1_DEBUG_ON
        VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES,
                                                VM_STRING("B frame type  \n"));
#endif
        Decode_InterlaceFieldBpicture_Adv(pContext);
        break;

    case VC1_BI_FRAME:
#ifdef VC1_DEBUG_ON
        VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES,
                                                VM_STRING("BI frame type  \n"));
#endif
        Decode_InterlaceFieldIpicture_Adv(pContext);
        break;
    default:
        break;
    }

    ExpandFrame_Field(pContext,
                      &pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iCurrIndex],
                      picLayerHeader->BottomField);

    return vc1Sts;
}

VC1Status Decode_SecondField_Adv(VC1Context* pContext)
{
    VC1Status vc1Sts = VC1_OK;
    VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader;

    picLayerHeader->BottomField = (Ipp8u)picLayerHeader->TFF;
    picLayerHeader->PTYPE = picLayerHeader->PTypeField2;

    picLayerHeader->CurrField = 1;

    ExpandFrame_Field(pContext,
                      &pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iCurrIndex],
                      picLayerHeader->BottomField);

    return vc1Sts;

}
VC1Status Decode_FieldPictureLayer_Adv(VC1Context* pContext)
{
    VC1Status vc1Sts = VC1_OK;
    Ipp32u temp_value;

    VC1_GET_BITS(1,temp_value);

    while(!(pContext->m_bitstream.bitOffset == 7||
            pContext->m_bitstream.bitOffset == 15 ||
            pContext->m_bitstream.bitOffset == 23 ||
            pContext->m_bitstream.bitOffset == 31 ))
            VC1_GET_BITS(1,temp_value);

   return vc1Sts;
}

#endif //UMC_ENABLE_VC1_VIDEO_DECODER


⌨️ 快捷键说明

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