📄 getpic.c
字号:
Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16, bx, by,
PMV[0][0][0], PMV[0][0][1], 0);
/* predict from field of opposite parity */
form_prediction(predframe, !currentfield, current_frame, 0,
Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16, bx, by,
DMV[0][0], DMV[0][1], 1);
}
else
Fault_Flag = 5;
}
stw = 1;
}
if (macroblock_type & MACROBLOCK_MOTION_BACKWARD)
{
if (picture_structure==FRAME_PICTURE)
{
if (motion_type==MC_FRAME)
{
/* frame-based prediction */
form_prediction(backward_reference_frame, 0, current_frame, 0,
Coded_Picture_Width, Coded_Picture_Width<<1, 16, 8, bx, by,
PMV[0][1][0], PMV[0][1][1], stw);
form_prediction(backward_reference_frame, 1, current_frame, 1,
Coded_Picture_Width, Coded_Picture_Width<<1, 16, 8, bx, by,
PMV[0][1][0], PMV[0][1][1], stw);
}
else /* field-based prediction */
{
/* top field prediction */
form_prediction(backward_reference_frame, motion_vertical_field_select[0][1],
current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
bx, by>>1, PMV[0][1][0], PMV[0][1][1]>>1, stw);
/* bottom field prediction */
form_prediction(backward_reference_frame, motion_vertical_field_select[1][1],
current_frame, 1, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
bx, by>>1, PMV[1][1][0], PMV[1][1][1]>>1, stw);
}
}
else
{
/* field picture */
if (motion_type==MC_FIELD)
{
/* field-based prediction */
form_prediction(backward_reference_frame, motion_vertical_field_select[0][1],
current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16,
bx, by, PMV[0][1][0], PMV[0][1][1], stw);
}
else if (motion_type==MC_16X8)
{
form_prediction(backward_reference_frame, motion_vertical_field_select[0][1],
current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
bx, by, PMV[0][1][0], PMV[0][1][1], stw);
form_prediction(backward_reference_frame, motion_vertical_field_select[1][1],
current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
bx, by+8, PMV[1][1][0], PMV[1][1][1], stw);
}
else
Fault_Flag = 5;
}
}
}
static void form_prediction(unsigned char *src[], int sfield, unsigned char *dst[],
int dfield, int lx, int lx2, int w, int h, int x, int y,
int dx, int dy, int average_flag)
{
form_component_prediction(src[0]+(sfield?lx2>>1:0), dst[0]+(dfield?lx2>>1:0),
lx, lx2, w, h, x, y, dx, dy, average_flag);
if (chroma_format!=CHROMA444)
{
lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2;
}
if (chroma_format==CHROMA420)
{
h>>=1; y>>=1; dy/=2;
}
/* Cb */
form_component_prediction(src[1]+(sfield?lx2>>1:0), dst[1]+(dfield?lx2>>1:0),
lx, lx2, w, h, x, y, dx, dy, average_flag);
/* Cr */
form_component_prediction(src[2]+(sfield?lx2>>1:0), dst[2]+(dfield?lx2>>1:0),
lx, lx2, w, h, x, y, dx, dy, average_flag);
}
/* ISO/IEC 13818-2 section 7.6.4: Forming predictions */
static void form_component_prediction(unsigned char *src, unsigned char *dst,
int lx, int lx2, int w, int h, int x, int y,
int dx, int dy, int average_flag)
{
static const __int64 mmmask_0001 = 0x0001000100010001;
static const __int64 mmmask_0002 = 0x0002000200020002;
static const __int64 mmmask_0003 = 0x0003000300030003;
static const __int64 mmmask_0006 = 0x0006000600060006;
unsigned char *s = src + lx * (y + (dy>>1)) + x + (dx>>1);
unsigned char *d = dst + lx * y + x;
int flag = (average_flag<<2) + ((dx & 1)<<1) + (dy & 1);
switch (flag)
{
case 0:
// d[i] = s[i];
__asm
{
mov eax, [s]
mov ebx, [d]
mov esi, 0x00
mov edi, [h]
mc0:
movq mm1, [eax+esi]
add esi, 0x08
cmp esi, [w]
movq [ebx+esi-8], mm1
jl mc0
add eax, [lx2]
add ebx, [lx2]
sub edi, 0x01
mov esi, 0x00
cmp edi, 0x00
jg mc0
}
break;
case 1:
// d[i] = (s[i]+s[i+lx]+1)>>1;
__asm
{
pxor mm0, mm0
movq mm7, [mmmask_0001]
mov eax, [s]
mov ebx, [d]
mov ecx, eax
add ecx, [lx]
mov esi, 0x00
mov edi, [h]
mc1:
movq mm1, [eax+esi]
movq mm2, [ecx+esi]
movq mm3, mm1
movq mm4, mm2
punpcklbw mm1, mm0
punpckhbw mm3, mm0
punpcklbw mm2, mm0
punpckhbw mm4, mm0
paddsw mm1, mm2
paddsw mm3, mm4
paddsw mm1, mm7
paddsw mm3, mm7
psrlw mm1, 1
psrlw mm3, 1
packuswb mm1, mm0
packuswb mm3, mm0
psllq mm3, 32
por mm1, mm3
add esi, 0x08
cmp esi, [w]
movq [ebx+esi-8], mm1
jl mc1
add eax, [lx2]
add ebx, [lx2]
add ecx, [lx2]
sub edi, 0x01
mov esi, 0x00
cmp edi, 0x00
jg mc1
}
break;
case 2:
// d[i] = (s[i]+s[i+1]+1)>>1;
__asm
{
pxor mm0, mm0
movq mm7, [mmmask_0001]
mov eax, [s]
mov ebx, [d]
mov esi, 0x00
mov edi, [h]
mc2:
movq mm1, [eax+esi]
movq mm2, [eax+esi+1]
movq mm3, mm1
movq mm4, mm2
punpcklbw mm1, mm0
punpckhbw mm3, mm0
punpcklbw mm2, mm0
punpckhbw mm4, mm0
paddsw mm1, mm2
paddsw mm3, mm4
paddsw mm1, mm7
paddsw mm3, mm7
psrlw mm1, 1
psrlw mm3, 1
packuswb mm1, mm0
packuswb mm3, mm0
psllq mm3, 32
por mm1, mm3
add esi, 0x08
cmp esi, [w]
movq [ebx+esi-8], mm1
jl mc2
add eax, [lx2]
add ebx, [lx2]
sub edi, 0x01
mov esi, 0x00
cmp edi, 0x00
jg mc2
}
break;
case 3:
// d[i] = (s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
__asm
{
pxor mm0, mm0
movq mm7, [mmmask_0002]
mov eax, [s]
mov ebx, [d]
mov ecx, eax
add ecx, [lx]
mov esi, 0x00
mov edi, [h]
mc3:
movq mm1, [eax+esi]
movq mm2, [eax+esi+1]
movq mm3, mm1
movq mm4, mm2
punpcklbw mm1, mm0
punpckhbw mm3, mm0
punpcklbw mm2, mm0
punpckhbw mm4, mm0
paddsw mm1, mm2
paddsw mm3, mm4
movq mm5, [ecx+esi]
paddsw mm1, mm7
movq mm6, [ecx+esi+1]
paddsw mm3, mm7
movq mm2, mm5
movq mm4, mm6
punpcklbw mm2, mm0
punpckhbw mm5, mm0
punpcklbw mm4, mm0
punpckhbw mm6, mm0
paddsw mm2, mm4
paddsw mm5, mm6
paddsw mm1, mm2
paddsw mm3, mm5
psrlw mm1, 2
psrlw mm3, 2
packuswb mm1, mm0
packuswb mm3, mm0
psllq mm3, 32
por mm1, mm3
add esi, 0x08
cmp esi, [w]
movq [ebx+esi-8], mm1
jl mc3
add eax, [lx2]
add ebx, [lx2]
add ecx, [lx2]
sub edi, 0x01
mov esi, 0x00
cmp edi, 0x00
jg mc3
}
break;
case 4:
// d[i] = (s[i]+d[i]+1)>>1;
__asm
{
pxor mm0, mm0
movq mm7, [mmmask_0001]
mov eax, [s]
mov ebx, [d]
mov esi, 0x00
mov edi, [h]
mc4:
movq mm1, [eax+esi]
movq mm2, [ebx+esi]
movq mm3, mm1
movq mm4, mm2
punpcklbw mm1, mm0
punpckhbw mm3, mm0
punpcklbw mm2, mm0
punpckhbw mm4, mm0
paddsw mm1, mm2
paddsw mm3, mm4
paddsw mm1, mm7
paddsw mm3, mm7
psrlw mm1, 1
psrlw mm3, 1
packuswb mm1, mm0
packuswb mm3, mm0
psllq mm3, 32
por mm1, mm3
add esi, 0x08
cmp esi, [w]
movq [ebx+esi-8], mm1
jl mc4
add eax, [lx2]
add ebx, [lx2]
sub edi, 0x01
mov esi, 0x00
cmp edi, 0x00
jg mc4
}
break;
case 5:
// d[i] = ((d[i]<<1) + s[i]+s[i+lx] + 3)>>2;
__asm
{
pxor mm0, mm0
movq mm7, [mmmask_0003]
mov eax, [s]
mov ebx, [d]
mov ecx, eax
add ecx, [lx]
mov esi, 0x00
mov edi, [h]
mc5:
movq mm1, [eax+esi]
movq mm2, [ecx+esi]
movq mm3, mm1
movq mm4, mm2
punpcklbw mm1, mm0
punpckhbw mm3, mm0
punpcklbw mm2, mm0
punpckhbw mm4, mm0
paddsw mm1, mm2
paddsw mm3, mm4
movq mm5, [ebx+esi]
paddsw mm1, mm7
paddsw mm3, mm7
movq mm6, mm5
punpcklbw mm5, mm0
punpckhbw mm6, mm0
psllw mm5, 1
psllw mm6, 1
paddsw mm1, mm5
paddsw mm3, mm6
psrlw mm1, 2
psrlw mm3, 2
packuswb mm1, mm0
packuswb mm3, mm0
psllq mm3, 32
por mm1, mm3
add esi, 0x08
cmp esi, [w]
movq [ebx+esi-8], mm1
jl mc5
add eax, [lx2]
add ebx, [lx2]
add ecx, [lx2]
sub edi, 0x01
mov esi, 0x00
cmp edi, 0x00
jg mc5
}
break;
case 6:
// d[i] = ((d[i]<<1) + s[i]+s[i+1] + 3) >> 2;
__asm
{
pxor mm0, mm0
movq mm7, [mmmask_0003]
mov eax, [s]
mov ebx, [d]
mov esi, 0x00
mov edi, [h]
mc6:
movq mm1, [eax+esi]
movq mm2, [eax+esi+1]
movq mm3, mm1
movq mm4, mm2
punpcklbw mm1, mm0
punpckhbw mm3, mm0
punpcklbw mm2, mm0
punpckhbw mm4, mm0
paddsw mm1, mm2
paddsw mm3, mm4
movq mm5, [ebx+esi]
paddsw mm1, mm7
paddsw mm3, mm7
movq mm6, mm5
punpcklbw mm5, mm0
punpckhbw mm6, mm0
psllw mm5, 1
psllw mm6, 1
paddsw mm1, mm5
paddsw mm3, mm6
psrlw mm1, 2
psrlw mm3, 2
packuswb mm1, mm0
packuswb mm3, mm0
psllq mm3, 32
por mm1, mm3
add esi, 0x08
cmp esi, [w]
movq [ebx+esi-8], mm1
jl mc6
add eax, [lx2]
add ebx, [lx2]
sub edi, 0x01
mov esi, 0x00
cmp edi, 0x00
jg mc6
}
break;
case 7:
// d[i] = ((d[i]<<2) + s[i]+s[i+1]+s[i+lx]+s[i+lx+1] + 6)>>3;
__asm
{
pxor mm0, mm0
movq mm7, [mmmask_0006]
mov eax, [s]
mov ebx, [d]
mov ecx, eax
add ecx, [lx]
mov esi, 0x00
mov edi, [h]
mc7:
movq mm1, [eax+esi]
movq mm2, [eax+esi+1]
movq mm3, mm1
movq mm4, mm2
punpcklbw mm1, mm0
punpckhbw mm3, mm0
punpcklbw mm2, mm0
punpckhbw mm4, mm0
paddsw mm1, mm2
paddsw mm3, mm4
movq mm5, [ecx+esi]
paddsw mm1, mm7
movq mm6, [ecx+esi+1]
paddsw mm3, mm7
movq mm2, mm5
movq mm4, mm6
punpcklbw mm2, mm0
punpckhbw mm5, mm0
punpcklbw mm4, mm0
punpckhbw mm6, mm0
paddsw mm2, mm4
paddsw mm5, mm6
paddsw mm1, mm2
paddsw mm3, mm5
movq mm6, [ebx+esi]
movq mm4, mm6
punpcklbw mm4, mm0
punpckhbw mm6, mm0
psllw mm4, 2
psllw mm6, 2
paddsw mm1, mm4
paddsw mm3, mm6
psrlw mm1, 3
psrlw mm3, 3
packuswb mm1, mm0
packuswb mm3, mm0
psllq mm3, 32
por mm1, mm3
add esi, 0x08
cmp esi, [w]
movq [ebx+esi-8], mm1
jl mc7
add eax, [lx2]
add ebx, [lx2]
add ecx, [lx2]
sub edi, 0x01
mov esi, 0x00
cmp edi, 0x00
jg mc7
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -