recongob.c
来自「symbian 下的helix player源代码」· C语言 代码 · 共 1,202 行 · 第 1/4 页
C
1,202 行
upperDCLumaBlockCache[2*mb->x][0], upperLumaBlockCache[2*mb->x], // DC and AC pred for row
upperDCLumaBlockCache[2*mb->x],upperLumaBlockCache[2*mb->x], // DC and AC store for row
leftDCLumaBlockCache[3][0], leftLumaBlockCache[3], // DC and AC pred for column
leftDCLumaBlockCache[2], leftLumaBlockCache[2], // DC and AC store for column
predtype, fixedDC,
mb->x==0, FALSE); // can only be on left boundary
//printf("Luma block 4 \n");
Idct2AdvancedIntra( mb->block[3].sym, mb->block[3].nsym, pixel0 + 8 + 8 * pic->y.hoffset,
pic->y.hoffset, recon_tab,
upperDCLumaBlockCache[2*mb->x+1][0], upperLumaBlockCache[2*mb->x+1], // DC and AC pred for row
upperDCLumaBlockCache[2*mb->x+1],upperLumaBlockCache[2*mb->x+1], // DC and AC store for row
leftDCLumaBlockCache[2][0], leftLumaBlockCache[2], // DC and AC pred for column
leftDCLumaBlockCache[3], leftLumaBlockCache[3], // DC and AC store for column
predtype, fixedDC,
FALSE, FALSE); // can't be on left or upper boundary
if (pic->color) {
// Assuming same offset for Cr and Cb
col = 8 * mb->x;
row = 8 * mb->y;
offset = col + row * pic->cb.hoffset;
pixel0 = pic->cb.ptr + offset;
//printf("CB block \n");
Idct2AdvancedIntra( mb->block[4].sym, mb->block[4].nsym, pixel0,
pic->cb.hoffset, recon_tab,
upperDCCbBlockCache[mb->x][0], upperCbBlockCache[mb->x], // DC and AC pred for row
upperDCCbBlockCache[mb->x],upperCbBlockCache[mb->x], // DC and AC store for row
leftDCCbBlockCache[0], leftCbBlockCache[0], // DC and AC pred for column
leftDCCbBlockCache, leftCbBlockCache[0], // DC and AC store for column
predtype, fixedDC,
mb->x==0, mb->y==0); // what boundaries are we on?
pixel0 = pic->cr.ptr + offset;
//printf("CR block \n");
Idct2AdvancedIntra( mb->block[5].sym, mb->block[5].nsym, pixel0,
pic->cr.hoffset, recon_tab,
upperDCCrBlockCache[mb->x][0], upperCrBlockCache[mb->x], // DC and AC pred for row
upperDCCrBlockCache[mb->x],upperCrBlockCache[mb->x], // DC and AC store for row
leftDCCrBlockCache[0], leftCrBlockCache[0], // DC and AC pred for column
leftDCCrBlockCache, leftCrBlockCache[0], // DC and AC store for column
predtype, fixedDC,
mb->x==0, mb->y==0); // what boundaries are we on?
}
return;
}
#endif
// ReconInter
extern void ReconInter( MACROBLOCK_DESCR * mb, PICTURE * pic, int clean )
{
int row, col, offset ;
PIXEL * pixel0;
S16 * recon_tab;
recon_tab = Recon[mb->quant - QUANT_MIN];
col = 16 * mb->x;
row = 16 * mb->y;
/* {
int isym;
printf("ReconInter: x = %d y = %d\n", col, row);
printf("nsym = %d %d %d %d %d %d \n", mb->block[0].nsym,
mb->block[1].nsym, mb->block[2].nsym, mb->block[3].nsym,
mb->block[4].nsym, mb->block[5].nsym);
printf("Symbol number to print: ");
scanf("%d", &isym);
while (isym > 0) {
printf("Luma 1: ");
printsym( *(mb->block[0].sym + isym - 1) ); printf("\n");
printf("Luma 2: ");
printsym( *(mb->block[1].sym + isym - 1) ); printf("\n");
printf("Luma 3: ");
printsym( *(mb->block[2].sym + isym - 1) ); printf("\n");
printf("Luma 4: ");
printsym( *(mb->block[3].sym + isym - 1) ); printf("\n");
printf("Symbol number to print: ");
scanf("%d", &isym);
}
}
*/
pixel0 = pic->y.ptr + col + row * pic->y.hoffset;
// #define DB_DUMP_MACROBLOCK
#ifdef DB_DUMP_MACROBLOCK
{
static char foo[256]; /* Flawfinder: ignore */
static char dump=0;
int dbi,dbj;
if(dump) {
SafeSprintf(foo, 256, "Reference Block (from ReconInter) (%d, %d)\n", mb->x, mb->y);
OutputDebugString(foo);
for(dbi=0;dbi<16;dbi++)
{
foo[0] = '\0';
for(dbj=0;dbj<16;dbj++)
{
SafeSprintf(foo+strlen(foo), 256-strlen(foo), "%d ", pixel0[dbi*pic->y.hoffset + dbj]);
}
SafeStrCat(foo, "\n", 256);
OutputDebugString(foo);
}
}
}
#endif
if (mb->block[0].nsym > 0) {
//printf("Luma block 1 \n");
Idct2Sum( mb->block[0].sym, mb->block[0].nsym, pixel0,
pic->y.hoffset, recon_tab, clean);
}
if (mb->block[1].nsym > 0) {
//printf("Luma block 2 \n");
Idct2Sum( mb->block[1].sym, mb->block[1].nsym, pixel0 + 8,
pic->y.hoffset, recon_tab, clean);
}
if (mb->block[2].nsym > 0) {
//printf("Luma block 3 \n");
Idct2Sum( mb->block[2].sym, mb->block[2].nsym, pixel0 + 8 * pic->y.hoffset,
pic->y.hoffset, recon_tab, clean);
}
if (mb->block[3].nsym > 0) {
//printf("Luma block 4 \n");
Idct2Sum( mb->block[3].sym, mb->block[3].nsym, pixel0 + 8 + 8 * pic->y.hoffset,
pic->y.hoffset, recon_tab, clean);
}
if (pic->color && (mb->block[4].nsym > 0 || mb->block[5].nsym > 0)) {
// Assuming same offset for Cr and Cb
col = 8 * mb->x;
row = 8 * mb->y;
offset = col + row * pic->cb.hoffset;
if (mb->block[4].nsym > 0) {
pixel0 = pic->cb.ptr + offset;
//printf("CB block \n");
Idct2Sum( mb->block[4].sym, mb->block[4].nsym, pixel0,
pic->cb.hoffset, recon_tab, clean);
}
if (mb->block[5].nsym > 0) {
pixel0 = pic->cr.ptr + offset;
//printf("CR block \n");
Idct2Sum( mb->block[5].sym, mb->block[5].nsym, pixel0,
pic->cr.hoffset, recon_tab, clean);
}
}
//#define DB_DUMP_MACROBLOCK
#ifdef DB_DUMP_MACROBLOCK
{
static char foo[256]; /* Flawfinder: ignore */
static char dump=0;
int dbi,dbj;
if(dump) {
pixel0 = pic->y.ptr + col + row * pic->y.hoffset;
SafeSprintf(foo, 256, "Reconstructed Macroblock (%d, %d)\n", mb->x, mb->y);
OutputDebugString(foo);
for(dbi=0;dbi<16;dbi++)
{
foo[0] = '\0';
for(dbj=0;dbj<16;dbj++)
{
SafeSprintf(foo+strlen(foo), 256-strlen(foo), "%d ", pixel0[dbi*pic->y.hoffset + dbj]);
}
SafeStrCat(foo, "\n", 256);
OutputDebugString(foo);
}
}
}
#endif
return;
}
// reconBframe - Reconstruct B-frame prediction error and add to prediction
static void reconBframe( MACROBLOCK_DESCR * mb, PICTURE * Bpic )
{
int i;
U8 saveQuant, saveCbp;
SYMBOL *saveSym[6];
int saveNsym[6];
if (BFRAME_HAS_CBP(mb)) {
// Set quant, cbp, and block[] to hold values for B-frame
saveQuant = mb->quant;
mb->quant = mb->Bquant;
saveCbp = mb->cbp;
mb->cbp = mb->cbpB;
for (i = 0; i < 6; ++i) {
saveSym[i] = mb->block[i].sym;
mb->block[i].sym = mb->Bblock[i].sym;
saveNsym[i] = mb->block[i].nsym;
mb->block[i].nsym = mb->Bblock[i].nsym;
}
// Do reconstruction
ReconInter( mb, Bpic, CLEAN );
// Restore parameters (if needed for statistics)
mb->quant = saveQuant;
mb->cbp = saveCbp;
for (i = 0; i < 6; ++i) {
mb->block[i].sym = saveSym[i];
mb->block[i].nsym = saveNsym[i];
}
}
}
// gray_mb - fill macroblock with gray (value 128); assumes that pic is word-aligned
static void gray_mb( MACROBLOCK_DESCR * mb, PICTURE * pic )
{
fill_mb( mb, pic, GRAY );
}
// fill_mb - fill macroblock with constant color; assumes that pic is word-aligned
static void fill_mb( MACROBLOCK_DESCR * mb, PICTURE * pic, PIXEL value )
{
int row, col, i;
union { // Write words to speed up routine
PIXEL * pix;
U32 * word;
} pixel;
U32 * dest;
U32 dValue;
dValue = value | (value << 8) | (value << 16) | (value << 24);
col = 16 * mb->x;
row = 16 * mb->y;
#ifdef DO_H263_PLUS
if (col >= pic->y.nhor || row >= pic->y.nvert)
return; // Inactive part of Macroblock
#endif
pixel.pix = pic->y.ptr + col + row * pic->y.hoffset;
for (i = 0; i < 16; i++) {
for (dest = pixel.word; dest < pixel.word + 16/4; dest++) {
*dest = dValue;
}
pixel.pix += pic->y.hoffset;
}
if (pic->color) {
col = 8 * mb->x;
row = 8 * mb->y;
pixel.pix = pic->cb.ptr + col + row * pic->cb.hoffset;
for (i = 0; i < 8; i++) {
for (dest = pixel.word; dest < pixel.word + 8/4; dest++) {
*dest = dValue;
}
pixel.pix += pic->cb.hoffset;
}
pixel.pix = pic->cr.ptr + col + row * pic->cr.hoffset;
for (i = 0; i < 8; i++) {
for (dest = pixel.word; dest < pixel.word + 8/4; dest++) {
*dest = dValue;
}
pixel.pix += pic->cr.hoffset;
}
}
return;
}
#ifdef DO_H263_PLUS
/////////////////////////////////////////////////////////////////////////////////////////
//////////// Functions for reconstruction in Reduced-resolution Update mode /////////////
/////////////////////////////////////////////////////////////////////////////////////////
// ReducedResMvComponent - Translate Reduced-res. motion vector component to representation
// with one fractional bit. The input value is "rounded" half a pixel towards zero, e.g.,
// input values: -2 -1 0 1 2 are
// translated to: -1.5 -0.5 0 0.5 1.5,
extern S8 ReducedResMvComponent( S8 x )
{
if (x > 0) {
x = 2 * x - 1;
} else if (x < 0) {
x = 2 * x + 1;
}
return x;
}
// MotionComp32x32 - perform motion compensation for Reduced-res. Update mode
extern void MotionComp32x32( MACROBLOCK_DESCR * mb, // Describes block to be motion-compensated
PICTURE * prevPic, // Describes previous picture used to form MC
PICTURE * pic // Output picture where MC block is placed
)
{
int blk;
// Save MTYPE and x/y position
int saveType = mb->mtype;
int saveX = mb->x;
int saveY = mb->y;
int saveMvX = mb->mv_x;
int saveMvY = mb->mv_y;
mb->mtype = MTYPE263_INTER;
if (saveType != MTYPE263_INTER4V) {
// Use same motion vector for all four quadrants
for (blk = 0; blk < 4; ++blk) {
mb->blkMvX[blk] = mb->mv_x;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?