2 * VIDIX - VIDeo Interface for *niX.
3 * Copyright (C) 2002 Nick Kurshev
4 * Copyright (C) 2007 Benjamin Zores <ben@geexbox.org>
6 * This file is part of MPlayer.
8 * MPlayer is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * MPlayer 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
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with MPlayer; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 * This interface is introduced as universal one to MPEG decoder,
23 * Back End Scaler (BES) and YUV2RGB hw accelerators.
25 * In the future it may be expanded up to capturing and audio things.
26 * Main goal of this this interface imlpementation is providing DGA
27 * everywhere where it's possible (unlike X11 and other).
29 * This interface is based on v4l2, fbvid.h, mga_vid.h projects
30 * and personally my ideas.
32 * NOTE: This interface is introduces as driver interface.
42 #define VIDIX_VERSION 100
44 #define PROBE_NORMAL 0 /* normal probing */
45 #define PROBE_FORCE 1 /* ignore device_id but recognize device if it's known */
47 typedef enum vidix_dev_type
{
48 TYPE_OUTPUT
= 0x00000000, /* Is a video playback device */
49 TYPE_CAPTURE
= 0x00000001, /* Is a capture device */
50 TYPE_CODEC
= 0x00000002, /* Device supports hw (de)coding */
51 TYPE_FX
= 0x00000004, /* Is a video effects device */
54 typedef enum vidix_dev_flag
{
55 FLAG_NONE
= 0x00000000, /* No flags defined */
56 FLAG_DMA
= 0x00000001, /* Card can use DMA */
57 /* Card can use DMA only if src pitch == dest pitch */
58 FLAG_EQ_DMA
= 0x00000002,
59 /* Possible to wait for DMA to finish. See BM_DMA_SYNC and BM_DMA_BLOCK */
60 FLAG_SYNC_DMA
= 0x00000004,
61 FLAG_UPSCALER
= 0x00000010, /* Card supports hw upscaling */
62 FLAG_DOWNSCALER
= 0x00000020, /* Card supports hw downscaling */
63 FLAG_SUBPIC
= 0x00001000, /* Card supports DVD subpictures */
64 FLAG_EQUALIZER
= 0x00002000, /* Card supports equalizer */
67 typedef struct vidix_capability_s
69 char name
[64]; /* Driver name */
70 char author
[64]; /* Author name */
71 vidix_dev_type_t type
;
72 unsigned reserved0
[4];
77 int maxframerate
; /* -1 if unlimited */
78 vidix_dev_flag_t flags
;
79 unsigned short vendor_id
;
80 unsigned short device_id
;
81 unsigned reserved1
[4];
84 typedef enum vidix_depth
{
85 VID_DEPTH_NONE
= 0x0000,
86 VID_DEPTH_1BPP
= 0x0001,
87 VID_DEPTH_2BPP
= 0x0002,
88 VID_DEPTH_4BPP
= 0x0004,
89 VID_DEPTH_8BPP
= 0x0008,
90 VID_DEPTH_12BPP
= 0x0010,
91 VID_DEPTH_15BPP
= 0x0020,
92 VID_DEPTH_16BPP
= 0x0040,
93 VID_DEPTH_24BPP
= 0x0080,
94 VID_DEPTH_32BPP
= 0x0100,
95 VID_DEPTH_ALL
= VID_DEPTH_1BPP
| VID_DEPTH_2BPP
| \
96 VID_DEPTH_4BPP
| VID_DEPTH_8BPP
| \
97 VID_DEPTH_12BPP
| VID_DEPTH_15BPP
| \
98 VID_DEPTH_16BPP
| VID_DEPTH_24BPP
| \
102 typedef enum vidix_cap
{
103 VID_CAP_NONE
= 0x0000,
104 /* if overlay can be bigger than source */
105 VID_CAP_EXPAND
= 0x0001,
106 /* if overlay can be smaller than source */
107 VID_CAP_SHRINK
= 0x0002,
108 /* if overlay can be blended with framebuffer */
109 VID_CAP_BLEND
= 0x0004,
110 /* if overlay can be restricted to a colorkey */
111 VID_CAP_COLORKEY
= 0x0008,
112 /* if overlay can be restricted to an alpha channel */
113 VID_CAP_ALPHAKEY
= 0x0010,
114 /* if the colorkey can be a range */
115 VID_CAP_COLORKEY_ISRANGE
= 0x0020,
116 /* if the alphakey can be a range */
117 VID_CAP_ALPHAKEY_ISRANGE
= 0x0040,
118 /* colorkey is checked against framebuffer */
119 VID_CAP_COLORKEY_ISMAIN
= 0x0080,
120 /* colorkey is checked against overlay */
121 VID_CAP_COLORKEY_ISOVERLAY
= 0x0100,
122 /* alphakey is checked against framebuffer */
123 VID_CAP_ALPHAKEY_ISMAIN
= 0x0200,
124 /* alphakey is checked against overlay */
125 VID_CAP_ALPHAKEY_ISOVERLAY
= 0x0400,
128 typedef struct vidix_fourcc_s
130 unsigned fourcc
; /* input: requested fourcc */
131 vidix_depth_t depth
; /* output: screen depth for given fourcc */
132 vidix_cap_t flags
; /* output: capability */
135 typedef struct vidix_yuv_s
140 typedef struct vidix_rect_s
142 unsigned x
,y
,w
,h
; /* in pixels */
143 vidix_yuv_t pitch
; /* line-align in bytes */
146 typedef enum vidix_color_key_op
{
152 } vidix_color_key_op_t
;
154 typedef struct vidix_color_key_s
156 vidix_color_key_op_t op
; /* defines logical operation */
160 unsigned char reserved
;
163 typedef enum vidix_video_key_op
{
168 } vidix_video_key_op_t
;
170 typedef struct vidix_video_key_s
{
171 vidix_video_key_op_t op
; /* defines logical operation */
172 unsigned char key
[8];
175 typedef enum vidix_interleave
{
176 VID_PLAY_INTERLEAVED_UV
= 0x00000001,
177 /* UVUVUVUVUV used by Matrox G200 */
178 INTERLEAVING_UV
= 0x00001000,
180 INTERLEAVING_VU
= 0x00001001,
181 } vidix_interleave_t
;
183 #define VID_PLAY_MAXFRAMES 64 /* unreal limitation */
185 typedef struct vidix_playback_s
187 unsigned fourcc
; /* app -> driver: movies's fourcc */
188 unsigned capability
; /* app -> driver: what capability to use */
189 unsigned blend_factor
; /* app -> driver: blending factor */
190 vidix_rect_t src
; /* app -> driver: original movie size */
191 vidix_rect_t dest
; /* app -> driver: destinition movie size.
192 driver->app dest_pitch */
193 vidix_interleave_t flags
; /* driver -> app: interleaved UV planes */
195 unsigned frame_size
; /* driver -> app: destinition frame size */
196 unsigned num_frames
; /* app -> driver: after call: driver -> app */
197 unsigned offsets
[VID_PLAY_MAXFRAMES
]; /* driver -> app */
198 vidix_yuv_t offset
; /* driver -> app: relative offsets
199 within frame for yuv planes */
200 void *dga_addr
; /* driver -> app: linear address */
203 typedef enum vidix_key_op
{
210 typedef struct vidix_grkey_s
212 vidix_ckey_t ckey
; /* app -> driver: color key */
213 vidix_vkey_t vkey
; /* app -> driver: video key */
214 vidix_key_op_t key_op
; /* app -> driver: keys operations */
217 typedef enum vidix_veq_cap
{
218 VEQ_CAP_NONE
= 0x00000000UL
,
219 VEQ_CAP_BRIGHTNESS
= 0x00000001UL
,
220 VEQ_CAP_CONTRAST
= 0x00000002UL
,
221 VEQ_CAP_SATURATION
= 0x00000004UL
,
222 VEQ_CAP_HUE
= 0x00000008UL
,
223 VEQ_CAP_RGB_INTENSITY
= 0x00000010UL
,
226 typedef enum vidix_veq_flag
{
227 VEQ_FLG_ITU_R_BT_601
= 0x00000000, /* ITU-R BT.601 colour space (default) */
228 VEQ_FLG_ITU_R_BT_709
= 0x00000001, /* ITU-R BT.709 colour space */
229 VEQ_FLG_ITU_MASK
= 0x0000000f,
232 typedef struct vidix_video_eq_s
{
233 vidix_veq_cap_t cap
; /* on get_eq should contain capability of
234 equalizer on set_eq should contain using fields */
235 /* end-user app can have presets like: cold-normal-hot picture and so on */
236 int brightness
; /* -1000 : +1000 */
237 int contrast
; /* -1000 : +1000 */
238 int saturation
; /* -1000 : +1000 */
239 int hue
; /* -1000 : +1000 */
240 int red_intensity
; /* -1000 : +1000 */
241 int green_intensity
; /* -1000 : +1000 */
242 int blue_intensity
; /* -1000 : +1000 */
243 vidix_veq_flag_t flags
; /* currently specifies ITU YCrCb color
247 typedef enum vidix_interlace_flag
{
248 /* stream is not interlaced */
249 CFG_NON_INTERLACED
= 0x00000000,
250 /* stream is interlaced */
251 CFG_INTERLACED
= 0x00000001,
252 /* first frame contains even fields but second - odd */
253 CFG_EVEN_ODD_INTERLACING
= 0x00000002,
254 /* first frame contains odd fields but second - even */
255 CFG_ODD_EVEN_INTERLACING
= 0x00000004,
256 /* field deinterlace_pattern is valid */
257 CFG_UNIQUE_INTERLACING
= 0x00000008,
258 /* unknown deinterlacing - use adaptive if it's possible */
259 CFG_UNKNOWN_INTERLACING
= 0x0000000f,
260 } vidix_interlace_flag_t
;
262 typedef struct vidix_deinterlace_s
{
263 vidix_interlace_flag_t flags
;
264 unsigned deinterlace_pattern
; /* app -> driver: deinterlace pattern if
265 flag CFG_UNIQUE_INTERLACING is set */
266 } vidix_deinterlace_t
;
268 typedef struct vidix_slice_s
{
269 void *address
; /* app -> driver */
270 unsigned size
; /* app -> driver */
271 vidix_rect_t slice
; /* app -> driver */
274 typedef enum vidix_bm_flag
{
276 /* waits for vsync or hsync */
280 typedef struct vidix_dma_s
282 vidix_slice_t src
; /* app -> driver */
283 vidix_slice_t dest
; /* app -> driver */
284 vidix_dma_flag_t flags
; /* app -> driver */
287 typedef enum vidix_fx_type
{
288 FX_TYPE_BOOLEAN
= 0x00000000,
289 FX_TYPE_INTEGER
= 0x00000001,
293 This structure is introdused to support OEM effects like:
302 typedef struct vidix_oem_fx_s
304 vidix_fx_type_t type
; /* type of effects */
305 int num
; /* app -> driver: effect number.
306 From 0 to max number of effects */
307 int minvalue
; /* min value of effect. 0 - for boolean */
308 int maxvalue
; /* max value of effect. 1 - for boolean */
309 int value
; /* current value of effect on get; required on set */
310 char *name
[80]; /* effect name to display */