Filter SDK/avs2yuv
From Avisynth wiki
(Difference between revisions)
Line 19: | Line 19: | ||
if (!strcmp(argv[1], "-h")) { | if (!strcmp(argv[1], "-h")) { | ||
fprintf(stderr, MY_VERSION "\n" | fprintf(stderr, MY_VERSION "\n" | ||
− | "Usage: avs2yuv in.avs out.raw\n"); | + | "Usage: avs2yuv.exe in.avs out.raw\n"); |
return 2; | return 2; | ||
} else { | } else { |
Revision as of 00:17, 3 January 2014
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.exe 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; }