📄 sesenc.cpp
字号:
for (y = 0; y < iUVDataHeight; y++) {
Int size = (Int) fread (ppxlcU, sizeof (U8), m_rctOrg.width / 2, pf);
if (size == 0)
fprintf (stderr, "Unexpected end of file\n");
ppxlcU += iUvFrmWidth;
}
for (y = 0; y < iUVDataHeight; y++) {
Int size = (Int) fread (ppxlcV, sizeof (U8), m_rctOrg.width / 2, pf);
if (size == 0)
fprintf (stderr, "Unexpected end of file\n");
ppxlcV += iUvFrmWidth;
}
PixelC* ppxlcBY = (PixelC*) pvopcDst->pixelsBY () + nSkipYPixel;
Int iObjectExist = 0;
if ((bAUsage == ONE_BIT) && (pvopcDst -> fAUsage () == ONE_BIT)) { // load Alpha
//binary
for (CoordI y = 0; y < iYDataHeight; y++) {
Int size = (Int) fread (ppxlcBY, sizeof (U8), m_rctOrg.width, pf);
if (size == 0)
fprintf (stderr, "Unexpected end of file\n");
ppxlcBY += iYFrmWidth;
}
((CU8Image*) pvopcDst->getPlane (BUV_PLANE))->decimateBinaryShapeFrom (*(pvopcDst->getPlane (BY_PLANE)));
}
#ifdef _FOR_GSSP_
else if ((bAUsage == EIGHT_BIT) && (pvopcDst -> fAUsage () == EIGHT_BIT)) { // load Alpha
//grayscale alpha
PixelC* ppxlcA = (PixelC*) pvopcDst->pixelsA () + nSkipYPixel;
for (CoordI y = 0; y < iYDataHeight; y++) {
for (CoordI x = 0; x < m_rctOrg.width; x++) {
PixelC pxlcCurr = getc (pf);
ppxlcA [x] = (pxlcCurr >= GRAY_ALPHA_THRESHOLD) ? pxlcCurr : transpValue;
ppxlcBY [x] = (pxlcCurr >= GRAY_ALPHA_THRESHOLD) ? opaqueValue : transpValue;
}
ppxlcBY += iYFrmWidth;
ppxlcA += iYFrmWidth;
}
((CU8Image*) pvopcDst->getPlane (BUV_PLANE))->decimateBinaryShapeFrom (*(pvopcDst->getPlane (BY_PLANE)));
}
#endif
}
Void CSessionEncoder::getInputFiles (FILE*& pfYuvSrc, FILE*& pfAlpSrc, FILE*& pfYuvSrcSpatialEnhn,
FILE* rgpfReconYUV [], FILE* rgpfReconSeg [],
ofstream* rgpostrm [], ofstream* rgpostrmTrace [],
PixelC& pxlcObjColor, Int iobj, const VOLMode& volmd, const VOLMode& volmd_enhn)
{
static Char pchYUV [100], pchSeg [100], pchCmp [100], pchTrace [100];
//output files
createCmpDir (iobj);
sprintf (pchCmp, SUB_CMPFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
sprintf (pchTrace, SUB_TRCFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
rgpostrm [BASE_LAYER] = new ofstream (pchCmp, IOS_BINARY | ios::out);
rgpostrmTrace [BASE_LAYER] = NULL;
if (volmd.bTrace)
rgpostrmTrace [BASE_LAYER] = new ofstream (pchTrace);
// prepare for the reconstructed files
createReconDir (iobj); // create a directory for the reconstructed YUV in case it doesn't exist
sprintf (pchYUV, SUB_YUVFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
sprintf (pchSeg, SUB_SEGFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
rgpfReconSeg [BASE_LAYER] = NULL;
rgpfReconSeg [ENHN_LAYER] = NULL;
rgpfReconYUV [BASE_LAYER] = fopen (pchYUV, "wb"); // reconstructed YUV file
assert (rgpfReconYUV [BASE_LAYER] != NULL);
if (volmd.fAUsage != RECTANGLE) {
rgpfReconSeg [BASE_LAYER] = fopen (pchSeg, "wb"); // reconstructed seg file
assert (rgpfReconSeg [BASE_LAYER] != NULL);
}
/*
if (m_rgbSpatialScalability [iobj - m_iFirstVO] == TRUE) {
sprintf (pchCmp, ENHN_SUB_CMPFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
sprintf (pchTrace, ENHN_SUB_TRCFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
rgpostrm [ENHN_LAYER] = new ofstream (pchCmp, IOS_BINARY | ios::out);
rgpostrmTrace [ENHN_LAYER] = NULL;
if (volmd.bTrace)
rgpostrmTrace [ENHN_LAYER] = new ofstream (pchTrace);
sprintf (pchYUV, ENHN_SUB_YUVFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
sprintf (pchSeg, ENHN_SUB_SEGFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
rgpfReconYUV [ENHN_LAYER] = fopen (pchYUV, "wb"); // reconstructed YUV file
if (volmd.fAUsage != RECTANGLE) {
rgpfReconSeg [ENHN_LAYER] = fopen (pchSeg, "wb"); // reconstructed seg file
assert (FALSE); // no spatial scalability for shape
}
}
*/ //wchen: moved down
if (!m_bTexturePerVOP)
sprintf (pchYUV, ROOT_YUVFILE, m_pchBmpFiles, m_pchPrefix);
else
sprintf (pchYUV, SUB_YUVFILE, m_pchBmpFiles, iobj, m_pchPrefix);
pfYuvSrc = fopen (pchYUV, "rb");
if (pfYuvSrc == NULL) {
fprintf (stderr, "can't open %s\n", pchYUV);
exit (1);
}
if (m_rgbSpatialScalability [iobj - m_iFirstVO] == TRUE) {
sprintf (pchCmp, ENHN_SUB_CMPFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
sprintf (pchTrace, ENHN_SUB_TRCFILE, m_pchOutStrFiles, iobj, m_pchPrefix);
rgpostrm [ENHN_LAYER] = new ofstream (pchCmp, IOS_BINARY | ios::out);
rgpostrmTrace [ENHN_LAYER] = NULL;
if (volmd_enhn.bTrace) // modified by Sharp (98/2/12)
rgpostrmTrace [ENHN_LAYER] = new ofstream (pchTrace);
// begin: added by Sharp (98/10/26)
if ( volmd_enhn.bTemporalScalability == TRUE ){
rgpfReconYUV [ENHN_LAYER] = rgpfReconYUV[BASE_LAYER];
if (volmd_enhn.fAUsage != RECTANGLE) {
if ( volmd_enhn.iEnhnType == 0 )
rgpfReconSeg [ENHN_LAYER] = rgpfReconSeg[BASE_LAYER];
else{
sprintf (pchSeg, ENHN_SUB_SEGFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
rgpfReconSeg [ENHN_LAYER] = fopen (pchSeg, "wb"); // reconstructed seg file
}
}
} else {
// end: added by Sharp (98/10/26)
sprintf (pchYUV, ENHN_SUB_YUVFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
sprintf (pchSeg, ENHN_SUB_SEGFILE, m_pchReconYUVDir, iobj, m_pchPrefix);
rgpfReconYUV [ENHN_LAYER] = fopen (pchYUV, "wb"); // reconstructed YUV file
if (volmd_enhn.fAUsage != RECTANGLE) { // modified by Sharp (98/2/12)
rgpfReconSeg [ENHN_LAYER] = fopen (pchSeg, "wb"); // reconstructed seg file
// deleted by Sharp (98/10/26)
// begin: added by Sharp (98/2/10)
// if ( volmd.bTemporalScalability == TRUE )
// assert (rgpfReconSeg [ENHN_LAYER] != NULL);
// else
// end: added by Sharp (98/2/10)
// end: deleted by Sharp (98/10/26)
assert (FALSE); // no spatial scalability for shape
}
} // added by Sharp (98/10/26)
if ( volmd_enhn.bTemporalScalability == FALSE ){ // added by Sharp (98/2/10)
if (!m_bTexturePerVOP) {
fprintf (stderr,"m_bTexturePerVOP != 0 is not applyed for spatial scalable coding\n");
}
else
sprintf (pchYUV, ENHN_SUB_YUVFILE, m_pchBmpFiles, iobj, m_pchPrefix);
pfYuvSrcSpatialEnhn = fopen (pchYUV, "rb");
if (pfYuvSrcSpatialEnhn == NULL){
fprintf (stderr,"can't open %s\n", pchYUV);
exit(1);
}
} // added by Sharp (98/2/10)
}
if (volmd.fAUsage != RECTANGLE ||
m_rgbSpatialScalability [iobj - m_iFirstVO] == TRUE && volmd_enhn.fAUsage != RECTANGLE) { // load Alpha // modified by Sharp (98/2/12)
if (!m_bAlphaPerVOP) {
pxlcObjColor = iobj;
sprintf (pchSeg, ROOT_SEGFILE, m_pchBmpFiles, m_pchPrefix);
}
else {
pxlcObjColor = opaqueValue; // out data notation
sprintf (pchSeg, SUB_SEGFILE, m_pchBmpFiles, iobj, m_pchPrefix);
}
pfAlpSrc = fopen (pchSeg, "rb");
if (pfAlpSrc == NULL) {
fprintf (stderr, "can't open %s\n", pchSeg);
exit (1);
}
}
// begin: deleted by Sharp (98/10/26)
// begin: added by Sharp (98/2/10)
// #ifndef __OUT_ONE_FRAME_
// if (m_rgbSpatialScalability [iobj - m_iFirstVO] == TRUE && volmd_enhn.bTemporalScalability == TRUE && volmd_enhn.iEnhnType != 0) { // modified by Sharp (98/3/24)
// FILE *pfTemp;
// sprintf (pchYUV, "%s/%2.2d/%s_bgc.yuv", m_pchReconYUVDir, iobj, m_pchPrefix);
// pfTemp = fopen (pchYUV, "wb"); // clear file pointer for background composition
// fclose(pfTemp);
// }
// #endif
// end: added by Sharp (98/2/10)
// end: deleted by Sharp (98/10/26)
}
Void CSessionEncoder::initVOEncoder (CVideoObjectEncoder** rgpvoenc, Int iobj, ofstream* rgpostrmTrace [])
{
Int iVOidx = iobj - m_iFirstVO;
Bool bTemporalScalability = m_rgvolmd[BASE_LAYER][iVOidx].bTemporalScalability; // added by Sharp (98/2/10)
// Bool bTemporalScalability = TRUE; // added by Sharp (98/2/10)
if (m_rgbSpatialScalability [iVOidx] == TRUE) {
rgpvoenc [BASE_LAYER] = new CVideoObjectEncoder (
iobj,
m_rgvolmd [BASE_LAYER] [iVOidx],
m_rgvopmd [BASE_LAYER] [iVOidx],
m_iFirstFrame,
m_iLastFrame,
m_rctOrg.width,
m_rctOrg.height(),
m_rguiRateControl [BASE_LAYER] [iVOidx],
m_rguiBudget [BASE_LAYER] [iVOidx],
rgpostrmTrace [BASE_LAYER],
m_rguiWarpingAccuracy [iVOidx],
m_rgNumOfPnts [iVOidx],
m_pppstDst [iVOidx],
m_SptMode,
m_rctFrame,
m_rctOrg,
m_rgiMVFileUsage [BASE_LAYER][iVOidx],
m_pchMVFileName [BASE_LAYER][iVOidx]);
// begin: added by Sharp (98/2/10)
if ( bTemporalScalability )
rgpvoenc [ENHN_LAYER] = new CVideoObjectEncoder (
iobj,
m_rgvolmd [ENHN_LAYER] [iVOidx],
m_rgvopmd [ENHN_LAYER] [iVOidx],
m_iFirstFrame,
m_iLastFrame,
m_rctOrg.width,
m_rctOrg.height(),
m_rguiRateControl [ENHN_LAYER] [iVOidx],
m_rguiBudget [ENHN_LAYER] [iVOidx],
rgpostrmTrace [ENHN_LAYER],
0,
-1,
m_pppstDst [iVOidx],
m_SptMode,
m_rctFrame,
m_rctOrgSpatialEnhn,
m_rgiMVFileUsage [ENHN_LAYER][iVOidx],
m_pchMVFileName [ENHN_LAYER][iVOidx]);
else
// end: added by Sharp (98/2/10)
rgpvoenc [ENHN_LAYER] = new CVideoObjectEncoder (
iobj,
m_rgvolmd [ENHN_LAYER] [iVOidx],
m_rgvopmd [ENHN_LAYER] [iVOidx],
m_iFirstFrame,
m_iLastFrame,
m_rctOrgSpatialEnhn.width,
m_rctOrgSpatialEnhn.height (),
m_rguiRateControl [ENHN_LAYER] [iVOidx],
m_rguiBudget [ENHN_LAYER] [iVOidx],
rgpostrmTrace [ENHN_LAYER],
0,
-1,
m_pppstDst [iVOidx],
m_SptMode,
m_rctFrame,
m_rctOrgSpatialEnhn,
m_rgiMVFileUsage [ENHN_LAYER][iVOidx],
m_pchMVFileName [ENHN_LAYER][iVOidx]);
}
else {
rgpvoenc [BASE_LAYER] = new CVideoObjectEncoder (
iobj,
m_rgvolmd [BASE_LAYER] [iVOidx],
m_rgvopmd [BASE_LAYER] [iVOidx],
m_iFirstFrame,
m_iLastFrame,
m_rctOrg.width,
m_rctOrg.height (),
m_rguiRateControl [BASE_LAYER] [iVOidx],
m_rguiBudget [BASE_LAYER] [iVOidx],
rgpostrmTrace [BASE_LAYER],
m_rguiWarpingAccuracy [iVOidx],
m_rgNumOfPnts [iVOidx],
m_pppstDst [iVOidx],
m_SptMode,
m_rctFrame,
m_rctOrg,
m_rgiMVFileUsage [BASE_LAYER][iVOidx],
m_pchMVFileName [BASE_LAYER][iVOidx]);
}
}
Bool CSessionEncoder::loadData (UInt iFrame, FILE* pfYuvSrc, FILE* pfSegSrc, PixelC pxlcObjColor, CVOPU8YUVBA* pvopcDst, CRct& rctOrg, const VOLMode& volmd)
{
Int iLeadingPixels = iFrame * rctOrg.area ();
if (volmd.nBits<=8) {
fseek (pfYuvSrc, iLeadingPixels + iLeadingPixels / 2, SEEK_SET); //4:2:0
} else { // NBIT: 2 bytes per pixel, Y component plus UV
fseek (pfYuvSrc, iLeadingPixels * 3, SEEK_SET);
}
if (volmd.fAUsage != RECTANGLE)
fseek (pfSegSrc, iLeadingPixels, SEEK_SET);
Int iYDataHeight = rctOrg.height ();
Int iUVDataHeight = rctOrg.height () / 2;
Int iYFrmWidth = pvopcDst->whereY ().width;
Int iUvFrmWidth = pvopcDst->whereUV ().width;
Int nSkipYPixel = iYFrmWidth * EXPANDY_REF_FRAME + EXPANDY_REF_FRAME;
Int nSkipUvPixel = iUvFrmWidth * EXPANDUV_REF_FRAME + EXPANDUV_REF_FRAME;
PixelC* ppxlcY = (PixelC*) pvopcDst->pixelsY () + nSkipYPixel;
PixelC* ppxlcU = (PixelC*) pvopcDst->pixelsU () + nSkipUvPixel;
PixelC* ppxlcV = (PixelC*) pvopcDst->pixelsV () + nSkipUvPixel;
CoordI y,x;
for (y = 0; y < iYDataHeight; y++) {
Int size = (Int) fread (ppxlcY, sizeof (PixelC), rctOrg.width, pfYuvSrc);
if (size == 0)
fprintf (stderr, "Unexpected end of file\n");
ppxlcY += iYFrmWidth;
}
/* modified by Rockwell (98/05/08)
if (volmd.nBits<=8) {*/
for (y = 0; y <
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -