Update
This commit is contained in:
@@ -0,0 +1,422 @@
|
||||
/*
|
||||
* libzvbi -- Old raw VBI decoder
|
||||
*
|
||||
* Copyright (C) 2000, 2001, 2002 Michael H. Schimek
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
/* $Id: decoder.h,v 1.11 2008-02-19 00:35:15 mschimek Exp $ */
|
||||
|
||||
#ifndef DECODER_H
|
||||
#define DECODER_H
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include "bcd.h"
|
||||
#include "sliced.h"
|
||||
|
||||
/* Public */
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
/* Bit slicer */
|
||||
|
||||
/**
|
||||
* @ingroup Rawdec
|
||||
* @brief Image format used as source to vbi_bit_slice() and vbi_raw_decode().
|
||||
*
|
||||
* @htmlonly
|
||||
<table border=1>
|
||||
<tr><th>Symbol</th><th>Byte 0</th><th>Byte 1</th><th>Byte 2</th><th>Byte 3</th></tr>
|
||||
<tr><td colspan=5>Planar YUV 4:2:0 data.</td></tr>
|
||||
<tr><td>VBI_PIXFMT_YUV420</td><td colspan=4>
|
||||
<table>
|
||||
<tr><th>Y plane</th><th>U plane</th><th>V plane</th></tr>
|
||||
<tr><td><table border=1>
|
||||
<tr><td>Y00</td><td>Y01</td><td>Y02</td><td>Y03</td></tr>
|
||||
<tr><td>Y10</td><td>Y11</td><td>Y12</td><td>Y13</td></tr>
|
||||
<tr><td>Y20</td><td>Y21</td><td>Y22</td><td>Y23</td></tr>
|
||||
<tr><td>Y30</td><td>Y31</td><td>Y32</td><td>Y33</td></tr>
|
||||
</table></td>
|
||||
<td><table border=1>
|
||||
<tr><td>Cb00</td><td>Cb01</td></tr>
|
||||
<tr><td>Cb10</td><td>Cb11</td></tr>
|
||||
</table></td>
|
||||
<td><table border=1>
|
||||
<tr><td>Cr00</td><td>Cr01</td></tr>
|
||||
<tr><td>Cr10</td><td>Cr11</td></tr>
|
||||
</table></td>
|
||||
</tr></table></td>
|
||||
</tr>
|
||||
<tr><td colspan=5>Packed YUV 4:2:2 data.</td></tr>
|
||||
<tr><td>VBI_PIXFMT_YUYV</td><td>Y0</td><td>Cb</td><td>Y1</td><td>Cr</td></tr>
|
||||
<tr><td>VBI_PIXFMT_YVYU</td><td>Y0</td><td>Cr</td><td>Y1</td><td>Cb</td></tr>
|
||||
<tr><td>VBI_PIXFMT_UYVY</td><td>Cb</td><td>Y0</td><td>Cr</td><td>Y1</td></tr>
|
||||
<tr><td>VBI_PIXFMT_VYUY</td><td>Cr</td><td>Y0</td><td>Cb</td><td>Y1</td></tr>
|
||||
<tr><td colspan=5>Packed 32 bit RGB data.</td></tr>
|
||||
<tr><td>VBI_PIXFMT_RGBA32_LE VBI_PIXFMT_ARGB32_BE</td>
|
||||
<td>r7 ... r0</td><td>g7 ... g0</td>
|
||||
<td>b7 ... b0</td><td>a7 ... a0</td></tr>
|
||||
<tr><td>VBI_PIXFMT_BGRA32_LE VBI_PIXFMT_ARGB32_BE</td>
|
||||
<td>b7 ... b0</td><td>g7 ... g0</td>
|
||||
<td>r7 ... r0</td><td>a7 ... a0</td></tr>
|
||||
<tr><td>VBI_PIXFMT_ARGB32_LE VBI_PIXFMT_BGRA32_BE</td>
|
||||
<td>a7 ... a0</td><td>r7 ... r0</td>
|
||||
<td>g7 ... g0</td><td>b7 ... b0</td></tr>
|
||||
<tr><td>VBI_PIXFMT_ABGR32_LE VBI_PIXFMT_RGBA32_BE</td>
|
||||
<td>a7 ... a0</td><td>b7 ... b0</td>
|
||||
<td>g7 ... g0</td><td>r7 ... r0</td></tr>
|
||||
<tr><td colspan=5>Packed 24 bit RGB data.</td></tr>
|
||||
<tr><td>VBI_PIXFMT_RGBA24</td>
|
||||
<td>r7 ... r0</td><td>g7 ... g0</td>
|
||||
<td>b7 ... b0</td><td> </td></tr>
|
||||
<tr><td>VBI_PIXFMT_BGRA24</td>
|
||||
<td>b7 ... b0</td><td>g7 ... g0</td>
|
||||
<td>r7 ... r0</td><td> </td></tr>
|
||||
<tr><td colspan=5>Packed 16 bit RGB data.</td></tr>
|
||||
<tr><td>VBI_PIXFMT_RGB16_LE</td>
|
||||
<td>g2 g1 g0 r4 r3 r2 r1 r0</td>
|
||||
<td>b4 b3 b2 b1 b0 g5 g4 g3</td>
|
||||
<td> </td><td> </td></tr><tr><td>VBI_PIXFMT_BGR16_LE</td>
|
||||
<td>g2 g1 g0 b4 b3 b2 b1 b0</td>
|
||||
<td>r4 r3 r2 r1 r0 g5 g4 g3</td>
|
||||
<td> </td><td> </td></tr><tr><td>VBI_PIXFMT_RGB16_BE</td>
|
||||
<td>b4 b3 b2 b1 b0 g5 g4 g3</td>
|
||||
<td>g2 g1 g0 r4 r3 r2 r1 r0</td>
|
||||
<td> </td><td> </td></tr><tr><td>VBI_PIXFMT_BGR16_BE</td>
|
||||
<td>r4 r3 r2 r1 r0 g5 g4 g3</td>
|
||||
<td>g2 g1 g0 b4 b3 b2 b1 b0</td>
|
||||
<td> </td><td> </td></tr>
|
||||
<tr><td colspan=5>Packed 15 bit RGB data.</td></tr>
|
||||
<tr><td>VBI_PIXFMT_RGBA15_LE</td>
|
||||
<td>g2 g1 g0 r4 r3 r2 r1 r0</td>
|
||||
<td>a0 b4 b3 b2 b1 b0 g4 g3</td>
|
||||
<td> </td><td> </td></tr><tr><td>VBI_PIXFMT_BGRA15_LE</td>
|
||||
<td>g2 g1 g0 b4 b3 b2 b1 b0</td>
|
||||
<td>a0 r4 r3 r2 r1 r0 g4 g3</td>
|
||||
<td> </td><td> </td></tr><tr><td>VBI_PIXFMT_ARGB15_LE</td>
|
||||
<td>g1 g0 r4 r3 r2 r1 r0 a0</td>
|
||||
<td>b4 b3 b2 b1 b0 g4 g3 g2</td>
|
||||
<td> </td><td> </td></tr><tr><td>VBI_PIXFMT_ABGR15_LE</td>
|
||||
<td>g1 g0 b4 b3 b2 b1 b0 a0</td>
|
||||
<td>r4 r3 r2 r1 r0 g4 g3 g2</td>
|
||||
<td> </td><td> </td></tr><tr><td>VBI_PIXFMT_RGBA15_BE</td>
|
||||
<td>a0 b4 b3 b2 b1 b0 g4 g3</td>
|
||||
<td>g2 g1 g0 r4 r3 r2 r1 r0</td>
|
||||
<td> </td><td> </td></tr><tr><td>VBI_PIXFMT_BGRA15_BE</td>
|
||||
<td>a0 r4 r3 r2 r1 r0 g4 g3</td>
|
||||
<td>g2 g1 g0 b4 b3 b2 b1 b0</td>
|
||||
<td> </td><td> </td></tr><tr><td>VBI_PIXFMT_ARGB15_BE</td>
|
||||
<td>b4 b3 b2 b1 b0 g4 g3 g2</td>
|
||||
<td>g1 g0 r4 r3 r2 r1 r0 a0</td>
|
||||
<td> </td><td> </td></tr><tr><td>VBI_PIXFMT_ABGR15_BE</td>
|
||||
<td>r4 r3 r2 r1 r0 g4 g3 g2</td>
|
||||
<td>g1 g0 b4 b3 b2 b1 b0 a0</td>
|
||||
<td> </td><td> </td></tr>
|
||||
</table>
|
||||
@endhtmlonly */
|
||||
/* Attn: keep this in sync with rte, don't change order */
|
||||
typedef enum {
|
||||
VBI_PIXFMT_YUV420 = 1,
|
||||
VBI_PIXFMT_YUYV,
|
||||
VBI_PIXFMT_YVYU,
|
||||
VBI_PIXFMT_UYVY,
|
||||
VBI_PIXFMT_VYUY,
|
||||
VBI_PIXFMT_PAL8,
|
||||
VBI_PIXFMT_RGBA32_LE = 32,
|
||||
VBI_PIXFMT_RGBA32_BE,
|
||||
VBI_PIXFMT_BGRA32_LE,
|
||||
VBI_PIXFMT_BGRA32_BE,
|
||||
VBI_PIXFMT_ABGR32_BE = 32, /* synonyms */
|
||||
VBI_PIXFMT_ABGR32_LE,
|
||||
VBI_PIXFMT_ARGB32_BE,
|
||||
VBI_PIXFMT_ARGB32_LE,
|
||||
VBI_PIXFMT_RGB24,
|
||||
VBI_PIXFMT_BGR24,
|
||||
VBI_PIXFMT_RGB16_LE,
|
||||
VBI_PIXFMT_RGB16_BE,
|
||||
VBI_PIXFMT_BGR16_LE,
|
||||
VBI_PIXFMT_BGR16_BE,
|
||||
VBI_PIXFMT_RGBA15_LE,
|
||||
VBI_PIXFMT_RGBA15_BE,
|
||||
VBI_PIXFMT_BGRA15_LE,
|
||||
VBI_PIXFMT_BGRA15_BE,
|
||||
VBI_PIXFMT_ARGB15_LE,
|
||||
VBI_PIXFMT_ARGB15_BE,
|
||||
VBI_PIXFMT_ABGR15_LE,
|
||||
VBI_PIXFMT_ABGR15_BE
|
||||
} vbi_pixfmt;
|
||||
|
||||
/* Private */
|
||||
|
||||
typedef uint64_t vbi_pixfmt_set;
|
||||
|
||||
#define VBI_MAX_PIXFMTS 64
|
||||
#define VBI_PIXFMT_SET(pixfmt) (((vbi_pixfmt_set) 1) << (pixfmt))
|
||||
#define VBI_PIXFMT_SET_YUV (VBI_PIXFMT_SET (VBI_PIXFMT_YUV420) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_YUYV) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_YVYU) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_UYVY) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_VYUY))
|
||||
#define VBI_PIXFMT_SET_RGB (VBI_PIXFMT_SET (VBI_PIXFMT_RGBA32_LE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_RGBA32_BE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_BGRA32_LE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_BGRA32_BE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_RGB24) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_BGR24) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_RGB16_LE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_RGB16_BE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_BGR16_LE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_BGR16_BE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_RGBA15_LE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_RGBA15_BE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_BGRA15_LE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_BGRA15_BE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_ARGB15_LE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_ARGB15_BE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_ABGR15_LE) | \
|
||||
VBI_PIXFMT_SET (VBI_PIXFMT_ABGR15_BE))
|
||||
#define VBI_PIXFMT_SET_ALL (VBI_PIXFMT_SET_YUV | \
|
||||
VBI_PIXFMT_SET_RGB)
|
||||
|
||||
#define VBI_PIXFMT_BPP(fmt) \
|
||||
(((fmt) == VBI_PIXFMT_YUV420) ? 1 : \
|
||||
(((fmt) >= VBI_PIXFMT_RGBA32_LE \
|
||||
&& (fmt) <= VBI_PIXFMT_BGRA32_BE) ? 4 : \
|
||||
(((fmt) == VBI_PIXFMT_RGB24 \
|
||||
|| (fmt) == VBI_PIXFMT_BGR24) ? 3 : 2)))
|
||||
|
||||
/* Public */
|
||||
|
||||
/**
|
||||
* @ingroup Rawdec
|
||||
* @brief Modulation used for VBI data transmission.
|
||||
*/
|
||||
typedef enum {
|
||||
/**
|
||||
* The data is 'non-return to zero' coded, logical '1' bits
|
||||
* are described by high sample values, logical '0' bits by
|
||||
* low values. The data is last significant bit first transmitted.
|
||||
*/
|
||||
VBI_MODULATION_NRZ_LSB,
|
||||
/**
|
||||
* 'Non-return to zero' coded, most significant bit first
|
||||
* transmitted.
|
||||
*/
|
||||
VBI_MODULATION_NRZ_MSB,
|
||||
/**
|
||||
* The data is 'bi-phase' coded. Each data bit is described
|
||||
* by two complementary signalling elements, a logical '1'
|
||||
* by a sequence of '10' elements, a logical '0' by a '01'
|
||||
* sequence. The data is last significant bit first transmitted.
|
||||
*/
|
||||
VBI_MODULATION_BIPHASE_LSB,
|
||||
/**
|
||||
* 'Bi-phase' coded, most significant bit first transmitted.
|
||||
*/
|
||||
VBI_MODULATION_BIPHASE_MSB
|
||||
} vbi_modulation;
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* @ingroup Rawdec
|
||||
* @brief Bit slicer context.
|
||||
*
|
||||
* The contents of this structure are private,
|
||||
* use vbi_bit_slicer_init() to initialize.
|
||||
*/
|
||||
typedef struct vbi_bit_slicer {
|
||||
vbi_bool (* func)(struct vbi_bit_slicer *slicer,
|
||||
uint8_t *raw, uint8_t *buf);
|
||||
unsigned int cri;
|
||||
unsigned int cri_mask;
|
||||
int thresh;
|
||||
int cri_bytes;
|
||||
int cri_rate;
|
||||
int oversampling_rate;
|
||||
int phase_shift;
|
||||
int step;
|
||||
unsigned int frc;
|
||||
int frc_bits;
|
||||
int payload;
|
||||
int endian;
|
||||
int skip;
|
||||
} vbi_bit_slicer;
|
||||
|
||||
/**
|
||||
* @addtogroup Rawdec
|
||||
* @{
|
||||
*/
|
||||
extern void vbi_bit_slicer_init(vbi_bit_slicer *slicer,
|
||||
int raw_samples, int sampling_rate,
|
||||
int cri_rate, int bit_rate,
|
||||
unsigned int cri_frc, unsigned int cri_mask,
|
||||
int cri_bits, int frc_bits, int payload,
|
||||
vbi_modulation modulation, vbi_pixfmt fmt);
|
||||
/**
|
||||
* @param slicer Pointer to initialized vbi_bit_slicer object.
|
||||
* @param raw Input data. At least the number of pixels or samples
|
||||
* given as @a raw_samples to vbi_bit_slicer_init().
|
||||
* @param buf Output data. The buffer must be large enough to store
|
||||
* the number of bits given as @a payload to vbi_bit_slicer_init().
|
||||
*
|
||||
* Decode one scan line of raw vbi data. Note the bit slicer tries
|
||||
* to adapt to the average signal amplitude, you should avoid
|
||||
* using the same vbi_bit_slicer object for data from different
|
||||
* devices.
|
||||
*
|
||||
* @note As a matter of speed this function does not lock the
|
||||
* @a slicer. When you want to share a vbi_bit_slicer object between
|
||||
* multiple threads you must implement your own locking mechanism.
|
||||
*
|
||||
* @return
|
||||
* @c FALSE if the raw data does not contain the expected
|
||||
* information, i. e. the CRI/FRC has not been found. This may also
|
||||
* result from a too weak or noisy signal. Error correction must be
|
||||
* implemented at a higher layer.
|
||||
*/
|
||||
_vbi_inline vbi_bool
|
||||
vbi_bit_slice(vbi_bit_slicer *slicer, uint8_t *raw, uint8_t *buf)
|
||||
{
|
||||
return slicer->func(slicer, raw, buf);
|
||||
}
|
||||
/** @} */
|
||||
#endif
|
||||
/**
|
||||
* @ingroup Rawdec
|
||||
* @brief Raw vbi decoder context.
|
||||
*
|
||||
* Only the sampling parameters are public. See
|
||||
* vbi_raw_decoder_parameters() and vbi_raw_decoder_add_services()
|
||||
* for usage.
|
||||
*/
|
||||
typedef struct vbi_raw_decoder {
|
||||
/* Sampling parameters */
|
||||
|
||||
/**
|
||||
* Either 525 (M/NTSC, M/PAL) or 625 (PAL, SECAM), describing the
|
||||
* scan line system all line numbers refer to.
|
||||
*/
|
||||
int scanning;
|
||||
/**
|
||||
* Format of the raw vbi data.
|
||||
*/
|
||||
vbi_pixfmt sampling_format;
|
||||
/**
|
||||
* Sampling rate in Hz, the number of samples or pixels
|
||||
* captured per second.
|
||||
*/
|
||||
int sampling_rate; /* Hz */
|
||||
/**
|
||||
* Number of samples or pixels captured per scan line,
|
||||
* in bytes. This determines the raw vbi image width and you
|
||||
* want it large enough to cover all data transmitted in the line (with
|
||||
* headroom).
|
||||
*/
|
||||
int bytes_per_line;
|
||||
/**
|
||||
* The distance from 0H (leading edge hsync, half amplitude point)
|
||||
* to the first sample (pixel) captured, in samples (pixels). You want
|
||||
* an offset small enough not to miss the start of the data
|
||||
* transmitted.
|
||||
*/
|
||||
int offset; /* 0H, samples */
|
||||
/**
|
||||
* First scan line to be captured, first and second field
|
||||
* respectively, according to the ITU-R line numbering scheme
|
||||
* (see vbi_sliced). Set to zero if the exact line number isn't
|
||||
* known.
|
||||
*/
|
||||
int start[2]; /* ITU-R numbering */
|
||||
/**
|
||||
* Number of scan lines captured, first and second
|
||||
* field respectively. This can be zero if only data from one
|
||||
* field is required. The sum @a count[0] + @a count[1] determines the
|
||||
* raw vbi image height.
|
||||
*/
|
||||
int count[2]; /* field lines */
|
||||
/**
|
||||
* In the raw vbi image, normally all lines of the second
|
||||
* field are supposed to follow all lines of the first field. When
|
||||
* this flag is set, the scan lines of first and second field
|
||||
* will be interleaved in memory. This implies @a count[0] and @a count[1]
|
||||
* are equal.
|
||||
*/
|
||||
vbi_bool interlaced;
|
||||
/**
|
||||
* Fields must be stored in temporal order, i. e. as the
|
||||
* lines have been captured. It is assumed that the first field is
|
||||
* also stored first in memory, however if the hardware cannot reliable
|
||||
* distinguish fields this flag shall be cleared, which disables
|
||||
* decoding of data services depending on the field number.
|
||||
*/
|
||||
vbi_bool synchronous;
|
||||
|
||||
/*< private >*/
|
||||
|
||||
GMutex mutex;
|
||||
|
||||
unsigned int services;
|
||||
#if 0 /* DISABLED LEGACY DECODER */
|
||||
int num_jobs;
|
||||
#endif
|
||||
|
||||
int8_t * pattern; /* The real vbi3_raw_decoder */
|
||||
#if 0 /* DISABLED LEGACY DECODER */
|
||||
struct _vbi_raw_decoder_job {
|
||||
unsigned int id;
|
||||
int offset;
|
||||
vbi_bit_slicer slicer;
|
||||
} jobs[8];
|
||||
#endif
|
||||
} vbi_raw_decoder;
|
||||
|
||||
/**
|
||||
* @addtogroup Rawdec
|
||||
* @{
|
||||
*/
|
||||
extern void vbi_raw_decoder_init(vbi_raw_decoder *rd);
|
||||
extern void vbi_raw_decoder_reset(vbi_raw_decoder *rd);
|
||||
extern void vbi_raw_decoder_destroy(vbi_raw_decoder *rd);
|
||||
extern unsigned int vbi_raw_decoder_add_services(vbi_raw_decoder *rd,
|
||||
unsigned int services,
|
||||
int strict);
|
||||
extern unsigned int vbi_raw_decoder_check_services(vbi_raw_decoder *rd,
|
||||
unsigned int services, int strict);
|
||||
extern unsigned int vbi_raw_decoder_remove_services(vbi_raw_decoder *rd,
|
||||
unsigned int services);
|
||||
extern void vbi_raw_decoder_resize( vbi_raw_decoder *rd,
|
||||
int * start, unsigned int * count );
|
||||
extern unsigned int vbi_raw_decoder_parameters(vbi_raw_decoder *rd, unsigned int services,
|
||||
int scanning, int *max_rate);
|
||||
extern int vbi_raw_decode(vbi_raw_decoder *rd, uint8_t *raw, vbi_sliced *out);
|
||||
|
||||
void vbi_initialize_gst_debug (void);
|
||||
/** @} */
|
||||
|
||||
/* Private */
|
||||
|
||||
#endif /* DECODER_H */
|
||||
|
||||
/*
|
||||
Local variables:
|
||||
c-set-style: K&R
|
||||
c-basic-offset: 8
|
||||
End:
|
||||
*/
|
||||
Reference in New Issue
Block a user