示例#1
0
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
}
示例#2
0
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
}
示例#3
0
文件: TDecGop.go 项目: nacore/GoHM
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")
	}
}
示例#4
0
文件: TDecTop.go 项目: hanjinze/GoHM
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
}