📄 rrv.cpp
字号:
}
// for error(m_ppxliErrorMBY)
void UpSamplingTextureForRRV(PixelI *pPixlc, PixelI *pretPxlc,
Int iwidth, Int ihight,Int iwidthofpPix)
{
Int ibx, iby, ix, iy, ipos, icnt;
PixelI* pblock_low = new PixelI [64];
PixelI* pblock_norm = new PixelI [256];
PixelI* pnormal_data = new PixelI [iwidth *ihight *4];
Int inor_sizex = iwidth *2;
Int inor_sizey = ihight *2;
for(iby = 0; iby < (inor_sizey/2); iby+=8)
{
for(ibx = 0; ibx < (inor_sizex/2); ibx+=8)
{
for(iy = iby, icnt = 0; iy < iby + 8; iy ++)
{
ipos = ibx + (iy) * iwidth;
for(ix = ibx; ix < ibx + 8; ix++)
{
pblock_low[icnt] = pPixlc[ipos];
icnt++;
ipos++;
}
}
MeanUpSampling(pblock_low, pblock_norm, 8, 8);
for(iy = 2 * iby, icnt = 0; iy < 2 * iby + 16; iy ++)
{
ipos = 2 * ibx + (iy) * inor_sizex;
for(ix = 2 * ibx; ix < 2 * ibx + 16; ix++)
{
pnormal_data[ipos] = pblock_norm[icnt];
icnt++;
ipos++;
}
}
}
}
for(iy = 0; iy < inor_sizey; iy++)
{
for(ix = 0; ix < inor_sizex; ix++)
{
pretPxlc[ix +(iy *iwidthofpPix)]
= pnormal_data[ix +(iy *inor_sizex)];
}
}
delete [] pblock_norm;
delete [] pblock_low;
delete [] pnormal_data;
}
//static void
Void MeanUpSampling(PixelI *pSrcPic, PixelI *pDestPic,
Int iwidth, Int iheight )
{
Int i, j, ix0, iy0, ix1, iy1, ix2, iy2;
Int ival;
for(j = 0; j < iheight; j++)
{
for(i = 0; i < iwidth; i++)
{
ix0 = i;
iy0 = j;
ix1 = RRV_MAX(0, (i - 1));
iy1 = RRV_MAX(0, (j - 1));
ix2 = RRV_MIN((iwidth - 1), (i + 1));
iy2 = RRV_MIN((iheight - 1), (j + 1));
// RRV_3
if(i==0 && j==0) {
pDestPic[i * 2 + j * 2 * iwidth * 2] = pSrcPic[ix0 + iy0 * iwidth];
} else {
// ~RRV_3
ival = 9 * pSrcPic[ix0 + iy0 * iwidth] +
3 * pSrcPic[ix1 + iy0 * iwidth] +
3 * pSrcPic[ix0 + iy1 * iwidth] +
1 * pSrcPic[ix1 + iy1 * iwidth];
pDestPic[i * 2 + j * 2 * iwidth * 2] = (ival + 8) / 16;
// RRV_3
}
// ~RRV_3
// RRV_3
if(i==(iwidth-1) && j==0) {
pDestPic[i * 2 + 1 + j * 2 * iwidth * 2] = pSrcPic[ix0 + iy0 * iwidth];
} else {
// ~RRV_3
ival = 9 * pSrcPic[ix0 + iy0 * iwidth] +
3 * pSrcPic[ix2 + iy0 * iwidth] +
3 * pSrcPic[ix0 + iy1 * iwidth] +
1 * pSrcPic[ix2 + iy1 * iwidth];
pDestPic[i * 2 + 1 + j * 2 * iwidth * 2] = (ival + 8) / 16;
// RRV_3
}
// ~RRV_3
// RRV_3
if(i==0 && j==(iheight-1)) {
pDestPic[i * 2 + (j * 2 + 1) * iwidth * 2] = pSrcPic[ix0 + iy0 * iwidth];
} else {
// ~RRV_3
ival = 9 * pSrcPic[ix0 + iy0 * iwidth] +
3 * pSrcPic[ix1 + iy0 * iwidth] +
3 * pSrcPic[ix0 + iy2 * iwidth] +
1 * pSrcPic[ix1 + iy2 * iwidth];
pDestPic[i * 2 + (j * 2 + 1) * iwidth * 2] = (ival + 8) / 16;
// RRV_3
}
// ~RRV_3
// RRV_3
if(i==(iwidth-1) && j==(iheight-1)) {
pDestPic[i * 2 + 1 + (j * 2 + 1)* iwidth * 2] = pSrcPic[ix0 + iy0 * iwidth];
} else {
// ~RRV_3
ival = 9 * pSrcPic[ix0 + iy0 * iwidth] +
3 * pSrcPic[ix2 + iy0 * iwidth] +
3 * pSrcPic[ix0 + iy2 * iwidth] +
1 * pSrcPic[ix2 + iy2 * iwidth];
pDestPic[i * 2 + 1 + (j * 2 + 1)* iwidth * 2] = (ival + 8) / 16;
// RRV_3
}
// ~RRV_3
}
}
}
//static void
void MeanUpSampling(PixelC *pSrcPic, PixelC *pDestPic,
Int iwidth, Int iheight )
{
Int i, j, ix0, iy0, ix1, iy1, ix2, iy2;
Int ival;
for(j = 0; j < iheight; j++)
{
for(i = 0; i < iwidth; i++)
{
ix0 = i;
iy0 = j;
ix1 = RRV_MAX(0, (i - 1));
iy1 = RRV_MAX(0, (j - 1));
ix2 = RRV_MIN((iwidth - 1), (i + 1));
iy2 = RRV_MIN((iheight - 1), (j + 1));
// RRV_3
if(i==0 && j==0) {
pDestPic[i * 2 + j * 2 * iwidth * 2] = pSrcPic[ix0 + iy0 * iwidth];
} else {
// ~RRV_3
ival = 9 * pSrcPic[ix0 + iy0 * iwidth] +
3 * pSrcPic[ix1 + iy0 * iwidth] +
3 * pSrcPic[ix0 + iy1 * iwidth] +
1 * pSrcPic[ix1 + iy1 * iwidth];
pDestPic[i * 2 + j * 2 * iwidth * 2] = (ival + 8) / 16;
// RRV_3
}
// ~RRV_3
// RRV_3
if(i==(iwidth-1) && j==0) {
pDestPic[i * 2 + 1 + j * 2 * iwidth * 2] = pSrcPic[ix0 + iy0 * iwidth];
} else {
// ~RRV_3
ival = 9 * pSrcPic[ix0 + iy0 * iwidth] +
3 * pSrcPic[ix2 + iy0 * iwidth] +
3 * pSrcPic[ix0 + iy1 * iwidth] +
1 * pSrcPic[ix2 + iy1 * iwidth];
pDestPic[i * 2 + 1 + j * 2 * iwidth * 2] = (ival + 8) / 16;
// RRV_3
}
// ~RRV_3
// RRV_3
if(i==0 && j==(iheight-1)) {
pDestPic[i * 2 + (j * 2 + 1) * iwidth * 2] = pSrcPic[ix0 + iy0 * iwidth];
} else {
// ~RRV_3
ival = 9 * pSrcPic[ix0 + iy0 * iwidth] +
3 * pSrcPic[ix1 + iy0 * iwidth] +
3 * pSrcPic[ix0 + iy2 * iwidth] +
1 * pSrcPic[ix1 + iy2 * iwidth];
pDestPic[i * 2 + (j * 2 + 1) * iwidth * 2] = (ival + 8) / 16;
// RRV_3
}
// ~RRV_3
// RRV_3
if(i==(iwidth-1) && j==(iheight-1)) {
pDestPic[i * 2 + 1 + (j * 2 + 1)* iwidth * 2] = pSrcPic[ix0 + iy0 * iwidth];
} else {
// ~RRV_3
ival = 9 * pSrcPic[ix0 + iy0 * iwidth] +
3 * pSrcPic[ix2 + iy0 * iwidth] +
3 * pSrcPic[ix0 + iy2 * iwidth] +
1 * pSrcPic[ix2 + iy2 * iwidth];
pDestPic[i * 2 + 1 + (j * 2 + 1)* iwidth * 2] = (ival + 8) / 16;
// RRV_3
}
// ~RRV_3
}
}
}
//
//
//FilterCodedPictureforRRV
//
//
Void CVideoObject::filterCodedPictureForRRV(PixelC *pPxlcY,
PixelC *pPxlcU, PixelC *pPxlcV,
Int isizex, Int isizey,
Int inumMBx,Int inumMBy,
Int iwidthY, Int iwidthUV)
{
// PixelC pdataY[isizex *isizey];
// PixelC pdataU[isizex *isizey /4];
// PixelC pdataV[isizex *isizey /4];
PixelC *pdataY = new PixelC[isizex *isizey];
PixelC *pdataU = new PixelC[isizex *isizey /4];
PixelC *pdataV = new PixelC[isizex *isizey /4];
Int ipMB,ipPreMB;
Int ixcount,iycount;
Int icurMB = 0;
Int i, j;
// RRV_2 insertion
Int iVpEdgeEnable;
iVpEdgeEnable = (!m_volmd.bNewpredEnable)||(m_volmd.bNewpredSegmentType);
// ~RRV_2
// copy data, data -> pPxlc
for(j = 0; j < isizey; j++)
{
for(i = 0; i < isizex; i++)
{
pdataY[i+ j* isizex] = pPxlcY[i+ j* iwidthY];
}
}
for(j = 0; j < isizey /2; j++)
{
for(i = 0; i < isizex /2; i++){
pdataU[i+ j *isizex /2] = pPxlcU[i +j *iwidthUV];
pdataV[i+ j* isizex /2] = pPxlcV[i +j *iwidthUV];
}
}
// check cod-frag
/*
printf("Checking cod flag numMBy = %d numMBx = %d\n", inumMBy, inumMBx);
for(i = 0; i < inumMBy; i++)
{
for(j = 0; j < inumMBx; j++)
{
if(m_rgmbmd[i *inumMBx +j].m_bSkip == TRUE)
{
printf("T ");
}
else if(m_rgmbmd[i *inumMBx +j].m_bSkip == FALSE)
{
printf("F ");
}
else
{
printf("E ");
}
}
printf("\n");
}
*/
// --- Filtering Macro-Block Borderline (Lum part) ---
// printf("Filtering Macro-Block Horizontal Borderline (Lum)\n");
for(iycount = 1; iycount < (inumMBy * 2); iycount++)
{
icurMB = (iycount / 2) * inumMBx;
for(ixcount=0; ixcount<(inumMBx * 2); ixcount+=2, icurMB++)
{
ipMB = icurMB;
if(iycount % 2)
{
ipPreMB = ipMB;
}
else
{
ipPreMB = (ipMB - inumMBx);
}
// RRV_2 modification
if(((m_rgmbmd[ipMB].m_bSkip == FALSE)||
(m_rgmbmd[ipPreMB].m_bSkip == FALSE))&&
((m_rgmbmd[ipMB].m_iVideoPacketNumber == m_rgmbmd[ipPreMB].m_iVideoPacketNumber)||(iVpEdgeEnable == 1)))
{
// if((m_rgmbmd[ipMB].m_bSkip == FALSE)||
// (m_rgmbmd[ipPreMB].m_bSkip == FALSE))
// {
// ~RRV_2
filterMBHorBorder(pdataY, isizex, ixcount, iycount);
filterMBHorBorder(pdataY, isizex, (ixcount+1), iycount);
}
}
}
// printf("Done\n");
// printf("Filtering Macro-Block Vartial Borderline (Lum)\n");
for(iycount=0; iycount<(inumMBy * 2); iycount+=2)
{
icurMB = (iycount / 2) * inumMBx;
for(ixcount = 1; ixcount < (inumMBx * 2); ixcount++)
{
ipMB = icurMB + (ixcount / 2);
if(ixcount % 2)
{
ipPreMB = ipMB;
}
else
{
ipPreMB = ipMB - 1;
}
// RRV_2 modification
if(((m_rgmbmd[ipMB].m_bSkip == FALSE)||
(m_rgmbmd[ipPreMB].m_bSkip == FALSE))&&
((m_rgmbmd[ipMB].m_iVideoPacketNumber == m_rgmbmd[ipPreMB].m_iVideoPacketNumber)||(iVpEdgeEnable == 1)))
{
// if((m_rgmbmd[ipMB].m_bSkip == FALSE)||
// (m_rgmbmd[ipPreMB].m_bSkip == FALSE))
// {
// ~RRV_2
filterMBVarBorder(pdataY, isizex, ixcount, iycount);
filterMBVarBorder(pdataY, isizex, ixcount, (iycount+1));
}
}
}
// printf("Done\n");
//--- Filtering Macro-Block Borderline (Cb & Cr part) ---
// printf("Filtering Macro-Block Horizontal Borderline (Cb & Cr)\n");
for(iycount = 1; iycount < inumMBy; iycount++)
{
icurMB = iycount * inumMBx;
for(ixcount = 0; ixcount < inumMBx; ixcount++, icurMB++)
{
ipMB = icurMB;
ipPreMB = ipMB - inumMBx;
// RRV_2 modification
if(((m_rgmbmd[ipMB].m_bSkip == FALSE)||
(m_rgmbmd[ipPreMB].m_bSkip == FALSE))&&
((m_rgmbmd[ipMB].m_iVideoPacketNumber == m_rgmbmd[ipPreMB].m_iVideoPacketNumber)||(iVpEdgeEnable == 1)))
{
// if((m_rgmbmd[ipMB].m_bSkip == FALSE)||
// (m_rgmbmd[ipPreMB].m_bSkip == FALSE))
// {
// ~RRV_2
filterMBHorBorder(pdataU, isizex/2, ixcount, iycount);
filterMBHorBorder(pdataV, isizex/2, ixcount, iycount);
}
}
}
// printf("Done\n");
// printf("Filtering Macro-Block Vartial Borderline (Cb & Cr)\n");
for(iycount = 0; iycount < inumMBy; iycount++)
{
icurMB = iycount * inumMBx;
for(ixcount = 1; ixcount < inumMBx; ixcount++)
{
icurMB++;
ipMB = icurMB;
ipPreMB = ipMB - 1;
// RRV_2 modification
if(((m_rgmbmd[ipMB].m_bSkip == FALSE)||
(m_rgmbmd[ipPreMB].m_bSkip == FALSE))&&
((m_rgmbmd[ipMB].m_iVideoPacketNumber == m_rgmbmd[ipPreMB].m_iVideoPacketNumber)||(iVpEdgeEnable == 1)))
{
// if((m_rgmbmd[ipMB].m_bSkip == FALSE)||
// (m_rgmbmd[ipPreMB].m_bSkip == FALSE))
// {
// ~RRV_2
filterMBVarBorder(pdataU, isizex/2, ixcount, iycount);
filterMBVarBorder(pdataV, isizex/2, ixcount, iycount);
}
}
}
// printf("Done\n");
// copy data, pPxlc -> data
for(j = 0; j < isizey; j++)
{
for(i = 0; i < isizex; i++)
{
pPxlcY[i +j *iwidthY] = pdataY[i +j *isizex];
}
}
for(j = 0; j < isizey /2; j++)
{
for(i = 0; i < isizex /2; i++)
{
pPxlcU[i +j *iwidthUV] = pdataU[i +j* isizex /2];
pPxlcV[i +j *iwidthUV] = pdataV[i +j* isizex /2];
}
}
}
Void filterMBVarBorder(PixelC *pPicTop, Int isizex, Int icurX, Int icurY)
{
PixelC *pPixel1, *pPixel2;
Int ival1, ival2;
Int i;
icurX *= RRV_BLOCK_SIZE;
icurY *= RRV_BLOCK_SIZE;
//--- Read Cb Data ---
pPixel1 = pPicTop + ((icurX - 1) + icurY * isizex);
pPixel2 = pPicTop + ( icurX + icurY * isizex);
for(i = 0; i < RRV_BLOCK_SIZE; i++)
{
ival1 = *pPixel1;
ival2 = *pPixel2;
*pPixel1 = (3 * ival1 + ival2 + 2) / 4;
*pPixel2 = (ival1 + 3 * ival2 + 2) / 4;
pPixel1 += isizex;
pPixel2 += isizex;
}
}
Void filterMBHorBorder(PixelC *pPicTop, Int isizex, Int icurX, Int icurY)
{
PixelC *pPixel1, *pPixel2;
Int ival1, ival2;
Int i;
icurX *= RRV_BLOCK_SIZE;
icurY *= RRV_BLOCK_SIZE;
//--- Read Data ---
pPixel1 = pPicTop + (icurX + (icurY - 1) * isizex);
pPixel2 = pPicTop + (icurX + icurY * isizex);
for(i = 0; i < RRV_BLOCK_SIZE; i++)
{
ival1 = *pPixel1;
ival2 = *pPixel2;
*pPixel1 = (3 * ival1 + ival2 + 2) / 4;
*pPixel2 = (ival1 + 3 * ival2 + 2) / 4;
pPixel1++;
pPixel2++;
}
}
Void writeCubicRct(Int xsize, Int line_interval, PixelC* src, PixelC* dst)
{
PixelC *p0, *p1;
p0 = src;
p1 = dst;
for(int y = 0; y < xsize; y ++)
{
for(int x = 0; x < xsize; x ++)
{
(*p1 ++) = (*p0 ++);
}
p1 += (line_interval -xsize);
}
}
Void writeCubicRct(Int xsize, Int line_interval, PixelI* src, PixelI* dst)
{
PixelI *p0, *p1;
p0 = src;
p1 = dst;
for(int y = 0; y < xsize; y ++)
{
for(int x = 0; x < xsize; x ++)
{
(*p1 ++) = (*p0 ++);
}
p1 += (line_interval -xsize);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -