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 enum PixelFormat pix_fmt; /* picture pixel format */
57 int bpm; /* blocks per macroblock */
58 const uint8_t *block_sizes; /* AC block sizes, in bits */
59 int audio_stride; /* size of audio_shuffle table */
60 int audio_min_samples[3]; /* min amount of audio samples */
61 /* for 48kHz, 44.1kHz and 32kHz */
62 int audio_samples_dist[5]; /* how many samples are supposed to be */
63 /* in each frame in a 5 frames window */
64 const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */
70 * There's a catch about the following three tables: the mapping they establish
71 * between (run, level) and vlc is not 1-1. So you have to watch out for that
72 * when building misc. tables. E.g. (1, 0) can be either 0x7cf or 0x1f82.
74 static const uint16_t dv_vlc_bits[409] = {
75 0x0000, 0x0002, 0x0007, 0x0008, 0x0009, 0x0014, 0x0015, 0x0016,
76 0x0017, 0x0030, 0x0031, 0x0032, 0x0033, 0x0068, 0x0069, 0x006a,
77 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x00e0, 0x00e1, 0x00e2,
78 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea,
79 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x01e0, 0x01e1, 0x01e2,
80 0x01e3, 0x01e4, 0x01e5, 0x01e6, 0x01e7, 0x01e8, 0x01e9, 0x01ea,
81 0x01eb, 0x01ec, 0x01ed, 0x01ee, 0x01ef, 0x03e0, 0x03e1, 0x03e2,
82 0x03e3, 0x03e4, 0x03e5, 0x03e6, 0x07ce, 0x07cf, 0x07d0, 0x07d1,
83 0x07d2, 0x07d3, 0x07d4, 0x07d5, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
84 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
85 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
86 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87,
87 0x1f88, 0x1f89, 0x1f8a, 0x1f8b, 0x1f8c, 0x1f8d, 0x1f8e, 0x1f8f,
88 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97,
89 0x1f98, 0x1f99, 0x1f9a, 0x1f9b, 0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f,
90 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7,
91 0x1fa8, 0x1fa9, 0x1faa, 0x1fab, 0x1fac, 0x1fad, 0x1fae, 0x1faf,
92 0x1fb0, 0x1fb1, 0x1fb2, 0x1fb3, 0x1fb4, 0x1fb5, 0x1fb6, 0x1fb7,
93 0x1fb8, 0x1fb9, 0x1fba, 0x1fbb, 0x1fbc, 0x1fbd, 0x1fbe, 0x1fbf,
94 0x7f00, 0x7f01, 0x7f02, 0x7f03, 0x7f04, 0x7f05, 0x7f06, 0x7f07,
95 0x7f08, 0x7f09, 0x7f0a, 0x7f0b, 0x7f0c, 0x7f0d, 0x7f0e, 0x7f0f,
96 0x7f10, 0x7f11, 0x7f12, 0x7f13, 0x7f14, 0x7f15, 0x7f16, 0x7f17,
97 0x7f18, 0x7f19, 0x7f1a, 0x7f1b, 0x7f1c, 0x7f1d, 0x7f1e, 0x7f1f,
98 0x7f20, 0x7f21, 0x7f22, 0x7f23, 0x7f24, 0x7f25, 0x7f26, 0x7f27,
99 0x7f28, 0x7f29, 0x7f2a, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2e, 0x7f2f,
100 0x7f30, 0x7f31, 0x7f32, 0x7f33, 0x7f34, 0x7f35, 0x7f36, 0x7f37,
101 0x7f38, 0x7f39, 0x7f3a, 0x7f3b, 0x7f3c, 0x7f3d, 0x7f3e, 0x7f3f,
102 0x7f40, 0x7f41, 0x7f42, 0x7f43, 0x7f44, 0x7f45, 0x7f46, 0x7f47,
103 0x7f48, 0x7f49, 0x7f4a, 0x7f4b, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f4f,
104 0x7f50, 0x7f51, 0x7f52, 0x7f53, 0x7f54, 0x7f55, 0x7f56, 0x7f57,
105 0x7f58, 0x7f59, 0x7f5a, 0x7f5b, 0x7f5c, 0x7f5d, 0x7f5e, 0x7f5f,
106 0x7f60, 0x7f61, 0x7f62, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f67,
107 0x7f68, 0x7f69, 0x7f6a, 0x7f6b, 0x7f6c, 0x7f6d, 0x7f6e, 0x7f6f,
108 0x7f70, 0x7f71, 0x7f72, 0x7f73, 0x7f74, 0x7f75, 0x7f76, 0x7f77,
109 0x7f78, 0x7f79, 0x7f7a, 0x7f7b, 0x7f7c, 0x7f7d, 0x7f7e, 0x7f7f,
110 0x7f80, 0x7f81, 0x7f82, 0x7f83, 0x7f84, 0x7f85, 0x7f86, 0x7f87,
111 0x7f88, 0x7f89, 0x7f8a, 0x7f8b, 0x7f8c, 0x7f8d, 0x7f8e, 0x7f8f,
112 0x7f90, 0x7f91, 0x7f92, 0x7f93, 0x7f94, 0x7f95, 0x7f96, 0x7f97,
113 0x7f98, 0x7f99, 0x7f9a, 0x7f9b, 0x7f9c, 0x7f9d, 0x7f9e, 0x7f9f,
114 0x7fa0, 0x7fa1, 0x7fa2, 0x7fa3, 0x7fa4, 0x7fa5, 0x7fa6, 0x7fa7,
115 0x7fa8, 0x7fa9, 0x7faa, 0x7fab, 0x7fac, 0x7fad, 0x7fae, 0x7faf,
116 0x7fb0, 0x7fb1, 0x7fb2, 0x7fb3, 0x7fb4, 0x7fb5, 0x7fb6, 0x7fb7,
117 0x7fb8, 0x7fb9, 0x7fba, 0x7fbb, 0x7fbc, 0x7fbd, 0x7fbe, 0x7fbf,
118 0x7fc0, 0x7fc1, 0x7fc2, 0x7fc3, 0x7fc4, 0x7fc5, 0x7fc6, 0x7fc7,
119 0x7fc8, 0x7fc9, 0x7fca, 0x7fcb, 0x7fcc, 0x7fcd, 0x7fce, 0x7fcf,
120 0x7fd0, 0x7fd1, 0x7fd2, 0x7fd3, 0x7fd4, 0x7fd5, 0x7fd6, 0x7fd7,
121 0x7fd8, 0x7fd9, 0x7fda, 0x7fdb, 0x7fdc, 0x7fdd, 0x7fde, 0x7fdf,
122 0x7fe0, 0x7fe1, 0x7fe2, 0x7fe3, 0x7fe4, 0x7fe5, 0x7fe6, 0x7fe7,
123 0x7fe8, 0x7fe9, 0x7fea, 0x7feb, 0x7fec, 0x7fed, 0x7fee, 0x7fef,
124 0x7ff0, 0x7ff1, 0x7ff2, 0x7ff3, 0x7ff4, 0x7ff5, 0x7ff6, 0x7ff7,
125 0x7ff8, 0x7ff9, 0x7ffa, 0x7ffb, 0x7ffc, 0x7ffd, 0x7ffe, 0x7fff,
129 static const uint8_t dv_vlc_len[409] = {
130 2, 3, 4, 4, 4, 5, 5, 5,
131 5, 6, 6, 6, 6, 7, 7, 7,
132 7, 7, 7, 7, 7, 8, 8, 8,
133 8, 8, 8, 8, 8, 8, 8, 8,
134 8, 8, 8, 8, 8, 9, 9, 9,
135 9, 9, 9, 9, 9, 9, 9, 9,
136 9, 9, 9, 9, 9, 10, 10, 10,
137 10, 10, 10, 10, 11, 11, 11, 11,
138 11, 11, 11, 11, 12, 12, 12, 12,
139 12, 12, 12, 12, 12, 12, 12, 12,
140 12, 12, 12, 12, 12, 12, 12, 12,
141 13, 13, 13, 13, 13, 13, 13, 13,
142 13, 13, 13, 13, 13, 13, 13, 13,
143 13, 13, 13, 13, 13, 13, 13, 13,
144 13, 13, 13, 13, 13, 13, 13, 13,
145 13, 13, 13, 13, 13, 13, 13, 13,
146 13, 13, 13, 13, 13, 13, 13, 13,
147 13, 13, 13, 13, 13, 13, 13, 13,
148 13, 13, 13, 13, 13, 13, 13, 13,
149 15, 15, 15, 15, 15, 15, 15, 15,
150 15, 15, 15, 15, 15, 15, 15, 15,
151 15, 15, 15, 15, 15, 15, 15, 15,
152 15, 15, 15, 15, 15, 15, 15, 15,
153 15, 15, 15, 15, 15, 15, 15, 15,
154 15, 15, 15, 15, 15, 15, 15, 15,
155 15, 15, 15, 15, 15, 15, 15, 15,
156 15, 15, 15, 15, 15, 15, 15, 15,
157 15, 15, 15, 15, 15, 15, 15, 15,
158 15, 15, 15, 15, 15, 15, 15, 15,
159 15, 15, 15, 15, 15, 15, 15, 15,
160 15, 15, 15, 15, 15, 15, 15, 15,
161 15, 15, 15, 15, 15, 15, 15, 15,
162 15, 15, 15, 15, 15, 15, 15, 15,
163 15, 15, 15, 15, 15, 15, 15, 15,
164 15, 15, 15, 15, 15, 15, 15, 15,
165 15, 15, 15, 15, 15, 15, 15, 15,
166 15, 15, 15, 15, 15, 15, 15, 15,
167 15, 15, 15, 15, 15, 15, 15, 15,
168 15, 15, 15, 15, 15, 15, 15, 15,
169 15, 15, 15, 15, 15, 15, 15, 15,
170 15, 15, 15, 15, 15, 15, 15, 15,
171 15, 15, 15, 15, 15, 15, 15, 15,
172 15, 15, 15, 15, 15, 15, 15, 15,
173 15, 15, 15, 15, 15, 15, 15, 15,
174 15, 15, 15, 15, 15, 15, 15, 15,
175 15, 15, 15, 15, 15, 15, 15, 15,
176 15, 15, 15, 15, 15, 15, 15, 15,
177 15, 15, 15, 15, 15, 15, 15, 15,
178 15, 15, 15, 15, 15, 15, 15, 15,
179 15, 15, 15, 15, 15, 15, 15, 15,
180 15, 15, 15, 15, 15, 15, 15, 15,
184 static const uint8_t dv_vlc_run[409] = {
185 0, 0, 1, 0, 0, 2, 1, 0,
186 0, 3, 4, 0, 0, 5, 6, 2,
187 1, 1, 0, 0, 0, 7, 8, 9,
188 10, 3, 4, 2, 1, 1, 1, 0,
189 0, 0, 0, 0, 0, 11, 12, 13,
190 14, 5, 6, 3, 4, 2, 2, 1,
191 0, 0, 0, 0, 0, 5, 3, 3,
192 2, 1, 1, 1, 0, 1, 6, 4,
193 3, 1, 1, 1, 2, 3, 4, 5,
194 7, 8, 9, 10, 7, 8, 4, 3,
195 2, 2, 2, 2, 2, 1, 1, 1,
196 0, 1, 2, 3, 4, 5, 6, 7,
197 8, 9, 10, 11, 12, 13, 14, 15,
198 16, 17, 18, 19, 20, 21, 22, 23,
199 24, 25, 26, 27, 28, 29, 30, 31,
200 32, 33, 34, 35, 36, 37, 38, 39,
201 40, 41, 42, 43, 44, 45, 46, 47,
202 48, 49, 50, 51, 52, 53, 54, 55,
203 56, 57, 58, 59, 60, 61, 62, 63,
204 0, 0, 0, 0, 0, 0, 0, 0,
205 0, 0, 0, 0, 0, 0, 0, 0,
206 0, 0, 0, 0, 0, 0, 0, 0,
207 0, 0, 0, 0, 0, 0, 0, 0,
208 0, 0, 0, 0, 0, 0, 0, 0,
209 0, 0, 0, 0, 0, 0, 0, 0,
210 0, 0, 0, 0, 0, 0, 0, 0,
211 0, 0, 0, 0, 0, 0, 0, 0,
212 0, 0, 0, 0, 0, 0, 0, 0,
213 0, 0, 0, 0, 0, 0, 0, 0,
214 0, 0, 0, 0, 0, 0, 0, 0,
215 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 0, 0, 0, 0, 0, 0, 0,
217 0, 0, 0, 0, 0, 0, 0, 0,
218 0, 0, 0, 0, 0, 0, 0, 0,
219 0, 0, 0, 0, 0, 0, 0, 0,
220 0, 0, 0, 0, 0, 0, 0, 0,
221 0, 0, 0, 0, 0, 0, 0, 0,
222 0, 0, 0, 0, 0, 0, 0, 0,
223 0, 0, 0, 0, 0, 0, 0, 0,
224 0, 0, 0, 0, 0, 0, 0, 0,
225 0, 0, 0, 0, 0, 0, 0, 0,
226 0, 0, 0, 0, 0, 0, 0, 0,
227 0, 0, 0, 0, 0, 0, 0, 0,
228 0, 0, 0, 0, 0, 0, 0, 0,
229 0, 0, 0, 0, 0, 0, 0, 0,
230 0, 0, 0, 0, 0, 0, 0, 0,
231 0, 0, 0, 0, 0, 0, 0, 0,
232 0, 0, 0, 0, 0, 0, 0, 0,
233 0, 0, 0, 0, 0, 0, 0, 0,
234 0, 0, 0, 0, 0, 0, 0, 0,
235 0, 0, 0, 0, 0, 0, 0, 0,
239 static const uint8_t dv_vlc_level[409] = {
240 1, 2, 1, 3, 4, 1, 2, 5,
241 6, 1, 1, 7, 8, 1, 1, 2,
242 3, 4, 9, 10, 11, 1, 1, 1,
243 1, 2, 2, 3, 5, 6, 7, 12,
244 13, 14, 15, 16, 17, 1, 1, 1,
245 1, 2, 2, 3, 3, 4, 5, 8,
246 18, 19, 20, 21, 22, 3, 4, 5,
247 6, 9, 10, 11, 0, 0, 3, 4,
248 6, 12, 13, 14, 0, 0, 0, 0,
249 2, 2, 2, 2, 3, 3, 5, 7,
250 7, 8, 9, 10, 11, 15, 16, 17,
251 0, 0, 0, 0, 0, 0, 0, 0,
252 0, 0, 0, 0, 0, 0, 0, 0,
253 0, 0, 0, 0, 0, 0, 0, 0,
254 0, 0, 0, 0, 0, 0, 0, 0,
255 0, 0, 0, 0, 0, 0, 0, 0,
256 0, 0, 0, 0, 0, 0, 0, 0,
257 0, 0, 0, 0, 0, 0, 0, 0,
258 0, 0, 0, 0, 0, 0, 0, 0,
259 0, 1, 2, 3, 4, 5, 6, 7,
260 8, 9, 10, 11, 12, 13, 14, 15,
261 16, 17, 18, 19, 20, 21, 22, 23,
262 24, 25, 26, 27, 28, 29, 30, 31,
263 32, 33, 34, 35, 36, 37, 38, 39,
264 40, 41, 42, 43, 44, 45, 46, 47,
265 48, 49, 50, 51, 52, 53, 54, 55,
266 56, 57, 58, 59, 60, 61, 62, 63,
267 64, 65, 66, 67, 68, 69, 70, 71,
268 72, 73, 74, 75, 76, 77, 78, 79,
269 80, 81, 82, 83, 84, 85, 86, 87,
270 88, 89, 90, 91, 92, 93, 94, 95,
271 96, 97, 98, 99, 100, 101, 102, 103,
272 104, 105, 106, 107, 108, 109, 110, 111,
273 112, 113, 114, 115, 116, 117, 118, 119,
274 120, 121, 122, 123, 124, 125, 126, 127,
275 128, 129, 130, 131, 132, 133, 134, 135,
276 136, 137, 138, 139, 140, 141, 142, 143,
277 144, 145, 146, 147, 148, 149, 150, 151,
278 152, 153, 154, 155, 156, 157, 158, 159,
279 160, 161, 162, 163, 164, 165, 166, 167,
280 168, 169, 170, 171, 172, 173, 174, 175,
281 176, 177, 178, 179, 180, 181, 182, 183,
282 184, 185, 186, 187, 188, 189, 190, 191,
283 192, 193, 194, 195, 196, 197, 198, 199,
284 200, 201, 202, 203, 204, 205, 206, 207,
285 208, 209, 210, 211, 212, 213, 214, 215,
286 216, 217, 218, 219, 220, 221, 222, 223,
287 224, 225, 226, 227, 228, 229, 230, 231,
288 232, 233, 234, 235, 236, 237, 238, 239,
289 240, 241, 242, 243, 244, 245, 246, 247,
290 248, 249, 250, 251, 252, 253, 254, 255,
294 /* unquant tables (not used directly) */
295 static const uint8_t dv_quant_shifts[22][4] = {
320 static const uint8_t dv_quant_offset[4] = { 6, 3, 0, 1 };
321 static const uint8_t dv_quant_areas[4] = { 6, 21, 43, 64 };
323 /* quantization quanta by QNO for DV100 */
324 static const uint8_t dv100_qstep[16] = {
325 1, /* QNO = 0 and 1 both have no quantization */
327 2, 3, 4, 5, 6, 7, 8, 16, 18, 20, 22, 24, 28, 52
330 /* DV25/50 DCT coefficient weights and inverse weights */
331 /* created by dvtables.py */
332 static const int dv_weight_bits = 18;
333 static const int dv_weight_88[64] = {
334 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
335 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
336 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
337 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
338 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
339 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
340 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
341 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
343 static const int dv_weight_248[64] = {
344 131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754,
345 224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536,
346 211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568,
347 242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965,
348 200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627,
349 229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965,
350 175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364,
351 195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651,
353 static const int dv_iweight_bits = 14;
354 static const int dv_iweight_88[64] = {
355 32768, 16710, 16710, 17735, 17015, 17735, 18197, 18079,
356 18079, 18197, 18725, 18559, 19196, 18559, 18725, 19284,
357 19108, 19692, 19692, 19108, 19284, 21400, 19645, 20262,
358 20214, 20262, 19645, 21400, 22733, 21845, 20867, 20815,
359 20815, 20867, 21845, 22733, 23173, 23173, 21400, 21400,
360 21400, 23173, 23173, 24600, 23764, 22017, 22017, 23764,
361 24600, 25267, 24457, 22672, 24457, 25267, 25971, 25191,
362 25191, 25971, 26715, 27962, 26715, 29642, 29642, 31536,
364 static const int dv_iweight_248[64] = {
365 32768, 17735, 16710, 18079, 18725, 21400, 17735, 19196,
366 19108, 21845, 16384, 17735, 18725, 21400, 16710, 18079,
367 20262, 23173, 18197, 19692, 18725, 20262, 20815, 23764,
368 17735, 19196, 19108, 21845, 20262, 23173, 18197, 19692,
369 21400, 24457, 19284, 20867, 21400, 23173, 22017, 25191,
370 18725, 20262, 20815, 23764, 21400, 24457, 19284, 20867,
371 24457, 27962, 22733, 24600, 25971, 29642, 21400, 23173,
372 22017, 25191, 24457, 27962, 22733, 24600, 25971, 29642,
376 * The "inverse" DV100 weights are actually just the spec weights (zig-zagged).
378 static const int dv_iweight_1080_y[64] = {
379 128, 16, 16, 17, 17, 17, 18, 18,
380 18, 18, 18, 18, 19, 18, 18, 19,
381 19, 19, 19, 19, 19, 42, 38, 40,
382 40, 40, 38, 42, 44, 43, 41, 41,
383 41, 41, 43, 44, 45, 45, 42, 42,
384 42, 45, 45, 48, 46, 43, 43, 46,
385 48, 49, 48, 44, 48, 49, 101, 98,
386 98, 101, 104, 109, 104, 116, 116, 123,
388 static const int dv_iweight_1080_c[64] = {
389 128, 16, 16, 17, 17, 17, 25, 25,
390 25, 25, 26, 25, 26, 25, 26, 26,
391 26, 27, 27, 26, 26, 42, 38, 40,
392 40, 40, 38, 42, 44, 43, 41, 41,
393 41, 41, 43, 44, 91, 91, 84, 84,
394 84, 91, 91, 96, 93, 86, 86, 93,
395 96, 197, 191, 177, 191, 197, 203, 197,
396 197, 203, 209, 219, 209, 232, 232, 246,
398 static const int dv_iweight_720_y[64] = {
399 128, 16, 16, 17, 17, 17, 18, 18,
400 18, 18, 18, 18, 19, 18, 18, 19,
401 19, 19, 19, 19, 19, 42, 38, 40,
402 40, 40, 38, 42, 44, 43, 41, 41,
403 41, 41, 43, 44, 68, 68, 63, 63,
404 63, 68, 68, 96, 92, 86, 86, 92,
405 96, 98, 96, 88, 96, 98, 202, 196,
406 196, 202, 208, 218, 208, 232, 232, 246,
408 static const int dv_iweight_720_c[64] = {
409 128, 24, 24, 26, 26, 26, 36, 36,
410 36, 36, 36, 36, 38, 36, 36, 38,
411 38, 38, 38, 38, 38, 84, 76, 80,
412 80, 80, 76, 84, 88, 86, 82, 82,
413 82, 82, 86, 88, 182, 182, 168, 168,
414 168, 182, 182, 192, 186, 192, 172, 186,
415 192, 394, 382, 354, 382, 394, 406, 394,
416 394, 406, 418, 438, 418, 464, 464, 492,
419 static const uint8_t dv_audio_shuffle525[10][9] = {
420 { 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */
421 { 6, 36, 66, 26, 56, 86, 16, 46, 76 },
422 { 12, 42, 72, 2, 32, 62, 22, 52, 82 },
423 { 18, 48, 78, 8, 38, 68, 28, 58, 88 },
424 { 24, 54, 84, 14, 44, 74, 4, 34, 64 },
426 { 1, 31, 61, 21, 51, 81, 11, 41, 71 }, /* 2nd channel */
427 { 7, 37, 67, 27, 57, 87, 17, 47, 77 },
428 { 13, 43, 73, 3, 33, 63, 23, 53, 83 },
429 { 19, 49, 79, 9, 39, 69, 29, 59, 89 },
430 { 25, 55, 85, 15, 45, 75, 5, 35, 65 },
433 static const uint8_t dv_audio_shuffle625[12][9] = {
434 { 0, 36, 72, 26, 62, 98, 16, 52, 88}, /* 1st channel */
435 { 6, 42, 78, 32, 68, 104, 22, 58, 94},
436 { 12, 48, 84, 2, 38, 74, 28, 64, 100},
437 { 18, 54, 90, 8, 44, 80, 34, 70, 106},
438 { 24, 60, 96, 14, 50, 86, 4, 40, 76},
439 { 30, 66, 102, 20, 56, 92, 10, 46, 82},
441 { 1, 37, 73, 27, 63, 99, 17, 53, 89}, /* 2nd channel */
442 { 7, 43, 79, 33, 69, 105, 23, 59, 95},
443 { 13, 49, 85, 3, 39, 75, 29, 65, 101},
444 { 19, 55, 91, 9, 45, 81, 35, 71, 107},
445 { 25, 61, 97, 15, 51, 87, 5, 41, 77},
446 { 31, 67, 103, 21, 57, 93, 11, 47, 83},
449 static const av_unused int dv_audio_frequency[3] = {
453 /* macroblock bit budgets */
454 static const uint8_t block_sizes_dv2550[8] = {
455 112, 112, 112, 112, 80, 80, 0, 0,
458 static const uint8_t block_sizes_dv100[8] = {
459 80, 80, 80, 80, 80, 80, 64, 64,
462 static DVwork_chunk work_chunks_dv25pal [1*12*27];
463 static DVwork_chunk work_chunks_dv25pal411[1*12*27];
464 static DVwork_chunk work_chunks_dv25ntsc [1*10*27];
465 static DVwork_chunk work_chunks_dv50pal [2*12*27];
466 static DVwork_chunk work_chunks_dv50ntsc [2*10*27];
467 static DVwork_chunk work_chunks_dv100palp [2*12*27];
468 static DVwork_chunk work_chunks_dv100ntscp[2*10*27];
469 static DVwork_chunk work_chunks_dv100pali [4*12*27];
470 static DVwork_chunk work_chunks_dv100ntsci[4*10*27];
472 static const DVprofile dv_profiles[] = {
475 .frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
478 .time_base = { 1001, 30000 },
482 .sar = {{10, 11}, {40, 33}},
483 .work_chunks = &work_chunks_dv25ntsc[0],
484 .pix_fmt = PIX_FMT_YUV411P,
486 .block_sizes = block_sizes_dv2550,
488 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32kHz */
489 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
490 .audio_shuffle = dv_audio_shuffle525,
494 .frame_size = 144000, /* IEC 61834 - 625/50 (PAL) */
497 .time_base = { 1, 25 },
501 .sar = {{59, 54}, {118, 81}},
502 .work_chunks = &work_chunks_dv25pal[0],
503 .pix_fmt = PIX_FMT_YUV420P,
505 .block_sizes = block_sizes_dv2550,
507 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32kHz */
508 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
509 .audio_shuffle = dv_audio_shuffle625,
513 .frame_size = 144000, /* SMPTE-314M - 625/50 (PAL) */
516 .time_base = { 1, 25 },
520 .sar = {{59, 54}, {118, 81}},
521 .work_chunks = &work_chunks_dv25pal411[0],
522 .pix_fmt = PIX_FMT_YUV411P,
524 .block_sizes = block_sizes_dv2550,
526 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32kHz */
527 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
528 .audio_shuffle = dv_audio_shuffle625,
532 .frame_size = 240000, /* SMPTE-314M - 525/60 (NTSC) 50 Mbps */
533 .difseg_size = 10, /* also known as "DVCPRO50" */
535 .time_base = { 1001, 30000 },
539 .sar = {{10, 11}, {40, 33}},
540 .work_chunks = &work_chunks_dv50ntsc[0],
541 .pix_fmt = PIX_FMT_YUV422P,
543 .block_sizes = block_sizes_dv2550,
545 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32kHz */
546 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
547 .audio_shuffle = dv_audio_shuffle525,
551 .frame_size = 288000, /* SMPTE-314M - 625/50 (PAL) 50 Mbps */
552 .difseg_size = 12, /* also known as "DVCPRO50" */
554 .time_base = { 1, 25 },
558 .sar = {{59, 54}, {118, 81}},
559 .work_chunks = &work_chunks_dv50pal[0],
560 .pix_fmt = PIX_FMT_YUV422P,
562 .block_sizes = block_sizes_dv2550,
564 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32kHz */
565 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
566 .audio_shuffle = dv_audio_shuffle625,
570 .frame_size = 480000, /* SMPTE-370M - 1080i60 100 Mbps */
571 .difseg_size = 10, /* also known as "DVCPRO HD" */
573 .time_base = { 1001, 30000 },
577 .sar = {{1, 1}, {1, 1}},
578 .work_chunks = &work_chunks_dv100ntsci[0],
579 .pix_fmt = PIX_FMT_YUV422P,
581 .block_sizes = block_sizes_dv100,
583 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32kHz */
584 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
585 .audio_shuffle = dv_audio_shuffle525,
589 .frame_size = 576000, /* SMPTE-370M - 1080i50 100 Mbps */
590 .difseg_size = 12, /* also known as "DVCPRO HD" */
592 .time_base = { 1, 25 },
596 .sar = {{1, 1}, {1, 1}},
597 .work_chunks = &work_chunks_dv100pali[0],
598 .pix_fmt = PIX_FMT_YUV422P,
600 .block_sizes = block_sizes_dv100,
602 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32kHz */
603 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
604 .audio_shuffle = dv_audio_shuffle625,
608 .frame_size = 240000, /* SMPTE-370M - 720p60 100 Mbps */
609 .difseg_size = 10, /* also known as "DVCPRO HD" */
611 .time_base = { 1001, 60000 },
615 .sar = {{1, 1}, {1, 1}},
616 .work_chunks = &work_chunks_dv100ntscp[0],
617 .pix_fmt = PIX_FMT_YUV422P,
619 .block_sizes = block_sizes_dv100,
621 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32kHz */
622 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
623 .audio_shuffle = dv_audio_shuffle525,
627 .frame_size = 288000, /* SMPTE-370M - 720p50 100 Mbps */
628 .difseg_size = 12, /* also known as "DVCPRO HD" */
630 .time_base = { 1, 50 },
634 .sar = {{1, 1}, {1, 1}},
635 .work_chunks = &work_chunks_dv100palp[0],
636 .pix_fmt = PIX_FMT_YUV422P,
638 .block_sizes = block_sizes_dv100,
640 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32kHz */
641 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
642 .audio_shuffle = dv_audio_shuffle525,
646 enum dv_section_type {
647 dv_sect_header = 0x1f,
648 dv_sect_subcode = 0x3f,
650 dv_sect_audio = 0x76,
651 dv_sect_video = 0x96,
655 dv_header525 = 0x3f, /* see dv_write_pack for important details on */
656 dv_header625 = 0xbf, /* these two packs */
658 dv_audio_source = 0x50,
659 dv_audio_control = 0x51,
660 dv_audio_recdate = 0x52,
661 dv_audio_rectime = 0x53,
662 dv_video_source = 0x60,
663 dv_video_control = 0x61,
664 dv_video_recdate = 0x62,
665 dv_video_rectime = 0x63,
666 dv_unknown_pack = 0xff,
669 #define DV_PROFILE_IS_HD(p) ((p)->video_stype & 0x10)
670 #define DV_PROFILE_IS_1080i50(p) (((p)->video_stype == 0x14) && ((p)->dsf == 1))
671 #define DV_PROFILE_IS_720p50(p) (((p)->video_stype == 0x18) && ((p)->dsf == 1))
673 /* minimum number of bytes to read from a DV stream in order to
674 determine the profile */
675 #define DV_PROFILE_BYTES (6*80) /* 6 DIF blocks */
678 * largest possible DV frame, in bytes (1080i50)
680 #define DV_MAX_FRAME_SIZE 576000
683 * maximum number of blocks per macroblock in any DV format
687 static inline const DVprofile* dv_frame_profile(const uint8_t* frame)
691 int dsf = (frame[3] & 0x80) >> 7;
693 int stype = frame[80*5 + 48 + 3] & 0x1f;
695 /* 576i50 25Mbps 4:1:1 is a special case */
696 if (dsf == 1 && stype == 0 && frame[5] & 0x07) {
697 return &dv_profiles[2];
700 for (i=0; i<FF_ARRAY_ELEMS(dv_profiles); i++)
701 if (dsf == dv_profiles[i].dsf && stype == dv_profiles[i].video_stype)
702 return &dv_profiles[i];
707 static const DVprofile* dv_codec_profile(AVCodecContext* codec)
711 for (i=0; i<FF_ARRAY_ELEMS(dv_profiles); i++)
712 if (codec->height == dv_profiles[i].height &&
713 codec->pix_fmt == dv_profiles[i].pix_fmt &&
714 codec->width == dv_profiles[i].width)
715 return &dv_profiles[i];
720 static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
721 uint8_t seq_num, uint8_t dif_num,
724 buf[0] = (uint8_t)t; /* Section type */
725 buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
726 (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
727 7; /* reserved -- always 1 */
728 buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
733 static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
735 if (syb_num == 0 || syb_num == 6) {
736 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
737 (0 << 4) | /* AP3 (Subcode application ID) */
738 0x0f; /* reserved -- always 1 */
740 else if (syb_num == 11) {
741 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
742 0x7f; /* reserved -- always 1 */
745 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
746 (0 << 4) | /* APT (Track application ID) */
747 0x0f; /* reserved -- always 1 */
749 buf[1] = 0xf0 | /* reserved -- always 1 */
750 (syb_num & 0x0f); /* SSYB number 0 - 11 */
751 buf[2] = 0xff; /* reserved -- always 1 */
755 #endif /* AVCODEC_DVDATA_H */