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
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
33typedef 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 */
44typedef 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 */
66} DVprofile;
67
68/* unquant tables (not used directly) */
69static const uint8_t dv_quant_shifts[22][4] = {
70  { 3,3,4,4 },
71  { 3,3,4,4 },
72  { 2,3,3,4 },
73  { 2,3,3,4 },
74  { 2,2,3,3 },
75  { 2,2,3,3 },
76  { 1,2,2,3 },
77  { 1,2,2,3 },
78  { 1,1,2,2 },
79  { 1,1,2,2 },
80  { 0,1,1,2 },
81  { 0,1,1,2 },
82  { 0,0,1,1 },
83  { 0,0,1,1 },
84  { 0,0,0,1 },
85  { 0,0,0,0 },
86  { 0,0,0,0 },
87  { 0,0,0,0 },
88  { 0,0,0,0 },
89  { 0,0,0,0 },
90  { 0,0,0,0 },
91  { 0,0,0,0 },
92};
93
94static const uint8_t dv_quant_offset[4] = { 6,  3,  0,  1 };
95static const uint8_t dv_quant_areas[4]  = { 6, 21, 43, 64 };
96
97/* quantization quanta by QNO for DV100 */
98static const uint8_t dv100_qstep[16] = {
99    1, /* QNO = 0 and 1 both have no quantization */
100    1,
101    2, 3, 4, 5, 6, 7, 8, 16, 18, 20, 22, 24, 28, 52
102};
103
104/* DV25/50 DCT coefficient weights and inverse weights */
105/* created by dvtables.py */
106static const int dv_weight_bits = 18;
107static 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,
116};
117static 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,
126};
127static const int dv_iweight_bits = 14;
128static 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,
137};
138static 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,
147};
148
149/**
150 * The "inverse" DV100 weights are actually just the spec weights (zig-zagged).
151 */
152static 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,
161};
162static 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,
171};
172static 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,
181};
182static 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,
191};
192
193static 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 },
199
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 },
205};
206
207static 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},
214
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},
221};
222
223static const av_unused int dv_audio_frequency[3] = {
224    48000, 44100, 32000,
225};
226
227/* macroblock bit budgets */
228static const uint8_t block_sizes_dv2550[8] = {
229    112, 112, 112, 112, 80, 80, 0, 0,
230};
231
232static const uint8_t block_sizes_dv100[8] = {
233    80, 80, 80, 80, 80, 80, 64, 64,
234};
235
236enum dv_section_type {
237     dv_sect_header  = 0x1f,
238     dv_sect_subcode = 0x3f,
239     dv_sect_vaux    = 0x56,
240     dv_sect_audio   = 0x76,
241     dv_sect_video   = 0x96,
242};
243
244enum dv_pack_type {
245     dv_header525     = 0x3f, /* see dv_write_pack for important details on */
246     dv_header625     = 0xbf, /* these two packs */
247     dv_timecode      = 0x13,
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,
257};
258
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))
262
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 */
266
267/**
268 * largest possible DV frame, in bytes (1080i50)
269 */
270#define DV_MAX_FRAME_SIZE 576000
271
272/**
273 * maximum number of blocks per macroblock in any DV format
274 */
275#define DV_MAX_BPM 8
276
277const DVprofile* ff_dv_frame_profile(const DVprofile *sys,
278                                  const uint8_t* frame, unsigned buf_size);
279const DVprofile* ff_dv_codec_profile(AVCodecContext* codec);
280
281static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
282                                  uint8_t seq_num, uint8_t dif_num,
283                                  uint8_t* buf)
284{
285    buf[0] = (uint8_t)t;       /* Section type */
286    buf[1] = (seq_num  << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
287             (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
288             7;                /* reserved -- always 1 */
289    buf[2] = dif_num;          /* DIF block number Video: 0-134, Audio: 0-8 */
290    return 3;
291}
292
293
294static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
295{
296    if (syb_num == 0 || syb_num == 6) {
297        buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
298                 (0  << 4) | /* AP3 (Subcode application ID) */
299                 0x0f;       /* reserved -- always 1 */
300    }
301    else if (syb_num == 11) {
302        buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
303                 0x7f;       /* reserved -- always 1 */
304    }
305    else {
306        buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
307                 (0  << 4) | /* APT (Track application ID) */
308                 0x0f;       /* reserved -- always 1 */
309    }
310    buf[1] = 0xf0 |            /* reserved -- always 1 */
311             (syb_num & 0x0f); /* SSYB number 0 - 11   */
312    buf[2] = 0xff;             /* reserved -- always 1 */
313    return 3;
314}
315
316#endif /* AVCODEC_DVDATA_H */
317