📄 macroblock.c
字号:
void interpret_mb_mode_P(struct img_par *img)
{
int i;
const int ICBPTAB[6] = {0,16,32,15,31,47};
Macroblock *currMB = &img->mb_data[img->map_mb_nr];//GB current_mb_nr];
int mbmode = currMB->mb_type;
#define ZERO_P8x8 (mbmode==5)
#define MODE_IS_P8x8 (mbmode==4 || mbmode==5)
#define MODE_IS_I4x4 (mbmode==6)
#define I16OFFSET (mbmode-7)
if(mbmode <4)
{
currMB->mb_type = mbmode;
for (i=0;i<4;i++)
{
currMB->b8mode[i] = mbmode;
currMB->b8pdir[i] = 0;
}
}
else if(MODE_IS_P8x8)
{
currMB->mb_type = P8x8;
img->allrefzero = ZERO_P8x8;
}
else if(MODE_IS_I4x4)
{
currMB->mb_type = I4MB;
for (i=0;i<4;i++)
{
currMB->b8mode[i] = IBLOCK;
currMB->b8pdir[i] = -1;
}
}
else
{
currMB->mb_type = I16MB;
for (i=0;i<4;i++) {currMB->b8mode[i]=0; currMB->b8pdir[i]=-1; }
currMB->cbp= ICBPTAB[(I16OFFSET)>>2];
currMB->i16mode = (I16OFFSET) & 0x03;
}
}
/*!
************************************************************************
* \brief
* Interpret the mb mode for I-Frames
************************************************************************
*/
void interpret_mb_mode_I(struct img_par *img)
{
int i;
const int ICBPTAB[6] = {0,16,32,15,31,47};
Macroblock *currMB = &img->mb_data[img->map_mb_nr];//GB current_mb_nr];
int mbmode = currMB->mb_type;
if (mbmode==0)
{
currMB->mb_type = I4MB;
for (i=0;i<4;i++) {currMB->b8mode[i]=IBLOCK; currMB->b8pdir[i]=-1; }
}
else
{
currMB->mb_type = I16MB;
for (i=0;i<4;i++) {currMB->b8mode[i]=0; currMB->b8pdir[i]=-1; }
currMB->cbp= ICBPTAB[(mbmode-1)>>2];
currMB->i16mode = (mbmode-1) & 0x03;
}
}
/*!
************************************************************************
* \brief
* Interpret the mb mode for B-Frames
************************************************************************
*/
void interpret_mb_mode_B(struct img_par *img)
{
static const int offset2pdir16x16[12] = {0, 0, 1, 2, 0,0,0,0,0,0,0,0};
static const int offset2pdir16x8[22][2] = {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,1},{0,0},{0,1},{0,0},{1,0},
{0,0},{0,2},{0,0},{1,2},{0,0},{2,0},{0,0},{2,1},{0,0},{2,2},{0,0}};
static const int offset2pdir8x16[22][2] = {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,1},{0,0},{0,1},{0,0},
{1,0},{0,0},{0,2},{0,0},{1,2},{0,0},{2,0},{0,0},{2,1},{0,0},{2,2}};
const int ICBPTAB[6] = {0,16,32,15,31,47};
Macroblock *currMB = &img->mb_data[img->map_mb_nr];//GB current_mb_nr];
int i, mbmode;
int mbtype = currMB->mb_type;
int *b8mode = currMB->b8mode;
int *b8pdir = currMB->b8pdir;
//--- set mbtype, b8type, and b8pdir ---
if (mbtype==0) // direct
{
mbmode=0; for(i=0;i<4;i++) {b8mode[i]=0; b8pdir[i]=2; }
}
else if (mbtype==23) // intra4x4
{
mbmode=I4MB; for(i=0;i<4;i++) {b8mode[i]=IBLOCK; b8pdir[i]=-1; }
}
else if (mbtype>23) // intra16x16
{
mbmode=I16MB; for(i=0;i<4;i++) {b8mode[i]=0; b8pdir[i]=-1; }
currMB->cbp = ICBPTAB[(mbtype-24)>>2];
currMB->i16mode = (mbtype-24) & 0x03;
}
else if (mbtype==22) // 8x8(+split)
{
mbmode=P8x8; // b8mode and pdir is transmitted in additional codewords
}
else if (mbtype<4) // 16x16
{
mbmode=1; for(i=0;i<4;i++) {b8mode[i]=1; b8pdir[i]=offset2pdir16x16[mbtype]; }
}
else if (mbtype%2==0) // 16x8
{
mbmode=2; for(i=0;i<4;i++) {b8mode[i]=2; b8pdir[i]=offset2pdir16x8 [mbtype][i/2]; }
}
else
{
mbmode=3; for(i=0;i<4;i++) {b8mode[i]=3; b8pdir[i]=offset2pdir8x16 [mbtype][i%2]; }
}
currMB->mb_type = mbmode;
}
/*!
************************************************************************
* \brief
* Interpret the mb mode for SI-Frames
************************************************************************
*/
void interpret_mb_mode_SI(struct img_par *img)
{
int i;
const int ICBPTAB[6] = {0,16,32,15,31,47};
Macroblock *currMB = &img->mb_data[img->map_mb_nr];//GB current_mb_nr];
int mbmode = currMB->mb_type;
if (mbmode==0)
{
currMB->mb_type = SI4MB;
for (i=0;i<4;i++) {currMB->b8mode[i]=IBLOCK; currMB->b8pdir[i]=-1; }
img->siblock[img->mb_x][img->mb_y]=1;
}
else if (mbmode==1)
{
currMB->mb_type = I4MB;
for (i=0;i<4;i++) {currMB->b8mode[i]=IBLOCK; currMB->b8pdir[i]=-1; }
}
else
{
currMB->mb_type = I16MB;
for (i=0;i<4;i++) {currMB->b8mode[i]=0; currMB->b8pdir[i]=-1; }
currMB->cbp= ICBPTAB[(mbmode-1)>>2];
currMB->i16mode = (mbmode-2) & 0x03;
}
}
/*!
************************************************************************
* \brief
* init macroblock I and P frames
************************************************************************
*/
void init_macroblock(struct img_par *img)
{
int i,j;
int predframe_no;
Macroblock *currMB = &img->mb_data[img->map_mb_nr];//GB current_mb_nr];
int img_block_y;
int j2 = img->block_y/2 - 2*(img->current_mb_nr%2);
if (img->mb_frame_field_flag)
{
if (img->current_mb_nr%2==0)
{
img_block_y = img->block_y/2;
img->mv_frm[img->block_x+4][img->block_y][2]=img->number;
img->mv_top[img->block_x+4][img_block_y][2]=img->number*2;
}
else
{
img_block_y = (img->block_y-4)/2;
img->mv_frm[img->block_x+4][img->block_y][2]=img->number;
img->mv_bot[img->block_x+4][img_block_y][2]=img->number*2;
}
}
else
img->mv[img->block_x+4][img->block_y][2]=img->number;
for (i=0;i<BLOCK_SIZE;i++)
{ // reset vectors and pred. modes
for(j=0;j<BLOCK_SIZE;j++)
{
if (img->mb_frame_field_flag)
{
if (img->current_mb_nr%2==0)
{
img_block_y = img->block_y/2;
img->mv_frm[img->block_x+i+4][img->block_y+j][0] = 0;
img->mv_frm[img->block_x+i+4][img->block_y+j][1] = 0;
img->mv_top[img->block_x+i+4][img_block_y+j][0] = 0;
img->mv_top[img->block_x+i+4][img_block_y+j][1] = 0;
}
else
{
img_block_y = (img->block_y-4)/2;
img->mv_frm[img->block_x+i+4][img->block_y+j][0] = 0;
img->mv_frm[img->block_x+i+4][img->block_y+j][1] = 0;
img->mv_bot[img->block_x+i+4][img_block_y+j][0] = 0;
img->mv_bot[img->block_x+i+4][img_block_y+j][1] = 0;
}
}
else
{
img->mv[img->block_x+i+4][img->block_y+j][0] = 0;
img->mv[img->block_x+i+4][img->block_y+j][1] = 0;
}
img->ipredmode[img->block_x+i+1][img->block_y+j+1] = DC_PRED;
if (img->current_mb_nr%2==0)
img->ipredmode_top[img->block_x+i+1][j2+j+1] = DC_PRED;
else
img->ipredmode_bot[img->block_x+i+1][j2+j+1] = DC_PRED;
}
}
predframe_no = 0;
if (img->structure != FRAME) // Initialize for field mode (use for copy)
if (img->number>1) // use the top field for the bottom field of the first picture
predframe_no = 1; // g.b.1;
// Set the reference frame information for motion vector prediction
if (IS_INTRA (currMB))
{
if (img->structure != FRAME)
{
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
refFrArr[img->block_y+j][img->block_x+i] = -1;
}
}
else
{
if (img->mb_frame_field_flag)
{
if (img->current_mb_nr%2==0)
{
img_block_y = img->block_y/2;
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
refFrArr_top[img_block_y+j][img->block_x+i] = -1;
refFrArr_frm[img->block_y+j][img->block_x+i] = -1;
}
}
else
{
img_block_y = (img->block_y-4)/2;
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
refFrArr_bot[img_block_y+j][img->block_x+i] = -1;
refFrArr_frm[img->block_y+j][img->block_x+i] = -1;
}
}
}
else
{
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
refFrArr[img->block_y+j][img->block_x+i] = -1;
}
}
}
}
else if (!IS_P8x8 (currMB))
{
if (img->structure != FRAME)
{
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
refFrArr[img->block_y+j][img->block_x+i] = 0;
}
}
else
{
if (img->mb_frame_field_flag)
{
if (img->current_mb_nr%2==0)
{
img_block_y = img->block_y/2;
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
refFrArr_top[img_block_y+j][img->block_x+i] = 0;
refFrArr_frm[img->block_y+j][img->block_x+i] = 0;
}
}
else
{
img_block_y = (img->block_y-4)/2;
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
refFrArr_bot[img_block_y+j][img->block_x+i] = 0;
refFrArr_frm[img->block_y+j][img->block_x+i] = 0;
}
}
}
else
{
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
refFrArr[img->block_y+j][img->block_x+i] = 0;
}
}
}
}
else
{
if (img->mb_frame_field_flag)
{
if (img->current_mb_nr%2==0)
{
img_block_y = img->block_y/2;
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
if(img->structure != FRAME)
refFrArr[img->block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : (img->number>1)?1:0);
else
{
refFrArr_top[img_block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : 0);
refFrArr_frm[img->block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : 0);
}
}
}
else
{
img_block_y = (img->block_y-4)/2;
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
if(img->structure != FRAME)
refFrArr[img->block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : (img->number>1)?1:0);
else
{
refFrArr_bot[img_block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : 0);
refFrArr_frm[img->block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : 0);
}
}
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -