Ejemplo n.º 1
0
// -------------------------------------------------------------------------------------------------------------------
// member access functions
// -------------------------------------------------------------------------------------------------------------------
func (this *TEncTop) xGetNewPicBuffer() *TLibCommon.TComPic { ///< get picture buffer which will be processed
	var rpcPic *TLibCommon.TComPic

	TLibCommon.SortPicList(this.m_cListPic)

	if this.m_cListPic.Len() >= (this.GetEncCfg().m_iGOPSize + this.GetEncCfg().GetMaxDecPicBuffering(TLibCommon.MAX_TLAYER-1) + 2) {

		//Int iSize = Int( this.m_cListPic.size() );
		for iterPic := this.m_cListPic.Front(); iterPic != nil; iterPic = iterPic.Next() {
			rpcPic = iterPic.Value.(*TLibCommon.TComPic)

			if rpcPic.GetSlice(0).IsReferenced() == false {
				break
			}
		}
	} else {
		if this.GetEncCfg().GetUseAdaptiveQP() {
			pcEPic := TLibCommon.NewTComPic()
			pcEPic.Create(this.GetEncCfg().m_iSourceWidth, this.GetEncCfg().m_iSourceHeight,
				TLibCommon.G_uiMaxCUWidth, TLibCommon.G_uiMaxCUHeight, TLibCommon.G_uiMaxCUDepth, this.m_cPPS.GetMaxCuDQPDepth()+1,
				this.GetEncCfg().m_conformanceWindow, this.GetEncCfg().m_defaultDisplayWindow, this.GetEncCfg().m_numReorderPics[:], false)
			rpcPic = pcEPic
		} else {
			rpcPic = TLibCommon.NewTComPic()
			rpcPic.Create(this.GetEncCfg().m_iSourceWidth, this.GetEncCfg().m_iSourceHeight,
				TLibCommon.G_uiMaxCUWidth, TLibCommon.G_uiMaxCUHeight, TLibCommon.G_uiMaxCUDepth, 0,
				this.GetEncCfg().m_conformanceWindow, this.GetEncCfg().m_defaultDisplayWindow, this.GetEncCfg().m_numReorderPics[:], false)
		}
		if this.GetEncCfg().GetUseSAO() {
			fmt.Printf("not support SAO\n")
			//rpcPic.GetPicSym().AllocSaoParam(this.m_cEncSAO);
		}
		this.m_cListPic.PushBack(rpcPic)
	}
	rpcPic.SetReconMark(false)

	this.m_iPOCLast++
	this.m_iNumPicRcvd++

	rpcPic.GetSlice(0).SetPOC(this.m_iPOCLast)
	// mark it should be extended
	rpcPic.GetPicYuvRec().SetBorderExtension(false)

	return rpcPic
}
Ejemplo n.º 2
0
//protected:
func (this *TDecTop) xGetNewPicBuffer(pcSlice *TLibCommon.TComSlice) (rpcPic *TLibCommon.TComPic) {
	var numReorderPics [TLibCommon.MAX_TLAYER]int
	conformanceWindow := pcSlice.GetSPS().GetConformanceWindow()
	var defaultDisplayWindow *TLibCommon.Window
	if pcSlice.GetSPS().GetVuiParametersPresentFlag() {
		defaultDisplayWindow = pcSlice.GetSPS().GetVuiParameters().GetDefaultDisplayWindow()
	} else {
		defaultDisplayWindow = TLibCommon.NewWindow()
	}

	for temporalLayer := uint(0); temporalLayer < TLibCommon.MAX_TLAYER; temporalLayer++ {
		numReorderPics[temporalLayer] = pcSlice.GetSPS().GetNumReorderPics(temporalLayer)
		//fmt.Printf("numReorderPics[temporalLayer]=%d\n",numReorderPics[temporalLayer]);
	}

	this.m_iMaxRefPicNum = int(pcSlice.GetSPS().GetMaxDecPicBuffering(pcSlice.GetTLayer())) + pcSlice.GetSPS().GetNumReorderPics(pcSlice.GetTLayer()) + 1 // +1 to have space for the picture currently being decoded
	if this.m_pcListPic.Len() < this.m_iMaxRefPicNum {
		rpcPic = TLibCommon.NewTComPic()

		rpcPic.Create(int(pcSlice.GetSPS().GetPicWidthInLumaSamples()), int(pcSlice.GetSPS().GetPicHeightInLumaSamples()),
			pcSlice.GetSPS().GetMaxCUWidth(), pcSlice.GetSPS().GetMaxCUHeight(), pcSlice.GetSPS().GetMaxCUDepth(), 0,
			conformanceWindow, defaultDisplayWindow, numReorderPics[:], true)
		rpcPic.GetPicSym().AllocSaoParam(this.m_cSAO)
		this.m_pcListPic.PushBack(rpcPic)

		return rpcPic
	}

	bBufferIsAvailable := false
	for e := this.m_pcListPic.Front(); e != nil; e = e.Next() {
		rpcPic = e.Value.(*TLibCommon.TComPic)
		if rpcPic.GetReconMark() == false && rpcPic.GetOutputMark() == false {
			rpcPic.SetOutputMark(false)
			bBufferIsAvailable = true
			break
		}

		if rpcPic.GetSlice(0).IsReferenced() == false && rpcPic.GetOutputMark() == false {
			rpcPic.SetOutputMark(false)
			rpcPic.SetReconMark(false)
			rpcPic.GetPicYuvRec().SetBorderExtension(false)
			bBufferIsAvailable = true
			break
		}
	}

	if !bBufferIsAvailable {
		//There is no room for this picture, either because of faulty encoder or dropped NAL. Extend the buffer.
		this.m_iMaxRefPicNum++
		rpcPic = TLibCommon.NewTComPic()
		this.m_pcListPic.PushBack(rpcPic)
	}

	rpcPic.Destroy()
	rpcPic.Create(int(pcSlice.GetSPS().GetPicWidthInLumaSamples()), int(pcSlice.GetSPS().GetPicHeightInLumaSamples()),
		pcSlice.GetSPS().GetMaxCUWidth(), pcSlice.GetSPS().GetMaxCUHeight(), pcSlice.GetSPS().GetMaxCUDepth(), 0,
		conformanceWindow, defaultDisplayWindow, numReorderPics[:], true)
	rpcPic.GetPicSym().AllocSaoParam(this.m_cSAO)

	return rpcPic
}