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