Filter SDK/avs2yuv

From Avisynth wiki
Revision as of 19:49, 2 January 2014 by Admin (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

avs2yuv reads a script and outputs raw video (YUV or RGB). It's a stripped down version of the famous avs2yuv.

Here's avs2yuv.cpp:

#include <stdio.h>
#include <Windows.h>
#include "avisynth.h"

#define MY_VERSION "Avs2YUV 0.24"

const AVS_Linkage *AVS_linkage = 0;

int __cdecl main(int argc, const char* argv[])
{
	const char* infile = NULL;
	const char* outfile = NULL;
	FILE* out_fh;
	
	if (!strcmp(argv[1], "-h")) {
		fprintf(stderr, MY_VERSION "\n"
		"Usage: avs2yuv in.avs out.raw\n"
		);
		return 2;
	} else {
		infile = argv[1];
		outfile = argv[2];
	}

	try {
		char* colorformat;
		IScriptEnvironment* (__stdcall *CreateEnv)(int);
		HMODULE avsdll = LoadLibrary("avisynth.dll");
		if (!avsdll) {
			fprintf(stderr, "failed to load avisynth.dll\n");
			return 2;
		}

		CreateEnv = (IScriptEnvironment *(__stdcall *)(int))GetProcAddress(avsdll, "CreateScriptEnvironment"); 
		if (!CreateEnv) {
			fprintf(stderr, "failed to load CreateScriptEnvironment()\n");
			return 1;
		}
	
		IScriptEnvironment* env = CreateEnv(AVISYNTH_INTERFACE_VERSION);
		env->CheckVersion(5);
		AVS_linkage = env->GetAVSLinkage();
		AVSValue arg(infile);
		AVSValue res = env->Invoke("Import", AVSValue(&arg, 1));
		if (!res.IsClip()) {
			fprintf(stderr, "Error: '%s' didn't return a video clip.\n", infile);
			return 1;
		}
		PClip clip = res.AsClip();
		VideoInfo vi = clip->GetVideoInfo();
	
		fprintf(stderr, " %s:\n", infile);
		fprintf(stderr, " %dx%d,\n", vi.width, vi.height);
		fprintf(stderr, " %d/%d fps,\n", vi.fps_numerator, vi.fps_denominator);
		fprintf(stderr, " %d frames,\n", vi.num_frames);
		if (vi.IsYUV()) {
			colorformat = "YUV";
		} else {
			colorformat = "RGB";
		}
		fprintf(stderr, " %s color format", colorformat);

		out_fh = fopen(outfile, "wb");
		if (!out_fh) {
			fprintf(stderr, "fopen(\"%s\") failed", outfile);
			return 1;
		}

		for (int frm = 0; frm < vi.num_frames; ++frm) {
			PVideoFrame f = clip->GetFrame(frm, env);
	
			static const int planes[] = {PLANAR_Y, PLANAR_U, PLANAR_V};
 			int wrote = 0;

			for (int p=0; p<3; p++) { // for interleaved formats only the first plane (being the whole frame) is written
				int w = vi.width  >> vi.GetPlaneWidthSubsampling(planes[p]);
				int h = vi.height >> vi.GetPlaneHeightSubsampling(planes[p]);
				int pitch = f->GetPitch(planes[p]);
				const BYTE* data = f->GetReadPtr(planes[p]);
				for (int y=0; y<h; y++) {
					wrote += fwrite(data, 1, w, out_fh);
					data += pitch;
				}
			}
		}

		env->DeleteScriptEnvironment();
		FreeLibrary(avsdll);

	} catch(AvisynthError err) {
		fprintf(stderr, "\nAvisynth error:\n%s\n", err.msg);
		return 1;
	}

	AVS_linkage = 0;
	fclose(out_fh);
	return 0;
}
Personal tools