Filter SDK/avs2yuv: Difference between revisions
From Avisynth wiki
Jump to navigationJump to search
Created page with "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> ..." |
No edit summary |
||
| Line 13: | Line 13: | ||
int __cdecl main(int argc, const char* argv[]) | 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; | |||
} | } | ||
Revision as of 19:58, 2 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 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;
}