2 * Constants for DV codec
3 * Copyright (c) 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * Constants for DV codec.
27 #ifndef AVCODEC_DVDATA_H
28 #define AVCODEC_DVDATA_H
30 #include "libavutil/rational.h"
33 typedef struct DVwork_chunk {
35 uint16_t mb_coordinates[5];
39 * DVprofile is used to express the differences between various
40 * DV flavors. For now it's primarily used for differentiating
41 * 525/60 and 625/50, but the plans are to use it for various
42 * DV specs as well (e.g. SMPTE314M vs. IEC 61834).
44 typedef struct DVprofile {
45 int dsf; /* value of the dsf in the DV header */
46 int video_stype; /* stype for VAUX source pack */
47 int frame_size; /* total size of one frame in bytes */
48 int difseg_size; /* number of DIF segments per DIF channel */
49 int n_difchan; /* number of DIF channels per frame */
50 AVRational time_base; /* 1/framerate */
51 int ltc_divisor; /* FPS from the LTS standpoint */
52 int height; /* picture height in pixels */
53 int width; /* picture width in pixels */
54 AVRational sar[2]; /* sample aspect ratios for 4:3 and 16:9 */
55 DVwork_chunk *work_chunks; /* each thread gets its own chunk of frame to work on */
56 uint32_t *idct_factor; /* set of iDCT factor tables */
57 enum PixelFormat pix_fmt; /* picture pixel format */
58 int bpm; /* blocks per macroblock */
59 const uint8_t *block_sizes; /* AC block sizes, in bits */
60 int audio_stride; /* size of audio_shuffle table */
61 int audio_min_samples[3]; /* min amount of audio samples */
62 /* for 48kHz, 44.1kHz and 32kHz */
63 int audio_samples_dist[5]; /* how many samples are supposed to be */
64 /* in each frame in a 5 frames window */
65 const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */
68 /* unquant tables (not used directly) */
69 static const uint8_t dv_quant_shifts[22][4] = {
94 static const uint8_t dv_quant_offset[4] = { 6, 3, 0, 1 };
95 static const uint8_t dv_quant_areas[4] = { 6, 21, 43, 64 };
97 /* quantization quanta by QNO for DV100 */
98 static const uint8_t dv100_qstep[16] = {
99 1, /* QNO = 0 and 1 both have no quantization */
101 2, 3, 4, 5, 6, 7, 8, 16, 18, 20, 22, 24, 28, 52
104 /* DV25/50 DCT coefficient weights and inverse weights */
105 /* created by dvtables.py */
106 static const int dv_weight_bits = 18;
107 static const int dv_weight_88[64] = {
108 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
109 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
110 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
111 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
112 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
113 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
114 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
115 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
117 static const int dv_weight_248[64] = {
118 131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754,
119 224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536,
120 211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568,
121 242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965,
122 200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627,
123 229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965,
124 175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364,
125 195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651,
127 static const int dv_iweight_bits = 14;
128 static const int dv_iweight_88[64] = {
129 32768, 16710, 16710, 17735, 17015, 17735, 18197, 18079,
130 18079, 18197, 18725, 18559, 19196, 18559, 18725, 19284,
131 19108, 19692, 19692, 19108, 19284, 21400, 19645, 20262,
132 20214, 20262, 19645, 21400, 22733, 21845, 20867, 20815,
133 20815, 20867, 21845, 22733, 23173, 23173, 21400, 21400,
134 21400, 23173, 23173, 24600, 23764, 22017, 22017, 23764,
135 24600, 25267, 24457, 22672, 24457, 25267, 25971, 25191,
136 25191, 25971, 26715, 27962, 26715, 29642, 29642, 31536,
138 static const int dv_iweight_248[64] = {
139 32768, 17735, 16710, 18079, 18725, 21400, 17735, 19196,
140 19108, 21845, 16384, 17735, 18725, 21400, 16710, 18079,
141 20262, 23173, 18197, 19692, 18725, 20262, 20815, 23764,
142 17735, 19196, 19108, 21845, 20262, 23173, 18197, 19692,
143 21400, 24457, 19284, 20867, 21400, 23173, 22017, 25191,
144 18725, 20262, 20815, 23764, 21400, 24457, 19284, 20867,
145 24457, 27962, 22733, 24600, 25971, 29642, 21400, 23173,
146 22017, 25191, 24457, 27962, 22733, 24600, 25971, 29642,
150 * The "inverse" DV100 weights are actually just the spec weights (zig-zagged).
152 static const int dv_iweight_1080_y[64] = {
153 128, 16, 16, 17, 17, 17, 18, 18,
154 18, 18, 18, 18, 19, 18, 18, 19,
155 19, 19, 19, 19, 19, 42, 38, 40,
156 40, 40, 38, 42, 44, 43, 41, 41,
157 41, 41, 43, 44, 45, 45, 42, 42,
158 42, 45, 45, 48, 46, 43, 43, 46,
159 48, 49, 48, 44, 48, 49, 101, 98,
160 98, 101, 104, 109, 104, 116, 116, 123,
162 static const int dv_iweight_1080_c[64] = {
163 128, 16, 16, 17, 17, 17, 25, 25,
164 25, 25, 26, 25, 26, 25, 26, 26,
165 26, 27, 27, 26, 26, 42, 38, 40,
166 40, 40, 38, 42, 44, 43, 41, 41,
167 41, 41, 43, 44, 91, 91, 84, 84,
168 84, 91, 91, 96, 93, 86, 86, 93,
169 96, 197, 191, 177, 191, 197, 203, 197,
170 197, 203, 209, 219, 209, 232, 232, 246,
172 static const int dv_iweight_720_y[64] = {
173 128, 16, 16, 17, 17, 17, 18, 18,
174 18, 18, 18, 18, 19, 18, 18, 19,
175 19, 19, 19, 19, 19, 42, 38, 40,
176 40, 40, 38, 42, 44, 43, 41, 41,
177 41, 41, 43, 44, 68, 68, 63, 63,
178 63, 68, 68, 96, 92, 86, 86, 92,
179 96, 98, 96, 88, 96, 98, 202, 196,
180 196, 202, 208, 218, 208, 232, 232, 246,
182 static const int dv_iweight_720_c[64] = {
183 128, 24, 24, 26, 26, 26, 36, 36,
184 36, 36, 36, 36, 38, 36, 36, 38,
185 38, 38, 38, 38, 38, 84, 76, 80,
186 80, 80, 76, 84, 88, 86, 82, 82,
187 82, 82, 86, 88, 182, 182, 168, 168,
188 168, 182, 182, 192, 186, 192, 172, 186,
189 192, 394, 382, 354, 382, 394, 406, 394,
190 394, 406, 418, 438, 418, 464, 464, 492,
193 static const uint8_t dv_audio_shuffle525[10][9] = {
194 { 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */
195 { 6, 36, 66, 26, 56, 86, 16, 46, 76 },
196 { 12, 42, 72, 2, 32, 62, 22, 52, 82 },
197 { 18, 48, 78, 8, 38, 68, 28, 58, 88 },
198 { 24, 54, 84, 14, 44, 74, 4, 34, 64 },
200 { 1, 31, 61, 21, 51, 81, 11, 41, 71 }, /* 2nd channel */
201 { 7, 37, 67, 27, 57, 87, 17, 47, 77 },
202 { 13, 43, 73, 3, 33, 63, 23, 53, 83 },
203 { 19, 49, 79, 9, 39, 69, 29, 59, 89 },
204 { 25, 55, 85, 15, 45, 75, 5, 35, 65 },
207 static const uint8_t dv_audio_shuffle625[12][9] = {
208 { 0, 36, 72, 26, 62, 98, 16, 52, 88}, /* 1st channel */
209 { 6, 42, 78, 32, 68, 104, 22, 58, 94},
210 { 12, 48, 84, 2, 38, 74, 28, 64, 100},
211 { 18, 54, 90, 8, 44, 80, 34, 70, 106},
212 { 24, 60, 96, 14, 50, 86, 4, 40, 76},
213 { 30, 66, 102, 20, 56, 92, 10, 46, 82},
215 { 1, 37, 73, 27, 63, 99, 17, 53, 89}, /* 2nd channel */
216 { 7, 43, 79, 33, 69, 105, 23, 59, 95},
217 { 13, 49, 85, 3, 39, 75, 29, 65, 101},
218 { 19, 55, 91, 9, 45, 81, 35, 71, 107},
219 { 25, 61, 97, 15, 51, 87, 5, 41, 77},
220 { 31, 67, 103, 21, 57, 93, 11, 47, 83},
223 static const av_unused int dv_audio_frequency[3] = {
227 /* macroblock bit budgets */
228 static const uint8_t block_sizes_dv2550[8] = {
229 112, 112, 112, 112, 80, 80, 0, 0,
232 static const uint8_t block_sizes_dv100[8] = {
233 80, 80, 80, 80, 80, 80, 64, 64,
236 enum dv_section_type {
237 dv_sect_header = 0x1f,
238 dv_sect_subcode = 0x3f,
240 dv_sect_audio = 0x76,
241 dv_sect_video = 0x96,
245 dv_header525 = 0x3f, /* see dv_write_pack for important details on */
246 dv_header625 = 0xbf, /* these two packs */
248 dv_audio_source = 0x50,
249 dv_audio_control = 0x51,
250 dv_audio_recdate = 0x52,
251 dv_audio_rectime = 0x53,
252 dv_video_source = 0x60,
253 dv_video_control = 0x61,
254 dv_video_recdate = 0x62,
255 dv_video_rectime = 0x63,
256 dv_unknown_pack = 0xff,
259 #define DV_PROFILE_IS_HD(p) ((p)->video_stype & 0x10)
260 #define DV_PROFILE_IS_1080i50(p) (((p)->video_stype == 0x14) && ((p)->dsf == 1))
261 #define DV_PROFILE_IS_720p50(p) (((p)->video_stype == 0x18) && ((p)->dsf == 1))
263 /* minimum number of bytes to read from a DV stream in order to
264 determine the profile */
265 #define DV_PROFILE_BYTES (6*80) /* 6 DIF blocks */
268 * largest possible DV frame, in bytes (1080i50)
270 #define DV_MAX_FRAME_SIZE 576000
273 * maximum number of blocks per macroblock in any DV format
277 const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys,
278 const uint8_t* frame, unsigned buf_size);
279 const DVprofile* avpriv_dv_frame_profile2(AVCodecContext* codec, const DVprofile *sys,
280 const uint8_t* frame, unsigned buf_size);
281 const DVprofile* avpriv_dv_codec_profile(AVCodecContext* codec);
283 static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
284 uint8_t seq_num, uint8_t dif_num,
287 buf[0] = (uint8_t)t; /* Section type */
288 buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
289 (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
290 7; /* reserved -- always 1 */
291 buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
296 static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
298 if (syb_num == 0 || syb_num == 6) {
299 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
300 (0 << 4) | /* AP3 (Subcode application ID) */
301 0x0f; /* reserved -- always 1 */
303 else if (syb_num == 11) {
304 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
305 0x7f; /* reserved -- always 1 */
308 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
309 (0 << 4) | /* APT (Track application ID) */
310 0x0f; /* reserved -- always 1 */
312 buf[1] = 0xf0 | /* reserved -- always 1 */
313 (syb_num & 0x0f); /* SSYB number 0 - 11 */
314 buf[2] = 0xff; /* reserved -- always 1 */
318 #endif /* AVCODEC_DVDATA_H */