3 * Copyright (c) 2005 Gianluigi Tiesi <sherpya@netfarm.it>
5 * Avisynth C Interface Version 0.20
6 * Copyright 2003 Kevin Atkinson
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301 USA.
24 enum { AVISYNTH_INTERFACE_VERSION
= 2 };
28 AVS_SAMPLE_INT8
= 1<<0,
29 AVS_SAMPLE_INT16
= 1<<1,
30 AVS_SAMPLE_INT24
= 1<<2,
31 AVS_SAMPLE_INT32
= 1<<3,
32 AVS_SAMPLE_FLOAT
= 1<<4
40 AVS_PLANAR_ALIGNED
=1<<3,
41 AVS_PLANAR_Y_ALIGNED
=AVS_PLANAR_Y
|AVS_PLANAR_ALIGNED
,
42 AVS_PLANAR_U_ALIGNED
=AVS_PLANAR_U
|AVS_PLANAR_ALIGNED
,
43 AVS_PLANAR_V_ALIGNED
=AVS_PLANAR_V
|AVS_PLANAR_ALIGNED
46 // Colorspace properties.
51 AVS_CS_INTERLEAVED
= 1<<30,
55 // Specific colorformats
59 AVS_CS_BGR24
= 1<<0 | AVS_CS_BGR
| AVS_CS_INTERLEAVED
,
60 AVS_CS_BGR32
= 1<<1 | AVS_CS_BGR
| AVS_CS_INTERLEAVED
,
61 AVS_CS_YUY2
= 1<<2 | AVS_CS_YUV
| AVS_CS_INTERLEAVED
,
62 AVS_CS_YV12
= 1<<3 | AVS_CS_YUV
| AVS_CS_PLANAR
, // y-v-u, planar
63 AVS_CS_I420
= 1<<4 | AVS_CS_YUV
| AVS_CS_PLANAR
, // y-u-v, planar
64 AVS_CS_IYUV
= 1<<4 | AVS_CS_YUV
| AVS_CS_PLANAR
// same as above
67 typedef struct AVS_Clip AVS_Clip
;
68 typedef struct AVS_ScriptEnvironment AVS_ScriptEnvironment
;
70 typedef struct AVS_Value AVS_Value
;
72 short type
; // 'a'rray, 'c'lip, 'b'ool, 'i'nt, 'f'loat, 's'tring, 'v'oid, or 'l'ong
73 // for some function e'rror
76 void * clip
; // do not use directly, use avs_take_clip
81 const AVS_Value
* array
;
85 // AVS_VideoInfo is layed out identicly to VideoInfo
86 typedef struct AVS_VideoInfo
{
87 int width
, height
; // width=0 means no video
88 unsigned fps_numerator
, fps_denominator
;
93 int audio_samples_per_second
; // 0 means no audio
95 uint64_t num_audio_samples
;
98 // Imagetype properties
103 typedef struct AVS_VideoFrameBuffer
{
106 // sequence_number is incremented every time the buffer is changed, so
107 // that stale views can tell they're no longer valid.
108 long sequence_number
;
111 } AVS_VideoFrameBuffer
;
113 typedef struct AVS_VideoFrame
{
115 AVS_VideoFrameBuffer
* vfb
;
116 int offset
, pitch
, row_size
, height
, offsetU
, offsetV
, pitchUV
; // U&V offsets are from top of picture.
119 static inline AVS_Value
avs_new_value_string(const char * v0
)
120 { AVS_Value v
; v
.type
= 's'; v
.d
.string
= v0
; return v
; }
122 static inline AVS_Value
avs_new_value_array(AVS_Value
* v0
, int size
)
123 { AVS_Value v
; v
.type
= 'a'; v
.d
.array
= v0
; v
.array_size
= size
; return v
; }
126 static inline int avs_is_error(AVS_Value v
) { return v
.type
== 'e'; }
127 static inline int avs_is_clip(AVS_Value v
) { return v
.type
== 'c'; }
128 static inline int avs_is_string(AVS_Value v
) { return v
.type
== 's'; }
129 static inline int avs_has_video(const AVS_VideoInfo
* p
) { return (p
->width
!=0); }
130 static inline int avs_has_audio(const AVS_VideoInfo
* p
) { return (p
->audio_samples_per_second
!=0); }
132 static inline const char * avs_as_string(AVS_Value v
)
133 { return avs_is_error(v
) || avs_is_string(v
) ? v
.d
.string
: 0; }
136 static inline int avs_is_rgb(const AVS_VideoInfo
* p
)
137 { return (p
->pixel_type
&AVS_CS_BGR
); }
139 static inline int avs_is_rgb24(const AVS_VideoInfo
* p
)
140 { return (p
->pixel_type
&AVS_CS_BGR24
)==AVS_CS_BGR24
; } // Clear out additional properties
142 static inline int avs_is_rgb32(const AVS_VideoInfo
* p
)
143 { return (p
->pixel_type
& AVS_CS_BGR32
) == AVS_CS_BGR32
; }
145 static inline int avs_is_yuy(const AVS_VideoInfo
* p
)
146 { return (p
->pixel_type
&AVS_CS_YUV
); }
148 static inline int avs_is_yuy2(const AVS_VideoInfo
* p
)
149 { return (p
->pixel_type
& AVS_CS_YUY2
) == AVS_CS_YUY2
; }
151 static inline int avs_is_yv12(const AVS_VideoInfo
* p
)
152 { return ((p
->pixel_type
& AVS_CS_YV12
) == AVS_CS_YV12
)||((p
->pixel_type
& AVS_CS_I420
) == AVS_CS_I420
); }
154 static inline int avs_bits_per_pixel(const AVS_VideoInfo
* p
)
156 switch (p
->pixel_type
) {
157 case AVS_CS_BGR24
: return 24;
158 case AVS_CS_BGR32
: return 32;
159 case AVS_CS_YUY2
: return 16;
161 case AVS_CS_I420
: return 12;