📄 decoder.cpp
字号:
pfReconYUV [ENHN_LAYER]= fopen (pchTmp, "wb");
fatal_error("cant open enhancement layer output yuv file",pfReconYUV [ENHN_LAYER] != NULL);
}
//OBSS_SAIT_991015
FILE* pfReconSeg[2];
pfReconSeg[0] = NULL;
pfReconSeg[1] = NULL;
sprintf (pchTmp, "%s.seg", argv [2 + bScalability]);
if (pvodec [BASE_LAYER]-> volmd ().fAUsage != RECTANGLE) {
pfReconSeg[BASE_LAYER] = fopen (pchTmp, "wb");
fatal_error("cant open output seg file",pfReconSeg[BASE_LAYER] != NULL);
}
// MAC (SB) 1-Dec-99
if (pvodec [BASE_LAYER]-> volmd ().fAUsage == EIGHT_BIT) {
Int iAuxCompCount = pvodec [BASE_LAYER]-> volmd ().iAuxCompCount;
ppfReconAux[0] = new FILE* [iAuxCompCount];
ppfReconAux[1] = new FILE* [iAuxCompCount];
for(Int iAuxComp=0; iAuxComp<iAuxCompCount; iAuxComp++ ) {
sprintf (pchTmp, "%s.%d.aux", argv [2 + bScalability], iAuxComp);
ppfReconAux[BASE_LAYER][iAuxComp] = fopen (pchTmp, "wb");
fatal_error("cant open output seg file",ppfReconAux[BASE_LAYER][iAuxComp] != NULL);
}
}
//~MAC
if (bScalability){
sprintf (pchTmp, "%s_e.seg", argv [2 + bScalability]);
if (pvodec [ENHN_LAYER]-> volmd ().fAUsage != RECTANGLE) {
pfReconSeg[ENHN_LAYER] = fopen (pchTmp, "wb");
fatal_error("cant open output seg file",pfReconSeg[ENHN_LAYER] != NULL);
}
}
//~OBSS_SAIT_991015
Int iEof = 1;
Int nFrames = 0;
const CVOPU8YUVBA* pvopcQuant;
#ifdef __PC_COMPILER_
Int tickBegin = ::GetTickCount ();
#endif // __PC_COMPILER_
Bool bCachedRefFrame = FALSE;
Bool bCachedRefFrameCoded = FALSE;
//OBSS_SAIT_991015 //_SS_BASE_BVOP_
Int iBASEVOP_time;
Int iBASEVOP_PredType;
//~OBSS_SAIT_991015 //_SS_BASE_BVOP_
while (iEof != EOF)
{
if (main_short_video_header) // Added by KPN for short headers
{
fprintf(stderr,"Frame number: %d\n", nFrames);
iEof = pvodec [BASE_LAYER] -> h263_decode ();
}
else
iEof = pvodec [BASE_LAYER] -> decode ();
if (iEof != EOF)
nFrames++;
if(pvodec [BASE_LAYER] -> fSptUsage () == 1)
{
// sprite
if(iEof != EOF)
{
pvopcQuant = pvodec [BASE_LAYER]->pvopcReconCurr();
dumpFrame (pvopcQuant, &(rgpvopcPrevDisp[BASE_LAYER]), pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER],
ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount,
pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0, pvodec [BASE_LAYER]->vopmd().bInterlace); //OBSS_SAIT_991015
}
}
else
{
if(iEof == EOF)
{
// dump final cached frame if present
if(bCachedRefFrame)
{
bCachedRefFrame = FALSE;
if(bCachedRefFrameCoded)
{
pvopcQuant = pvodec [BASE_LAYER]->pvopcRefQLater(); // future reference
dumpFrame (pvopcQuant, &(rgpvopcPrevDisp[BASE_LAYER]), pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER],
ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount,
pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0, pvodec [BASE_LAYER]->vopmd().bInterlace); //OBSS_SAIT_991015
}
else // non coded
dumpFrameNonCoded(pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER],
ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount,
rgpvopcPrevDisp[BASE_LAYER],
pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay, nBits); //OBSS_SAIT_991015
}
}
else
{
// dump if bvop
if(pvodec[BASE_LAYER]->vopmd().vopPredType == BVOP)
{
// BVOP
if(iEof != FALSE)
{
pvopcQuant = pvodec [BASE_LAYER]->pvopcReconCurr(); // current vop
dumpFrame (pvopcQuant, &(rgpvopcPrevDisp[BASE_LAYER]), pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER],
ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount,
pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0, pvodec [BASE_LAYER]->vopmd().bInterlace); //OBSS_SAIT_991015
}
else // non coded BVOP
dumpFrameNonCoded(pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER],
ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount,
rgpvopcPrevDisp[BASE_LAYER],
pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay, nBits); //OBSS_SAIT_991015
}
else
{
// not a BVOP, so dump any previous cached frame
if(bCachedRefFrame)
{
bCachedRefFrame = FALSE;
if(bCachedRefFrameCoded)
{
pvopcQuant = pvodec [BASE_LAYER]->pvopcRefQPrev(); // past reference
dumpFrame (pvopcQuant, &(rgpvopcPrevDisp[BASE_LAYER]), pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER],
ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount,
pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay,
nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0, pvodec [BASE_LAYER]->vopmd().bInterlace); //OBSS_SAIT_991015
}
else // non coded
dumpFrameNonCoded(pfReconYUV [BASE_LAYER], pfReconSeg[BASE_LAYER],
ppfReconAux[BASE_LAYER], pvodec [BASE_LAYER]->volmd().iAuxCompCount,
rgpvopcPrevDisp[BASE_LAYER],
pvodec[BASE_LAYER]->volmd().fAUsage, rctDisplay, nBits); //OBSS_SAIT_991015
}
// cache current reference
bCachedRefFrame = TRUE;
bCachedRefFrameCoded = (iEof != FALSE);
}
}
}
if (bSpatialScalable == TRUE) {
//OBSS_SAIT_991015 //_SS_BASE_BVOP_
if(iEof == FALSE){
pvopcQuant = NULL;
if(pvodec[BASE_LAYER]->volmd().fAUsage == ONE_BIT){
iBASEVOP_time = pvodec[BASE_LAYER]->show_current_time();
iBASEVOP_PredType = pvodec[BASE_LAYER]->vopmd().vopPredType;
}
}
else {
pvopcQuant = pvodec [BASE_LAYER]->pvopcReconCurr(); //Added by SONY 98/11/25
iBASEVOP_time = pvodec[BASE_LAYER]->show_current_time();
iBASEVOP_PredType = pvodec[BASE_LAYER]->vopmd().vopPredType;
}
//These static parameters will be used in the case BVOP is available in the BASE_LAYER (for spatial scalability)
static CVOPU8YUVBA* pBASE_stackVOP=NULL; //Temporal buffer of BASELAYER reconstructed image
static Int iBase_stackTime = -1;
static CRct pBase_stack_rctBase;
Int iENHNVOP_time = pvodec[ENHN_LAYER] -> senseTime ();
static ShapeMode* pBase_stack_Baseshpmd = NULL;
static ShapeMode* pBase_tmp_Baseshpmd = NULL;
static CMotionVector* pBase_stack_mvBaseBY = NULL;
static CMotionVector* pBase_tmp_mvBaseBY = NULL;
static Int iBase_stack_x, iBase_stack_y;
Bool BGComposition = FALSE; //for OBSS partial enhancement mode
if (iBASEVOP_time != iENHNVOP_time && iBASEVOP_PredType !=BVOP ){
//stack YUV images and paramters
pBase_stack_rctBase = pvodec [BASE_LAYER] -> getBaseRct();
iBase_stackTime = iBASEVOP_time;
//for OBSS BVOP_BASE : stack
//OBSSFIX_MODE3
if(pvodec[ENHN_LAYER]->volmd().fAUsage == ONE_BIT &&
!(pvodec[ENHN_LAYER]->volmd().iHierarchyType == 0 &&
pvodec[ENHN_LAYER]->volmd().iuseRefShape == 1 &&
pvodec[ENHN_LAYER]->volmd().iEnhnType != 0 )) {
// if(pvodec[ENHN_LAYER]->volmd().fAUsage == ONE_BIT) {
//~OBSSFIX_MODE3
if(iEof) pBASE_stackVOP = new CVOPU8YUVBA (*pvopcQuant, pvodec[BASE_LAYER]->volmd().fAUsage, (pvodec[BASE_LAYER]->pvopcQuantCurr())->whereY());
iBase_stack_x = pvodec [BASE_LAYER] -> getMBXRef();
iBase_stack_y = pvodec [BASE_LAYER] -> getMBYRef();
pBase_stack_Baseshpmd = new ShapeMode[iBase_stack_x*iBase_stack_y];
pBase_stack_mvBaseBY = new CMotionVector[iBase_stack_x*iBase_stack_y];
for(Int j=0;j<iBase_stack_y;j++){
for(Int i=0;i<iBase_stack_x;i++){
pBase_stack_Baseshpmd[j*iBase_stack_x+i] = (pvodec[BASE_LAYER] ->shapemd())[j*iBase_stack_x+i];
pBase_stack_mvBaseBY[j*iBase_stack_x+i] = (pvodec [BASE_LAYER] ->getmvBaseBY())[j*iBase_stack_x+i];
}
}
}
//OBSSFIX_MODE3
else if(pvodec[ENHN_LAYER]->volmd().fAUsage == RECTANGLE ||
(pvodec[ENHN_LAYER]->volmd().iHierarchyType == 0 &&
pvodec[ENHN_LAYER]->volmd().iuseRefShape == 1 &&
pvodec[ENHN_LAYER]->volmd().iEnhnType != 0 )){
if(pvodec[BASE_LAYER]->volmd().fAUsage == RECTANGLE)
pBASE_stackVOP= new CVOPU8YUVBA (*pvopcQuant, pvodec[BASE_LAYER]->volmd().fAUsage, pBase_stack_rctBase);
else if(iEof) pBASE_stackVOP = new CVOPU8YUVBA (*pvopcQuant, pvodec[BASE_LAYER]->volmd ().fAUsage, (pvodec[BASE_LAYER]->pvopcQuantCurr())->whereY());
// else if(pvodec[ENHN_LAYER]->volmd().fAUsage == RECTANGLE){
// pBASE_stackVOP = new CVOPU8YUVBA (*pvopcQuant, pvodec[BASE_LAYER]->volmd().fAUsage, pBase_stack_rctBase);
//~OBSSFIX_MODE3
}
//~for OBSS BVOP_BASE : stack
} else if( iBASEVOP_time != -1 &&iBASEVOP_time == iENHNVOP_time){
//decode VOP using currentry decoded Base layer image
if(pvodec[ENHN_LAYER]->volmd().fAUsage == ONE_BIT) {
pvodec[ENHN_LAYER] -> setShapeMode(pvodec[BASE_LAYER] ->shapemd());
CMotionVector* pmvBaseBY;
pmvBaseBY = pvodec [BASE_LAYER] ->getmvBaseBY();
pvodec [ENHN_LAYER] -> setmvBaseBY(pmvBaseBY);
Int x, y;
x = pvodec [BASE_LAYER] -> getMBBaseXRef();
y = pvodec [BASE_LAYER] -> getMBBaseYRef();
pvodec [ENHN_LAYER] -> setMBXYRef(x, y);
CRct prctBase;
prctBase = pvodec [BASE_LAYER] -> getBaseRct();
pvodec [ENHN_LAYER] -> setBaseRct(prctBase);
}
// if base layer is non coded, pvopcQuant=NULL, but enh layer should also be non coded.
iEof = pvodec [ENHN_LAYER] -> decode (pvopcQuant);
// for background composition (base layer(background) + partial enhancement layer)
BGComposition = FALSE;
//OBSSFIX_MODE3
if( pvodec [ENHN_LAYER] -> volmd().iHierarchyType == 0 &&
pvodec [ENHN_LAYER] -> volmd().iEnhnType == 1 &&
pvodec [ENHN_LAYER] -> vopmd().bBGComposition == 1 )
BGComposition = pvodec [ENHN_LAYER] -> BackgroundCompositionSS(rctDisplay_SSenh.width, rctDisplay_SSenh.height (), pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER], pvopcQuant);
// if( pvodec [ENHN_LAYER] -> volmd().iHierarchyType == 0 &&
// pvodec [ENHN_LAYER] -> volmd().iEnhnType == 1 &&
// pvodec [ENHN_LAYER] -> volmd().iuseRefShape == 0 )
// BGComposition = pvodec [ENHN_LAYER] -> BackgroundComposition(rctDisplay_SSenh.width, rctDisplay_SSenh.height (), pfReconYUV[ENHN_LAYER], pfReconSeg[ENHN_LAYER]);
//~OBSSFIX_MODE3
if(iEof!=EOF)
nFrames++; // include enhancement layer
if(iEof==FALSE)
dumpFrameNonCoded(pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER],
ppfReconAux[ENHN_LAYER], pvodec [ENHN_LAYER]->volmd().iAuxCompCount,
rgpvopcPrevDisp[ENHN_LAYER],
pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay_SSenh, nBits);
if (iEof != EOF && iEof!=FALSE )
//for OBSS partial enhancement mode
//OBSSFIX_MODE3
if(!(pvodec [ENHN_LAYER]->volmd().iHierarchyType == 0 && pvodec [ENHN_LAYER] -> volmd().iEnhnType == 1 && BGComposition))
// if(!(pvodec [ENHN_LAYER]->volmd().iHierarchyType == 0 && pvodec [ENHN_LAYER] -> volmd().iEnhnType == 1 && pvodec [ENHN_LAYER] -> volmd().iuseRefShape == 0 && BGComposition))
//~OBSSFIX_MODE3
dumpFrame (pvodec [ENHN_LAYER]->pvopcReconCurr (), &(rgpvopcPrevDisp[ENHN_LAYER]), pfReconYUV [ENHN_LAYER], pfReconSeg[ENHN_LAYER],
NULL, 0,
pvodec[ENHN_LAYER]->volmd().fAUsage, rctDisplay_SSenh,
nBits, pvodec [BASE_LAYER]->vopmd().iVopConstantAlphaValue, 0, 0); // still base layer
if( iBase_stackTime != -1 &&
iBase_stackTime == pvodec[ENHN_LAYER] -> senseTime ()){
//decode VOP using stacked VOP.
//for OBSS BVOP_BASE : stack out
//OBSSFIX_MODE3
if(pvodec[ENHN_LAYER]->volmd().fAUsage == ONE_BIT &&
!(pvodec[ENHN_LAYER]->volmd().iHierarchyType == 0 &&
pvodec[ENHN_LAYER]->volmd().iEnhnType != 0 &&
pvodec[ENHN_LAYER]->volmd().iuseRefShape == 1)) {
// if(pvodec[ENHN_LAYER]->volmd().fAUsage == ONE_BIT) {
//~OBSSFIX_MODE3
pBase_tmp_Baseshpmd = pvodec[BASE_LAYER] ->shapemd();
pvodec[ENHN_LAYER] -> setShapeMode(pBase_stack_Baseshpmd);
pBase_tmp_mvBaseBY = pvodec [BASE_LAYER] ->getmvBaseBY();
pvodec [ENHN_LAYER] -> setmvBaseBY(pBase_stack_mvBaseBY);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -