Example #1
0
 public MacroBlockPrediction(byte mbtype, MacroBlockLayer mbl)
 {
     _mbType  = mbtype;
     _mbLayer = mbl;
 }
Example #2
0
        public void Read(BitReader bitReader)
        {
            if (_pps.EntropyCodingModeFlag)
            {
                while (!bitReader.ByteAligned)
                {
                    if ((CABACAlignmentOneBit = bitReader.GetNextBit()) == false)
                    {
                        throw new Exception("Invalid entropy coding start for slice data");
                    }
                }
            }

            CurrMbAddr    = _header.FirstMBInSlice * (1u + (_header.MBaffFrameFlag ? 1u : 0u));
            moreDataFlag  = true;
            prevMbSkipped = false;
            do
            {
                if ((_header.SliceType != SliceTypes.I) && (_header.SliceType != SliceTypes.SI))
                {
                    if (!_pps.EntropyCodingModeFlag)
                    {
                        MBSkipRun     = bitReader.DecodeUnsignedExpGolomb();
                        prevMbSkipped = (MBSkipRun > 0);
                        for (int i = 0; i < MBSkipRun; i++)
                        {
                            CurrMbAddr = NextMBAddress(CurrMbAddr);
                        }
                        moreDataFlag = _nalu.MoreRBSPData(bitReader);
                    }
                    else
                    {
                        mbSkipFlag   = false; // FIXME: CABAC value bitReader.GetNextBit();
                        moreDataFlag = !mbSkipFlag;
                    }
                }

                if (moreDataFlag)
                {
                    if (_header.MBaffFrameFlag && (CurrMbAddr % 2 == 0 || (CurrMbAddr % 2 == 1 && prevMbSkipped)))
                    {
                        mbFieldDecodingFlag = false; // FIXME: CABAC value bitReader.GetNextBit();
                    }
                    MacroBlockLayer mbLayer = new MacroBlockLayer(_sps, _pps, _header, this);
                    mbLayer.Read(bitReader);
                }

                if (!_pps.EntropyCodingModeFlag)
                {
                    moreDataFlag = _nalu.MoreRBSPData(bitReader);
                }
                else
                {
                    if (_header.SliceType != SliceTypes.I && _header.SliceType != SliceTypes.SI)
                    {
                        prevMbSkipped = mbSkipFlag;
                    }
                    if (_header.MBaffFrameFlag && CurrMbAddr % 2 == 0)
                    {
                        moreDataFlag = true;
                    }
                    else
                    {
                        endOfSliceFlag = bitReader.GetNextBit(); // FIXME: random bit bec. residual is not read
                        moreDataFlag   = !endOfSliceFlag;
                    }
                }

                CurrMbAddr = NextMBAddress(CurrMbAddr);
            } while (moreDataFlag);
        }
 public MacroBlockPrediction(byte mbtype, MacroBlockLayer mbl)
 {
     _mbType = mbtype;
       _mbLayer = mbl;
 }
Example #4
0
        public void Read(BitReader bitReader)
        {
            if (_pps.EntropyCodingModeFlag)
              {
            while (!bitReader.ByteAligned)
              if ((CABACAlignmentOneBit = bitReader.GetNextBit()) == false)
            throw new Exception("Invalid entropy coding start for slice data");
              }

              CurrMbAddr = _header.FirstMBInSlice * (1u + (_header.MBaffFrameFlag ? 1u : 0u));
              moreDataFlag = true;
              prevMbSkipped = false;
              do
              {
            if ((_header.SliceType != SliceTypes.I) && (_header.SliceType != SliceTypes.SI))
            {
              if (!_pps.EntropyCodingModeFlag)
              {
            MBSkipRun = bitReader.DecodeUnsignedExpGolomb();
            prevMbSkipped = (MBSkipRun > 0);
            for (int i = 0; i < MBSkipRun; i++)
            {
              CurrMbAddr = NextMBAddress(CurrMbAddr);
            }
            moreDataFlag = _nalu.MoreRBSPData(bitReader);
              }
              else
              {
            mbSkipFlag = false; // FIXME: CABAC value bitReader.GetNextBit();
            moreDataFlag = !mbSkipFlag;
              }
            }

            if (moreDataFlag)
            {
              if (_header.MBaffFrameFlag && (CurrMbAddr % 2 == 0 || (CurrMbAddr % 2 == 1 && prevMbSkipped)))
              {
            mbFieldDecodingFlag = false; // FIXME: CABAC value bitReader.GetNextBit();
              }
              MacroBlockLayer mbLayer = new MacroBlockLayer(_sps, _pps, _header, this);
              mbLayer.Read(bitReader);
            }

            if (!_pps.EntropyCodingModeFlag)
              moreDataFlag = _nalu.MoreRBSPData(bitReader);
            else
            {
              if (_header.SliceType != SliceTypes.I && _header.SliceType != SliceTypes.SI)
            prevMbSkipped = mbSkipFlag;
              if (_header.MBaffFrameFlag && CurrMbAddr % 2 == 0)
            moreDataFlag = true;
              else
              {
            endOfSliceFlag = bitReader.GetNextBit(); // FIXME: random bit bec. residual is not read
            moreDataFlag = !endOfSliceFlag;
              }
            }

            CurrMbAddr = NextMBAddress(CurrMbAddr);

              } while (moreDataFlag);
        }