ErrVal RecPicBuffer::xClearOutputAll( PicBufferList& rcOutputList, PicBufferList& rcUnusedList ) { //===== create output list ===== RecPicBufUnitList cOutputList; Int iMinPoc = MSYS_INT_MAX; Int iMaxPoc = MSYS_INT_MIN; RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin(); RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.end (); for( ; iter != end; iter++ ) { Bool bOutput = ( ! (*iter)->isOutputted() && (*iter)->isExisting() ); if( bOutput ) { cOutputList.push_back( *iter ); if( (*iter)->getPoc() < iMinPoc ) iMinPoc = (*iter)->getPoc(); if( (*iter)->getPoc() > iMaxPoc ) iMaxPoc = (*iter)->getPoc(); } } //===== real output ===== for( Int iPoc = iMinPoc; iPoc <= iMaxPoc; iPoc++ ) { iter = cOutputList.begin(); end = cOutputList.end (); for( ; iter != end; iter++ ) { if( (*iter)->getPoc() == iPoc ) { RecPicBufUnit* pcRecPicBufUnit = *iter; cOutputList.remove( pcRecPicBufUnit ); //--- output --- PicBuffer* pcPicBuffer = pcRecPicBufUnit->getPicBuffer(); ROF( pcPicBuffer ); pcRecPicBufUnit->getRecFrame()->store( pcPicBuffer ); rcOutputList.push_back( pcPicBuffer ); rcUnusedList.push_back( pcPicBuffer ); break; // only one picture per poc } } } ROT( cOutputList.size() ); //===== uninit all elements and move to free list ===== while( m_cUsedRecPicBufUnitList.size() ) { RecPicBufUnit* pcRecPicBufUnit = m_cUsedRecPicBufUnitList.popFront(); RNOK( pcRecPicBufUnit->uninit() ); m_cFreeRecPicBufUnitList.push_back( pcRecPicBufUnit ); } return Err::m_nOK; }
ErrVal RecPicBuffer::xOutput( PicBufferList& rcOutputList, PicBufferList& rcUnusedList ) { ROTRS( m_cFreeRecPicBufUnitList.size(), Err::m_nOK ); //===== smallest non-ref/output poc value ===== Int iMinOutputPoc = MSYS_INT_MAX; RecPicBufUnit* pcElemToRemove = 0; RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin(); RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.end (); for( ; iter != end; iter++ ) { Bool bOutput = ( ! (*iter)->isOutputted() && (*iter)->isExisting() && ! (*iter)->isNeededForRef() ); if( bOutput && (*iter)->getPoc() < iMinOutputPoc ) { iMinOutputPoc = (*iter)->getPoc(); pcElemToRemove = (*iter); } } ROF( pcElemToRemove ); // error, nothing can be removed //===== copy all output elements to temporary list ===== RecPicBufUnitList cOutputList; Int iMaxPoc = iMinOutputPoc; Int iMinPoc = MSYS_INT_MAX; iter = m_cUsedRecPicBufUnitList.begin(); for( ; iter != end; iter++ ) { Bool bOutput = ( (*iter)->getPoc() <= iMinOutputPoc && ! (*iter)->isOutputted() ); if( bOutput ) { if( (*iter)->isExisting() ) { cOutputList.push_back( *iter ); if( (*iter)->getPoc() < iMinPoc ) { iMinPoc = (*iter)->getPoc(); } } else { RNOK( (*iter)->markOutputted() ); } } } //===== real output ===== for( Int iPoc = iMinPoc; iPoc <= iMaxPoc; iPoc++ ) { iter = cOutputList.begin(); end = cOutputList.end (); for( ; iter != end; iter++ ) { if( (*iter)->getPoc() == iPoc ) { RecPicBufUnit* pcRecPicBufUnit = *iter; cOutputList.remove( pcRecPicBufUnit ); PicBuffer* pcPicBuffer = pcRecPicBufUnit->getPicBuffer(); ROF( pcPicBuffer ); pcRecPicBufUnit->getRecFrame()->store( pcPicBuffer ); rcOutputList.push_back( pcPicBuffer ); rcUnusedList.push_back( pcPicBuffer ); pcRecPicBufUnit->markOutputted(); break; // only one picture per POC } } } ROT( cOutputList.size() ); //===== clear buffer ==== RNOK( xClearBuffer() ); //===== check ===== ROT( m_cFreeRecPicBufUnitList.empty() ); // this should never happen return Err::m_nOK; }