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