📄 macroblock.c
字号:
movq mm2,[esi+16]
movq mm3,[esi+24]
//PUNPCKLBW mm0,mm7
//PUNPCKLBW mm1,mm7
//PUNPCKLBW mm2,mm7
//PUNPCKLBW mm3,mm7
//转秩
movq mm4,mm0
movq mm5,mm1
movq mm6,mm2
movq mm7,mm3
PUNPCKLWD mm0,mm1
PUNPCKLWD mm2,mm3
movq mm1,mm0
PUNPCKLDQ mm0,mm2
PUNPCKHDQ mm1,mm2
PUNPCKHWD mm4,mm5
PUNPCKHWD mm6,mm3
movq mm3,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm3,mm6
movq mm2,mm4
movq [edi],mm0
movq [edi+32],mm1
movq [edi+64],mm2
movq [edi+96],mm3
emms
}
}
else if (bw_ref_frame ==-1 )
{
_asm
{
mov edi,pt1
mov esi,fpred
//pxor mm7,mm7
movq mm0,[esi]
movq mm1,[esi+8]
movq mm2,[esi+16]
movq mm3,[esi+24]
// PUNPCKLBW mm0,mm7
// PUNPCKLBW mm1,mm7
// PUNPCKLBW mm2,mm7
// PUNPCKLBW mm3,mm7
//转秩
movq mm4,mm0
movq mm5,mm1
movq mm6,mm2
movq mm7,mm3
PUNPCKLWD mm0,mm1
PUNPCKLWD mm2,mm3
movq mm1,mm0
PUNPCKLDQ mm0,mm2
PUNPCKHDQ mm1,mm2
PUNPCKHWD mm4,mm5
PUNPCKHWD mm6,mm3
movq mm3,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm3,mm6
movq mm2,mm4
movq [edi],mm0
movq [edi+32],mm1
movq [edi+64],mm2
movq [edi+96],mm3
emms
}
}
else
{
_asm
{
mov edi,pt1
mov eax,bpred
mov ebx,fpred
movq mm0,[eax]
movq mm1,[eax+8]
movq mm2,[eax+16]
movq mm3,[eax+24]
movq mm4,[ebx]
movq mm5,[ebx+8]
movq mm6,[ebx+16]
movq mm7,[ebx+24]
//PUNPCKLBW mm0,zero
//PUNPCKLBW mm1,zero
//PUNPCKLBW mm2,zero
//PUNPCKLBW mm3,zero
//PUNPCKLBW mm4,zero
//PUNPCKLBW mm5,zero
//PUNPCKLBW mm6,zero
//PUNPCKLBW mm7,zero
paddw mm0,mm4
paddw mm0,f1
psraw mm0,1
paddw mm1,mm5
paddw mm1,f1
psraw mm1,1
paddw mm2,mm6
paddw mm2,f1
psraw mm2,1
paddw mm3,mm7
paddw mm3,f1
psraw mm3,1
//转秩
movq mm4,mm0
movq mm5,mm1
movq mm6,mm2
movq mm7,mm3
PUNPCKLWD mm0,mm1
PUNPCKLWD mm2,mm3
movq mm1,mm0
PUNPCKLDQ mm0,mm2
PUNPCKHDQ mm1,mm2
PUNPCKHWD mm4,mm5
PUNPCKHWD mm6,mm3
movq mm3,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm3,mm6
movq mm2,mm4
movq [edi],mm0
movq [edi+32],mm1
movq [edi+64],mm2
movq [edi+96],mm3
emms
}
}
}
else
{
_asm
{
mov edi,pt1
mov eax,bpred
mov ebx,fpred
movq mm0,[eax]
movq mm1,[eax+8]
movq mm2,[eax+16]
movq mm3,[eax+24]
movq mm4,[ebx]
movq mm5,[ebx+8]
movq mm6,[ebx+16]
movq mm7,[ebx+24]
/*PUNPCKLBW mm0,zero
PUNPCKLBW mm1,zero
PUNPCKLBW mm2,zero
PUNPCKLBW mm3,zero
PUNPCKLBW mm4,zero
PUNPCKLBW mm5,zero
PUNPCKLBW mm6,zero
PUNPCKLBW mm7,zero*/
paddw mm0,mm4
paddw mm0,f1
psraw mm0,1
paddw mm1,mm5
paddw mm1,f1
psraw mm1,1
paddw mm2,mm6
paddw mm2,f1
psraw mm2,1
paddw mm3,mm7
paddw mm3,f1
psraw mm3,1
//转秩
movq mm4,mm0
movq mm5,mm1
movq mm6,mm2
movq mm7,mm3
PUNPCKLWD mm0,mm1
PUNPCKLWD mm2,mm3
movq mm1,mm0
PUNPCKLDQ mm0,mm2
PUNPCKHDQ mm1,mm2
PUNPCKHWD mm4,mm5
PUNPCKHWD mm6,mm3
movq mm3,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm3,mm6
movq mm2,mm4
movq [edi],mm0
movq [edi+32],mm1
movq [edi+64],mm2
movq [edi+96],mm3
emms
}
}
}
else if (fw_mode || skipped)
{
_asm
{
mov edi,pt1
mov esi,fpred
//pxor mm7,mm7
movq mm0,[esi]
movq mm1,[esi+8]
movq mm2,[esi+16]
movq mm3,[esi+24]
/*PUNPCKLBW mm0,mm7
PUNPCKLBW mm1,mm7
PUNPCKLBW mm2,mm7
PUNPCKLBW mm3,mm7*/
//转秩
movq mm4,mm0
movq mm5,mm1
movq mm6,mm2
movq mm7,mm3
PUNPCKLWD mm0,mm1
PUNPCKLWD mm2,mm3
movq mm1,mm0
PUNPCKLDQ mm0,mm2
PUNPCKHDQ mm1,mm2
PUNPCKHWD mm4,mm5
PUNPCKHWD mm6,mm3
movq mm3,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm3,mm6
movq mm2,mm4
movq [edi],mm0
movq [edi+32],mm1
movq [edi+64],mm2
movq [edi+96],mm3
emms
}
}
else
{
_asm
{
mov edi,pt1
mov esi,bpred
//pxor mm7,mm7
movq mm0,[esi]
movq mm1,[esi+8]
movq mm2,[esi+16]
movq mm3,[esi+24]
/*PUNPCKLBW mm0,mm7
PUNPCKLBW mm1,mm7
PUNPCKLBW mm2,mm7
PUNPCKLBW mm3,mm7*/
//转秩
movq mm4,mm0
movq mm5,mm1
movq mm6,mm2
movq mm7,mm3
PUNPCKLWD mm0,mm1
PUNPCKLWD mm2,mm3
movq mm1,mm0
PUNPCKLDQ mm0,mm2
PUNPCKHDQ mm1,mm2
PUNPCKHWD mm4,mm5
PUNPCKHWD mm6,mm3
movq mm3,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm3,mm6
movq mm2,mm4
movq [edi],mm0
movq [edi+32],mm1
movq [edi+64],mm2
movq [edi+96],mm3
emms
}
}
/*
if (direct || (fw_mode && bw_mode))
{
if (direct )
{
for (j=block_y; j<block_y4; j++)
for (i=block_x; i<block_x4; i++)
if (fw_ref_frame==-1)
img->mpr[i][j] = *bpred++;
else if (bw_ref_frame==-1)
img->mpr[i][j] = *fpred++;
else
img->mpr[i][j] = (*fpred++ + *bpred++ + 1) / 2;
}
else
for (j=block_y; j<block_y4; j++)
for (i=block_x; i<block_x4; i++)
img->mpr[i][j] = (*fpred++ + *bpred++ + 1) / 2;
}
else if (fw_mode || skipped)
{
for (j=block_y; j<block_y4; j++)
for (i=block_x; i<block_x4; i++) img->mpr[i][j] = *fpred++;
}
else
{
for (j=block_y; j<block_y4; j++)
for (i=block_x; i<block_x4; i++) img->mpr[i][j] = *bpred++;
}*/
}
/*!
************************************************************************
* \brief
* Chroma residual coding for an macroblock
************************************************************************
*/
void ChromaResidualCoding (int* cr_cbp)
{
int uv, block8, block_y, block_x, j, i;
int fw_mode, bw_mode, refframe;
int skipped = (img->mb_data[img->current_mb_nr].mb_type == 0 && img->type == INTER_IMG);
int incr = 1, offset = 0; // For MB level field/frame coding
int bw_ref;
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
{
incr = 2; // increment every other field
if(!img->top_field)
offset = -7;
}
for (*cr_cbp=0, uv=0; uv<2; uv++)
{
//===== prediction of chrominance blocks ===d==
block8 = 0;
for (block_y=0; block_y<8; block_y+=4)
for (block_x=0; block_x<8; block_x+=4, block8++)
{
SetModesAndRefframe (block8, &fw_mode, &bw_mode, &refframe, &bw_ref);
ChromaPrediction4x4 (uv, block_x, block_y, fw_mode, bw_mode, refframe, bw_ref);
}
// ==== set chroma residue to zero for skip Mode in SP frames
if (img->NoResidueDirect)
for (j=0; j<8; j++)
for (i=0; i<8; i++)
{
imgUV[uv][img->pix_c_y+j][img->pix_c_x+i] = img->mpr[i][j];
}
else
if (skipped && img->types==SP_IMG)
for (j=0; j<8; j++)
for (i=0; i<8; i++)
{
img->m7[i][j] = 0;
}
else
if (skipped)
{
for (j=0; j<8; j++)
for (i=0; i<8; i++)
{
imgUV[uv][img->pix_c_y+j][img->pix_c_x+i] = img->mpr[i][j];
}
}
else
for (j=0; j<8; j++)
for (i=0; i<8; i++)
{
img->m7[i][j] = imgUV_org[uv][img->pix_c_y+(j*incr)+offset][img->pix_c_x+i] - img->mpr[i][j];
}
//===== DCT, Quantization, inverse Quantization, IDCT, and Reconstruction =====
//===== Call function for skip mode in SP frames to properly process frame ====
if (skipped && img->types==SP_IMG)
{
*cr_cbp=dct_chroma_sp(uv,*cr_cbp);
}
else
if (!img->NoResidueDirect && !skipped)
{
if (img->types!=SP_IMG || IS_INTRA (&img->mb_data[img->current_mb_nr]))
*cr_cbp=dct_chroma (uv,*cr_cbp);
else
*cr_cbp=dct_chroma_sp(uv,*cr_cbp);
}
}
//===== update currMB->cbp =====
img->mb_data[img->current_mb_nr].cbp += ((*cr_cbp)<<4);
}
/*!
************************************************************************
* \brief
* Predict an intra chroma 8x8 block
************************************************************************
*/
void IntraChromaPrediction8x8 (int *mb_up, int *mb_left, int*mb_up_left)
{
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int s, s0, s1, s2, s3, i, j, k;
pel_t** image;
int block_x, block_y, b4;
int img_cx = img->pix_c_x;
int img_cy = img->pix_c_y;
int img_cx_1 = img->pix_c_x-1;
int img_cx_4 = img->pix_c_x+4;
int img_cy_1 = img->pix_c_y-1;
int img_cy_4 = img->pix_c_y+4;
int mb_nr = img->current_mb_nr;
int mb_width = img->width/16;
int mb_available_up = (img_cy/BLOCK_SIZE == 0) ? 0 : (img->mb_data[mb_nr].slice_nr==img->mb_data[mb_nr-mb_width].slice_nr);
int mb_available_left = (img_cx/BLOCK_SIZE == 0) ? 0 : (img->mb_data[mb_nr].slice_nr==img->mb_data[mb_nr-1] .slice_nr);
int mb_available_up_left = (img_cx/BLOCK_SIZE == 0 || img_cy/BLOCK_SIZE == 0) ? 0 : (img->mb_data[mb_nr].slice_nr==img->mb_data[mb_nr-mb_width-1].slice_nr);
int ih,iv;
int ib,ic,iaa;
int uv;
int hline[8], vline[8];
int mode;
int best_mode = DC_PRED_8; //just an initilaization here, should always be overwritten
int cost;
int min_cost;
_int16 diff[16];
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
{
img_cy = img->field_pix_c_y;
img_cy_1 = img->field_pix_c_y-1;
img_cy_4 = img->field_pix_c_y+4;
mb_available_up = (img_cy/BLOCK_SIZE == 0) ? 0 : (img->mb
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -