// ------------------------------------------------------------------------------------------------------------------- // 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 }
//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 }