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

多媒体编程

开发平台:

Visual C++

  1. // Avisynth v2.5 alpha.  Copyright 2002 Ben Rudiak-Gould et al.
  2. // http://www.avisynth.org
  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. //
  18. // Linking Avisynth statically or dynamically with other modules is making a
  19. // combined work based on Avisynth.  Thus, the terms and conditions of the GNU
  20. // General Public License cover the whole combination.
  21. //
  22. // As a special exception, the copyright holders of Avisynth give you
  23. // permission to link Avisynth with independent modules that communicate with
  24. // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license
  25. // terms of these independent modules, and to copy and distribute the
  26. // resulting combined work under terms of your choice, provided that
  27. // every copy of the combined work is accompanied by a complete copy of
  28. // the source code of Avisynth (the version of Avisynth used to produce the
  29. // combined work), being distributed under the terms of the GNU General
  30. // Public License plus this exception.  An independent module is a module
  31. // which is not derived from or based on Avisynth, such as 3rd-party filters,
  32. // import and export plugins, or graphical user interfaces.
  33. #pragma once
  34. enum { AVISYNTH_INTERFACE_VERSION = 2 };
  35. /* Define all types necessary for interfacing with avisynth.dll
  36.    Moved from internal.h */
  37. // Win32 API macros, notably the types BYTE, DWORD, ULONG, etc. 
  38. #include <windef.h>  
  39. // COM interface macros
  40. #include <objbase.h>
  41. // Raster types used by VirtualDub & Avisynth
  42. #define in64 (__int64)(unsigned short)
  43. typedef unsigned long Pixel;    // this will break on 64-bit machines!
  44. typedef unsigned long Pixel32;
  45. typedef unsigned char Pixel8;
  46. typedef long PixCoord;
  47. typedef long PixDim;
  48. typedef long PixOffset;
  49. /* Compiler-specific crap */
  50. // Tell MSVC to stop precompiling here
  51. #ifdef _MSC_VER
  52. //  #pragma hdrstop
  53. #endif
  54. // Set up debugging macros for MS compilers; for others, step down to the
  55. // standard <assert.h> interface
  56. #ifdef _MSC_VER
  57.   #include <crtdbg.h>
  58. #else
  59.   #define _RPT0(a,b) ((void)0)
  60.   #define _RPT1(a,b,c) ((void)0)
  61.   #define _RPT2(a,b,c,d) ((void)0)
  62.   #define _RPT3(a,b,c,d,e) ((void)0)
  63.   #define _RPT4(a,b,c,d,e,f) ((void)0)
  64.   
  65.   #define _ASSERTE(x) assert(x)
  66.   #include <assert.h>
  67. #endif
  68. // I had problems with Premiere wanting 1-byte alignment for its structures,
  69. // so I now set the Avisynth struct alignment explicitly here.
  70. #pragma pack(push,8)
  71. #define FRAME_ALIGN 16 
  72. // Default frame alignment is 16 bytes, to help P4, when using SSE2
  73. // The VideoInfo struct holds global information about a clip (i.e.
  74. // information that does not depend on the frame number).  The GetVideoInfo
  75. // method in IClip returns this struct.
  76. // Audio Sample information
  77. typedef float SFLOAT;
  78. enum {SAMPLE_INT8  = 1<<0,
  79.         SAMPLE_INT16 = 1<<1, 
  80.         SAMPLE_INT24 = 1<<2,    // Int24 is a very stupid thing to code, but it's supported by some hardware.
  81.         SAMPLE_INT32 = 1<<3,
  82.         SAMPLE_FLOAT = 1<<4};
  83. enum {
  84.    PLANAR_Y=1<<0,
  85.    PLANAR_U=1<<1,
  86.    PLANAR_V=1<<2,
  87.    PLANAR_ALIGNED=1<<3,
  88.    PLANAR_Y_ALIGNED=PLANAR_Y|PLANAR_ALIGNED,
  89.    PLANAR_U_ALIGNED=PLANAR_U|PLANAR_ALIGNED,
  90.    PLANAR_V_ALIGNED=PLANAR_V|PLANAR_ALIGNED,
  91.   };
  92. struct VideoInfo {
  93.   int width, height;    // width=0 means no video
  94.   unsigned fps_numerator, fps_denominator;
  95.   int num_frames;
  96.   // This is more extensible than previous versions. More properties can be added seeminglesly.
  97.   // Colorspace properties.
  98.   enum {
  99.     CS_BGR = 1<<28,  
  100.     CS_YUV = 1<<29,
  101.     CS_INTERLEAVED = 1<<30,
  102.     CS_PLANAR = 1<<31
  103.   };
  104.   // Specific colorformats
  105.   enum { CS_UNKNOWN = 0,
  106.          CS_BGR24 = 1<<0 | CS_BGR | CS_INTERLEAVED,
  107.          CS_BGR32 = 1<<1 | CS_BGR | CS_INTERLEAVED,
  108.          CS_YUY2 = 1<<2 | CS_YUV | CS_INTERLEAVED,
  109.          CS_YV12 = 1<<3 | CS_YUV | CS_PLANAR,  // y-v-u, planar
  110.          CS_I420 = 1<<4 | CS_YUV | CS_PLANAR,  // y-u-v, planar
  111.          CS_IYUV = 1<<4 | CS_YUV | CS_PLANAR  // same as above
  112.          };
  113.   int pixel_type;                // changed to int as of 2.5
  114.   
  115.   int audio_samples_per_second;   // 0 means no audio
  116.   int sample_type;                // as of 2.5
  117.   __int64 num_audio_samples;      // changed as of 2.5
  118.   int nchannels;                  // as of 2.5
  119.   // Imagetype properties
  120.   int image_type;
  121.   enum {
  122.     IT_BFF = 1<<0,
  123.     IT_TFF = 1<<1,
  124.     IT_FIELDBASED = 1<<2
  125.   };
  126.   // useful functions of the above
  127.   bool HasVideo() const { return (width!=0); }
  128.   bool HasAudio() const { return (audio_samples_per_second!=0); }
  129.   bool IsRGB() const { return !!(pixel_type&CS_BGR); }
  130.   bool IsRGB24() const { return (pixel_type&CS_BGR24)==CS_BGR24; } // Clear out additional properties
  131.   bool IsRGB32() const { return (pixel_type & CS_BGR32) == CS_BGR32 ; }
  132.   bool IsYUV() const { return !!(pixel_type&CS_YUV ); }
  133.   bool IsYUY2() const { return (pixel_type & CS_YUY2) == CS_YUY2; }  
  134.   bool IsYV12() const { return ((pixel_type & CS_YV12) == CS_YV12)||((pixel_type & CS_I420) == CS_I420); }
  135.   bool IsColorSpace(int c_space) const { return ((pixel_type & c_space) == c_space); }
  136.   bool Is(int property) const { return ((pixel_type & property)==property ); }
  137.   bool IsPlanar() const { return !!(pixel_type & CS_PLANAR); }
  138.   bool IsFieldBased() const { return !!(image_type & IT_FIELDBASED); }
  139.   bool IsParityKnown() const { return ((image_type & IT_FIELDBASED)&&(image_type & (IT_BFF||IT_TFF))); }
  140.   bool IsBFF() const { return !!(pixel_type & IT_BFF); }
  141.   bool IsTFF() const { return !!(pixel_type & IT_TFF); }
  142.   
  143.   bool IsVPlaneFirst() const {return ((pixel_type & CS_YV12) == CS_YV12); }  // Don't use this 
  144.   int BytesFromPixels(int pixels) const { return pixels * (BitsPerPixel()>>3); }   // Will not work on planar images, but will return only luma planes
  145.   int RowSize() const { return BytesFromPixels(width); }  // Also only returns first plane on planar images
  146.   int BMPSize() const { if (IsPlanar()) {int p = height * ((RowSize()+3) & ~3); p+=p>>1; return p;  } return height * ((RowSize()+3) & ~3); }
  147.   __int64 AudioSamplesFromFrames(__int64 frames) const { return (__int64(frames) * audio_samples_per_second * fps_denominator / fps_numerator); }
  148.   int FramesFromAudioSamples(__int64 samples) const { return (int)(samples * (__int64)fps_numerator / (__int64)fps_denominator / (__int64)audio_samples_per_second); }
  149.   __int64 AudioSamplesFromBytes(__int64 bytes) const { return bytes / BytesPerAudioSample(); }
  150.   __int64 BytesFromAudioSamples(__int64 samples) const { return samples * BytesPerAudioSample(); }
  151.   int AudioChannels() const { return nchannels; }
  152.   int SampleType() const{ return sample_type;}
  153.   int SamplesPerSecond() const { return audio_samples_per_second; }
  154.   int BytesPerAudioSample() const { return nchannels*BytesPerChannelSample();}
  155.   void SetFieldBased(bool isfieldbased)  { if (isfieldbased) image_type|=IT_FIELDBASED; else  image_type&=~IT_FIELDBASED; }
  156.   void Set(int property)  { image_type|=property; }
  157.   void Clear(int property)  { image_type&=~property; }
  158.   int BitsPerPixel() const { 
  159.     switch (pixel_type) {
  160.       case CS_BGR24:
  161.         return 24;
  162.       case CS_BGR32:
  163.         return 32;
  164.       case CS_YUY2:
  165.         return 16;
  166.       case CS_YV12:
  167.       case CS_I420:
  168.         return 12;
  169.       default:
  170.         return 0;
  171.     }
  172.   }
  173.   int BytesPerChannelSample() const { 
  174.     switch (sample_type) {
  175.     case SAMPLE_INT8:
  176.       return sizeof(signed char);
  177.     case SAMPLE_INT16:
  178.       return sizeof(signed short);
  179.     case SAMPLE_INT24:
  180.       return 3;
  181.     case SAMPLE_INT32:
  182.       return sizeof(signed int);
  183.     case SAMPLE_FLOAT:
  184.       return sizeof(SFLOAT);
  185.     default:
  186.       _ASSERTE("Sample type not recognized!");
  187.       return 0;
  188.     }
  189.   }
  190.   // useful mutator
  191.   void SetFPS(unsigned numerator, unsigned denominator) {
  192.     unsigned x=numerator, y=denominator;
  193.     while (y) {   // find gcd
  194.       unsigned t = x%y; x = y; y = t;
  195.     }
  196.     fps_numerator = numerator/x;
  197.     fps_denominator = denominator/x;
  198.   }
  199. };
  200. enum {
  201.   FILTER_TYPE=1,
  202.   FILTER_INPUT_COLORSPACE=2,
  203.   FILTER_OUTPUT_TYPE=9,
  204.   FILTER_NAME=4,
  205.   FILTER_AUTHOR=5,
  206.   FILTER_VERSION=6,
  207.   FILTER_ARGS=7,
  208.   FILTER_ARGS_INFO=8,
  209.   FILTER_ARGS_DESCRIPTION=10,
  210.   FILTER_DESCRIPTION=11,
  211. };
  212. enum {  //SUBTYPES
  213.   FILTER_TYPE_AUDIO=1,
  214.   FILTER_TYPE_VIDEO=2,
  215.   FILTER_OUTPUT_TYPE_SAME=3,
  216.   FILTER_OUTPUT_TYPE_DIFFERENT=4,
  217. };
  218. // VideoFrameBuffer holds information about a memory block which is used
  219. // for video data.  For efficiency, instances of this class are not deleted
  220. // when the refcount reaches zero; instead they're stored in a linked list
  221. // to be reused.  The instances are deleted when the corresponding AVS
  222. // file is closed.
  223. class VideoFrameBuffer {
  224.   BYTE* const data;
  225.   const int data_size;
  226.   // sequence_number is incremented every time the buffer is changed, so
  227.   // that stale views can tell they're no longer valid.
  228.   long sequence_number;
  229.   friend class VideoFrame;
  230.   friend class Cache;
  231.   long refcount;
  232. public:
  233.   VideoFrameBuffer(int size);
  234.   VideoFrameBuffer();
  235.   ~VideoFrameBuffer();
  236.   const BYTE* GetReadPtr() const { return data; }
  237.   BYTE* GetWritePtr() { ++sequence_number; return data; }
  238.   int GetDataSize() { return data_size; }
  239.   int GetSequenceNumber() { return sequence_number; }
  240.   int GetRefcount() { return refcount; }
  241. };
  242. class IClip;
  243. class PClip;
  244. class PVideoFrame;
  245. class IScriptEnvironment;
  246. class AVSValue;
  247. // VideoFrame holds a "window" into a VideoFrameBuffer.  Operator new
  248. // is overloaded to recycle class instances.
  249. class VideoFrame {
  250.   int refcount;
  251.   VideoFrameBuffer* const vfb;
  252.   const int offset, pitch, row_size, height, offsetU, offsetV, pitchUV;  // U&V offsets are from top of picture.
  253.   friend class PVideoFrame;
  254.   void AddRef() { ++refcount; }
  255.   void Release() { if (refcount==1) --vfb->refcount; --refcount; }
  256.   friend class ScriptEnvironment;
  257.   friend class Cache;
  258.   VideoFrame(VideoFrameBuffer* _vfb, int _offset, int _pitch, int _row_size, int _height);
  259.   VideoFrame(VideoFrameBuffer* _vfb, int _offset, int _pitch, int _row_size, int _height, int _offsetU, int _offsetV, int _pitchUV);
  260.   void* operator new(unsigned size);
  261. // TESTME: OFFSET U/V may be switched to what could be expected from AVI standard!
  262. public:
  263.   int GetPitch() const { return pitch; }
  264.   int GetPitch(int plane) const { switch (plane) {case PLANAR_U: case PLANAR_V: return pitchUV;} return pitch; }
  265.   int GetRowSize() const { return row_size; }
  266.   int GetRowSize(int plane) const { 
  267.     switch (plane) {
  268.     case PLANAR_U: case PLANAR_V: if (pitchUV) return row_size>>1; else return 0;
  269.     case PLANAR_U_ALIGNED: case PLANAR_V_ALIGNED: 
  270.       if (pitchUV) { 
  271.         int r = ((row_size+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)) )>>1; // Aligned rowsize
  272.         if (r<=pitchUV) 
  273.           return r; 
  274.         return row_size>>1; 
  275.       } else return 0;
  276.     case PLANAR_Y_ALIGNED:
  277.       int r = (row_size+FRAME_ALIGN-1)&(~(FRAME_ALIGN-1)); // Aligned rowsize
  278.       if (r<=pitch) 
  279.         return r; 
  280.       return row_size;
  281.     }
  282.     return row_size; }
  283.   int GetHeight() const { return height; }
  284.   int GetHeight(int plane) const {  switch (plane) {case PLANAR_U: case PLANAR_V: if (pitchUV) return height>>1; return 0;} return height; }
  285.   // generally you shouldn't use these three
  286.   VideoFrameBuffer* GetFrameBuffer() const { return vfb; }
  287.   int GetOffset() const { return offset; }
  288.   int GetOffset(int plane) const { switch (plane) {case PLANAR_U: return offsetU;case PLANAR_V: return offsetV;default: return offset;}; }
  289.   // in plugins use env->SubFrame()
  290.   VideoFrame* Subframe(int rel_offset, int new_pitch, int new_row_size, int new_height) const;
  291.   VideoFrame* Subframe(int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int pitchUV) const;
  292.   const BYTE* GetReadPtr() const { return vfb->GetReadPtr() + offset; }
  293.   const BYTE* GetReadPtr(int plane) const { return vfb->GetReadPtr() + GetOffset(plane); }
  294.   bool IsWritable() const { return (refcount == 1 && vfb->refcount == 1); }
  295.   BYTE* GetWritePtr() const {
  296.     return IsWritable() ? (vfb->GetWritePtr() + offset) : 0;
  297.   }
  298.   BYTE* GetWritePtr(int plane) const {
  299.     if (plane==PLANAR_Y)
  300.       return IsWritable() ? vfb->GetWritePtr() + GetOffset(plane) : 0;
  301.     return vfb->data + GetOffset(plane);
  302.   }
  303.   ~VideoFrame() { --vfb->refcount; }
  304. };
  305. enum {
  306.   CACHE_NOTHING=0,
  307.   CACHE_RANGE=1 };
  308. // Base class for all filters.
  309. class IClip {
  310.   friend class PClip;
  311.   friend class AVSValue;
  312.   int refcnt;
  313.   void AddRef() { ++refcnt; }
  314.   void Release() { if (!--refcnt) delete this; }
  315. public:
  316.   IClip() : refcnt(0) {}
  317.   virtual int __stdcall GetVersion() { return AVISYNTH_INTERFACE_VERSION; }
  318.   
  319.   virtual PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) = 0;
  320.   virtual bool __stdcall GetParity(int n) = 0;  // return field parity if field_based, else parity of first field in frame
  321.   virtual void __stdcall GetAudio(void* buf, __int64 start, __int64 count, IScriptEnvironment* env) = 0;  // start and count are in samples
  322.   virtual void __stdcall SetCacheHints(int cachehints,int frame_range) = 0 ;  // We do not pass cache requests upwards, only to the next filter.
  323.   virtual const VideoInfo& __stdcall GetVideoInfo() = 0;
  324.   virtual __stdcall ~IClip() {}
  325. };
  326. // smart pointer to IClip
  327. class PClip {
  328.   IClip* p;
  329.   IClip* GetPointerWithAddRef() const { if (p) p->AddRef(); return p; }
  330.   friend class AVSValue;
  331.   friend class VideoFrame;
  332.   void Init(IClip* x) {
  333.     if (x) x->AddRef();
  334.     p=x;
  335.   }
  336.   void Set(IClip* x) {
  337.     if (x) x->AddRef();
  338.     if (p) p->Release();
  339.     p=x;
  340.   }
  341. public:
  342.   PClip() { p = 0; }
  343.   PClip(const PClip& x) { Init(x.p); }
  344.   PClip(IClip* x) { Init(x); }
  345.   void operator=(IClip* x) { Set(x); }
  346.   void operator=(const PClip& x) { Set(x.p); }
  347.   IClip* operator->() const { return p; }
  348.   // useful in conditional expressions
  349.   operator void*() const { return p; }
  350.   bool operator!() const { return !p; }
  351.   ~PClip() { if (p) p->Release(); }
  352. };
  353. // smart pointer to VideoFrame
  354. class PVideoFrame {
  355.   VideoFrame* p;
  356.   void Init(VideoFrame* x) {
  357.     if (x) x->AddRef();
  358.     p=x;
  359.   }
  360.   void Set(VideoFrame* x) {
  361.     if (x) x->AddRef();
  362.     if (p) p->Release();
  363.     p=x;
  364.   }
  365. public:
  366.   PVideoFrame() { p = 0; }
  367.   PVideoFrame(const PVideoFrame& x) { Init(x.p); }
  368.   PVideoFrame(VideoFrame* x) { Init(x); }
  369.   void operator=(VideoFrame* x) { Set(x); }
  370.   void operator=(const PVideoFrame& x) { Set(x.p); }
  371.   VideoFrame* operator->() const { return p; }
  372.   // for conditional expressions
  373.   operator void*() const { return p; }
  374.   bool operator!() const { return !p; }
  375.   ~PVideoFrame() { if (p) p->Release(); }
  376. };
  377. class AVSValue {
  378. public:
  379.   AVSValue() { type = 'v'; }
  380.   AVSValue(IClip* c) { type = 'c'; clip = c; if (c) c->AddRef(); }
  381.   AVSValue(const PClip& c) { type = 'c'; clip = c.GetPointerWithAddRef(); }
  382.   AVSValue(bool b) { type = 'b'; boolean = b; }
  383.   AVSValue(int i) { type = 'i'; integer = i; }
  384. //  AVSValue(__int64 l) { type = 'l'; longlong = l; }
  385.   AVSValue(float f) { type = 'f'; floating_pt = f; }
  386.   AVSValue(double f) { type = 'f'; floating_pt = float(f); }
  387.   AVSValue(const char* s) { type = 's'; string = s; }
  388.   AVSValue(const AVSValue* a, int size) { type = 'a'; array = a; array_size = size; }
  389.   AVSValue(const AVSValue& v) { Assign(&v, true); }
  390.   ~AVSValue() { if (IsClip() && clip) clip->Release(); }
  391.   AVSValue& operator=(const AVSValue& v) { Assign(&v, false); return *this; }
  392.   // Note that we transparently allow 'int' to be treated as 'float'.
  393.   // There are no int<->bool conversions, though.
  394.   bool Defined() const { return type != 'v'; }
  395.   bool IsClip() const { return type == 'c'; }
  396.   bool IsBool() const { return type == 'b'; }
  397.   bool IsInt() const { return type == 'i'; }
  398. //  bool IsLong() const { return (type == 'l'|| type == 'i'); }
  399.   bool IsFloat() const { return type == 'f' || type == 'i'; }
  400.   bool IsString() const { return type == 's'; }
  401.   bool IsArray() const { return type == 'a'; }
  402.   PClip AsClip() const { _ASSERTE(IsClip()); return IsClip()?clip:0; }
  403.   bool AsBool() const { _ASSERTE(IsBool()); return boolean; }
  404.   int AsInt() const { _ASSERTE(IsInt()); return integer; }   
  405. //  int AsLong() const { _ASSERTE(IsLong()); return longlong; } 
  406.   const char* AsString() const { _ASSERTE(IsString()); return IsString()?string:0; }
  407.   double AsFloat() const { _ASSERTE(IsFloat()); return IsInt()?integer:floating_pt; }
  408.   bool AsBool(bool def) const { _ASSERTE(IsBool()||!Defined()); return IsBool() ? boolean : def; }
  409.   int AsInt(int def) const { _ASSERTE(IsInt()||!Defined()); return IsInt() ? integer : def; }
  410.   double AsFloat(double def) const { _ASSERTE(IsFloat()||!Defined()); return IsInt() ? integer : type=='f' ? floating_pt : def; }
  411.   const char* AsString(const char* def) const { _ASSERTE(IsString()||!Defined()); return IsString() ? string : def; }
  412.   int ArraySize() const { _ASSERTE(IsArray()); return IsArray()?array_size:1; }
  413.   const AVSValue& operator[](int index) const {
  414.     _ASSERTE(IsArray() && index>=0 && index<array_size);
  415.     return (IsArray() && index>=0 && index<array_size) ? array[index] : *this;
  416.   }
  417. private:
  418.   short type;  // 'a'rray, 'c'lip, 'b'ool, 'i'nt, 'f'loat, 's'tring, 'v'oid, or 'l'ong
  419.   short array_size;
  420.   union {
  421.     IClip* clip;
  422.     bool boolean;
  423.     int integer;
  424.     float floating_pt;
  425.     const char* string;
  426.     const AVSValue* array;
  427. //    __int64 longlong;
  428.   };
  429.   void Assign(const AVSValue* src, bool init) {
  430.     if (src->IsClip() && src->clip)
  431.       src->clip->AddRef();
  432.     if (!init && IsClip() && clip)
  433.       clip->Release();
  434.     // make sure this copies the whole struct!
  435.     ((__int32*)this)[0] = ((__int32*)src)[0];
  436.     ((__int32*)this)[1] = ((__int32*)src)[1];
  437.   }
  438. };
  439. // instantiable null filter
  440. class GenericVideoFilter : public IClip {
  441. protected:
  442.   PClip child;
  443.   VideoInfo vi;
  444. public:
  445.   GenericVideoFilter(PClip _child) : child(_child) { vi = child->GetVideoInfo(); }
  446.   PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) { return child->GetFrame(n, env); }
  447.   void __stdcall GetAudio(void* buf, __int64 start, __int64 count, IScriptEnvironment* env) { child->GetAudio(buf, start, count, env); }
  448.   const VideoInfo& __stdcall GetVideoInfo() { return vi; }
  449.   bool __stdcall GetParity(int n) { return child->GetParity(n); }
  450.   void __stdcall SetCacheHints(int cachehints,int frame_range) { } ;  // We do not pass cache requests upwards, only to the next filter.
  451. };
  452. class AvisynthError /* exception */ {
  453. public:
  454.   const char* const msg;
  455.   AvisynthError(const char* _msg) : msg(_msg) {}
  456. };
  457. // For GetCPUFlags.  These are backwards-compatible with those in VirtualDub.
  458. enum {                    
  459.                     /* slowest CPU to support extension */
  460.   CPUF_FORCE   = 0x01,   // N/A
  461.   CPUF_FPU     = 0x02,   // 386/486DX
  462.   CPUF_MMX     = 0x04,   // P55C, K6, PII
  463.   CPUF_INTEGER_SSE = 0x08, // PIII, Athlon
  464.   CPUF_SSE     = 0x10, // PIII, Athlon XP/MP
  465.   CPUF_SSE2     = 0x20, // PIV, Hammer
  466.   CPUF_3DNOW   = 0x40,   // K6-2
  467.   CPUF_3DNOW_EXT = 0x80, // Athlon
  468.   CPUF_X86_64       = 0xA0,   // Hammer (note: equiv. to 3DNow + SSE2, which only Hammer
  469.                               //         will have anyway)
  470. };
  471. #define MAX_INT 0x7fffffff
  472. #define MIN_INT 0x80000000
  473. class ConvertAudio : public GenericVideoFilter 
  474. /**
  475.   * Helper class to convert audio to any format
  476.  **/
  477. {
  478. public:
  479.   ConvertAudio(PClip _clip, int prefered_format);
  480.   void __stdcall GetAudio(void* buf, __int64 start, __int64 count, IScriptEnvironment* env);
  481.   static PClip Create(PClip clip, int sample_type, int prefered_type);
  482.   static AVSValue __cdecl Create_float(AVSValue args, void*, IScriptEnvironment*);
  483.   static AVSValue __cdecl Create_32bit(AVSValue args, void*, IScriptEnvironment*);
  484.   static AVSValue __cdecl Create_16bit(AVSValue args, void*, IScriptEnvironment*);
  485.   static AVSValue __cdecl Create_8bit(AVSValue args, void*, IScriptEnvironment*);
  486.   virtual ~ConvertAudio()
  487.   {if (tempbuffer_size) {delete[] tempbuffer;tempbuffer_size=0;}}
  488. private:
  489. void ConvertAudio::convertToFloat(char* inbuf, float* outbuf, char sample_type, int count);
  490. void ConvertAudio::convertFromFloat(float* inbuf, void* outbuf, char sample_type, int count);
  491.   __inline int Saturate_int8(float n);
  492.   __inline short Saturate_int16(float n);
  493.   __inline int Saturate_int24(float n);
  494.   __inline int Saturate_int32(float n);
  495.   char src_format;
  496.   char dst_format;
  497.   int src_bps;
  498.   char *tempbuffer;
  499.   SFLOAT *floatbuffer;
  500.   int tempbuffer_size;
  501. };
  502. class AlignPlanar : public GenericVideoFilter {
  503. public:
  504.   AlignPlanar(PClip _clip);
  505.   static PClip Create(PClip clip);
  506.   PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env);
  507. };
  508. class FillBorder : public GenericVideoFilter {
  509. public:
  510.   FillBorder(PClip _clip);
  511.   static PClip Create(PClip clip);
  512.   PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env);
  513. };
  514. class IScriptEnvironment {
  515. public:
  516.   virtual __stdcall ~IScriptEnvironment() {}
  517.   virtual /*static*/ long __stdcall GetCPUFlags() = 0;
  518.   virtual char* __stdcall SaveString(const char* s, int length = -1) = 0;
  519.   virtual char* __stdcall Sprintf(const char* fmt, ...) = 0;
  520.   // note: val is really a va_list; I hope everyone typedefs va_list to a pointer
  521.   virtual char* __stdcall VSprintf(const char* fmt, void* val) = 0;
  522.   __declspec(noreturn) virtual void __stdcall ThrowError(const char* fmt, ...) = 0;
  523.   class NotFound /*exception*/ {};  // thrown by Invoke and GetVar
  524.   typedef AVSValue (__cdecl *ApplyFunc)(AVSValue args, void* user_data, IScriptEnvironment* env);
  525.   virtual void __stdcall AddFunction(const char* name, const char* params, ApplyFunc apply, void* user_data) = 0;
  526.   virtual bool __stdcall FunctionExists(const char* name) = 0;
  527.   virtual AVSValue __stdcall Invoke(const char* name, const AVSValue args, const char** arg_names=0) = 0;
  528.   virtual AVSValue __stdcall GetVar(const char* name) = 0;
  529.   virtual bool __stdcall SetVar(const char* name, const AVSValue& val) = 0;
  530.   virtual bool __stdcall SetGlobalVar(const char* name, const AVSValue& val) = 0;
  531.   virtual void __stdcall PushContext(int level=0) = 0;
  532.   virtual void __stdcall PopContext() = 0;
  533.   // align should be 4 or 8
  534.   virtual PVideoFrame __stdcall NewVideoFrame(const VideoInfo& vi, int align=FRAME_ALIGN) = 0;
  535.   virtual bool __stdcall MakeWritable(PVideoFrame* pvf) = 0;
  536.   virtual /*static*/ void __stdcall BitBlt(BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height) = 0;
  537.   typedef void (__cdecl *ShutdownFunc)(void* user_data, IScriptEnvironment* env);
  538.   virtual void __stdcall AtExit(ShutdownFunc function, void* user_data) = 0;
  539.   virtual void __stdcall CheckVersion(int version = AVISYNTH_INTERFACE_VERSION) = 0;
  540.   virtual PVideoFrame __stdcall Subframe(PVideoFrame src, int rel_offset, int new_pitch, int new_row_size, int new_height) = 0;
  541. virtual int __stdcall SetMemoryMax(int mem) = 0;
  542.   virtual int __stdcall SetWorkingDir(const char * newdir) = 0;
  543. };
  544. // avisynth.dll exports this; it's a way to use it as a library, without
  545. // writing an AVS script or without going through AVIFile.
  546. IScriptEnvironment* __stdcall CreateScriptEnvironment(int version = AVISYNTH_INTERFACE_VERSION);
  547. #pragma pack(pop)