]> git.sesse.net Git - ffmpeg/blob - libavcodec/dvdata.h
d673d60332073fb846c510961189eef9f21fc1b4
[ffmpeg] / libavcodec / dvdata.h
1 /*
2  * Constants for DV codec
3  * Copyright (c) 2002 Fabrice Bellard.
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21
22 /**
23  * @file dvdata.h
24  * Constants for DV codec.
25  */
26
27 #ifndef AVCODEC_DVDATA_H
28 #define AVCODEC_DVDATA_H
29
30 #include "libavutil/rational.h"
31 #include "avcodec.h"
32
33 typedef struct DVwork_chunk {
34     uint16_t  buf_offset;
35     uint16_t  mb_coordinates[5];
36 } DVwork_chunk;
37
38 /*
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).
43  */
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 */
65 } DVprofile;
66
67 #define NB_DV_VLC 409
68
69 /*
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.
73  */
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,
126  0x0006,
127 };
128
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,
181   4,
182 };
183
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,
236 127,
237 };
238
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,
291    0,
292 };
293
294 /* unquant tables (not used directly) */
295 static const uint8_t dv_quant_shifts[22][4] = {
296   { 3,3,4,4 },
297   { 3,3,4,4 },
298   { 2,3,3,4 },
299   { 2,3,3,4 },
300   { 2,2,3,3 },
301   { 2,2,3,3 },
302   { 1,2,2,3 },
303   { 1,2,2,3 },
304   { 1,1,2,2 },
305   { 1,1,2,2 },
306   { 0,1,1,2 },
307   { 0,1,1,2 },
308   { 0,0,1,1 },
309   { 0,0,1,1 },
310   { 0,0,0,1 },
311   { 0,0,0,0 },
312   { 0,0,0,0 },
313   { 0,0,0,0 },
314   { 0,0,0,0 },
315   { 0,0,0,0 },
316   { 0,0,0,0 },
317   { 0,0,0,0 },
318 };
319
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 };
322
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 */
326     1,
327     2, 3, 4, 5, 6, 7, 8, 16, 18, 20, 22, 24, 28, 52
328 };
329
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,
342 };
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,
352 };
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,
363 };
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,
373 };
374
375 /**
376  * The "inverse" DV100 weights are actually just the spec weights (zig-zagged).
377  */
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,
387 };
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,
397 };
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,
407 };
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,
417 };
418
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 },
425
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 },
431 };
432
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},
440
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},
447 };
448
449 static const av_unused int dv_audio_frequency[3] = {
450     48000, 44100, 32000,
451 };
452
453 /* macroblock bit budgets */
454 static const uint8_t block_sizes_dv2550[8] = {
455     112, 112, 112, 112, 80, 80, 0, 0,
456 };
457
458 static const uint8_t block_sizes_dv100[8] = {
459     80, 80, 80, 80, 80, 80, 64, 64,
460 };
461
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];
471
472 static const DVprofile dv_profiles[] = {
473     { .dsf = 0,
474       .video_stype = 0x0,
475       .frame_size = 120000,        /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
476       .difseg_size = 10,
477       .n_difchan = 1,
478       .time_base = { 1001, 30000 },
479       .ltc_divisor = 30,
480       .height = 480,
481       .width = 720,
482       .sar = {{10, 11}, {40, 33}},
483       .work_chunks = &work_chunks_dv25ntsc[0],
484       .pix_fmt = PIX_FMT_YUV411P,
485       .bpm = 6,
486       .block_sizes = block_sizes_dv2550,
487       .audio_stride = 90,
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,
491     },
492     { .dsf = 1,
493       .video_stype = 0x0,
494       .frame_size = 144000,        /* IEC 61834 - 625/50 (PAL) */
495       .difseg_size = 12,
496       .n_difchan = 1,
497       .time_base = { 1, 25 },
498       .ltc_divisor = 25,
499       .height = 576,
500       .width = 720,
501       .sar = {{59, 54}, {118, 81}},
502       .work_chunks = &work_chunks_dv25pal[0],
503       .pix_fmt = PIX_FMT_YUV420P,
504       .bpm = 6,
505       .block_sizes = block_sizes_dv2550,
506       .audio_stride = 108,
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,
510     },
511     { .dsf = 1,
512       .video_stype = 0x0,
513       .frame_size = 144000,        /* SMPTE-314M - 625/50 (PAL) */
514       .difseg_size = 12,
515       .n_difchan = 1,
516       .time_base = { 1, 25 },
517       .ltc_divisor = 25,
518       .height = 576,
519       .width = 720,
520       .sar = {{59, 54}, {118, 81}},
521       .work_chunks = &work_chunks_dv25pal411[0],
522       .pix_fmt = PIX_FMT_YUV411P,
523       .bpm = 6,
524       .block_sizes = block_sizes_dv2550,
525       .audio_stride = 108,
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,
529     },
530     { .dsf = 0,
531       .video_stype = 0x4,
532       .frame_size = 240000,        /* SMPTE-314M - 525/60 (NTSC) 50 Mbps */
533       .difseg_size = 10,           /* also known as "DVCPRO50" */
534       .n_difchan = 2,
535       .time_base = { 1001, 30000 },
536       .ltc_divisor = 30,
537       .height = 480,
538       .width = 720,
539       .sar = {{10, 11}, {40, 33}},
540       .work_chunks = &work_chunks_dv50ntsc[0],
541       .pix_fmt = PIX_FMT_YUV422P,
542       .bpm = 6,
543       .block_sizes = block_sizes_dv2550,
544       .audio_stride = 90,
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,
548     },
549     { .dsf = 1,
550       .video_stype = 0x4,
551       .frame_size = 288000,        /* SMPTE-314M - 625/50 (PAL) 50 Mbps */
552       .difseg_size = 12,           /* also known as "DVCPRO50" */
553       .n_difchan = 2,
554       .time_base = { 1, 25 },
555       .ltc_divisor = 25,
556       .height = 576,
557       .width = 720,
558       .sar = {{59, 54}, {118, 81}},
559       .work_chunks = &work_chunks_dv50pal[0],
560       .pix_fmt = PIX_FMT_YUV422P,
561       .bpm = 6,
562       .block_sizes = block_sizes_dv2550,
563       .audio_stride = 108,
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,
567     },
568     { .dsf = 0,
569       .video_stype = 0x14,
570       .frame_size = 480000,        /* SMPTE-370M - 1080i60 100 Mbps */
571       .difseg_size = 10,           /* also known as "DVCPRO HD" */
572       .n_difchan = 4,
573       .time_base = { 1001, 30000 },
574       .ltc_divisor = 30,
575       .height = 1080,
576       .width = 1280,
577       .sar = {{1, 1}, {1, 1}},
578       .work_chunks = &work_chunks_dv100ntsci[0],
579       .pix_fmt = PIX_FMT_YUV422P,
580       .bpm = 8,
581       .block_sizes = block_sizes_dv100,
582       .audio_stride = 90,
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,
586     },
587     { .dsf = 1,
588       .video_stype = 0x14,
589       .frame_size = 576000,        /* SMPTE-370M - 1080i50 100 Mbps */
590       .difseg_size = 12,           /* also known as "DVCPRO HD" */
591       .n_difchan = 4,
592       .time_base = { 1, 25 },
593       .ltc_divisor = 25,
594       .height = 1080,
595       .width = 1440,
596       .sar = {{1, 1}, {1, 1}},
597       .work_chunks = &work_chunks_dv100pali[0],
598       .pix_fmt = PIX_FMT_YUV422P,
599       .bpm = 8,
600       .block_sizes = block_sizes_dv100,
601       .audio_stride = 108,
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,
605     },
606     { .dsf = 0,
607       .video_stype = 0x18,
608       .frame_size = 240000,        /* SMPTE-370M - 720p60 100 Mbps */
609       .difseg_size = 10,           /* also known as "DVCPRO HD" */
610       .n_difchan = 2,
611       .time_base = { 1001, 60000 },
612       .ltc_divisor = 60,
613       .height = 720,
614       .width = 960,
615       .sar = {{1, 1}, {1, 1}},
616       .work_chunks = &work_chunks_dv100ntscp[0],
617       .pix_fmt = PIX_FMT_YUV422P,
618       .bpm = 8,
619       .block_sizes = block_sizes_dv100,
620       .audio_stride = 90,
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,
624     },
625     { .dsf = 1,
626       .video_stype = 0x18,
627       .frame_size = 288000,        /* SMPTE-370M - 720p50 100 Mbps */
628       .difseg_size = 12,           /* also known as "DVCPRO HD" */
629       .n_difchan = 2,
630       .time_base = { 1, 50 },
631       .ltc_divisor = 50,
632       .height = 720,
633       .width = 960,
634       .sar = {{1, 1}, {1, 1}},
635       .work_chunks = &work_chunks_dv100palp[0],
636       .pix_fmt = PIX_FMT_YUV422P,
637       .bpm = 8,
638       .block_sizes = block_sizes_dv100,
639       .audio_stride = 90,
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,
643     }
644 };
645
646 enum dv_section_type {
647      dv_sect_header  = 0x1f,
648      dv_sect_subcode = 0x3f,
649      dv_sect_vaux    = 0x56,
650      dv_sect_audio   = 0x76,
651      dv_sect_video   = 0x96,
652 };
653
654 enum dv_pack_type {
655      dv_header525     = 0x3f, /* see dv_write_pack for important details on */
656      dv_header625     = 0xbf, /* these two packs */
657      dv_timecode      = 0x13,
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,
667 };
668
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))
672
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 */
676
677 /**
678  * largest possible DV frame, in bytes (1080i50)
679  */
680 #define DV_MAX_FRAME_SIZE 576000
681
682 /**
683  * maximum number of blocks per macroblock in any DV format
684  */
685 #define DV_MAX_BPM 8
686
687 static inline const DVprofile* dv_frame_profile(const uint8_t* frame)
688 {
689    int i;
690
691    int dsf = (frame[3] & 0x80) >> 7;
692
693    int stype = frame[80*5 + 48 + 3] & 0x1f;
694
695    /* 576i50 25Mbps 4:1:1 is a special case */
696    if (dsf == 1 && stype == 0 && frame[5] & 0x07) {
697        return &dv_profiles[2];
698    }
699
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];
703
704    return NULL;
705 }
706
707 static const DVprofile* dv_codec_profile(AVCodecContext* codec)
708 {
709     int i;
710
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];
716
717     return NULL;
718 }
719
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,
722                                   uint8_t* buf)
723 {
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 */
729     return 3;
730 }
731
732
733 static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
734 {
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 */
739     }
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 */
743     }
744     else {
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 */
748     }
749     buf[1] = 0xf0 |            /* reserved -- always 1 */
750              (syb_num & 0x0f); /* SSYB number 0 - 11   */
751     buf[2] = 0xff;             /* reserved -- always 1 */
752     return 3;
753 }
754
755 #endif /* AVCODEC_DVDATA_H */