⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfapidec.c

📁 DVD转换到AVI的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

	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 + -