avisynth1.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:14k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // Avisynth v1.0 beta.  Copyright 2000 Ben Rudiak-Gould.
  2. // http://www.math.berkeley.edu/~benrg/avisynth.html
  3. // This program is free software; you can redistribute it and/or modify
  4. // it under the terms of the GNU General Public License as published by
  5. // the Free Software Foundation; either version 2 of the License, or
  6. // (at your option) any later version.
  7. //
  8. // This program is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. // GNU General Public License for more details.
  12. //
  13. // You should have received a copy of the GNU General Public License
  14. // along with this program; if not, write to the Free Software
  15. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
  16. // http://www.gnu.org/copyleft/gpl.html .
  17. #pragma once
  18. #ifdef _MSC_VER
  19.   #include <crtdbg.h>
  20. #else
  21.   #define _ASSERTE(x) assert(x)
  22.   #include <assert.h>
  23. #endif
  24. enum { AVISYNTH_INTERFACE_VERSION = 1 };
  25. // I had problems with Premiere wanting 1-byte alignment for its structures,
  26. // so I now set the Avisynth struct alignment explicitly here.
  27. #pragma pack(push,8)
  28. // The VideoInfo struct holds global information about a clip (i.e.
  29. // information that does not depend on the frame number).  The GetVideoInfo
  30. // method in IClip returns this struct.
  31. struct VideoInfo {
  32.   int width, height;    // width=0 means no video
  33.   unsigned fps_numerator, fps_denominator;
  34.   int num_frames;
  35.   enum { UNKNOWN=0, BGR24=0x13, BGR32=0x14, YUY2=0x22 };
  36.   unsigned char pixel_type;
  37.   bool field_based;
  38.   int audio_samples_per_second;   // 0 means no audio
  39.   int num_audio_samples;
  40.   bool stereo, sixteen_bit;
  41.   // useful functions of the above
  42.   bool HasVideo() const { return !!width; }
  43.   bool HasAudio() const { return !!audio_samples_per_second; }
  44.   bool IsRGB() const { return !!(pixel_type&0x10); }
  45.   bool IsRGB24() const { return pixel_type == BGR24; }
  46.   bool IsRGB32() const { return pixel_type == BGR32; }
  47.   bool IsYUV() const { return !!(pixel_type&0x20); }
  48.   bool IsYUY2() const { return pixel_type == YUY2; }
  49.   int BytesFromPixels(int pixels) const { return pixels * (pixel_type&7); }
  50.   int RowSize() const { return BytesFromPixels(width); }
  51.   int BitsPerPixel() const { return (pixel_type&7) * 8; }
  52.   int BMPSize() const { return height * ((RowSize()+3) & -4); }
  53.   int AudioSamplesFromFrames(int frames) const { return int(__int64(frames) * audio_samples_per_second * fps_denominator / fps_numerator); }
  54.   int FramesFromAudioSamples(int samples) const { return int(__int64(samples) * fps_numerator / fps_denominator / audio_samples_per_second); }
  55.   int AudioSamplesFromBytes(int bytes) const { return bytes >> (stereo + sixteen_bit); }
  56.   int BytesFromAudioSamples(int samples) const { return samples << (stereo + sixteen_bit); }
  57.   int BytesPerAudioSample() const { return BytesFromAudioSamples(1); }
  58.   // useful mutator
  59.   void SetFPS(unsigned numerator, unsigned denominator) {
  60.     unsigned x=numerator, y=denominator;
  61.     while (y) {   // find gcd
  62.       unsigned t = x%y; x = y; y = t;
  63.     }
  64.     fps_numerator = numerator/x;
  65.     fps_denominator = denominator/x;
  66.   }
  67. };
  68. // VideoFrameBuffer holds information about a memory block which is used
  69. // for video data.  For efficiency, instances of this class are not deleted
  70. // when the refcount reaches zero; instead they're stored in a linked list
  71. // to be reused.  The instances are deleted when the corresponding AVS
  72. // file is closed.
  73. class VideoFrameBuffer {
  74.   unsigned char* const data;
  75.   const int data_size;
  76.   // sequence_number is incremented every time the buffer is changed, so
  77.   // that stale views can tell they're no longer valid.
  78.   long sequence_number;
  79.   friend class VideoFrame;
  80.   friend class Cache;
  81.   long refcount;
  82. public:
  83.   VideoFrameBuffer(int size);
  84.   VideoFrameBuffer();
  85.   ~VideoFrameBuffer();
  86.   const unsigned char* GetReadPtr() const { return data; }
  87.   unsigned char* GetWritePtr() { ++sequence_number; return data; }
  88.   int GetDataSize() { return data_size; }
  89.   int GetSequenceNumber() { return sequence_number; }
  90.   int GetRefcount() { return refcount; }
  91. };
  92. class IClip;
  93. class PClip;
  94. class PVideoFrame;
  95. class IScriptEnvironment;
  96. class AVSValue;
  97. // VideoFrame holds a "window" into a VideoFrameBuffer.  Operator new
  98. // is overloaded to recycle class instances.
  99. class VideoFrame {
  100.   int refcount;
  101.   VideoFrameBuffer* const vfb;
  102.   const int offset, pitch, row_size, height;
  103.   friend class PVideoFrame;
  104.   void AddRef() { ++refcount; }
  105.   void Release() { if (refcount==1) --vfb->refcount; --refcount; }
  106.   friend class ScriptEnvironment;
  107.   friend class Cache;
  108.   VideoFrame(VideoFrameBuffer* _vfb, int _offset, int _pitch, int _row_size, int _height);
  109.   void* operator new(unsigned size);
  110. public:
  111.   int GetPitch() const { return pitch; }
  112.   int GetRowSize() const { return row_size; }
  113.   int GetHeight() const { return height; }
  114.   // generally you shouldn't use these two 
  115.   VideoFrameBuffer* GetFrameBuffer() const { return vfb; }
  116.   int GetOffset() const { return offset; }
  117.   // in plugins use env->SubFrame()
  118.   VideoFrame* Subframe(int rel_offset, int new_pitch, int new_row_size, int new_height) const;
  119.   const unsigned char* GetReadPtr() const { return vfb->GetReadPtr() + offset; }
  120.   bool IsWritable() const { return (refcount == 1 && vfb->refcount == 1); }
  121.   unsigned char* GetWritePtr() const {
  122.     return IsWritable() ? (vfb->GetWritePtr() + offset) : 0;
  123.   }
  124.   ~VideoFrame() { --vfb->refcount; }
  125. };
  126. // Base class for all filters.
  127. class IClip {
  128.   friend class PClip;
  129.   friend class AVSValue;
  130.   int refcnt;
  131.   void AddRef() { ++refcnt; }
  132.   void Release() { if (!--refcnt) delete this; }
  133. public:
  134.   IClip() : refcnt(0) {}
  135.   virtual int __stdcall GetVersion() { return AVISYNTH_INTERFACE_VERSION; }
  136.   virtual PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) = 0;
  137.   virtual bool __stdcall GetParity(int n) = 0;  // return field parity if field_based, else parity of first field in frame
  138.   virtual void __stdcall GetAudio(void* buf, int start, int count, IScriptEnvironment* env) = 0;  // start and count are in samples
  139.   virtual const VideoInfo& __stdcall GetVideoInfo() = 0;
  140.   virtual __stdcall ~IClip() {}
  141. };
  142. // smart pointer to IClip
  143. class PClip {
  144.   IClip* p;
  145.   IClip* GetPointerWithAddRef() const { if (p) p->AddRef(); return p; }
  146.   friend class AVSValue;
  147.   friend class VideoFrame;
  148.   void Init(IClip* x) {
  149.     if (x) x->AddRef();
  150.     p=x;
  151.   }
  152.   void Set(IClip* x) {
  153.     if (x) x->AddRef();
  154.     if (p) p->Release();
  155.     p=x;
  156.   }
  157. public:
  158.   PClip() { p = 0; }
  159.   PClip(const PClip& x) { Init(x.p); }
  160.   PClip(IClip* x) { Init(x); }
  161.   void operator=(IClip* x) { Set(x); }
  162.   void operator=(const PClip& x) { Set(x.p); }
  163.   IClip* operator->() const { return p; }
  164.   // useful in conditional expressions
  165.   operator void*() const { return p; }
  166.   bool operator!() const { return !p; }
  167.   ~PClip() { if (p) p->Release(); }
  168. };
  169. // smart pointer to VideoFrame
  170. class PVideoFrame {
  171.   VideoFrame* p;
  172.   void Init(VideoFrame* x) {
  173.     if (x) x->AddRef();
  174.     p=x;
  175.   }
  176.   void Set(VideoFrame* x) {
  177.     if (x) x->AddRef();
  178.     if (p) p->Release();
  179.     p=x;
  180.   }
  181. public:
  182.   PVideoFrame() { p = 0; }
  183.   PVideoFrame(const PVideoFrame& x) { Init(x.p); }
  184.   PVideoFrame(VideoFrame* x) { Init(x); }
  185.   void operator=(VideoFrame* x) { Set(x); }
  186.   void operator=(const PVideoFrame& x) { Set(x.p); }
  187.   VideoFrame* operator->() const { return p; }
  188.   // for conditional expressions
  189.   operator void*() const { return p; }
  190.   bool operator!() const { return !p; }
  191.   ~PVideoFrame() { if (p) p->Release(); }
  192. };
  193. class AVSValue {
  194. public:
  195.   AVSValue() { type = 'v'; }
  196.   AVSValue(IClip* c) { type = 'c'; clip = c; if (c) c->AddRef(); }
  197.   AVSValue(const PClip& c) { type = 'c'; clip = c.GetPointerWithAddRef(); }
  198.   AVSValue(bool b) { type = 'b'; boolean = b; }
  199.   AVSValue(int i) { type = 'i'; integer = i; }
  200.   AVSValue(float f) { type = 'f'; floating_pt = f; }
  201.   AVSValue(double f) { type = 'f'; floating_pt = float(f); }
  202.   AVSValue(const char* s) { type = 's'; string = s; }
  203.   AVSValue(const AVSValue* a, int size) { type = 'a'; array = a; array_size = size; }
  204.   AVSValue(const AVSValue& v) { Assign(&v, true); }
  205.   ~AVSValue() { if (IsClip() && clip) clip->Release(); }
  206.   AVSValue& operator=(const AVSValue& v) { Assign(&v, false); return *this; }
  207.   // Note that we transparently allow 'int' to be treated as 'float'.
  208.   // There are no int<->bool conversions, though.
  209.   bool Defined() const { return type != 'v'; }
  210.   bool IsClip() const { return type == 'c'; }
  211.   bool IsBool() const { return type == 'b'; }
  212.   bool IsInt() const { return type == 'i'; }
  213.   bool IsFloat() const { return type == 'f' || type == 'i'; }
  214.   bool IsString() const { return type == 's'; }
  215.   bool IsArray() const { return type == 'a'; }
  216.   PClip AsClip() const { _ASSERTE(IsClip()); return IsClip()?clip:0; }
  217.   bool AsBool() const { _ASSERTE(IsBool()); return boolean; }
  218.   int AsInt() const { _ASSERTE(IsInt()); return integer; }
  219.   const char* AsString() const { _ASSERTE(IsString()); return IsString()?string:0; }
  220.   double AsFloat() const { _ASSERTE(IsFloat()); return IsInt()?integer:floating_pt; }
  221.   bool AsBool(bool def) const { _ASSERTE(IsBool()||!Defined()); return IsBool() ? boolean : def; }
  222.   int AsInt(int def) const { _ASSERTE(IsInt()||!Defined()); return IsInt() ? integer : def; }
  223.   double AsFloat(double def) const { _ASSERTE(IsFloat()||!Defined()); return IsInt() ? integer : type=='f' ? floating_pt : def; }
  224.   const char* AsString(const char* def) const { _ASSERTE(IsString()||!Defined()); return IsString() ? string : def; }
  225.   int ArraySize() const { _ASSERTE(IsArray()); return IsArray()?array_size:1; }
  226.   const AVSValue& operator[](int index) const {
  227.     _ASSERTE(IsArray() && index>=0 && index<array_size);
  228.     return (IsArray() && index>=0 && index<array_size) ? array[index] : *this;
  229.   }
  230. private:
  231.   short type;  // 'a'rray, 'c'lip, 'b'ool, 'i'nt, 'f'loat, 's'tring, or 'v'oid
  232.   short array_size;
  233.   union {
  234.     IClip* clip;
  235.     bool boolean;
  236.     int integer;
  237.     float floating_pt;
  238.     const char* string;
  239.     const AVSValue* array;
  240.   };
  241.   void Assign(const AVSValue* src, bool init) {
  242.     if (src->IsClip() && src->clip)
  243.       src->clip->AddRef();
  244.     if (!init && IsClip() && clip)
  245.       clip->Release();
  246.     // make sure this copies the whole struct!
  247.     ((__int32*)this)[0] = ((__int32*)src)[0];
  248.     ((__int32*)this)[1] = ((__int32*)src)[1];
  249.   }
  250. };
  251. // instantiable null filter
  252. class GenericVideoFilter : public IClip {
  253. protected:
  254.   PClip child;
  255.   VideoInfo vi;
  256. public:
  257.   GenericVideoFilter(PClip _child) : child(_child) { vi = child->GetVideoInfo(); }
  258.   PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) { return child->GetFrame(n, env); }
  259.   void __stdcall GetAudio(void* buf, int start, int count, IScriptEnvironment* env) { child->GetAudio(buf, start, count, env); }
  260.   const VideoInfo& __stdcall GetVideoInfo() { return vi; }
  261.   bool __stdcall GetParity(int n) { return child->GetParity(n); }
  262. };
  263. class AvisynthError /* exception */ {
  264. public:
  265.   const char* const msg;
  266.   AvisynthError(const char* _msg) : msg(_msg) {}
  267. };
  268. // For GetCPUFlags.  These are the same as in VirtualDub.
  269. enum {
  270.   CPUF_FORCE = 0x01,
  271.   CPUF_FPU = 0x02,
  272.   CPUF_MMX = 0x04,
  273.   CPUF_INTEGER_SSE = 0x08, // Athlon MMX extensions or Intel SSE
  274.   CPUF_SSE = 0x10, // Full SSE (PIII)
  275.   CPUF_SSE2 = 0x20, // (PIV)
  276.   CPUF_3DNOW = 0x40,
  277.   CPUF_3DNOW_EXT = 0x80, // Athlon 3DNow! extensions
  278. };
  279. class IScriptEnvironment {
  280. public:
  281.   virtual __stdcall ~IScriptEnvironment() {}
  282.   virtual /*static*/ long __stdcall GetCPUFlags() = 0;
  283.   virtual char* __stdcall SaveString(const char* s, int length = -1) = 0;
  284.   virtual char* __stdcall Sprintf(const char* fmt, ...) = 0;
  285.   // note: val is really a va_list; I hope everyone typedefs va_list to a pointer
  286.   virtual char* __stdcall VSprintf(const char* fmt, void* val) = 0;
  287.   __declspec(noreturn) virtual void __stdcall ThrowError(const char* fmt, ...) = 0;
  288.   class NotFound /*exception*/ {};  // thrown by Invoke and GetVar
  289.   typedef AVSValue (__cdecl *ApplyFunc)(AVSValue args, void* user_data, IScriptEnvironment* env);
  290.   virtual void __stdcall AddFunction(const char* name, const char* params, ApplyFunc apply, void* user_data) = 0;
  291.   virtual bool __stdcall FunctionExists(const char* name) = 0;
  292.   virtual AVSValue __stdcall Invoke(const char* name, const AVSValue args, const char** arg_names=0) = 0;
  293.   virtual AVSValue __stdcall GetVar(const char* name) = 0;
  294.   virtual bool __stdcall SetVar(const char* name, const AVSValue& val) = 0;
  295.   virtual bool __stdcall SetGlobalVar(const char* name, const AVSValue& val) = 0;
  296.   virtual void __stdcall PushContext(int level=0) = 0;
  297.   virtual void __stdcall PopContext() = 0;
  298.   // align should be 4 or 8
  299.   virtual PVideoFrame __stdcall NewVideoFrame(const VideoInfo& vi, int align=8) = 0;
  300.   virtual bool __stdcall MakeWritable(PVideoFrame* pvf) = 0;
  301.   virtual /*static*/ void __stdcall BitBlt(unsigned char* dstp, int dst_pitch, const unsigned char* srcp, int src_pitch, int row_size, int height) = 0;
  302.   typedef void (__cdecl *ShutdownFunc)(void* user_data, IScriptEnvironment* env);
  303.   virtual void __stdcall AtExit(ShutdownFunc function, void* user_data) = 0;
  304.   virtual void __stdcall CheckVersion(int version = AVISYNTH_INTERFACE_VERSION) = 0;
  305.   virtual PVideoFrame __stdcall Subframe(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height) = 0;
  306. };
  307. // avisynth.dll exports this; it's a way to use it as a library, without
  308. // writing an AVS script or without going through AVIFile.
  309. IScriptEnvironment* __stdcall CreateScriptEnvironment(int version = AVISYNTH_INTERFACE_VERSION);
  310. #pragma pack(pop)