📄 vopsedec.cpp
字号:
break;
default:
break;
}
cout << "\n";
cout.flush ();
/* Added by SONY (98/03/30)*/
if(m_bLinkisBroken == TRUE && m_bUseGOV == TRUE)
fprintf(stderr,"WARNING: broken_link = 1 --- Output image must be broken.\n");
/*Added by SONY (98/03/30) End*/
if(bCoded==FALSE)
{
if (m_vopmd.vopPredType != BVOP
&& m_volmd.fAUsage != RECTANGLE && bPrevRefVopWasCoded)
{
// give the current object a dummy size
m_iNumMBX = m_iNumMBY = m_iNumMB = 1;
saveShapeMode(); // save the previous reference vop shape mode
}
//OBSS_SAIT_991015
if (m_volmd.fAUsage != RECTANGLE){
// give the current object a dummy size
m_iNumMBX = m_iNumMBY = m_iNumMB = 1;
saveBaseShapeMode(); // save the base layer shape mode
}
//~OBSS_SAIT_991015
return FALSE;
}
if (m_volmd.fAUsage != RECTANGLE)
resetBYPlane ();
if (m_volmd.fAUsage != RECTANGLE) {
setRefStartingPointers ();
computeVOPMembers ();
}
// RRV insertion
redefineVOLMembersRRV ();
// ~RRV
decodeVOP ();
//wchen: added by sony-probably not the best way
if(m_volmd.volType == ENHN_LAYER &&
(m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0))
swapVOPU8Pointers(m_pvopcCurrQ,m_pvopcRefQ1);
//OBSSFIX_MODE3
//Case for base layer has rectangular shape & enhancement layer has arbitrary shape
if(m_pvopcCurrQ->fAUsage() == RECTANGLE && m_pvopcCurrQ->fAUsage() != m_pvopcRefQ1->fAUsage() ){
delete m_pvopcCurrQ;
m_pvopcCurrQ = new CVOPU8YUVBA(m_volmd.fAUsage, m_rctRefFrameY, m_volmd.iAuxCompCount);
}
//~OBSSFIX_MODE3
// store the direct mode data
if (m_vopmd.vopPredType != BVOP ||
(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) {
if(m_volmd.fAUsage != RECTANGLE && bPrevRefVopWasCoded)
saveShapeMode();
//OBSS_SAIT_991015
if(m_volmd.fAUsage != RECTANGLE)
saveBaseShapeMode();
//~OBSS_SAIT_991015
CMBMode* pmbmdTmp = m_rgmbmd;
m_rgmbmd = m_rgmbmdRef;
m_rgmbmdRef = pmbmdTmp;
CMotionVector* pmvTmp = m_rgmv;
m_rgmv = m_rgmvRef;
m_rgmvRef = pmvTmp;
m_rgmvBackward = m_rgmv + BVOP_MV_PER_REF_PER_MB * m_iSessNumMB;
}
//OBSS_SAIT_991015
else if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP ){
if( m_volmd.fAUsage != RECTANGLE)
saveBaseShapeMode();
}
//~OBSS_SAIT_991015
if (m_volmd.fAUsage != RECTANGLE) {
if (m_vopmd.vopPredType != BVOP ||
(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) {
m_iNumMBRef = m_iNumMB;
m_iNumMBXRef = m_iNumMBX;
m_iNumMBYRef = m_iNumMBY;
m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
m_rctPrevNoExpandY = m_rctCurrVOPY;
m_rctPrevNoExpandUV = m_rctCurrVOPUV;
m_rctRefVOPY1 = m_rctCurrVOPY;
m_rctRefVOPY1.expand (EXPANDY_REFVOP);
m_rctRefVOPUV1 = m_rctCurrVOPUV;
m_rctRefVOPUV1.expand (EXPANDUV_REFVOP);
m_pvopcRefQ1->setBoundRct (m_rctRefVOPY1);
}
else { // For Temporal Scalability Added by Sharp(1998-02-10)
//OBSS_SAIT_991015 //for Base layer BVOP padding
if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP) {
if(!m_volmd.bShapeOnly){
m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
m_rctPrevNoExpandY = m_rctCurrVOPY;
m_rctPrevNoExpandUV = m_rctCurrVOPUV;
}
}
//~OBSS_SAIT_991015
m_iBVOPOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
m_iBVOPOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);
m_rctBVOPPrevNoExpandY = m_rctCurrVOPY;
m_rctBVOPPrevNoExpandUV = m_rctCurrVOPUV;
m_rctBVOPRefVOPY1 = m_rctCurrVOPY;
m_rctBVOPRefVOPY1.expand (EXPANDY_REFVOP);
m_rctBVOPRefVOPUV1 = m_rctCurrVOPUV;
m_rctBVOPRefVOPUV1.expand (EXPANDUV_REFVOP);
} // For Temporal Scalability End Sharp(1998-02-10)
//give a comment that this is ac/dc pred stuff
Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 6+m_volmd.iAuxCompCount*4 : 6;
delete [] m_rgblkmCurrMB;
for (Int iMB = 0; iMB < m_iNumMBX; iMB++) {
for (Int iBlk = 0; iBlk < nBlk; iBlk++) {
delete [] (m_rgpmbmAbove [iMB]->rgblkm) [iBlk];
delete [] (m_rgpmbmCurr [iMB]->rgblkm) [iBlk];
}
delete [] m_rgpmbmAbove [iMB]->rgblkm;
delete m_rgpmbmAbove [iMB];
delete [] m_rgpmbmCurr [iMB]->rgblkm;
delete m_rgpmbmCurr [iMB];
}
delete [] m_rgpmbmAbove;
delete [] m_rgpmbmCurr;
}
else { // For Temporal Scalability Added by Sharp(1998-02-10)
m_iBVOPOffsetForPadY = m_iOffsetForPadY;
m_iBVOPOffsetForPadUV = m_iOffsetForPadUV;
m_rctBVOPPrevNoExpandY = m_rctPrevNoExpandY;
m_rctBVOPPrevNoExpandUV = m_rctPrevNoExpandUV;
m_rctBVOPRefVOPY1 = m_rctRefVOPY1;
m_rctBVOPRefVOPUV1 = m_rctRefVOPUV1;
} // For Temporal Scalability End Sharp(1998-02-10)
if (m_vopmd.vopPredType != BVOP ||
(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) {
if(!m_volmd.bShapeOnly){ //OBSS_SAIT_991015
repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ1);
repeatPadUV (m_pvopcRefQ1);
} //OBSS_SAIT_991015
//reset by in RefQ1 so that no left-over from last frame
if (m_volmd.fAUsage != RECTANGLE) {
if (m_volmd.fAUsage == EIGHT_BIT) {
for(Int iAuxComp=0; iAuxComp<m_volmd.iAuxCompCount; iAuxComp++ ) { // MAC (SB) 1-Dec-99
repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsA (iAuxComp) + m_iOffsetForPadY, m_pvopcRefQ1);
}
}
}
}
//OBSS_SAIT_991015 //Base layer BVOP padding for OBSS
if (m_volmd.volType == BASE_LAYER && m_vopmd.vopPredType == BVOP) {
if(!m_volmd.bShapeOnly){
repeatPadYOrA ((PixelC*) m_pvopcCurrQ->pixelsY () + m_iOffsetForPadY, m_pvopcCurrQ);
repeatPadUV (m_pvopcCurrQ);
}
if (m_volmd.fAUsage != RECTANGLE) {
if (m_volmd.fAUsage == EIGHT_BIT) {
for(Int iAuxComp=0; iAuxComp<m_volmd.iAuxCompCount; iAuxComp++ ) { // MAC (SB) 1-Dec-99
repeatPadYOrA ((PixelC*) m_pvopcCurrQ->pixelsA (iAuxComp) + m_iOffsetForPadY, m_pvopcCurrQ);
}
}
}
}
//~OBSS_SAIT_991015
// update buffers for temporal scalability Added by Sharp(1998-02-10)
if(m_volmd.volType != BASE_LAYER) updateBuffVOPsEnhc ();
return TRUE;
}
Int CVideoObjectDecoder::findStartCode()
{
// ensure byte alignment
m_pbitstrmIn->flush ();
Int bUserData;
do {
bUserData = 0;
while(m_pbitstrmIn->peekBits(NUMBITS_START_CODE_PREFIX)!=START_CODE_PREFIX)
{
m_pbitstrmIn->getBits(8);
if(m_pbitstrmIn->eof()==EOF)
return EOF;
}
m_pbitstrmIn->getBits(NUMBITS_START_CODE_PREFIX);
if(m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==USER_DATA_START_CODE)
bUserData = 1;
} while(bUserData);
return 0;
}
Void CVideoObjectDecoder::decodeVOHead ()
{
findStartCode();
// Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)(for Skip Session_Start_Code)
if( m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==SESSION_START_CODE){
m_pbitstrmIn -> getBits (NUMBITS_START_CODE_SUFFIX);
if (findStartCode () == EOF)
assert(FALSE);
}
// End Toshiba(1998-1-16:DP+RVLC)
UInt uiVoStartCode = m_pbitstrmIn -> getBits (NUMBITS_VO_START_CODE);
assert(uiVoStartCode == VO_START_CODE);
m_uiVOId = m_pbitstrmIn -> getBits (NUMBITS_VO_ID);
}
Void CVideoObjectDecoder::decodeVOLHead ()
{
findStartCode();
UInt uiVolStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOL_START_CODE);
assert(uiVolStartCode == VOL_START_CODE);
UInt uiVOLId = m_pbitstrmIn -> getBits (NUMBITS_VOL_ID);
// Begin: modified by Hughes 4/9/98 per clause 2.1.7. in N2171 document
Bool bRandom = m_pbitstrmIn->getBits (1); //VOL_Random_Access
// End: modified by Hughes 4/9/98
UInt uiOLType = m_pbitstrmIn -> getBits(8); // VOL_type_indication
UInt uiOLI = m_pbitstrmIn -> getBits (1); //VOL_Is_Object_Layer_Identifier, useless flag for now
if(uiOLI)
{
// GMC
m_volmd.uiVerID = m_pbitstrmIn -> getBits (4); // video_oject_layer_verid
// Here, is_object_layer_identifier is used for Version1/Version2
// identification at this moment (tentative solution).
// vol_type_indicator is not useless for version 2 at present.
// need discussion at Video Group about this issue.
// m_pbitstrmIn -> getBits (4); // video_oject_layer_verid
m_pbitstrmIn -> getBits (3); // video_oject_layer_priority
}
else{
m_volmd.uiVerID = 1;
// ~GMC
}
//assert(uiOLI == 0);
UInt uiAspect = m_pbitstrmIn -> getBits (4);
if(uiAspect==15) // extended PAR
{
UInt iParWidth = m_pbitstrmIn -> getBits (8);
UInt iParHeight = m_pbitstrmIn -> getBits (8);
}
UInt uiMark;
UInt uiCTP = m_pbitstrmIn -> getBits (1); //VOL_Control_Parameter, useless flag for now
if(uiCTP)
{
UInt uiChromaFormat = m_pbitstrmIn -> getBits (2);
UInt uiLowDelay = m_pbitstrmIn -> getBits (1);
UInt uiVBVParams = m_pbitstrmIn -> getBits (1);
if(uiVBVParams)
{
UInt uiFirstHalfBitRate = m_pbitstrmIn -> getBits (15);
uiMark = m_pbitstrmIn -> getBits (1);
assert(uiMark==1);
UInt uiLatterHalfBitRate = m_pbitstrmIn -> getBits (15);
uiMark = m_pbitstrmIn -> getBits (1);
assert(uiMark==1);
UInt uiFirstHalfVbvBufferSize = m_pbitstrmIn -> getBits (15);
uiMark = m_pbitstrmIn -> getBits (1);
assert(uiMark==1);
UInt uiLatterHalfVbvBufferSize = m_pbitstrmIn -> getBits (3);
UInt uiFirstHalfVbvBufferOccupany = m_pbitstrmIn -> getBits (11);
uiMark = m_pbitstrmIn -> getBits (1);
assert(uiMark==1);
UInt uiLatterHalfVbvBufferOccupany = m_pbitstrmIn -> getBits (15);
uiMark = m_pbitstrmIn -> getBits (1);
assert(uiMark==1);
}
}
UInt uiAUsage = m_pbitstrmIn -> getBits (NUMBITS_VOL_SHAPE);
// MAC (SB) 1-Dec-99
if (uiAUsage==3) { // gray scale
if (m_volmd.uiVerID!=1) {
m_volmd.iAlphaShapeExtension = m_pbitstrmIn -> getBits (4);
m_volmd.iAuxCompCount = CVideoObject::getAuxCompCount(m_volmd.iAlphaShapeExtension);
} else {
m_volmd.iAuxCompCount = 1;
}
} else
m_volmd.iAuxCompCount = 0;
//~MAC
uiMark = m_pbitstrmIn -> getBits (1);
assert(uiMark==1);
m_volmd.iClockRate = m_pbitstrmIn -> getBits (NUMBITS_TIME_RESOLUTION);
cout << m_volmd.iClockRate << "\n";
uiMark = m_pbitstrmIn -> getBits (1);
assert(uiMark==1);
Int iClockRate = m_volmd.iClockRate - 1;
assert (iClockRate < 65536);
if(iClockRate>0)
{
for (m_iNumBitsTimeIncr = 1; m_iNumBitsTimeIncr < NUMBITS_TIME_RESOLUTION; m_iNumBitsTimeIncr++) {
if (iClockRate == 1)
break;
iClockRate = (iClockRate >> 1);
}
}
else
m_iNumBitsTimeIncr = 0;
Bool bFixFrameRate = m_pbitstrmIn -> getBits (1);
//assert (bFixFrameRate == FALSE);
if(bFixFrameRate)
{
UInt uiFixedVOPTimeIncrement = 0;
if(m_iNumBitsTimeIncr!=0)
uiFixedVOPTimeIncrement = m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr);
// not used
//
//
}
if(uiAUsage==2) // shape-only mode
{
//OBSS_SAIT_991015
if(m_volmd.uiVerID == 2) {
m_volmd.volType = (m_pbitstrmIn -> getBits (1) == 0) ? BASE_LAYER : ENHN_LAYER;
m_volmd.iEnhnType = 0; //OBSSFIX_BSO
m_volmd.iHierarchyType = 0; //OBSSFIX_BSO
m_volmd.ihor_sampling_factor_n = 1;
m_volmd.ihor_sampling_factor_m = 1;
m_volmd.iver_sampling_factor_n = 1;
m_volmd.iver_sampling_factor_m = 1;
m_volmd.ihor_sampling_factor_n_shape = 1;
m_volmd.ihor_sampling_factor_m_shape = 1;
m_volmd.iver_sampling_factor_n_shape = 1;
m_volmd.iver_sampling_factor_m_shape = 1;
if (m_volmd.volType == ENHN_LAYER) {
m_volmd.ihor_sampling_factor_n_shape = m_pbitstrmIn->getBits (5);
m_volmd.ihor_sampling_factor_m_shape = m_pbitstrmIn->getBits (5);
m_volmd.iver_sampling_factor_n_shape = m_pbitstrmIn->getBits (5);
m_volmd.iver_sampling_factor_m_shape = m_pbitstrmIn->getBits (5);
m_volmd.ihor_sampling_factor_n = m_volmd.ihor_sampling_factor_n_shape;
m_volmd.ihor_sampling_factor_m = m_volmd.ihor_sampling_factor_m_shape;
m_volmd.iver_sampling_factor_n = m_volmd.iver_sampling_factor_n_shape;
m_volmd.iver_sampling_factor_m = m_volmd.iver_sampling_factor_m_shape;
}
}
//~OBSS_SAIT_991015
UInt uiResyncMarkerDisable = m_pbitstrmIn -> getBits (1);
// default to some values - probably not all needed
m_volmd.bShapeOnly=TRUE;
m_volmd.fAUsage=ONE_BIT;
m_volmd.bAdvPredDisable = 0;
m_volmd.fQuantizer = Q_H263;
//OBSS_SAIT_991015
m_volmd.bSadctDisable = 1;
m_volmd.bNewpredEnable = 0;
m_volmd.bQuarterSample = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -