Update to MPlayer SVN rev 29473 and FFmpeg SVN rev 19572.
[vaapi:athaifas-mplayer.git] / stream / tv.h
1 /*
2  * Teletext support
3  *
4  * Copyright (C) 2007 Vladimir Voroshilov <voroshil@gmail.com>
5  *
6  * This file is part of MPlayer.
7  *
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.
12  *
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.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with MPlayer; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22
23 #ifndef MPLAYER_TV_H
24 #define MPLAYER_TV_H
25
26 typedef struct tv_param_s {
27     char *freq;
28     char *channel;
29     char *chanlist;
30     char *norm;
31     int automute;
32     int normid;
33     char *device;
34     char *driver;
35     int width;
36     int height;
37     int input;
38     int outfmt;
39     float fps;
40     char **channels;
41     int noaudio;
42     int immediate;
43     int audiorate;
44     int audio_id;
45     int amode;
46     int volume;
47     int bass;
48     int treble;
49     int balance;
50     int forcechan;
51     int force_audio;
52     int buffer_size;
53     int mjpeg;
54     int decimation;
55     int quality;
56     int alsa;
57     char* adevice;
58     int brightness;
59     int contrast;
60     int hue;
61     int saturation;
62     int gain;
63     char *tdevice;  ///< teletext device
64     int tformat;    ///< teletext display format
65     int tpage;      ///< start teletext page
66     int tlang;      ///< primary language code
67
68     int scan;
69     int scan_threshold;
70     float scan_period;
71     /**
72       Terminate stream with video renderer instead of Null renderer
73       Will help if video freezes but audio does not.
74       May not work with -vo directx and -vf crop combination.
75     */
76     int hidden_video_renderer;
77     /**
78       For VIVO cards VP pin have to be rendered too.
79       This tweak will cause VidePort pin stream to be terminated with video renderer
80       instead of removing it from graph.
81       Use if your card have vp pin and video is still choppy.
82       May not work with -vo directx and -vf crop combination.
83     */
84     int hidden_vp_renderer;
85     /**
86       Use system clock as sync source instead of default graph clock (usually the clock
87       from one of live sources in graph.
88     */
89     int system_clock;
90     /**
91       Some audio cards creates audio chunks with about 0.5 sec size.
92       This can cause choppy video when using mplayer with immediatemode=0
93       Use followingtweak to decrease audio chunk sizes.
94       It will create audio chunks with time length equal to one video frame time.
95     */
96     int normalize_audio_chunks;
97 } tv_param_t;
98
99 extern tv_param_t stream_tv_defaults;
100
101 typedef struct tvi_info_s
102 {
103     struct tvi_handle_s * (*tvi_init)(tv_param_t* tv_param);
104     const char *name;
105     const char *short_name;
106     const char *author;
107     const char *comment;
108 } tvi_info_t;
109
110 typedef struct tvi_functions_s
111 {
112     int (*init)();
113     int (*uninit)();
114     int (*control)();
115     int (*start)();
116     double (*grab_video_frame)();
117     int (*get_video_framesize)();
118     double (*grab_audio_frame)();
119     int (*get_audio_framesize)();
120 } tvi_functions_t;
121
122 typedef struct tvi_handle_s {
123     const tvi_functions_t       *functions;
124     void                *priv;
125     int                 seq;
126
127     /* specific */
128     int                 norm;
129     int                 chanlist;
130     const struct CHANLIST *chanlist_s;
131     int                 channel;
132     tv_param_t          * tv_param;
133     void                * scan;
134 } tvi_handle_t;
135
136 typedef struct tv_channels_s {
137     int index;
138     char number[5];
139     char name[20];
140     int norm;
141     int   freq;
142     struct tv_channels_s *next;
143     struct tv_channels_s *prev;
144 } tv_channels_t;
145
146 extern tv_channels_t *tv_channel_list;
147 extern tv_channels_t *tv_channel_current, *tv_channel_last;
148 extern char *tv_channel_last_real;
149
150 typedef struct {
151     unsigned int     scan_timer;
152     int     channel_num;
153     int     new_channels;
154 } tv_scan_t;
155
156 #define TVI_CONTROL_FALSE               0
157 #define TVI_CONTROL_TRUE                1
158 #define TVI_CONTROL_NA                  -1
159 #define TVI_CONTROL_UNKNOWN             -2
160
161 /* ======================== CONTROLS =========================== */
162
163 /* GENERIC controls */
164 #define TVI_CONTROL_IS_AUDIO            0x1
165 #define TVI_CONTROL_IS_VIDEO            0x2
166 #define TVI_CONTROL_IS_TUNER            0x3
167 #define TVI_CONTROL_IMMEDIATE           0x4
168
169 /* VIDEO controls */
170 #define TVI_CONTROL_VID_GET_FPS         0x101
171 #define TVI_CONTROL_VID_GET_PLANES      0x102
172 #define TVI_CONTROL_VID_GET_BITS        0x103
173 #define TVI_CONTROL_VID_CHK_BITS        0x104
174 #define TVI_CONTROL_VID_SET_BITS        0x105
175 #define TVI_CONTROL_VID_GET_FORMAT      0x106
176 #define TVI_CONTROL_VID_CHK_FORMAT      0x107
177 #define TVI_CONTROL_VID_SET_FORMAT      0x108
178 #define TVI_CONTROL_VID_GET_WIDTH       0x109
179 #define TVI_CONTROL_VID_CHK_WIDTH       0x110
180 #define TVI_CONTROL_VID_SET_WIDTH       0x111
181 #define TVI_CONTROL_VID_GET_HEIGHT      0x112
182 #define TVI_CONTROL_VID_CHK_HEIGHT      0x113
183 #define TVI_CONTROL_VID_SET_HEIGHT      0x114
184 #define TVI_CONTROL_VID_GET_BRIGHTNESS  0x115
185 #define TVI_CONTROL_VID_SET_BRIGHTNESS  0x116
186 #define TVI_CONTROL_VID_GET_HUE         0x117
187 #define TVI_CONTROL_VID_SET_HUE         0x118
188 #define TVI_CONTROL_VID_GET_SATURATION  0x119
189 #define TVI_CONTROL_VID_SET_SATURATION  0x11a
190 #define TVI_CONTROL_VID_GET_CONTRAST    0x11b
191 #define TVI_CONTROL_VID_SET_CONTRAST    0x11c
192 #define TVI_CONTROL_VID_GET_PICTURE     0x11d
193 #define TVI_CONTROL_VID_SET_PICTURE     0x11e
194 #define TVI_CONTROL_VID_SET_GAIN        0x11f
195 #define TVI_CONTROL_VID_GET_GAIN        0x120
196 #define TVI_CONTROL_VID_SET_WIDTH_HEIGHT        0x121
197
198 /* TUNER controls */
199 #define TVI_CONTROL_TUN_GET_FREQ        0x201
200 #define TVI_CONTROL_TUN_SET_FREQ        0x202
201 #define TVI_CONTROL_TUN_GET_TUNER       0x203   /* update priv->tuner struct for used input */
202 #define TVI_CONTROL_TUN_SET_TUNER       0x204   /* update priv->tuner struct for used input */
203 #define TVI_CONTROL_TUN_GET_NORM        0x205
204 #define TVI_CONTROL_TUN_SET_NORM        0x206
205 #define TVI_CONTROL_TUN_GET_SIGNAL      0x207
206
207 /* AUDIO controls */
208 #define TVI_CONTROL_AUD_GET_FORMAT      0x301
209 #define TVI_CONTROL_AUD_GET_SAMPLERATE  0x302
210 #define TVI_CONTROL_AUD_GET_SAMPLESIZE  0x303
211 #define TVI_CONTROL_AUD_GET_CHANNELS    0x304
212 #define TVI_CONTROL_AUD_SET_SAMPLERATE  0x305
213
214 /* SPECIFIC controls */
215 #define TVI_CONTROL_SPC_GET_INPUT       0x401   /* set input channel (tv,s-video,composite..) */
216 #define TVI_CONTROL_SPC_SET_INPUT       0x402   /* set input channel (tv,s-video,composite..) */
217 #define TVI_CONTROL_SPC_GET_NORMID      0x403   /* get normid from norm name */
218
219 //tvi_* ioctl (not tvi_vbi.c !!!)
220 #define TVI_CONTROL_VBI_INIT           0x501   ///< vbi init
221
222 /*
223   TELETEXT controls (through teletext_control() )
224    NOTE:
225     _SET_ should be _GET_ +1
226    _STEP_ should be _GET_ +2
227 */
228 #define TV_VBI_CONTROL_GET_MODE        0x510   ///< get current mode teletext
229 #define TV_VBI_CONTROL_SET_MODE        0x511   ///< on/off grab teletext
230
231 #define TV_VBI_CONTROL_GET_PAGE        0x513   ///< get grabbed teletext page
232 #define TV_VBI_CONTROL_SET_PAGE        0x514   ///< set grab teletext page number
233 #define TV_VBI_CONTROL_STEP_PAGE       0x515   ///< step grab teletext page number
234
235 #define TV_VBI_CONTROL_GET_SUBPAGE     0x516   ///< get grabbed teletext page
236 #define TV_VBI_CONTROL_SET_SUBPAGE     0x517   ///< set grab teletext page number
237
238 #define TV_VBI_CONTROL_GET_FORMAT      0x519   ///< get teletext format
239 #define TV_VBI_CONTROL_SET_FORMAT      0x51a   ///< set teletext format
240
241 #define TV_VBI_CONTROL_GET_HALF_PAGE   0x51c   ///< get current half page
242 #define TV_VBI_CONTROL_SET_HALF_PAGE   0x51d   ///< switch half page
243
244 #define TV_VBI_CONTROL_IS_CHANGED      0x540   ///< teletext page is changed
245 #define TV_VBI_CONTROL_MARK_UNCHANGED  0x541   ///< teletext page is changed
246
247 #define TV_VBI_CONTROL_ADD_DEC         0x550   ///< add page number with dec
248 #define TV_VBI_CONTROL_GO_LINK         0x551   ///< go link (1..6) NYI
249 #define TV_VBI_CONTROL_GET_VBIPAGE     0x552   ///< get vbi_image for grabbed teletext page
250 #define TV_VBI_CONTROL_RESET           0x553   ///< vbi reset
251 #define TV_VBI_CONTROL_START           0x554   ///< vbi start
252 #define TV_VBI_CONTROL_STOP            0x555   ///< vbi stop
253 #define TV_VBI_CONTROL_DECODE_PAGE     0x556   ///< decode vbi page
254 #define TV_VBI_CONTROL_GET_NETWORKNAME 0x557   ///< get current network name
255
256 int tv_set_color_options(tvi_handle_t *tvh, int opt, int val);
257 int tv_get_color_options(tvi_handle_t *tvh, int opt, int* val);
258 #define TV_COLOR_BRIGHTNESS     1
259 #define TV_COLOR_HUE            2
260 #define TV_COLOR_SATURATION     3
261 #define TV_COLOR_CONTRAST       4
262
263 int tv_step_channel_real(tvi_handle_t *tvh, int direction);
264 int tv_step_channel(tvi_handle_t *tvh, int direction);
265 #define TV_CHANNEL_LOWER        1
266 #define TV_CHANNEL_HIGHER       2
267
268 int tv_last_channel(tvi_handle_t *tvh);
269
270 int tv_set_channel_real(tvi_handle_t *tvh, char *channel);
271 int tv_set_channel(tvi_handle_t *tvh, char *channel);
272
273 int tv_step_norm(tvi_handle_t *tvh);
274 int tv_step_chanlist(tvi_handle_t *tvh);
275
276 int tv_set_freq(tvi_handle_t *tvh, unsigned long freq);
277 int tv_get_freq(tvi_handle_t *tvh, unsigned long *freq);
278 int tv_get_signal(tvi_handle_t *tvh);
279 int tv_step_freq(tvi_handle_t *tvh, float step_interval);
280
281 int tv_set_norm(tvi_handle_t *tvh, char* norm);
282
283 void tv_start_scan(tvi_handle_t *tvh, int start);
284
285 #define TV_NORM_PAL             1
286 #define TV_NORM_NTSC            2
287 #define TV_NORM_SECAM           3
288 #define TV_NORM_PALNC           4
289 #define TV_NORM_PALM            5
290 #define TV_NORM_PALN            6
291 #define TV_NORM_NTSCJP          7
292
293 #define VBI_TFORMAT_TEXT    0               ///< text mode
294 #define VBI_TFORMAT_BW      1               ///< black&white mode
295 #define VBI_TFORMAT_GRAY    2               ///< grayscale mode
296 #define VBI_TFORMAT_COLOR   3               ///< color mode (require color_spu patch!)
297
298 #define VBI_MAX_PAGES      0x800            ///< max sub pages number
299 #define VBI_MAX_SUBPAGES   64               ///< max sub pages number
300
301 #define VBI_ROWS    25                      ///< teletext page height in rows
302 #define VBI_COLUMNS 40                      ///< teletext page width in chars
303 #define VBI_TIME_LINEPOS    26              ///< time line pos in page header
304
305 typedef
306 enum{
307     TT_FORMAT_OPAQUE=0,       ///< opaque
308     TT_FORMAT_TRANSPARENT,    ///< transparent
309     TT_FORMAT_OPAQUE_INV,     ///< opaque with inverted colors
310     TT_FORMAT_TRANSPARENT_INV ///< transparent with inverted colors
311 } teletext_format;
312
313 typedef
314 enum{
315     TT_ZOOM_NORMAL=0,
316     TT_ZOOM_TOP_HALF,
317     TT_ZOOM_BOTTOM_HALF
318 } teletext_zoom;
319
320 typedef struct tt_char_s{
321     unsigned int unicode; ///< unicode (utf8) character
322     unsigned char fg;  ///< foreground color
323     unsigned char bg;  ///< background color
324     unsigned char gfx; ///< 0-no gfx, 1-solid gfx, 2-separated gfx
325     unsigned char flh; ///< 0-no flash, 1-flash
326     unsigned char hidden; ///< char is hidden (for subtitle pages)
327     unsigned char ctl; ///< control character
328     unsigned char lng; ///< lang: 0-secondary language,1-primary language
329     unsigned char raw; ///< raw character (as received from device)
330 } tt_char;
331
332 typedef struct tt_link_s{
333     int pagenum;          ///< page number
334     int subpagenum;       ///< subpage number
335 } tt_link_t;
336
337 typedef struct tt_page_s{
338     int pagenum;          ///< page number
339     int subpagenum;       ///< subpage number
340     unsigned char primary_lang;   ///< primary language code
341     unsigned char secondary_lang; ///< secondary language code
342     unsigned char active; ///< page is complete and ready for rendering
343     unsigned char flags;  ///< page flags
344     unsigned char raw[VBI_ROWS*VBI_COLUMNS]; ///< page data
345     struct tt_page_s* next_subpage;
346     struct tt_link_s links[6];
347 }  tt_page;
348
349 #define TT_PGFL_SUPPRESS_HEADER  0x01
350 #define TT_PGFL_UPDATE_INDICATOR 0x02
351 #define TT_PGFL_INTERRUPTED_SEQ  0x04
352 #define TT_PGFL_INHIBIT_DISPLAY  0x08
353 #define TT_PGFL_NEWFLASH         0x10
354 #define TT_PGFL_SUBTITLE         0x20
355 #define TT_PGFL_ERASE_PAGE       0x40
356 #define TT_PGFL_MAGAZINE_SERIAL  0x80
357
358 typedef struct tt_stream_props_s{
359     int sampling_rate;
360     int samples_per_line;
361     int offset;
362     int count[2];     ///< number of lines in first and second fields
363     int interlaced;   ///< vbi data are interlaced
364     int bufsize;      ///< required buffer size
365 } tt_stream_props;
366
367 #endif /* MPLAYER_TV_H */