Filter SDK/avs2yuv
From Avisynth wiki
(Difference between revisions)
(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> ...") |
|||
| 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 18: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;
}