1 /*
2  *  libzvbi -- Bit slicer
3  *
4  *  Copyright (C) 2000-2007 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: bit_slicer.h,v 1.11 2008-02-24 14:18:13 mschimek Exp $ */
23 
24 #ifndef __ZVBI_BIT_SLICER_H__
25 #define __ZVBI_BIT_SLICER_H__
26 
27 #include "sampling_par.h"
28 
29 VBI_BEGIN_DECLS
30 
31 /**
32  * @addtogroup BitSlicer
33  * @{
34  */
35 
36 /**
37  * @brief Modulation used for VBI data transmission.
38  */
39 typedef enum {
40 	/**
41 	 * The data is 'non-return to zero' coded, logical '1' bits
42 	 * are described by high sample values, logical '0' bits by
43 	 * low values. The data is last significant bit first transmitted.
44 	 */
45 	VBI3_MODULATION_NRZ_LSB,
46 
47 	/**
48 	 * 'Non-return to zero' coded, most significant bit first
49 	 * transmitted.
50 	 */
51 	VBI3_MODULATION_NRZ_MSB,
52 
53 	/**
54 	 * The data is 'bi-phase' coded. Each data bit is described
55 	 * by two complementary signalling elements, a logical '1'
56 	 * by a sequence of '10' elements, a logical '0' by a '01'
57 	 * sequence. The data is last significant bit first transmitted.
58 	 */
59 	VBI3_MODULATION_BIPHASE_LSB,
60 
61 	/** 'Bi-phase' coded, most significant bit first transmitted. */
62 	VBI3_MODULATION_BIPHASE_MSB
63 } vbi3_modulation;
64 
65 /**
66  * @brief Bit slicer context.
67  *
68  * The contents of this structure are private.
69  * Call vbi3_bit_slicer_new() to allocate a bit slicer context.
70  */
71 typedef struct _vbi3_bit_slicer vbi3_bit_slicer;
72 
73 typedef enum {
74 	VBI3_CRI_BIT = 1,
75 	VBI3_FRC_BIT,
76 	VBI3_PAYLOAD_BIT
77 } vbi3_bit_slicer_bit;
78 
79 /**
80  * @brief Bit slicer sampling point.
81  *
82  * This structure contains information about
83  * a bit sampled by the bit slicer.
84  */
85 typedef struct {
86 	/** Whether this struct refers to a CRI, FRC or payload bit. */
87 	vbi3_bit_slicer_bit	kind;
88 
89 	/** Number of the sample times 256. */
90 	unsigned int		index;
91 
92 	/** Signal amplitude at this sample, in range 0 to 65535. */
93 	unsigned int		level;
94 
95 	/** 0/1 threshold at this sample, in range 0 to 65535. */
96 	unsigned int		thresh;
97 } vbi3_bit_slicer_point;
98 
99 extern vbi_bool
100 vbi3_bit_slicer_slice_with_points
101 				(vbi3_bit_slicer *	bs,
102 				 uint8_t *		buffer,
103 				 unsigned int		buffer_size,
104 				 vbi3_bit_slicer_point *points,
105 				 unsigned int *		n_points,
106 				 unsigned int		max_points,
107 				 const uint8_t *	raw)
108   _vbi_nonnull ((1, 2, 4, 5, 7));
109 extern vbi_bool
110 vbi3_bit_slicer_slice		(vbi3_bit_slicer *	bs,
111 				 uint8_t *		buffer,
112 				 unsigned int		buffer_size,
113 				 const uint8_t *	raw)
114   _vbi_nonnull ((1, 2, 4));
115 extern vbi_bool
116 vbi3_bit_slicer_set_params	(vbi3_bit_slicer *	bs,
117 				 vbi_pixfmt		sample_format,
118 				 unsigned int		sampling_rate,
119 				 unsigned int		sample_offset,
120 				 unsigned int		samples_per_line,
121 				 unsigned int		cri,
122 				 unsigned int		cri_mask,
123 				 unsigned int		cri_bits,
124 				 unsigned int		cri_rate,
125 				 unsigned int		cri_end,
126 				 unsigned int		frc,
127 				 unsigned int		frc_bits,
128 				 unsigned int		payload_bits,
129 				 unsigned int		payload_rate,
130 				 vbi3_modulation	modulation)
131   _vbi_nonnull ((1));
132 extern void
133 vbi3_bit_slicer_set_log_fn	(vbi3_bit_slicer *	bs,
134 				 vbi_log_mask		mask,
135 				 vbi_log_fn *		log_fn,
136 				 void *			user_data)
137   _vbi_nonnull ((1));
138 extern void
139 vbi3_bit_slicer_delete		(vbi3_bit_slicer *	bs);
140 extern vbi3_bit_slicer *
141 vbi3_bit_slicer_new		(void)
142   _vbi_alloc;
143 
144 /* Private */
145 
146 typedef vbi_bool
147 _vbi3_bit_slicer_fn		(vbi3_bit_slicer *	bs,
148 				 uint8_t *		buffer,
149 				 vbi3_bit_slicer_point *points,
150 				 unsigned int *		n_points,
151 				 const uint8_t *	raw);
152 
153 /** @internal */
154 struct _vbi3_bit_slicer {
155 	_vbi3_bit_slicer_fn *	func;
156 
157 	vbi_pixfmt		sample_format;
158 	unsigned int		cri;
159 	unsigned int		cri_mask;
160 	unsigned int		thresh;
161 	unsigned int		thresh_frac;
162 	unsigned int		cri_samples;
163 	unsigned int		cri_rate;
164 	unsigned int		oversampling_rate;
165 	unsigned int		phase_shift;
166 	unsigned int		step;
167 	unsigned int		frc;
168 	unsigned int		frc_bits;
169 	unsigned int		total_bits;
170 	unsigned int		payload;
171 	unsigned int		endian;
172 	unsigned int		bytes_per_sample;
173 	unsigned int		skip;
174 	unsigned int		green_mask;
175 
176 	_vbi_log_hook		log;
177 };
178 
179 extern void
180 _vbi3_bit_slicer_destroy	(vbi3_bit_slicer *	bs)
181   _vbi_nonnull ((1));
182 extern vbi_bool
183 _vbi3_bit_slicer_init		(vbi3_bit_slicer *	bs)
184   _vbi_nonnull ((1));
185 
186 /** @} */
187 
188 VBI_END_DECLS
189 
190 #endif /* __ZVBI_BIT_SLICER_H__ */
191 
192 /*
193 Local variables:
194 c-set-style: K&R
195 c-basic-offset: 8
196 End:
197 */
198