1 /* 2 * libzvbi -- Old raw VBI decoder 3 * 4 * Copyright (C) 2000, 2001, 2002 Michael H. Schimek 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Library General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Library General Public License for more details. 15 * 16 * You should have received a copy of the GNU Library General Public 17 * License along with this library; if not, write to the 18 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301 USA. 20 */ 21 22 /* $Id: decoder.h,v 1.11 2008-02-19 00:35:15 mschimek Exp $ */ 23 24 #ifndef DECODER_H 25 #define DECODER_H 26 27 #ifdef HAVE_CONFIG_H 28 # include "config.h" 29 #endif 30 31 #include "bcd.h" 32 #include "sliced.h" 33 34 /* Public */ 35 36 #include <glib.h> 37 38 /* Bit slicer */ 39 40 /** 41 * @ingroup Rawdec 42 * @brief Image format used as source to vbi_bit_slice() and vbi_raw_decode(). 43 * 44 * @htmlonly 45 <table border=1> 46 <tr><th>Symbol</th><th>Byte 0</th><th>Byte 1</th><th>Byte 2</th><th>Byte 3</th></tr> 47 <tr><td colspan=5>Planar YUV 4:2:0 data.</td></tr> 48 <tr><td>VBI_PIXFMT_YUV420</td><td colspan=4> 49 <table> 50 <tr><th>Y plane</th><th>U plane</th><th>V plane</th></tr> 51 <tr><td><table border=1> 52 <tr><td>Y00</td><td>Y01</td><td>Y02</td><td>Y03</td></tr> 53 <tr><td>Y10</td><td>Y11</td><td>Y12</td><td>Y13</td></tr> 54 <tr><td>Y20</td><td>Y21</td><td>Y22</td><td>Y23</td></tr> 55 <tr><td>Y30</td><td>Y31</td><td>Y32</td><td>Y33</td></tr> 56 </table></td> 57 <td><table border=1> 58 <tr><td>Cb00</td><td>Cb01</td></tr> 59 <tr><td>Cb10</td><td>Cb11</td></tr> 60 </table></td> 61 <td><table border=1> 62 <tr><td>Cr00</td><td>Cr01</td></tr> 63 <tr><td>Cr10</td><td>Cr11</td></tr> 64 </table></td> 65 </tr></table></td> 66 </tr> 67 <tr><td colspan=5>Packed YUV 4:2:2 data.</td></tr> 68 <tr><td>VBI_PIXFMT_YUYV</td><td>Y0</td><td>Cb</td><td>Y1</td><td>Cr</td></tr> 69 <tr><td>VBI_PIXFMT_YVYU</td><td>Y0</td><td>Cr</td><td>Y1</td><td>Cb</td></tr> 70 <tr><td>VBI_PIXFMT_UYVY</td><td>Cb</td><td>Y0</td><td>Cr</td><td>Y1</td></tr> 71 <tr><td>VBI_PIXFMT_VYUY</td><td>Cr</td><td>Y0</td><td>Cb</td><td>Y1</td></tr> 72 <tr><td colspan=5>Packed 32 bit RGB data.</td></tr> 73 <tr><td>VBI_PIXFMT_RGBA32_LE VBI_PIXFMT_ARGB32_BE</td> 74 <td>r7 ... r0</td><td>g7 ... g0</td> 75 <td>b7 ... b0</td><td>a7 ... a0</td></tr> 76 <tr><td>VBI_PIXFMT_BGRA32_LE VBI_PIXFMT_ARGB32_BE</td> 77 <td>b7 ... b0</td><td>g7 ... g0</td> 78 <td>r7 ... r0</td><td>a7 ... a0</td></tr> 79 <tr><td>VBI_PIXFMT_ARGB32_LE VBI_PIXFMT_BGRA32_BE</td> 80 <td>a7 ... a0</td><td>r7 ... r0</td> 81 <td>g7 ... g0</td><td>b7 ... b0</td></tr> 82 <tr><td>VBI_PIXFMT_ABGR32_LE VBI_PIXFMT_RGBA32_BE</td> 83 <td>a7 ... a0</td><td>b7 ... b0</td> 84 <td>g7 ... g0</td><td>r7 ... r0</td></tr> 85 <tr><td colspan=5>Packed 24 bit RGB data.</td></tr> 86 <tr><td>VBI_PIXFMT_RGBA24</td> 87 <td>r7 ... r0</td><td>g7 ... g0</td> 88 <td>b7 ... b0</td><td> </td></tr> 89 <tr><td>VBI_PIXFMT_BGRA24</td> 90 <td>b7 ... b0</td><td>g7 ... g0</td> 91 <td>r7 ... r0</td><td> </td></tr> 92 <tr><td colspan=5>Packed 16 bit RGB data.</td></tr> 93 <tr><td>VBI_PIXFMT_RGB16_LE</td> 94 <td>g2 g1 g0 r4 r3 r2 r1 r0</td> 95 <td>b4 b3 b2 b1 b0 g5 g4 g3</td> 96 <td> </td><td> </td></tr><tr><td>VBI_PIXFMT_BGR16_LE</td> 97 <td>g2 g1 g0 b4 b3 b2 b1 b0</td> 98 <td>r4 r3 r2 r1 r0 g5 g4 g3</td> 99 <td> </td><td> </td></tr><tr><td>VBI_PIXFMT_RGB16_BE</td> 100 <td>b4 b3 b2 b1 b0 g5 g4 g3</td> 101 <td>g2 g1 g0 r4 r3 r2 r1 r0</td> 102 <td> </td><td> </td></tr><tr><td>VBI_PIXFMT_BGR16_BE</td> 103 <td>r4 r3 r2 r1 r0 g5 g4 g3</td> 104 <td>g2 g1 g0 b4 b3 b2 b1 b0</td> 105 <td> </td><td> </td></tr> 106 <tr><td colspan=5>Packed 15 bit RGB data.</td></tr> 107 <tr><td>VBI_PIXFMT_RGBA15_LE</td> 108 <td>g2 g1 g0 r4 r3 r2 r1 r0</td> 109 <td>a0 b4 b3 b2 b1 b0 g4 g3</td> 110 <td> </td><td> </td></tr><tr><td>VBI_PIXFMT_BGRA15_LE</td> 111 <td>g2 g1 g0 b4 b3 b2 b1 b0</td> 112 <td>a0 r4 r3 r2 r1 r0 g4 g3</td> 113 <td> </td><td> </td></tr><tr><td>VBI_PIXFMT_ARGB15_LE</td> 114 <td>g1 g0 r4 r3 r2 r1 r0 a0</td> 115 <td>b4 b3 b2 b1 b0 g4 g3 g2</td> 116 <td> </td><td> </td></tr><tr><td>VBI_PIXFMT_ABGR15_LE</td> 117 <td>g1 g0 b4 b3 b2 b1 b0 a0</td> 118 <td>r4 r3 r2 r1 r0 g4 g3 g2</td> 119 <td> </td><td> </td></tr><tr><td>VBI_PIXFMT_RGBA15_BE</td> 120 <td>a0 b4 b3 b2 b1 b0 g4 g3</td> 121 <td>g2 g1 g0 r4 r3 r2 r1 r0</td> 122 <td> </td><td> </td></tr><tr><td>VBI_PIXFMT_BGRA15_BE</td> 123 <td>a0 r4 r3 r2 r1 r0 g4 g3</td> 124 <td>g2 g1 g0 b4 b3 b2 b1 b0</td> 125 <td> </td><td> </td></tr><tr><td>VBI_PIXFMT_ARGB15_BE</td> 126 <td>b4 b3 b2 b1 b0 g4 g3 g2</td> 127 <td>g1 g0 r4 r3 r2 r1 r0 a0</td> 128 <td> </td><td> </td></tr><tr><td>VBI_PIXFMT_ABGR15_BE</td> 129 <td>r4 r3 r2 r1 r0 g4 g3 g2</td> 130 <td>g1 g0 b4 b3 b2 b1 b0 a0</td> 131 <td> </td><td> </td></tr> 132 </table> 133 @endhtmlonly */ 134 /* Attn: keep this in sync with rte, don't change order */ 135 typedef enum { 136 VBI_PIXFMT_YUV420 = 1, 137 VBI_PIXFMT_YUYV, 138 VBI_PIXFMT_YVYU, 139 VBI_PIXFMT_UYVY, 140 VBI_PIXFMT_VYUY, 141 VBI_PIXFMT_PAL8, 142 VBI_PIXFMT_RGBA32_LE = 32, 143 VBI_PIXFMT_RGBA32_BE, 144 VBI_PIXFMT_BGRA32_LE, 145 VBI_PIXFMT_BGRA32_BE, 146 VBI_PIXFMT_ABGR32_BE = 32, /* synonyms */ 147 VBI_PIXFMT_ABGR32_LE, 148 VBI_PIXFMT_ARGB32_BE, 149 VBI_PIXFMT_ARGB32_LE, 150 VBI_PIXFMT_RGB24, 151 VBI_PIXFMT_BGR24, 152 VBI_PIXFMT_RGB16_LE, 153 VBI_PIXFMT_RGB16_BE, 154 VBI_PIXFMT_BGR16_LE, 155 VBI_PIXFMT_BGR16_BE, 156 VBI_PIXFMT_RGBA15_LE, 157 VBI_PIXFMT_RGBA15_BE, 158 VBI_PIXFMT_BGRA15_LE, 159 VBI_PIXFMT_BGRA15_BE, 160 VBI_PIXFMT_ARGB15_LE, 161 VBI_PIXFMT_ARGB15_BE, 162 VBI_PIXFMT_ABGR15_LE, 163 VBI_PIXFMT_ABGR15_BE 164 } vbi_pixfmt; 165 166 /* Private */ 167 168 typedef uint64_t vbi_pixfmt_set; 169 170 #define VBI_MAX_PIXFMTS 64 171 #define VBI_PIXFMT_SET(pixfmt) (((vbi_pixfmt_set) 1) << (pixfmt)) 172 #define VBI_PIXFMT_SET_YUV (VBI_PIXFMT_SET (VBI_PIXFMT_YUV420) | \ 173 VBI_PIXFMT_SET (VBI_PIXFMT_YUYV) | \ 174 VBI_PIXFMT_SET (VBI_PIXFMT_YVYU) | \ 175 VBI_PIXFMT_SET (VBI_PIXFMT_UYVY) | \ 176 VBI_PIXFMT_SET (VBI_PIXFMT_VYUY)) 177 #define VBI_PIXFMT_SET_RGB (VBI_PIXFMT_SET (VBI_PIXFMT_RGBA32_LE) | \ 178 VBI_PIXFMT_SET (VBI_PIXFMT_RGBA32_BE) | \ 179 VBI_PIXFMT_SET (VBI_PIXFMT_BGRA32_LE) | \ 180 VBI_PIXFMT_SET (VBI_PIXFMT_BGRA32_BE) | \ 181 VBI_PIXFMT_SET (VBI_PIXFMT_RGB24) | \ 182 VBI_PIXFMT_SET (VBI_PIXFMT_BGR24) | \ 183 VBI_PIXFMT_SET (VBI_PIXFMT_RGB16_LE) | \ 184 VBI_PIXFMT_SET (VBI_PIXFMT_RGB16_BE) | \ 185 VBI_PIXFMT_SET (VBI_PIXFMT_BGR16_LE) | \ 186 VBI_PIXFMT_SET (VBI_PIXFMT_BGR16_BE) | \ 187 VBI_PIXFMT_SET (VBI_PIXFMT_RGBA15_LE) | \ 188 VBI_PIXFMT_SET (VBI_PIXFMT_RGBA15_BE) | \ 189 VBI_PIXFMT_SET (VBI_PIXFMT_BGRA15_LE) | \ 190 VBI_PIXFMT_SET (VBI_PIXFMT_BGRA15_BE) | \ 191 VBI_PIXFMT_SET (VBI_PIXFMT_ARGB15_LE) | \ 192 VBI_PIXFMT_SET (VBI_PIXFMT_ARGB15_BE) | \ 193 VBI_PIXFMT_SET (VBI_PIXFMT_ABGR15_LE) | \ 194 VBI_PIXFMT_SET (VBI_PIXFMT_ABGR15_BE)) 195 #define VBI_PIXFMT_SET_ALL (VBI_PIXFMT_SET_YUV | \ 196 VBI_PIXFMT_SET_RGB) 197 198 #define VBI_PIXFMT_BPP(fmt) \ 199 (((fmt) == VBI_PIXFMT_YUV420) ? 1 : \ 200 (((fmt) >= VBI_PIXFMT_RGBA32_LE \ 201 && (fmt) <= VBI_PIXFMT_BGRA32_BE) ? 4 : \ 202 (((fmt) == VBI_PIXFMT_RGB24 \ 203 || (fmt) == VBI_PIXFMT_BGR24) ? 3 : 2))) 204 205 /* Public */ 206 207 /** 208 * @ingroup Rawdec 209 * @brief Modulation used for VBI data transmission. 210 */ 211 typedef enum { 212 /** 213 * The data is 'non-return to zero' coded, logical '1' bits 214 * are described by high sample values, logical '0' bits by 215 * low values. The data is last significant bit first transmitted. 216 */ 217 VBI_MODULATION_NRZ_LSB, 218 /** 219 * 'Non-return to zero' coded, most significant bit first 220 * transmitted. 221 */ 222 VBI_MODULATION_NRZ_MSB, 223 /** 224 * The data is 'bi-phase' coded. Each data bit is described 225 * by two complementary signalling elements, a logical '1' 226 * by a sequence of '10' elements, a logical '0' by a '01' 227 * sequence. The data is last significant bit first transmitted. 228 */ 229 VBI_MODULATION_BIPHASE_LSB, 230 /** 231 * 'Bi-phase' coded, most significant bit first transmitted. 232 */ 233 VBI_MODULATION_BIPHASE_MSB 234 } vbi_modulation; 235 236 #if 0 237 /** 238 * @ingroup Rawdec 239 * @brief Bit slicer context. 240 * 241 * The contents of this structure are private, 242 * use vbi_bit_slicer_init() to initialize. 243 */ 244 typedef struct vbi_bit_slicer { 245 vbi_bool (* func)(struct vbi_bit_slicer *slicer, 246 uint8_t *raw, uint8_t *buf); 247 unsigned int cri; 248 unsigned int cri_mask; 249 int thresh; 250 int cri_bytes; 251 int cri_rate; 252 int oversampling_rate; 253 int phase_shift; 254 int step; 255 unsigned int frc; 256 int frc_bits; 257 int payload; 258 int endian; 259 int skip; 260 } vbi_bit_slicer; 261 262 /** 263 * @addtogroup Rawdec 264 * @{ 265 */ 266 extern void vbi_bit_slicer_init(vbi_bit_slicer *slicer, 267 int raw_samples, int sampling_rate, 268 int cri_rate, int bit_rate, 269 unsigned int cri_frc, unsigned int cri_mask, 270 int cri_bits, int frc_bits, int payload, 271 vbi_modulation modulation, vbi_pixfmt fmt); 272 /** 273 * @param slicer Pointer to initialized vbi_bit_slicer object. 274 * @param raw Input data. At least the number of pixels or samples 275 * given as @a raw_samples to vbi_bit_slicer_init(). 276 * @param buf Output data. The buffer must be large enough to store 277 * the number of bits given as @a payload to vbi_bit_slicer_init(). 278 * 279 * Decode one scan line of raw vbi data. Note the bit slicer tries 280 * to adapt to the average signal amplitude, you should avoid 281 * using the same vbi_bit_slicer object for data from different 282 * devices. 283 * 284 * @note As a matter of speed this function does not lock the 285 * @a slicer. When you want to share a vbi_bit_slicer object between 286 * multiple threads you must implement your own locking mechanism. 287 * 288 * @return 289 * @c FALSE if the raw data does not contain the expected 290 * information, i. e. the CRI/FRC has not been found. This may also 291 * result from a too weak or noisy signal. Error correction must be 292 * implemented at a higher layer. 293 */ 294 _vbi_inline vbi_bool 295 vbi_bit_slice(vbi_bit_slicer *slicer, uint8_t *raw, uint8_t *buf) 296 { 297 return slicer->func(slicer, raw, buf); 298 } 299 /** @} */ 300 #endif 301 /** 302 * @ingroup Rawdec 303 * @brief Raw vbi decoder context. 304 * 305 * Only the sampling parameters are public. See 306 * vbi_raw_decoder_parameters() and vbi_raw_decoder_add_services() 307 * for usage. 308 */ 309 typedef struct vbi_raw_decoder { 310 /* Sampling parameters */ 311 312 /** 313 * Either 525 (M/NTSC, M/PAL) or 625 (PAL, SECAM), describing the 314 * scan line system all line numbers refer to. 315 */ 316 int scanning; 317 /** 318 * Format of the raw vbi data. 319 */ 320 vbi_pixfmt sampling_format; 321 /** 322 * Sampling rate in Hz, the number of samples or pixels 323 * captured per second. 324 */ 325 int sampling_rate; /* Hz */ 326 /** 327 * Number of samples or pixels captured per scan line, 328 * in bytes. This determines the raw vbi image width and you 329 * want it large enough to cover all data transmitted in the line (with 330 * headroom). 331 */ 332 int bytes_per_line; 333 /** 334 * The distance from 0H (leading edge hsync, half amplitude point) 335 * to the first sample (pixel) captured, in samples (pixels). You want 336 * an offset small enough not to miss the start of the data 337 * transmitted. 338 */ 339 int offset; /* 0H, samples */ 340 /** 341 * First scan line to be captured, first and second field 342 * respectively, according to the ITU-R line numbering scheme 343 * (see vbi_sliced). Set to zero if the exact line number isn't 344 * known. 345 */ 346 int start[2]; /* ITU-R numbering */ 347 /** 348 * Number of scan lines captured, first and second 349 * field respectively. This can be zero if only data from one 350 * field is required. The sum @a count[0] + @a count[1] determines the 351 * raw vbi image height. 352 */ 353 int count[2]; /* field lines */ 354 /** 355 * In the raw vbi image, normally all lines of the second 356 * field are supposed to follow all lines of the first field. When 357 * this flag is set, the scan lines of first and second field 358 * will be interleaved in memory. This implies @a count[0] and @a count[1] 359 * are equal. 360 */ 361 vbi_bool interlaced; 362 /** 363 * Fields must be stored in temporal order, i. e. as the 364 * lines have been captured. It is assumed that the first field is 365 * also stored first in memory, however if the hardware cannot reliable 366 * distinguish fields this flag shall be cleared, which disables 367 * decoding of data services depending on the field number. 368 */ 369 vbi_bool synchronous; 370 371 /*< private >*/ 372 373 GMutex mutex; 374 375 unsigned int services; 376 #if 0 /* DISABLED LEGACY DECODER */ 377 int num_jobs; 378 #endif 379 380 int8_t * pattern; /* The real vbi3_raw_decoder */ 381 #if 0 /* DISABLED LEGACY DECODER */ 382 struct _vbi_raw_decoder_job { 383 unsigned int id; 384 int offset; 385 vbi_bit_slicer slicer; 386 } jobs[8]; 387 #endif 388 } vbi_raw_decoder; 389 390 /** 391 * @addtogroup Rawdec 392 * @{ 393 */ 394 extern void vbi_raw_decoder_init(vbi_raw_decoder *rd); 395 extern void vbi_raw_decoder_reset(vbi_raw_decoder *rd); 396 extern void vbi_raw_decoder_destroy(vbi_raw_decoder *rd); 397 extern unsigned int vbi_raw_decoder_add_services(vbi_raw_decoder *rd, 398 unsigned int services, 399 int strict); 400 extern unsigned int vbi_raw_decoder_check_services(vbi_raw_decoder *rd, 401 unsigned int services, int strict); 402 extern unsigned int vbi_raw_decoder_remove_services(vbi_raw_decoder *rd, 403 unsigned int services); 404 extern void vbi_raw_decoder_resize( vbi_raw_decoder *rd, 405 int * start, unsigned int * count ); 406 extern unsigned int vbi_raw_decoder_parameters(vbi_raw_decoder *rd, unsigned int services, 407 int scanning, int *max_rate); 408 extern int vbi_raw_decode(vbi_raw_decoder *rd, uint8_t *raw, vbi_sliced *out); 409 410 void vbi_initialize_gst_debug (void); 411 /** @} */ 412 413 /* Private */ 414 415 #endif /* DECODER_H */ 416 417 /* 418 Local variables: 419 c-set-style: K&R 420 c-basic-offset: 8 421 End: 422 */ 423