📄 vopsedec.cpp
字号:
m_vopmd.mvInfoForward.uiFCode = m_vopmd.mvInfoBackward.uiFCode = 1; // Modified error resilient mode by Toshiba(1998-1-16)
if(m_volmd.fAUsage == EIGHT_BIT)
m_vopmd.intStepIAlpha = m_pbitstrmIn -> getBits (NUMBITS_VOP_ALPHA_QUANTIZER);
}
else if (m_vopmd.vopPredType == PVOP) {
m_vopmd.intStep = m_pbitstrmIn -> getBits (m_volmd.uiQuantPrecision);
if(m_volmd.fAUsage == EIGHT_BIT)
m_vopmd.intStepPAlpha = m_pbitstrmIn -> getBits (NUMBITS_VOP_ALPHA_QUANTIZER);
m_vopmd.mvInfoForward.uiFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
m_vopmd.mvInfoForward.uiScaleFactor = 1 << (m_vopmd.mvInfoForward.uiFCode - 1);
m_vopmd.mvInfoForward.uiRange = 16 << m_vopmd.mvInfoForward.uiFCode;
// Added for error resilient mode by Toshiba(1998-1-16)
m_vopmd.mvInfoBackward.uiFCode = 1;
// End Toshiba(1998-1-16)
}
else if (m_vopmd.vopPredType == BVOP) {
m_vopmd.intStepB = m_vopmd.intStep = m_pbitstrmIn -> getBits (m_volmd.uiQuantPrecision); //also assign intStep to be safe
if(m_volmd.fAUsage == EIGHT_BIT)
m_vopmd.intStepBAlpha = m_pbitstrmIn -> getBits (NUMBITS_VOP_ALPHA_QUANTIZER);
m_vopmd.mvInfoForward.uiFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
m_vopmd.mvInfoForward.uiScaleFactor = 1 << (m_vopmd.mvInfoForward.uiFCode - 1);
m_vopmd.mvInfoForward.uiRange = 16 << m_vopmd.mvInfoForward.uiFCode;
m_vopmd.mvInfoBackward.uiFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
m_vopmd.mvInfoBackward.uiScaleFactor = 1 << (m_vopmd.mvInfoBackward.uiFCode - 1);
m_vopmd.mvInfoBackward.uiRange = 16 << m_vopmd.mvInfoBackward.uiFCode;
}
// Added for error resilient mode by Toshiba(1997-11-14)
m_vopmd.bShapeCodingType = 1;
if ( m_volmd.volType == BASE_LAYER ) // added by Sharp (98/4/13)
if (m_volmd.fAUsage != RECTANGLE && m_vopmd.vopPredType != IVOP
&& m_uiSprite != 1)
{
m_vopmd.bShapeCodingType = m_pbitstrmIn -> getBits (1);
}
// End Toshiba(1997-11-14)
if(m_volmd.volType == ENHN_LAYER) { //sony
if( m_volmd.iEnhnType == 1 ){
m_vopmd.iLoadBakShape = m_pbitstrmIn -> getBits (1); // load_backward_shape
if(m_vopmd.iLoadBakShape){
CVOPU8YUVBA* pvopcCurr = new CVOPU8YUVBA (*(rgpbfShape [0]->pvopcReconCurr()));
copyVOPU8YUVBA(rgpbfShape [1]->m_pvopcRefQ1, pvopcCurr);
// previous backward shape is saved to current forward shape
rgpbfShape [1]->m_rctCurrVOPY.left = rgpbfShape [0]->m_rctCurrVOPY.left;
rgpbfShape [1]->m_rctCurrVOPY.right = rgpbfShape [0]->m_rctCurrVOPY.right;
rgpbfShape [1]->m_rctCurrVOPY.top = rgpbfShape [0]->m_rctCurrVOPY.top;
rgpbfShape [1]->m_rctCurrVOPY.bottom = rgpbfShape [0]->m_rctCurrVOPY.bottom;
Int width = m_pbitstrmIn -> getBits (NUMBITS_VOP_WIDTH); assert (width % MB_SIZE == 0); // has to be multiples of MB_SIZE
UInt uiMark = m_pbitstrmIn -> getBits (1);
assert (uiMark == 1);
Int height = m_pbitstrmIn -> getBits (NUMBITS_VOP_HEIGHT); assert (height % MB_SIZE == 0); // has to be multiples of MB_SIZE
uiMark = m_pbitstrmIn -> getBits (1);
assert (uiMark == 1);
width = ((width+15)>>4)<<4; // not needed if the asserts are present
height = ((height+15)>>4)<<4;
Int iSign = (m_pbitstrmIn -> getBits (1) == 1)? -1 : 1;
Int left = iSign * m_pbitstrmIn -> getBits (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1);
Int marker = m_pbitstrmIn -> getBits (1); // marker bit
iSign = (m_pbitstrmIn -> getBits (1) == 1)? -1 : 1;
Int top = iSign * m_pbitstrmIn -> getBits (NUMBITS_VOP_VERTICAL_SPA_REF - 1);
rgpbfShape[0]->m_rctCurrVOPY = CRct (left, top, left + width, top + height);
rgpbfShape[0]->m_rctCurrVOPUV = rgpbfShape[0]->m_rctCurrVOPY.downSampleBy2 ();
// decode backward shape
rgpbfShape[0]->setRefStartingPointers ();
rgpbfShape[0]->compute_bfShapeMembers (); // clear m_pvopcRefQ1
rgpbfShape[0]->resetBYPlane ();// clear BY of RefQ1 (katata)
rgpbfShape[0]->m_volmd.bShapeOnly = TRUE;
rgpbfShape[0]->m_volmd.bNoCrChange = m_volmd.bNoCrChange; // set CR change disable(Oct. 9 1997)
rgpbfShape[0]->m_vopmd.bInterlace = FALSE;
rgpbfShape[0]->decodeIVOP_WithShape ();
m_vopmd.iLoadForShape = m_pbitstrmIn -> getBits (1); // load_forward_shape
if(m_vopmd.iLoadForShape){
width = m_pbitstrmIn -> getBits (NUMBITS_VOP_WIDTH); assert (width % MB_SIZE == 0); // has to be multiples of MB_SIZE
uiMark = m_pbitstrmIn -> getBits (1);
assert (uiMark == 1);
height = m_pbitstrmIn -> getBits (NUMBITS_VOP_HEIGHT); assert (height % MB_SIZE == 0); // has to be multiples of MB_SIZE
uiMark = m_pbitstrmIn -> getBits (1);
assert (uiMark == 1);
width = ((width+15)>>4)<<4; // not needed if the asserts are present
height = ((height+15)>>4)<<4;
iSign = (m_pbitstrmIn -> getBits (1) == 1)? -1 : 1;
left = iSign * m_pbitstrmIn -> getBits (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1);
marker = m_pbitstrmIn -> getBits (1); // marker bit
iSign = (m_pbitstrmIn -> getBits (1) == 1)? -1 : 1;
top = iSign * m_pbitstrmIn -> getBits (NUMBITS_VOP_VERTICAL_SPA_REF - 1);
rgpbfShape[1]->m_rctCurrVOPY = CRct (left, top, left + width, top + height);
rgpbfShape[1]->m_rctCurrVOPUV = rgpbfShape[1]->m_rctCurrVOPY.downSampleBy2 ();
// decode forward shape
rgpbfShape[1]->setRefStartingPointers ();
rgpbfShape[1]->compute_bfShapeMembers (); // clear m_pvopcRefQ1
rgpbfShape[1]->resetBYPlane ();// clear BY of RefQ1 (katata)
rgpbfShape[1]->m_volmd.bShapeOnly = TRUE;
rgpbfShape[1]->m_volmd.bNoCrChange = m_volmd.bNoCrChange; // set CR change disable(Oct. 9 1997)
rgpbfShape[1]->m_vopmd.bInterlace = FALSE;
rgpbfShape[1]->decodeIVOP_WithShape ();
}
} // end of "if(m_vopmd.iLoadBakShape)"
else
m_vopmd.iLoadForShape = 0; // no forward shape when backward shape is not decoded
}
else {
m_vopmd.iLoadForShape = 0;
m_vopmd.iLoadBakShape = 0;
}
m_vopmd.iRefSelectCode = m_pbitstrmIn ->getBits (2) ;
}
return TRUE;
}
//added by sony for spatial scalability decoding loop
Int CVideoObjectDecoder::ReadNextVopPredType ()
{
m_pbitstrmIn -> setBookmark ();
if (findStartCode () == EOF) {
m_pbitstrmIn -> gotoBookmark ();
return EOF;
}
// Start code
UInt uiVopStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_START_CODE);
assert(uiVopStartCode == VOP_START_CODE);
Int vopPredType = (VOPpredType) m_pbitstrmIn -> getBits (NUMBITS_VOP_PRED_TYPE);
// Time reference and VOP_pred_type
m_pbitstrmIn -> gotoBookmark ();
return(vopPredType);
}
Void CVideoObjectDecoder::errorInBitstream (Char* rgchErorrMsg)
{
fprintf (stderr, "%s at %d\n", rgchErorrMsg, m_pbitstrmIn->getCounter ());
assert (FALSE);
exit (1);
}
// Added by Sharp(1998-02-10)
void CVideoObjectDecoder::updateBuffVOPsBase (
CVideoObjectDecoder* pvodecEnhc
)
{
switch(m_vopmd.vopPredType) {
case IVOP:
if (!pvodecEnhc -> m_pBuffP2 -> empty ()) // added by Sharp (98/3/11)
if ( pvodecEnhc -> m_pBuffP2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
pvodecEnhc -> m_pBuffP1 -> copyBuf (*(pvodecEnhc -> m_pBuffP2)); // added by Sharp (98/3/11)
pvodecEnhc -> m_pBuffP2 -> getBuf (this);
break;
case PVOP:
if ( pvodecEnhc -> m_pBuffP2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
pvodecEnhc -> m_pBuffP1 -> copyBuf (*(pvodecEnhc -> m_pBuffP2));
pvodecEnhc -> m_pBuffP2 -> getBuf (this);
break;
case BVOP:
if(!(pvodecEnhc -> m_pBuffB2 -> empty ())) {
if ( pvodecEnhc -> m_pBuffB2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
pvodecEnhc -> m_pBuffB1 -> copyBuf (*(pvodecEnhc -> m_pBuffB2));
}
pvodecEnhc -> m_pBuffB2 -> getBuf (this);
break;
default: exit(1);
}
}
void CVideoObjectDecoder::updateRefVOPsEnhc ()
{
Int tQ0, tQ1;
switch(m_vopmd.vopPredType) {
case IVOP: // printf(" Not defined in updateRefVOPsEnhc. \n"); exit(1); // deleted by Sharp (99/1/25)
break; // added by Sharp (99/1/25)
case PVOP:
switch(m_vopmd.iRefSelectCode) {
case 0: m_pBuffE -> putBufToQ0 (this); tQ0 = m_pBuffE -> m_t;
break;
case 1: if(!(m_pBuffB1 -> empty ())) { m_pBuffB1 -> putBufToQ0 (this); tQ0 = m_pBuffB1 -> m_t; }
else { m_pBuffP1 -> putBufToQ0 (this); tQ0 = m_pBuffP1 -> m_t; }
break;
case 2: if(!(m_pBuffB2 -> empty ())) { m_pBuffB2 -> putBufToQ0 (this); tQ0 = m_pBuffB2 -> m_t; }
else { m_pBuffP2 -> putBufToQ0 (this); tQ0 = m_pBuffP2 -> m_t; }
break;
case 3: // printf(" For Spatial Scalability -- Not defined\n"); exit(1);
if(!(m_pBuffB1 -> empty ())) { m_pBuffB1 -> putBufToQ0 (this); tQ0 = m_pBuffB1 -> m_t; }
else { m_pBuffP1 -> putBufToQ0 (this); tQ0 = m_pBuffP1 -> m_t; }
break;
}
m_tPastRef = tQ0;
break;
case BVOP:
switch(m_vopmd.iRefSelectCode) {
case 0: // printf(" For Spatial Scalability -- Not defined\n"); exit(1);
m_pBuffE -> putBufToQ0 (this); tQ0 = m_pBuffE -> m_t;
if(!(m_pBuffB1 -> empty ())) { m_pBuffB1 -> putBufToQ1 (this); tQ1 = m_pBuffB1 -> m_t; }
else { m_pBuffP1 -> putBufToQ1 (this); tQ1 = m_pBuffP1 -> m_t; }
break;
case 1: m_pBuffE -> putBufToQ0 (this); tQ0 = m_pBuffE -> m_t;
if(!(m_pBuffB1 -> empty ())) { m_pBuffB1 -> putBufToQ1 (this); tQ1 = m_pBuffB1 -> m_t; }
else { m_pBuffP1 -> putBufToQ1 (this); tQ1 = m_pBuffP1 -> m_t; }
break;
case 2: m_pBuffE -> putBufToQ0 (this); tQ0 = m_pBuffE -> m_t;
if(!(m_pBuffB2 -> empty ())) { m_pBuffB2 -> putBufToQ1 (this); tQ1 = m_pBuffB2 -> m_t; }
else { m_pBuffP2 -> putBufToQ1 (this); tQ1 = m_pBuffP2 -> m_t; }
break;
case 3: if(!(m_pBuffB1 -> empty ())) { m_pBuffB1 -> putBufToQ0 (this); tQ0 = m_pBuffB1 -> m_t; }
else { m_pBuffP1 -> putBufToQ0 (this); tQ0 = m_pBuffP1 -> m_t; }
if(!(m_pBuffB2 -> empty ())) { m_pBuffB2 -> putBufToQ1 (this); tQ1 = m_pBuffB2 -> m_t; }
else { m_pBuffP2 -> putBufToQ1 (this); tQ1 = m_pBuffP2 -> m_t; }
m_iBCount = (getTime () - tQ0);
break;
}
m_tPastRef = tQ0;
m_tFutureRef = tQ1;
break;
default: exit(1);
}
}
void CVideoObjectDecoder::updateBuffVOPsEnhc ()
{
if ( this -> m_bCodedFutureRef == 1 ){ // added by Sharp (99/1/28)
switch(m_vopmd.vopPredType) {
case IVOP: // printf(" Not defined in updateBuffVOPsEnhc. \n"); exit(1); // deleted by Sharp (99/1/25)
m_pBuffE -> getBuf (this); // added by Sharp (99/1/22)
break; //added by Sharp (99/1/25)
case PVOP: m_pBuffE -> getBuf (this);
break;
case BVOP: m_pBuffE -> getBuf (this);
break;
default: exit(1);
}
} // added by Sharp (99/1/28)
}
void CVideoObjectDecoder::bufferB2flush ()
{
if (!(m_pBuffB2 -> empty ())) {
if ( m_pBuffB2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
m_pBuffB1 -> copyBuf (*m_pBuffB2);
m_pBuffB2 -> dispose ();
}
}
/* Added */
void CVideoObjectDecoder::set_enh_display_size(CRct rctDisplay, CRct *rctDisplay_SSenh)
{
float tmp_right,tmp_left,tmp_top,tmp_bottom,tmp_width;
tmp_right = (float) rctDisplay.right * ((float) m_volmd.ihor_sampling_factor_n / m_volmd.ihor_sampling_factor_m);
tmp_left = (float) rctDisplay.left * ((float) m_volmd.ihor_sampling_factor_n / m_volmd.ihor_sampling_factor_m);
tmp_width = (float) rctDisplay.width * ((float) m_volmd.ihor_sampling_factor_n / m_volmd.ihor_sampling_factor_m);
tmp_top = (float) rctDisplay.top * ((float) m_volmd.iver_sampling_factor_n / m_volmd.iver_sampling_factor_m);
tmp_bottom = (float) rctDisplay.bottom * ((float) m_volmd.iver_sampling_factor_n / m_volmd.iver_sampling_factor_m);
rctDisplay_SSenh->right = (Int) tmp_right;
rctDisplay_SSenh->left = (Int) tmp_left;
rctDisplay_SSenh->width = (Int) tmp_width;
rctDisplay_SSenh->top = (Int) tmp_top;
rctDisplay_SSenh->bottom = (Int) tmp_bottom;
}
void CVideoObjectDecoder::bufferB1flush ()
{
m_pBuffB1 -> dispose ();
}
void CVideoObjectDecoder::bufferP1flush ()
{
m_pBuffP1 -> dispose ();
}
void CVideoObjectDecoder::copyBufP2ToB1 ()
{
if ( m_pBuffP2 -> m_bCodedFutureRef == 1 ) // added by Sharp (99/1/28)
m_pBuffB1 -> copyBuf (*m_pBuffP2);
}
void CVideoObjectDecoder::copyRefQ1ToQ0 ()
{
copyVOPU8YUVBA(m_pvopcRefQ0, m_pvopcRefQ1);
}
Time CVideoObjectDecoder::senseTime ()
{
m_pbitstrmIn -> setBookmark ();
if (findStartCode () == EOF) {
m_pbitstrmIn -> gotoBookmark ();
return EOF;
}
// Start code
UInt uiVopStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_START_CODE);
if (uiVopStartCode == GOV_START_CODE) {
m_bUseGOV = TRUE;
m_bLinkisBroken = FALSE;
Int timecode;
timecode = m_pbitstrmIn -> getBits (5) * 3600;
timecode += m_pbitstrmIn -> getBits (6) * 60;
m_pbitstrmIn -> getBits (1);
timecode += m_pbitstrmIn -> getBits (6);
m_tModuloBaseDecd = timecode;
m_tModuloBaseDisp = timecode;
Int closed_gov = m_pbitstrmIn -> getBits (1);
Int broken_link = m_pbitstrmIn -> getBits (1);
if ((closed_gov == 0)&&(broken_link == 1))
m_bLinkisBroken = TRUE;
findStartCode();
/*
m_pbitstrmIn -> getBits (4);
Int uiPrefix = m_pbitstrmIn -> getBits (NUMBITS_START_CODE_PREFIX);
assert(uiPrefix == START_CODE_PREFIX);
*/
uiVopStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_START_CODE);
}
assert(uiVopStartCode == VOP_START_CODE);
m_vopmd.vopPredType = (VOPpredType) m_pbitstrmIn -> getBits (NUMBITS_VOP_PRED_TYPE);
// Time reference and VOP_pred_type
Int iModuloInc = 0;
while (m_pbitstrmIn -> getBits (1) != 0)
iModuloInc++;
Time tCurrSec = iModuloInc + ((m_vopmd.vopPredType != BVOP ||
(m_vopmd.vopPredType == BVOP && m_volmd.volType == ENHN_LAYER )) ?
m_tModuloBaseDecd : m_tModuloBaseDisp);
UInt uiMarker = m_pbitstrmIn -> getBits (1);
assert(uiMarker == 1);
Time tVopIncr = m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr);
m_pbitstrmIn -> gotoBookmark ();
Time t = tCurrSec * m_volmd.iClockRate*m_iClockRateScale + tVopIncr*m_iClockRateScale;
return(t);
}
Time CVideoObjectDecoder::getTime ()
{
return m_t;
}
int CVideoObjectDecoder::getPredType ()
{
return m_vopmd.vopPredType;
}
Void CVideoObjectDecoder::BackgroundComposition(char* argv[], Bool
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -