コード例 #1
0
        // 7.3.5.1 Macroblock prediction syntax
        private void MacroBlockPrediction(IMacroblockType macroBlockType)
        {
            if (macroBlockType.IsIntra4X4 || macroBlockType.IsIntra16X16)
            {
                if (macroBlockType.IsIntra4X4)
                {
                    int lumaSubBlocks = _mbFlags.TransformSize8X8Flag ? 4 : 16;
                    for (int i = 0; i < lumaSubBlocks; i++)
                    {
                        if (GetPrevIntra4X4PredModeFlag() == 0)                   // prev_intra4x4_pred_mode_flag[luma4x4BlkIdx])
                        {
                            GetRemIntra4X4PredMode();                             // rem_intra4x4_pred_mode[luma4x4BlkIdx]
                        }
                    }
                }
                if (_sequenceState.IsChromaSubsampling)
                {
                    GetIntraChromaPredMode();                     // intra_chroma_pred_mode
                }
            }
            else if (!macroBlockType.IsDirect)
            {
                uint numMbPart = macroBlockType.NumMbPart;                 // either 1 or 2
                MacroblockPartitioning macroblockPartitioning = macroBlockType.MacroblockPartitioning;

                uint referencePictureCount0 = _sliceState.ActiveReferencePictureCount0;                //defaults to _pictureState.DefaultReferencePictureCount0;
                if (HasReferencePictureIndex(referencePictureCount0))
                {
                    var referencePictureIndex = new ReferencePictureIndex(_mbStateA.RefIdxL0, _mbStateB.RefIdxL0);
                    for (uint i = 0; i < numMbPart; i++)
                    {
                        if (macroBlockType.IsList0Predicted(i))
                        {
                            uint idx = macroblockPartitioning[i].Idx;
                            if (GetReferencePicture(referencePictureCount0, referencePictureIndex.GetCtxIdxInc(idx)))                             // ref_idx_l0[ mbPartIdx ]
                            {
                                referencePictureIndex.SetNonZeroRefIdx(idx);
                            }
                        }
                    }
                    _currMbState.RefIdxL0 = referencePictureIndex.Bits;
                }

                uint referencePictureCount1 = _sliceState.ActiveReferencePictureCount1;                //defaults to _pictureState.DefaultReferencePictureCount1;
                if (HasReferencePictureIndex(referencePictureCount1))
                {
                    var referencePictureIndex = new ReferencePictureIndex(_mbStateA.RefIdxL1, _mbStateB.RefIdxL1);
                    for (uint i = 0; i < numMbPart; i++)
                    {
                        if (macroBlockType.IsList1Predicted(i))
                        {
                            uint idx = macroblockPartitioning[i].Idx;
                            if (GetReferencePicture(referencePictureCount1, referencePictureIndex.GetCtxIdxInc(idx)))                             // ref_idx_l1[ mbPartIdx ]
                            {
                                referencePictureIndex.SetNonZeroRefIdx(idx);
                            }
                        }
                    }
                    _currMbState.RefIdxL1 = referencePictureIndex.Bits;
                }

                for (uint i = 0; i < numMbPart; i++)
                {
                    if (macroBlockType.IsList0Predicted(i))
                    {
                        GetMotionVector(_motionFieldL0, macroblockPartitioning[i]);                         // mvd_l0[ i ][ 0 ][ compIdx ]
                    }
                }
                for (uint i = 0; i < numMbPart; i++)
                {
                    if (macroBlockType.IsList1Predicted(i))
                    {
                        GetMotionVector(_motionFieldL1, macroblockPartitioning[i]);                         // mvd_l1[ i ][ 0 ][ compIdx ]
                    }
                }
            }
        }
コード例 #2
0
        // 7.3.5.1 Macroblock prediction syntax
        private void MacroBlockPrediction(IMacroblockType macroBlockType, bool transformSize8X8Flag)
        {
            if (macroBlockType.IsIntra4X4 || macroBlockType.IsIntra16X16)
            {
                if (macroBlockType.IsIntra4X4)
                {
                    uint lumaSubBlocks = transformSize8X8Flag ? 4U : 16U;
                    for (uint i = 0; i < lumaSubBlocks; i++)
                    {
                        if (!_reader.GetBit())                         // prev_intra4x4_pred_mode_flag[luma4x4BlkIdx])
                        {
                            _reader.GetBits(3);                        // rem_intra4x4_pred_mode[luma4x4BlkIdx]
                        }
                    }
                }
                if (_sequenceState.IsChromaSubsampling)
                {
                    _reader.GetExpGolombCoded();                     // intra_chroma_pred_mode
                }
            }
            else if (!macroBlockType.IsDirect)
            {
                uint numMbPart = macroBlockType.NumMbPart;                              // either 1 or 2

                uint referencePictureCount0 = _sliceState.ActiveReferencePictureCount0; //defaults to _pictureState.DefaultReferencePictureCount0;
                if (HasReferencePictureIndex(referencePictureCount0))
                {
                    for (uint i = 0; i < numMbPart; i++)
                    {
                        if (macroBlockType.IsList0Predicted(i))
                        {
                            GetReferencePicture(referencePictureCount0);                             // ref_idx_l0[ mbPartIdx ]
                        }
                    }
                }

                uint referencePictureCount1 = _sliceState.ActiveReferencePictureCount1;                //defaults to _pictureState.DefaultReferencePictureCount1;
                if (HasReferencePictureIndex(referencePictureCount1))
                {
                    for (uint i = 0; i < numMbPart; i++)
                    {
                        if (macroBlockType.IsList1Predicted(i))
                        {
                            GetReferencePicture(referencePictureCount1);                             // ref_idx_l1[ mbPartIdx ]
                        }
                    }
                }

                for (uint i = 0; i < numMbPart; i++)
                {
                    if (macroBlockType.IsList0Predicted(i))
                    {
                        GetMotionVector();                         // mvd_l0[ i ][ 0 ][ compIdx ]
                    }
                }
                for (uint i = 0; i < numMbPart; i++)
                {
                    if (macroBlockType.IsList1Predicted(i))
                    {
                        GetMotionVector();                         // mvd_l1[ i ][ 0 ][ compIdx ]
                    }
                }
            }
        }