func (this *TEncEntropy) encodePUWise(pcCU *TLibCommon.TComDataCU, uiAbsPartIdx uint, bRD bool) { //= false ); if bRD { uiAbsPartIdx = 0 } ePartSize := pcCU.GetPartitionSize1(uiAbsPartIdx) var uiNumPU uint if ePartSize == TLibCommon.SIZE_2Nx2N { uiNumPU = 1 } else if ePartSize == TLibCommon.SIZE_NxN { uiNumPU = 4 } else { uiNumPU = 2 } uiDepth := uint(pcCU.GetDepth1(uiAbsPartIdx)) //fmt.Printf("ePartSize=%d\n",ePartSize); uiPUOffset := (TLibCommon.G_auiPUOffset[uint(ePartSize)] << ((pcCU.GetSlice().GetSPS().GetMaxCUDepth() - uiDepth) << 1)) >> 4 uiSubPartIdx := uiAbsPartIdx for uiPartIdx := uint(0); uiPartIdx < uiNumPU; uiPartIdx++ { this.encodeMergeFlag(pcCU, uiSubPartIdx) if pcCU.GetMergeFlag1(uiSubPartIdx) { this.encodeMergeIndex(pcCU, uiSubPartIdx, false) } else { this.encodeInterDirPU(pcCU, uiSubPartIdx) for uiRefListIdx := 0; uiRefListIdx < 2; uiRefListIdx++ { if pcCU.GetSlice().GetNumRefIdx(TLibCommon.RefPicList(uiRefListIdx)) > 0 { this.encodeRefFrmIdxPU(pcCU, uiSubPartIdx, TLibCommon.RefPicList(uiRefListIdx)) this.encodeMvdPU(pcCU, uiSubPartIdx, TLibCommon.RefPicList(uiRefListIdx)) this.encodeMVPIdxPU(pcCU, uiSubPartIdx, TLibCommon.RefPicList(uiRefListIdx)) } } } uiSubPartIdx += uiPUOffset } return }
func (this *TDecEntropy) DecodePUWise(pcCU *TLibCommon.TComDataCU, uiAbsPartIdx, uiDepth uint, pcSubCU *TLibCommon.TComDataCU) { ePartSize := pcCU.GetPartitionSize1(uiAbsPartIdx) var uiNumPU uint if ePartSize == TLibCommon.SIZE_2Nx2N { uiNumPU = 1 } else if ePartSize == TLibCommon.SIZE_NxN { uiNumPU = 4 } else { uiNumPU = 2 } uiPUOffset := (TLibCommon.G_auiPUOffset[uint(ePartSize)] << ((pcCU.GetSlice().GetSPS().GetMaxCUDepth() - uiDepth) << 1)) >> 4 var cMvFieldNeighbours [TLibCommon.MRG_MAX_NUM_CANDS << 1]TLibCommon.TComMvField // double length for mv of both lists var uhInterDirNeighbours [TLibCommon.MRG_MAX_NUM_CANDS]byte for ui := uint(0); ui < pcCU.GetSlice().GetMaxNumMergeCand(); ui++ { uhInterDirNeighbours[ui] = 0 } numValidMergeCand := 0 isMerged := false pcSubCU.CopyInterPredInfoFrom(pcCU, uiAbsPartIdx, TLibCommon.REF_PIC_LIST_0) pcSubCU.CopyInterPredInfoFrom(pcCU, uiAbsPartIdx, TLibCommon.REF_PIC_LIST_1) uiSubPartIdx := uiAbsPartIdx for uiPartIdx := uint(0); uiPartIdx < uiNumPU; uiPartIdx++ { this.DecodeMergeFlag(pcCU, uiSubPartIdx, uiDepth, uiPartIdx) if pcCU.GetMergeFlag1(uiSubPartIdx) { this.DecodeMergeIndex(pcCU, uiPartIdx, uiSubPartIdx, uiDepth) uiMergeIndex := pcCU.GetMergeIndex1(uiSubPartIdx) if pcCU.GetSlice().GetPPS().GetLog2ParallelMergeLevelMinus2() != 0 && ePartSize != TLibCommon.SIZE_2Nx2N && pcSubCU.GetWidth1(0) <= 8 { pcSubCU.SetPartSizeSubParts(TLibCommon.SIZE_2Nx2N, 0, uiDepth) if !isMerged { pcSubCU.GetInterMergeCandidates(0, 0, cMvFieldNeighbours[:], uhInterDirNeighbours[:], &numValidMergeCand, -1) isMerged = true } pcSubCU.SetPartSizeSubParts(ePartSize, 0, uiDepth) } else { uiMergeIndex = pcCU.GetMergeIndex1(uiSubPartIdx) pcSubCU.GetInterMergeCandidates(uiSubPartIdx-uiAbsPartIdx, uiPartIdx, cMvFieldNeighbours[:], uhInterDirNeighbours[:], &numValidMergeCand, int(uiMergeIndex)) } pcCU.SetInterDirSubParts(uint(uhInterDirNeighbours[uiMergeIndex]), uiSubPartIdx, uiPartIdx, uiDepth) cTmpMv := TLibCommon.NewTComMv(0, 0) for uiRefListIdx := 0; uiRefListIdx < 2; uiRefListIdx++ { if pcCU.GetSlice().GetNumRefIdx(TLibCommon.RefPicList(uiRefListIdx)) > 0 { pcCU.SetMVPIdxSubParts(0, TLibCommon.RefPicList(uiRefListIdx), uiSubPartIdx, uiPartIdx, uiDepth) pcCU.SetMVPNumSubParts(0, TLibCommon.RefPicList(uiRefListIdx), uiSubPartIdx, uiPartIdx, uiDepth) pcCU.GetCUMvField(TLibCommon.RefPicList(uiRefListIdx)).SetAllMvd(*cTmpMv, ePartSize, int(uiSubPartIdx), uiDepth, int(uiPartIdx)) pcCU.GetCUMvField(TLibCommon.RefPicList(uiRefListIdx)).SetAllMvField(&cMvFieldNeighbours[2*int(uiMergeIndex)+uiRefListIdx], ePartSize, int(uiSubPartIdx), uiDepth, int(uiPartIdx)) } } } else { this.DecodeInterDirPU(pcCU, uiSubPartIdx, uiDepth, uiPartIdx) for uiRefListIdx := 0; uiRefListIdx < 2; uiRefListIdx++ { if pcCU.GetSlice().GetNumRefIdx(TLibCommon.RefPicList(uiRefListIdx)) > 0 { //fmt.Printf("%d \n",uiRefListIdx); this.DecodeRefFrmIdxPU(pcCU, uiSubPartIdx, uiDepth, uiPartIdx, TLibCommon.RefPicList(uiRefListIdx)) this.DecodeMvdPU(pcCU, uiSubPartIdx, uiDepth, uiPartIdx, TLibCommon.RefPicList(uiRefListIdx)) this.DecodeMVPIdxPU(pcSubCU, uiSubPartIdx-uiAbsPartIdx, uiDepth, uiPartIdx, TLibCommon.RefPicList(uiRefListIdx)) } } } if (pcCU.GetInterDir1(uiSubPartIdx) == 3) && pcSubCU.IsBipredRestriction(uiPartIdx) { pcCU.GetCUMvField(TLibCommon.REF_PIC_LIST_1).SetAllMv(*TLibCommon.NewTComMv(0, 0), ePartSize, int(uiSubPartIdx), uiDepth, int(uiPartIdx)) pcCU.GetCUMvField(TLibCommon.REF_PIC_LIST_1).SetAllRefIdx(-1, ePartSize, int(uiSubPartIdx), uiDepth, int(uiPartIdx)) pcCU.SetInterDirSubParts(1, uiSubPartIdx, uiPartIdx, uiDepth) } uiSubPartIdx += uiPUOffset } return }
func (this *TDecGop) FilterPicture(rpcPic *TLibCommon.TComPic) { pcSlice := rpcPic.GetSlice(rpcPic.GetCurrSliceIdx()) //-- For time output for each slice iBeforeTime := time.Now() // deblocking filter bLFCrossTileBoundary := pcSlice.GetPPS().GetLoopFilterAcrossTilesEnabledFlag() this.m_pcLoopFilter.SetCfg(bLFCrossTileBoundary) this.m_pcLoopFilter.LoopFilterPic(rpcPic) if pcSlice.GetSPS().GetUseSAO() { l := len(this.m_sliceStartCUAddress) this.m_sliceStartCUAddress[l] = int(rpcPic.GetNumCUsInFrame() * rpcPic.GetNumPartInCU()) ///this.m_sliceStartCUAddress.PushBack(rpcPic.GetNumCUsInFrame()* rpcPic.GetNumPartInCU()); rpcPic.CreateNonDBFilterInfo(this.m_sliceStartCUAddress, 0, this.m_LFCrossSliceBoundaryFlag, rpcPic.GetPicSym().GetNumTiles(), bLFCrossTileBoundary) } if pcSlice.GetSPS().GetUseSAO() { saoParam := rpcPic.GetPicSym().GetSaoParam() saoParam.SaoFlag[0] = pcSlice.GetSaoEnabledFlag() saoParam.SaoFlag[1] = pcSlice.GetSaoEnabledFlagChroma() this.m_pcSAO.SetSaoLcuBasedOptimization(true) this.m_pcSAO.CreatePicSaoInfo(rpcPic) //, len(this.m_sliceStartCUAddress)-1) this.m_pcSAO.SAOProcess(saoParam) this.m_pcSAO.PCMLFDisableProcess(rpcPic) this.m_pcSAO.DestroyPicSaoInfo() } if pcSlice.GetSPS().GetUseSAO() { rpcPic.DestroyNonDBFilterInfo() } rpcPic.CompressMotion() //this.DumpMotionField(rpcPic); var c string if pcSlice.IsIntra() { c = "I" } else if pcSlice.IsInterP() { if pcSlice.IsReferenced() { c = "P" } else { c = "p" } } else { if pcSlice.IsReferenced() { c = "B" } else { c = "b" } } //-- For time output for each slice fmt.Printf("\nPOC %4d TId: %1d ( %s-SLICE, QP%3d ) ", pcSlice.GetPOC(), pcSlice.GetTLayer(), c, pcSlice.GetSliceQp()) this.m_dDecTime += time.Now().Sub(iBeforeTime) fmt.Printf("[DT %10v] ", this.m_dDecTime) this.m_dDecTime = 0 for iRefList := 0; iRefList < 2; iRefList++ { fmt.Printf("[L%d ", iRefList) for iRefIndex := 0; iRefIndex < pcSlice.GetNumRefIdx(TLibCommon.RefPicList(iRefList)); iRefIndex++ { fmt.Printf("%d ", pcSlice.GetRefPOC(TLibCommon.RefPicList(iRefList), iRefIndex)) } fmt.Printf("] ") } if this.m_decodedPictureHashSEIEnabled > 0 { this.CalcAndPrintHashStatus(rpcPic.GetPicYuvRec(), rpcPic.GetSEIs()) } rpcPic.SetOutputMark(true) rpcPic.SetReconMark(true) //this.m_sliceStartCUAddress.Init(); //this.m_LFCrossSliceBoundaryFlag.Init(); slicesize := len(this.m_sliceStartCUAddress) for i := 0; i < slicesize; i++ { delete(this.m_sliceStartCUAddress, i) } if len(this.m_sliceStartCUAddress) != 0 { fmt.Printf("clear this.m_sliceStartCUAddress error\n") } lfsize := len(this.m_LFCrossSliceBoundaryFlag) for i := 0; i < lfsize; i++ { delete(this.m_LFCrossSliceBoundaryFlag, i) } if len(this.m_LFCrossSliceBoundaryFlag) != 0 { fmt.Printf("clear this.m_LFCrossSliceBoundaryFlag error\n") } }
func (this *TDecTop) xDecodeSlice(nalu *InputNALUnit, iSkipFrame *int, iPOCLastDisplay int, bSkipPictureForBLA *bool) bool { this.m_apcSlicePilot.InitSlice() if this.m_bFirstSliceInPicture { this.m_uiSliceIdx = 0 } this.m_apcSlicePilot.SetSliceIdx(this.m_uiSliceIdx) if !this.m_bFirstSliceInPicture { this.m_apcSlicePilot.CopySliceInfo(this.m_pcPic.GetPicSym().GetSlice(this.m_uiSliceIdx - 1)) } this.m_apcSlicePilot.SetNalUnitType(nalu.GetNalUnitType()) if (this.m_apcSlicePilot.GetNalUnitType() == TLibCommon.NAL_UNIT_CODED_SLICE_TRAIL_N) || (this.m_apcSlicePilot.GetNalUnitType() == TLibCommon.NAL_UNIT_CODED_SLICE_TSA_N) || (this.m_apcSlicePilot.GetNalUnitType() == TLibCommon.NAL_UNIT_CODED_SLICE_STSA_N) { this.m_apcSlicePilot.SetTemporalLayerNonReferenceFlag(true) } this.m_apcSlicePilot.SetReferenced(true) // Putting this as true ensures that picture is referenced the first time it is in an RPS this.m_apcSlicePilot.SetTLayerInfo(nalu.GetTemporalId()) if this.m_cEntropyDecoder.DecodeSliceHeader(this.m_apcSlicePilot, this.m_parameterSetManagerDecoder) == true && this.m_apcSlicePilot.GetPOC() != this.m_prevPOC && !this.m_bFirstSliceInSequence { this.m_prevPOC = this.m_apcSlicePilot.GetPOC() *bSkipPictureForBLA = this.m_prevSkipPictureForBLA return true } if this.m_apcSlicePilot.IsNextSlice() { this.m_prevSkipPictureForBLA = false } // Skip pictures due to random access if this.IsRandomAccessSkipPicture(iSkipFrame, &iPOCLastDisplay) { this.m_prevSkipPictureForBLA = true return false } // Skip TFD pictures associated with BLA/BLANT pictures if this.IsSkipPictureForBLA(&iPOCLastDisplay) { this.m_prevSkipPictureForBLA = true return false } // actual decoding starts here this.xActivateParameterSets() if this.m_apcSlicePilot.IsNextSlice() { this.m_prevPOC = this.m_apcSlicePilot.GetPOC() } this.m_bFirstSliceInSequence = false //detect lost reference picture and insert copy of earlier frame. lostPoc := this.m_apcSlicePilot.CheckThatAllRefPicsAreAvailable(this.m_pcListPic, this.m_apcSlicePilot.GetRPS(), true, this.m_pocRandomAccess) for lostPoc > 0 { this.xCreateLostPicture(lostPoc - 1) lostPoc = this.m_apcSlicePilot.CheckThatAllRefPicsAreAvailable(this.m_pcListPic, this.m_apcSlicePilot.GetRPS(), true, this.m_pocRandomAccess) } if this.m_bFirstSliceInPicture { // Buffer initialize for prediction. this.m_cPrediction.InitTempBuff(this.m_apcSlicePilot.GetSPS().GetMaxCUWidth(), this.m_apcSlicePilot.GetSPS().GetMaxCUHeight()) this.m_apcSlicePilot.ApplyReferencePictureSet(this.m_pcListPic, this.m_apcSlicePilot.GetRPS()) // Get a new picture buffer this.m_pcPic = this.xGetNewPicBuffer(this.m_apcSlicePilot) // transfer any SEI messages that have been received to the picture this.m_pcPic.SetSEIs(this.m_SEIs) this.m_SEIs = nil // Recursive structure this.m_cCuDecoder.Create(this.m_apcSlicePilot.GetSPS().GetMaxCUDepth(), this.m_apcSlicePilot.GetSPS().GetMaxCUWidth(), this.m_apcSlicePilot.GetSPS().GetMaxCUHeight()) this.m_cCuDecoder.Init(this.m_cEntropyDecoder, this.m_cTrQuant, this.m_cPrediction) this.m_cTrQuant.Init(this.m_apcSlicePilot.GetSPS().GetMaxTrSize(), false, false, false, false, false) this.m_cSliceDecoder.Create() } else { // Check if any new SEI has arrived /*if(!m_SEIs.empty()) { // Currently only decoding Unit SEI message occurring between VCL NALUs copied SEIMessages &picSEI = pcPic->getSEIs(); SEIMessages decodingUnitInfos = extractSeisByType (m_SEIs, SEI::DECODING_UNIT_INFO); picSEI.insert(picSEI.end(), decodingUnitInfos.begin(), decodingUnitInfos.end()); deleteSEIs(m_SEIs); }*/ } // Set picture slice pointer pcSlice := this.m_apcSlicePilot bNextSlice := pcSlice.IsNextSlice() var uiCummulativeTileWidth, uiCummulativeTileHeight uint var i, j, p int //set NumColumnsMins1 and NumRowsMinus1 this.m_pcPic.GetPicSym().SetNumColumnsMinus1(pcSlice.GetPPS().GetNumColumnsMinus1()) this.m_pcPic.GetPicSym().SetNumRowsMinus1(pcSlice.GetPPS().GetNumRowsMinus1()) //create the TComTileArray this.m_pcPic.GetPicSym().XCreateTComTileArray() if pcSlice.GetPPS().GetUniformSpacingFlag() { //set the width for each tile for j = 0; j < this.m_pcPic.GetPicSym().GetNumRowsMinus1()+1; j++ { for p = 0; p < this.m_pcPic.GetPicSym().GetNumColumnsMinus1()+1; p++ { a := (p + 1) * int(this.m_pcPic.GetPicSym().GetFrameWidthInCU()) / (this.m_pcPic.GetPicSym().GetNumColumnsMinus1() + 1) b := (p * int(this.m_pcPic.GetPicSym().GetFrameWidthInCU())) / (this.m_pcPic.GetPicSym().GetNumColumnsMinus1() + 1) this.m_pcPic.GetPicSym().GetTComTile(uint(j*(this.m_pcPic.GetPicSym().GetNumColumnsMinus1()+1) + p)).SetTileWidth(uint(a - b)) } } //set the height for each tile for j = 0; j < this.m_pcPic.GetPicSym().GetNumColumnsMinus1()+1; j++ { for p = 0; p < this.m_pcPic.GetPicSym().GetNumRowsMinus1()+1; p++ { a := (p + 1) * int(this.m_pcPic.GetPicSym().GetFrameHeightInCU()) / (this.m_pcPic.GetPicSym().GetNumRowsMinus1() + 1) b := (p * int(this.m_pcPic.GetPicSym().GetFrameHeightInCU())) / (this.m_pcPic.GetPicSym().GetNumRowsMinus1() + 1) this.m_pcPic.GetPicSym().GetTComTile(uint(p*(this.m_pcPic.GetPicSym().GetNumColumnsMinus1()+1) + j)).SetTileHeight(uint(a - b)) } } } else { //set the width for each tile for j = 0; j < pcSlice.GetPPS().GetNumRowsMinus1()+1; j++ { uiCummulativeTileWidth = 0 for i = 0; i < pcSlice.GetPPS().GetNumColumnsMinus1(); i++ { this.m_pcPic.GetPicSym().GetTComTile(uint(j*(pcSlice.GetPPS().GetNumColumnsMinus1()+1) + i)).SetTileWidth(uint(pcSlice.GetPPS().GetColumnWidth(int(i)))) uiCummulativeTileWidth += uint(pcSlice.GetPPS().GetColumnWidth(int(i))) } this.m_pcPic.GetPicSym().GetTComTile(uint(j*(pcSlice.GetPPS().GetNumColumnsMinus1()+1) + i)).SetTileWidth(this.m_pcPic.GetPicSym().GetFrameWidthInCU() - uiCummulativeTileWidth) } //set the height for each tile for j = 0; j < pcSlice.GetPPS().GetNumColumnsMinus1()+1; j++ { uiCummulativeTileHeight = 0 for i = 0; i < pcSlice.GetPPS().GetNumRowsMinus1(); i++ { this.m_pcPic.GetPicSym().GetTComTile(uint(i*(pcSlice.GetPPS().GetNumColumnsMinus1()+1) + j)).SetTileHeight(uint(pcSlice.GetPPS().GetRowHeight(int(i)))) uiCummulativeTileHeight += uint(pcSlice.GetPPS().GetRowHeight(int(i))) } this.m_pcPic.GetPicSym().GetTComTile(uint(i*(pcSlice.GetPPS().GetNumColumnsMinus1()+1) + j)).SetTileHeight(this.m_pcPic.GetPicSym().GetFrameHeightInCU() - uiCummulativeTileHeight) } } this.m_pcPic.GetPicSym().XInitTiles() //generate the Coding Order Map and Inverse Coding Order Map uiEncCUAddr := 0 for i = 0; i < int(this.m_pcPic.GetPicSym().GetNumberOfCUsInFrame()); i++ { this.m_pcPic.GetPicSym().SetCUOrderMap(i, uiEncCUAddr) this.m_pcPic.GetPicSym().SetInverseCUOrderMap(uiEncCUAddr, i) uiEncCUAddr = int(this.m_pcPic.GetPicSym().XCalculateNxtCUAddr(uint(uiEncCUAddr))) } this.m_pcPic.GetPicSym().SetCUOrderMap(int(this.m_pcPic.GetPicSym().GetNumberOfCUsInFrame()), int(this.m_pcPic.GetPicSym().GetNumberOfCUsInFrame())) this.m_pcPic.GetPicSym().SetInverseCUOrderMap(int(this.m_pcPic.GetPicSym().GetNumberOfCUsInFrame()), int(this.m_pcPic.GetPicSym().GetNumberOfCUsInFrame())) //convert the start and end CU addresses of the slice and dependent slice into encoding order pcSlice.SetSliceSegmentCurStartCUAddr(this.m_pcPic.GetPicSym().GetPicSCUEncOrder(pcSlice.GetSliceSegmentCurStartCUAddr())) pcSlice.SetSliceSegmentCurEndCUAddr(this.m_pcPic.GetPicSym().GetPicSCUEncOrder(pcSlice.GetSliceSegmentCurEndCUAddr())) if pcSlice.IsNextSlice() { pcSlice.SetSliceCurStartCUAddr(this.m_pcPic.GetPicSym().GetPicSCUEncOrder(pcSlice.GetSliceCurStartCUAddr())) pcSlice.SetSliceCurEndCUAddr(this.m_pcPic.GetPicSym().GetPicSCUEncOrder(pcSlice.GetSliceCurEndCUAddr())) } if this.m_bFirstSliceInPicture { if this.m_pcPic.GetNumAllocatedSlice() != 1 { this.m_pcPic.ClearSliceBuffer() } } else { this.m_pcPic.AllocateNewSlice() } //assert(pcPic.GetNumAllocatedSlice() == (this.m_uiSliceIdx + 1)); this.m_apcSlicePilot = this.m_pcPic.GetPicSym().GetSlice(this.m_uiSliceIdx) //fmt.Printf("%v\n", this.m_apcSlicePilot) this.m_pcPic.GetPicSym().SetSlice(pcSlice, this.m_uiSliceIdx) this.m_pcPic.SetTLayer(nalu.GetTemporalId()) if bNextSlice { pcSlice.CheckCRA(pcSlice.GetRPS(), &this.m_pocCRA, &this.m_prevRAPisBLA) // Set reference list pcSlice.SetRefPicList(this.m_pcListPic) // For generalized B // note: maybe not existed case (always L0 is copied to L1 if L1 is empty) if pcSlice.IsInterB() && pcSlice.GetNumRefIdx(TLibCommon.REF_PIC_LIST_1) == 0 { iNumRefIdx := pcSlice.GetNumRefIdx(TLibCommon.REF_PIC_LIST_0) pcSlice.SetNumRefIdx(TLibCommon.REF_PIC_LIST_1, iNumRefIdx) for iRefIdx := 0; iRefIdx < iNumRefIdx; iRefIdx++ { pcSlice.SetRefPic(pcSlice.GetRefPic(TLibCommon.REF_PIC_LIST_0, iRefIdx), TLibCommon.REF_PIC_LIST_1, iRefIdx) } } if !pcSlice.IsIntra() { bLowDelay := true iCurrPOC := pcSlice.GetPOC() iRefIdx := 0 for iRefIdx = 0; iRefIdx < pcSlice.GetNumRefIdx(TLibCommon.REF_PIC_LIST_0) && bLowDelay; iRefIdx++ { if int(pcSlice.GetRefPic(TLibCommon.REF_PIC_LIST_0, iRefIdx).GetPOC()) > iCurrPOC { bLowDelay = false } } if pcSlice.IsInterB() { for iRefIdx = 0; iRefIdx < pcSlice.GetNumRefIdx(TLibCommon.REF_PIC_LIST_1) && bLowDelay; iRefIdx++ { if int(pcSlice.GetRefPic(TLibCommon.REF_PIC_LIST_1, iRefIdx).GetPOC()) > iCurrPOC { bLowDelay = false } } } pcSlice.SetCheckLDC(bLowDelay) } //--------------- pcSlice.SetRefPOCList() pcSlice.SetNoBackPredFlag(false) if pcSlice.GetSliceType() == TLibCommon.B_SLICE { if pcSlice.GetNumRefIdx(TLibCommon.RefPicList(0)) == pcSlice.GetNumRefIdx(TLibCommon.RefPicList(1)) { pcSlice.SetNoBackPredFlag(true) for i = 0; i < pcSlice.GetNumRefIdx(TLibCommon.RefPicList(1)); i++ { if pcSlice.GetRefPOC(TLibCommon.RefPicList(1), i) != pcSlice.GetRefPOC(TLibCommon.RefPicList(0), i) { pcSlice.SetNoBackPredFlag(false) break } } } } } this.m_pcPic.SetCurrSliceIdx(this.m_uiSliceIdx) if pcSlice.GetSPS().GetScalingListFlag() { pcSlice.SetScalingList(pcSlice.GetSPS().GetScalingList()) if pcSlice.GetPPS().GetScalingListPresentFlag() { pcSlice.SetScalingList(pcSlice.GetPPS().GetScalingList()) } pcSlice.GetScalingList().SetUseTransformSkip(pcSlice.GetPPS().GetUseTransformSkip()) if !pcSlice.GetPPS().GetScalingListPresentFlag() && !pcSlice.GetSPS().GetScalingListPresentFlag() { pcSlice.SetDefaultScalingList() } this.m_cTrQuant.SetScalingListDec(pcSlice.GetScalingList()) this.m_cTrQuant.SetUseScalingList(true) } else { this.m_cTrQuant.SetFlatScalingList() this.m_cTrQuant.SetUseScalingList(false) } // Decode a picture this.m_cGopDecoder.DecompressSlice(nalu.m_Bitstream, this.m_pcPic, this.m_pTraceFile) this.m_bFirstSliceInPicture = false this.m_uiSliceIdx++ return false }