public MacroBlockPrediction(byte mbtype, MacroBlockLayer mbl) { _mbType = mbtype; _mbLayer = mbl; }
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 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); }