📄 vfapidec.c
字号:
return 1;
}
void Decode_D2VFAPI(D2VFAPI *in, unsigned char *dst, DWORD frame, int pitch)
{
DWORD i, now, size, origin, ref, fo;
int remain;
if (FO_Flag==FO_FILM)
{
fo = 0;
frame = FrameList[frame]->top;
}
origin = frame;
if (FO_Flag!=FO_FILM)
{
if (FrameList[frame]->top == FrameList[frame]->bottom)
{
fo = 0;
frame = FrameList[frame]->top;
}
else if (FrameList[frame]->top < FrameList[frame]->bottom)
{
fo = 1;
frame = FrameList[frame]->top;
}
else
{
fo = 2;
frame = FrameList[frame]->bottom;
}
}
ref = frame;
if (frame >= GOPList[in->VF_GOPLimit-1]->number)
{
now = in->VF_GOPLimit-1;
ref -= GOPList[in->VF_GOPLimit-1]->number;
size = in->VF_FrameBound - GOPList[in->VF_GOPLimit-1]->number + 1;
}
else
for (now = 0; now < (in->VF_GOPLimit-1); now++)
{
if (frame>=GOPList[now]->number && frame<GOPList[now+1]->number)
{
ref -= GOPList[now]->number;
size = GOPList[now+1]->number - GOPList[now]->number + 1;
break;
}
}
if (fo)
ref ++;
if (now != in->VF_GOPNow)
{
if ((in->VF_OldFrame + 1)==origin)
{
if (Full_Frame)
{
Get_Hdr();
Decode_Picture(1, dst, pitch);
if (picture_structure!=FRAME_PICTURE)
{
Get_Hdr();
Decode_Picture(1, dst, pitch);
}
}
else
switch (fo)
{
case 0:
if (!FrameList[origin]->backward)
{
Get_Hdr();
Decode_Picture(1, dst, pitch);
if (picture_structure!=FRAME_PICTURE)
{
Get_Hdr();
Decode_Picture(1, dst, pitch);
}
if (FrameList[origin]->forward)
{
if (Field_Order)
RGBCopyodd(dst, rgb24, pitch, 1);
else
RGBCopyeven(dst, rgb24, pitch, 1);
}
}
else
{
RGBCopyodd(rgb24, dst, pitch, 0);
RGBCopyeven(rgb24, dst, pitch, 0);
}
break;
case 1:
RGBCopyodd(rgb24, dst, pitch, 0);
Get_Hdr();
Decode_Picture(1, rgb24, twidth);
if (picture_structure!=FRAME_PICTURE)
{
Get_Hdr();
Decode_Picture(1, rgb24, twidth);
}
RGBCopyeven(rgb24, dst, pitch, 0);
break;
case 2:
RGBCopyeven(rgb24, dst, pitch, 0);
Get_Hdr();
Decode_Picture(1, rgb24, twidth);
if (picture_structure!=FRAME_PICTURE)
{
Get_Hdr();
Decode_Picture(1, rgb24, twidth);
}
RGBCopyodd(rgb24, dst, pitch, 0);
break;
}
if (in->VF_GOPSize)
{
for (i=0; i < in->VF_GOPSize; i++)
free(GOPBuffer[i]);
in->VF_GOPSize = 0;
}
in->VF_GOPNow = in->VF_GOPLimit;
in->VF_OldFrame = origin;
return;
}
remain = ref;
in->VF_OldRef = ref;
in->VF_GOPNow = now;
Second_Field = 0;
if (size < in->VF_GOPSize)
for (i=0; i < (in->VF_GOPSize - size); i++)
free(GOPBuffer[size+i]);
else if (size > in->VF_GOPSize)
for (i=0; i < (size - in->VF_GOPSize); i++)
GOPBuffer[in->VF_GOPSize+i] = malloc(in->VF_FrameSize);
in->VF_GOPSize = size;
File_Flag = GOPList[now]->file;
_lseeki64(Infile[GOPList[now]->file], GOPList[now]->position, SEEK_SET);
Initialize_Buffer();
while (Get_Hdr() && picture_coding_type!=I_TYPE);
Decode_Picture(0, dst, pitch);
while (Get_Hdr() && picture_coding_type==B_TYPE);
if (picture_structure!=FRAME_PICTURE)
{
Decode_Picture(0, dst, pitch);
Get_Hdr();
}
Decode_Picture(1, dst, pitch);
if (picture_structure!=FRAME_PICTURE)
{
Get_Hdr();
Decode_Picture(1, dst, pitch);
}
RGBCopyodd(dst, GOPBuffer[0], pitch, 1);
RGBCopyeven(dst, GOPBuffer[0], pitch, 1);
while (remain && Get_Hdr())
{
Decode_Picture(1, dst, pitch);
if (picture_structure!=FRAME_PICTURE)
{
Get_Hdr();
Decode_Picture(1, dst, pitch);
}
RGBCopyodd(dst, GOPBuffer[ref - remain + 1], pitch, 1);
RGBCopyeven(dst, GOPBuffer[ref - remain + 1], pitch, 1);
remain--;
}
if (!Full_Frame && ref>=(size-2))
{
RGBCopyodd(dst, rgb24, pitch, 1);
RGBCopyeven(dst, rgb24, pitch, 1);
}
}
else
{
remain = ref - in->VF_OldRef;
if (remain > 0)
{
in->VF_OldRef = ref;
while (remain && Get_Hdr())
{
Decode_Picture(1, dst, pitch);
if (picture_structure!=FRAME_PICTURE)
{
Get_Hdr();
Decode_Picture(1, dst, pitch);
}
RGBCopyodd(dst, GOPBuffer[ref - remain + 1], pitch, 1);
RGBCopyeven(dst, GOPBuffer[ref - remain + 1], pitch, 1);
remain--;
}
if (!Full_Frame && ref>=(size-2))
{
RGBCopyodd(dst, rgb24, pitch, 1);
RGBCopyeven(dst, rgb24, pitch, 1);
}
}
}
switch (fo)
{
case 0:
RGBCopyodd(GOPBuffer[ref], dst, pitch, 0);
RGBCopyeven(GOPBuffer[ref], dst, pitch, 0);
break;
case 1:
RGBCopyodd(GOPBuffer[ref-1], dst, pitch, 0);
RGBCopyeven(GOPBuffer[ref], dst, pitch, 0);
break;
case 2:
RGBCopyodd(GOPBuffer[ref], dst, pitch, 0);
RGBCopyeven(GOPBuffer[ref-1], dst, pitch, 0);
break;
}
in->VF_OldFrame = origin;
}
void Close_D2VFAPI(D2VFAPI *in)
{
int i;
if (in != NULL)
fclose(in->VF_File);
while (in->VF_GOPSize)
{
in->VF_GOPSize--;
free(GOPBuffer[in->VF_GOPSize]);
}
while (File_Limit)
{
File_Limit--;
_close(Infile[File_Limit]);
}
for (i=0; i<3; i++)
{
free(backward_reference_frame[i]);
free(forward_reference_frame[i]);
free(auxframe[i]);
}
free(u422);
free(v422);
free(u444);
free(v444);
free(rgb24);
if(Luminance_Flag)
free(lum);
for (i=0; i<8; i++)
free(p_block[i]);
free(p_fTempArray);
}
static void RGBCopyodd(unsigned char *src, unsigned char *dst, int pitch, int forward)
{
int pwidth = forward ? (pitch << 1) : swidth;
int qwidth = forward ? swidth : (pitch << 1);
__asm
{
mov eax, [src]
mov ebx, [dst]
mov esi, 0x00
mov edi, [Coded_Picture_Height]
rgbcopy:
movq mm1, [eax+esi]
add esi, 0x08
cmp esi, [twidth]
movq [ebx+esi-8], mm1
jl rgbcopy
add eax, [pwidth]
add ebx, [qwidth]
sub edi, 0x02
mov esi, 0x00
cmp edi, 0x00
jg rgbcopy
}
}
static void RGBCopyeven(unsigned char *src, unsigned char *dst, int pitch, int forward)
{
int pwidth = forward ? (pitch << 1) : swidth;
int qwidth = forward ? swidth : (pitch << 1);
src += forward ? pitch : twidth;
dst += forward ? twidth : pitch;
__asm
{
mov eax, [src]
mov ebx, [dst]
mov esi, 0x00
mov edi, [Coded_Picture_Height]
rgbcopy:
movq mm1, [eax+esi]
add esi, 0x08
cmp esi, [twidth]
movq [ebx+esi-8], mm1
jl rgbcopy
add eax, [pwidth]
add ebx, [qwidth]
sub edi, 0x02
mov esi, 0x00
cmp edi, 0x00
jg rgbcopy
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -