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

📄 umc_vc1_enc_mb.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 4 页
字号:
            dx= dx>>1;
            dy= dy>>1;
        }

        index= 35 + 37*NotSkip - 1;

        ret = pCodedMB->PutBits(table[2*index], table[2*index+1]);
        if (ret != UMC::UMC_OK) return ret;
        if (m_bMVHalf)
        {
            sizeX -= sizeX>>3;
            sizeY -= sizeY>>3;
        }
        ret = pCodedMB->PutBits(dx, sizeX);
        if (ret != UMC::UMC_OK) return ret;

        ret = pCodedMB->PutBits(dy, sizeY);
        if (ret != UMC::UMC_OK) return ret;

#ifdef VC1_ENC_DEBUG_ON
    pDebug->SetMVDiff(dx, dy,(!bForward),-1);
#endif
    }
    return ret;
}
template <class T>  UMC::Status    WriteBlockAC( T*                      pCodedBlock,
                                                                    const sACTablesSet*     pACTablesSet,
                                                                    sACEscInfo*             pACEscInfo,
                                                                    Ipp8u                   blk)
{
    UMC::Status     err                    = UMC::UMC_OK;
    Ipp32s          i                      = 0;
    static const Ipp32s    nSubblk [4]     = {1,2,2,4};

    const Ipp32u    *pEncTable   = pACTablesSet->pEncTable;
    Ipp8u           nPairsBlock  = 0;

    for (Ipp32s nSubblock=0; nSubblock<nSubblk[m_tsType[blk]]; nSubblock++)
    {
        const Ipp8u     *pTableDR    = pACTablesSet->pTableDR;
        const Ipp8u     *pTableDL    = pACTablesSet->pTableDL;
        const Ipp8u     *pTableInd   = pACTablesSet->pTableInd;
        Ipp8u           nPairs       = m_nPairs[blk][nSubblock];

        if (nPairs == 0)
            continue;

        // put codes into bitstream
        i = 0;
        for (Ipp32s not_last = 1; not_last>=0; not_last--)
        {
            for (; i < nPairs - not_last; i++)
            {
                bool    sign = false;
                Ipp8u   run  = m_uRun [blk] [i+nPairsBlock];
                Ipp16s  lev  = m_iLevel[blk][i+nPairsBlock];

                Ipp8u mode = GetMode( run, lev, pTableDR, pTableDL, sign);

#ifdef VC1_ENC_DEBUG_ON
                pDebug->SetRLMode(mode, blk, i+nPairsBlock);
#endif

                switch (mode)
                {
                    case 3:
                        err = pCodedBlock->PutBits(pEncTable[0], pEncTable[1]); //ESCAPE
                        VC1_ENC_CHECK (err)
                        err = pCodedBlock->PutBits(0,2);                       //mode
                        VC1_ENC_CHECK (err)
                        err = pCodedBlock->PutBits(!not_last,1);               //last
                        VC1_ENC_CHECK (err)
                        if ((!pACEscInfo->levelSize) && (!pACEscInfo->runSize))
                        {
                            pACEscInfo->runSize = 6;
                            pACEscInfo->levelSize = (pACEscInfo->pLSizeTable[2*11 +1]==0)? 8:11;
                            pACEscInfo->levelSize = (pACEscInfo->pLSizeTable[2*pACEscInfo->levelSize + 1]<=0) ?
                                                            2 : pACEscInfo->levelSize;
                            err = pCodedBlock->PutBits(pACEscInfo->pLSizeTable[2*pACEscInfo->levelSize],
                                                    pACEscInfo->pLSizeTable[2*pACEscInfo->levelSize +1]);
                            VC1_ENC_CHECK (err)
                            err = pCodedBlock->PutBits(pACEscInfo->runSize - 3, 2);
                            VC1_ENC_CHECK (err)
                        }
                        err = pCodedBlock->PutBits(run,pACEscInfo->runSize);
                        VC1_ENC_CHECK (err)
                        err = pCodedBlock->PutBits(sign, 1);
                        VC1_ENC_CHECK (err)
                        if (lev>((1<<pACEscInfo->levelSize)-1))
                        {
                            lev =(1<<pACEscInfo->levelSize)-1;
                            m_iLevel[blk][i+nPairsBlock] = lev;
                        }
                        err = pCodedBlock->PutBits(lev,pACEscInfo->levelSize);
                        VC1_ENC_CHECK (err)
                        break;
                    case 2:
                    case 1:
                        err = pCodedBlock->PutBits(pEncTable[0], pEncTable[1]); //ESCAPE
                        VC1_ENC_CHECK (err)
                        err = pCodedBlock->PutBits(1,mode);                     //mode
                        VC1_ENC_CHECK (err)
                     case 0:
                        Ipp16s index = pTableInd[run] + lev;
                        err = pCodedBlock->PutBits(pEncTable[2*index], pEncTable[2*index + 1]);
                        VC1_ENC_CHECK (err)
                        err = pCodedBlock->PutBits(sign, 1);
                        VC1_ENC_CHECK (err)
                        break;

                }
            }

            pTableDR    = pACTablesSet->pTableDRLast;
            pTableDL    = pACTablesSet->pTableDLLast;
            pTableInd   = pACTablesSet->pTableIndLast;

        }
        nPairsBlock += m_nPairs[blk][nSubblock];
    }
    return UMC::UMC_OK;
}


   template <class T>
   UMC::Status   WriteVSTSMB (   T*                      pCodedBlock,
                                                    const Ipp16s           (*pTTMBVLC)[4][6])
   {
       UMC::Status err = UMC::UMC_OK;

       Ipp32s blk;

       for(blk=0;blk<6;blk++)
       {
           if (m_nPairs[blk][0] + m_nPairs[blk][1] + m_nPairs[blk][2]+ m_nPairs[blk][3])
               break;
       }

       m_uiFirsrCodedBlock    = blk;
       eTransformType MBtype  = m_tsType[blk];
       Ipp8u          subPat  = ((m_nPairs[blk][0]>0)<<1) + (m_nPairs[blk][1]>0);
       subPat = (subPat>0)?subPat-1:subPat;

       err = pCodedBlock->PutBits(pTTMBVLC[m_bMBTSType][MBtype][2*subPat],pTTMBVLC[m_bMBTSType][MBtype][2*subPat+1] );
       return err;
   }

   template <class T>
   UMC::Status  WriteVSTSBlk (    T*                      pCodedBlock,
                                                      const Ipp8u            (*pTTBLKVLC)[6],
                                                      const Ipp8u*            pSBP4x4Table,
                                                      bool                    bVTS,
                                                      Ipp8u                   blk)
   {
       UMC::Status     err                    = UMC::UMC_OK;
       eTransformType  type                   = m_tsType[blk];

       if (m_nPairs[blk][0] + m_nPairs[blk][1] + m_nPairs[blk][2]+ m_nPairs[blk][3]==0)
            return err;

        if (bVTS && !m_bMBTSType && blk!= m_uiFirsrCodedBlock)
        {
            Ipp8u          subPat  = ((m_nPairs[blk][0]>0)<<1) + (m_nPairs[blk][1]>0);

            subPat = (subPat>0)?subPat-1:subPat;

            assert(subPat < 4);

            //block level transform type
            err = pCodedBlock->PutBits(pTTBLKVLC[type][2*subPat],pTTBLKVLC[type][2*subPat+1] );
            VC1_ENC_CHECK (err)
        }
        if (type == VC1_ENC_4x4_TRANSFORM)
        {
            Ipp8u          subPat  = ((m_nPairs[blk][0]>0)<<3) + ((m_nPairs[blk][1]>0)<<2)+
                                     ((m_nPairs[blk][2]>0)<<1) +  (m_nPairs[blk][3]>0);
             //VC1_ENC_4x4_TRANSFORM
            err = pCodedBlock->PutBits(pSBP4x4Table[2*subPat],pSBP4x4Table[2*subPat+1] );
            VC1_ENC_CHECK (err)
        }
        else if (type != VC1_ENC_8x8_TRANSFORM &&
                (m_bMBTSType && blk!= m_uiFirsrCodedBlock || !bVTS))
        {
            Ipp8u          subPat  = ((m_nPairs[blk][0]>0)<<1) + (m_nPairs[blk][1]>0) - 1;
            //if MB level or frame level
            err = pCodedBlock->PutBits(SubPattern8x4_4x8VLC[2*subPat],SubPattern8x4_4x8VLC[2*subPat+1] );
            VC1_ENC_CHECK (err)
        }
        return err;

   }
   template <class T>
   UMC::Status WriteMBHeaderP_INTRA    ( T*              pCodedMB,
                                                            bool            bBitplanesRaw,
                                                            const Ipp16u*   pMVDiffTable,
                                                            const Ipp16u*   pCBPCYTable)
{
    UMC::Status     err     =   UMC::UMC_OK;
    if (!pCodedMB)
        return UMC::UMC_ERR_NULL_PTR;

    bool coded = ((m_nPairs[0][0] +  m_nPairs[1][0]+
                  m_nPairs[2][0] +  m_nPairs[3][0] +
                  m_nPairs[4][0] +  m_nPairs[5][0])>0); //only 8x8 transform


    if (bBitplanesRaw)
    {
        err = pCodedMB->PutBits(0,1); //if intra, then non-skip
        VC1_ENC_CHECK (err)
    }

    err = WriteMVDataPIntra(pCodedMB,pMVDiffTable);
    VC1_ENC_CHECK (err)


    if (coded ==0)
    {
        //err = WriteMBQuantParameter(pCodedMB, doubleQuant>>1);
        //VC1_ENC_CHECK (err)

        err = pCodedMB->PutBits(m_bACPrediction,1);
        VC1_ENC_CHECK (err)

    }
    else
    {
        err = pCodedMB->PutBits(m_bACPrediction,1);
        VC1_ENC_CHECK (err)
        err = pCodedMB->PutBits(pCBPCYTable[2*(m_uiMBCBPCY&0x3F)], pCBPCYTable[2*(m_uiMBCBPCY&0x3F)+1]);
        VC1_ENC_CHECK (err)
        //err = WriteMBQuantParameter(pCodedPicture, doubleQuant>>1);
        //VC1_ENC_CHECK (err)
    }
    return err;
}
   template <class T>
   UMC::Status WriteMBHeaderB_INTRA    ( T*              pCodedMB,
                                                            bool            bBitplanesRaw,
                                                            const Ipp16u*   pMVDiffTable,
                                                            const Ipp16u*   pCBPCYTable)
   {
        UMC::Status     err     =   UMC::UMC_OK;
        if (!pCodedMB)
            return UMC::UMC_ERR_NULL_PTR;
        if (bBitplanesRaw)
        {
            err = pCodedMB->PutBits(0,1); //non directMB
            VC1_ENC_CHECK (err)
        }
        return WriteMBHeaderP_INTRA (pCodedMB,bBitplanesRaw,pMVDiffTable,pCBPCYTable);
   }
   template <class T>  UMC::Status   WritePMB1MV (T*                     pCodedBlock,
                                                                     bool                   bRawBitplanes,
                                                                     Ipp8u                  MVTab,
                                                                     Ipp8u                  MVRangeIndex,
                                                                     const Ipp16u*          pCBPCYTable,
                                                                     bool                   bVTS,
                                                                     const Ipp16s           (*pTTMBVLC)[4][6],
                                                                     const Ipp8u            (*pTTBLKVLC)[6],
                                                                     const Ipp8u*           pSBP4x4Table,
                                                                     const sACTablesSet*    pACTablesSet,
                                                                     sACEscInfo*            pACEscInfo)

   {
    UMC::Status  err=UMC::UMC_OK;
    Ipp32s       blk;

    if (bRawBitplanes)
    {
        err = pCodedBlock->PutBits(0,1);//skip
        VC1_ENC_CHECK (err)
    }
    err = WriteMVDataInter(pCodedBlock, MVDiffTablesVLC[MVTab],MVRangeIndex, m_uiMBCBPCY!=0);
    VC1_ENC_CHECK (err)

    if (m_bHybrid)
    {
        err = pCodedBlock->PutBits(m_bHybrid-1,1); // Hybrid
        VC1_ENC_CHECK (err)
    }

    if (m_uiMBCBPCY!=0)
    {

        err = pCodedBlock->PutBits(pCBPCYTable[2*(m_uiMBCBPCY&0x3F)], pCBPCYTable[2*(m_uiMBCBPCY&0x3F)+1]);
        VC1_ENC_CHECK (err)
            //err = WriteMBQuantParameter(pCodedPicture, doubleQuant>>1);
            //VC1_ENC_CHECK (err)

        if (bVTS)
        {
            err = WriteVSTSMB (pCodedBlock, pTTMBVLC);
            VC1_ENC_CHECK (err)
        }

        for (blk = 0; blk<6; blk++)
        {

            err = WriteVSTSBlk ( pCodedBlock,
                pTTBLKVLC,
                pSBP4x4Table,
                bVTS,
                blk);

            VC1_ENC_CHECK (err)

                err = WriteBlockAC(pCodedBlock,
                pACTablesSet,
                pACEscInfo,
                blk);

            VC1_ENC_CHECK (err)

        }//for

    }//MBPattern!=0
    return err;
  }
 template <class T>  UMC::Status   WriteBMB_DIRECT      (T*                     pCodedBlock,
                                                                            bool                   bRawBitplanes,
                                                                            const Ipp16u*          pCBPCYTable,
                                                                            bool                   bVTS,
                                                                            const Ipp16s           (*pTTMBVLC)[4][6],
                                                                            const Ipp8u            (*pTTBLKVLC)[6],
                                                                            const Ipp8u*           pSBP4x4Table,
                                                                            const sACTablesSet*    pACTablesSet,
                                                                            sACEscInfo*            pACEscInfo)
  {
    UMC::Status  err=UMC::UMC_OK;

⌨️ 快捷键说明

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