Libav
|
00001 /* 00002 * Constants for DV codec 00003 * Copyright (c) 2002 Fabrice Bellard 00004 * 00005 * This file is part of FFmpeg. 00006 * 00007 * FFmpeg is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * FFmpeg is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with FFmpeg; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00020 */ 00021 00027 #ifndef AVCODEC_DVDATA_H 00028 #define AVCODEC_DVDATA_H 00029 00030 #include "libavutil/rational.h" 00031 #include "avcodec.h" 00032 00033 typedef struct DVwork_chunk { 00034 uint16_t buf_offset; 00035 uint16_t mb_coordinates[5]; 00036 } DVwork_chunk; 00037 00038 /* 00039 * DVprofile is used to express the differences between various 00040 * DV flavors. For now it's primarily used for differentiating 00041 * 525/60 and 625/50, but the plans are to use it for various 00042 * DV specs as well (e.g. SMPTE314M vs. IEC 61834). 00043 */ 00044 typedef struct DVprofile { 00045 int dsf; /* value of the dsf in the DV header */ 00046 int video_stype; /* stype for VAUX source pack */ 00047 int frame_size; /* total size of one frame in bytes */ 00048 int difseg_size; /* number of DIF segments per DIF channel */ 00049 int n_difchan; /* number of DIF channels per frame */ 00050 AVRational time_base; /* 1/framerate */ 00051 int ltc_divisor; /* FPS from the LTS standpoint */ 00052 int height; /* picture height in pixels */ 00053 int width; /* picture width in pixels */ 00054 AVRational sar[2]; /* sample aspect ratios for 4:3 and 16:9 */ 00055 DVwork_chunk *work_chunks; /* each thread gets its own chunk of frame to work on */ 00056 uint32_t *idct_factor; /* set of iDCT factor tables */ 00057 enum PixelFormat pix_fmt; /* picture pixel format */ 00058 int bpm; /* blocks per macroblock */ 00059 const uint8_t *block_sizes; /* AC block sizes, in bits */ 00060 int audio_stride; /* size of audio_shuffle table */ 00061 int audio_min_samples[3]; /* min amount of audio samples */ 00062 /* for 48kHz, 44.1kHz and 32kHz */ 00063 int audio_samples_dist[5]; /* how many samples are supposed to be */ 00064 /* in each frame in a 5 frames window */ 00065 const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */ 00066 } DVprofile; 00067 00068 /* unquant tables (not used directly) */ 00069 static const uint8_t dv_quant_shifts[22][4] = { 00070 { 3,3,4,4 }, 00071 { 3,3,4,4 }, 00072 { 2,3,3,4 }, 00073 { 2,3,3,4 }, 00074 { 2,2,3,3 }, 00075 { 2,2,3,3 }, 00076 { 1,2,2,3 }, 00077 { 1,2,2,3 }, 00078 { 1,1,2,2 }, 00079 { 1,1,2,2 }, 00080 { 0,1,1,2 }, 00081 { 0,1,1,2 }, 00082 { 0,0,1,1 }, 00083 { 0,0,1,1 }, 00084 { 0,0,0,1 }, 00085 { 0,0,0,0 }, 00086 { 0,0,0,0 }, 00087 { 0,0,0,0 }, 00088 { 0,0,0,0 }, 00089 { 0,0,0,0 }, 00090 { 0,0,0,0 }, 00091 { 0,0,0,0 }, 00092 }; 00093 00094 static const uint8_t dv_quant_offset[4] = { 6, 3, 0, 1 }; 00095 static const uint8_t dv_quant_areas[4] = { 6, 21, 43, 64 }; 00096 00097 /* quantization quanta by QNO for DV100 */ 00098 static const uint8_t dv100_qstep[16] = { 00099 1, /* QNO = 0 and 1 both have no quantization */ 00100 1, 00101 2, 3, 4, 5, 6, 7, 8, 16, 18, 20, 22, 24, 28, 52 00102 }; 00103 00104 /* DV25/50 DCT coefficient weights and inverse weights */ 00105 /* created by dvtables.py */ 00106 static const int dv_weight_bits = 18; 00107 static const int dv_weight_88[64] = { 00108 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536, 00109 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935, 00110 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916, 00111 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433, 00112 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704, 00113 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568, 00114 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627, 00115 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258, 00116 }; 00117 static const int dv_weight_248[64] = { 00118 131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754, 00119 224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536, 00120 211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568, 00121 242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965, 00122 200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627, 00123 229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965, 00124 175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364, 00125 195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651, 00126 }; 00127 static const int dv_iweight_bits = 14; 00128 static const int dv_iweight_88[64] = { 00129 32768, 16710, 16710, 17735, 17015, 17735, 18197, 18079, 00130 18079, 18197, 18725, 18559, 19196, 18559, 18725, 19284, 00131 19108, 19692, 19692, 19108, 19284, 21400, 19645, 20262, 00132 20214, 20262, 19645, 21400, 22733, 21845, 20867, 20815, 00133 20815, 20867, 21845, 22733, 23173, 23173, 21400, 21400, 00134 21400, 23173, 23173, 24600, 23764, 22017, 22017, 23764, 00135 24600, 25267, 24457, 22672, 24457, 25267, 25971, 25191, 00136 25191, 25971, 26715, 27962, 26715, 29642, 29642, 31536, 00137 }; 00138 static const int dv_iweight_248[64] = { 00139 32768, 17735, 16710, 18079, 18725, 21400, 17735, 19196, 00140 19108, 21845, 16384, 17735, 18725, 21400, 16710, 18079, 00141 20262, 23173, 18197, 19692, 18725, 20262, 20815, 23764, 00142 17735, 19196, 19108, 21845, 20262, 23173, 18197, 19692, 00143 21400, 24457, 19284, 20867, 21400, 23173, 22017, 25191, 00144 18725, 20262, 20815, 23764, 21400, 24457, 19284, 20867, 00145 24457, 27962, 22733, 24600, 25971, 29642, 21400, 23173, 00146 22017, 25191, 24457, 27962, 22733, 24600, 25971, 29642, 00147 }; 00148 00152 static const int dv_iweight_1080_y[64] = { 00153 128, 16, 16, 17, 17, 17, 18, 18, 00154 18, 18, 18, 18, 19, 18, 18, 19, 00155 19, 19, 19, 19, 19, 42, 38, 40, 00156 40, 40, 38, 42, 44, 43, 41, 41, 00157 41, 41, 43, 44, 45, 45, 42, 42, 00158 42, 45, 45, 48, 46, 43, 43, 46, 00159 48, 49, 48, 44, 48, 49, 101, 98, 00160 98, 101, 104, 109, 104, 116, 116, 123, 00161 }; 00162 static const int dv_iweight_1080_c[64] = { 00163 128, 16, 16, 17, 17, 17, 25, 25, 00164 25, 25, 26, 25, 26, 25, 26, 26, 00165 26, 27, 27, 26, 26, 42, 38, 40, 00166 40, 40, 38, 42, 44, 43, 41, 41, 00167 41, 41, 43, 44, 91, 91, 84, 84, 00168 84, 91, 91, 96, 93, 86, 86, 93, 00169 96, 197, 191, 177, 191, 197, 203, 197, 00170 197, 203, 209, 219, 209, 232, 232, 246, 00171 }; 00172 static const int dv_iweight_720_y[64] = { 00173 128, 16, 16, 17, 17, 17, 18, 18, 00174 18, 18, 18, 18, 19, 18, 18, 19, 00175 19, 19, 19, 19, 19, 42, 38, 40, 00176 40, 40, 38, 42, 44, 43, 41, 41, 00177 41, 41, 43, 44, 68, 68, 63, 63, 00178 63, 68, 68, 96, 92, 86, 86, 92, 00179 96, 98, 96, 88, 96, 98, 202, 196, 00180 196, 202, 208, 218, 208, 232, 232, 246, 00181 }; 00182 static const int dv_iweight_720_c[64] = { 00183 128, 24, 24, 26, 26, 26, 36, 36, 00184 36, 36, 36, 36, 38, 36, 36, 38, 00185 38, 38, 38, 38, 38, 84, 76, 80, 00186 80, 80, 76, 84, 88, 86, 82, 82, 00187 82, 82, 86, 88, 182, 182, 168, 168, 00188 168, 182, 182, 192, 186, 192, 172, 186, 00189 192, 394, 382, 354, 382, 394, 406, 394, 00190 394, 406, 418, 438, 418, 464, 464, 492, 00191 }; 00192 00193 static const uint8_t dv_audio_shuffle525[10][9] = { 00194 { 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */ 00195 { 6, 36, 66, 26, 56, 86, 16, 46, 76 }, 00196 { 12, 42, 72, 2, 32, 62, 22, 52, 82 }, 00197 { 18, 48, 78, 8, 38, 68, 28, 58, 88 }, 00198 { 24, 54, 84, 14, 44, 74, 4, 34, 64 }, 00199 00200 { 1, 31, 61, 21, 51, 81, 11, 41, 71 }, /* 2nd channel */ 00201 { 7, 37, 67, 27, 57, 87, 17, 47, 77 }, 00202 { 13, 43, 73, 3, 33, 63, 23, 53, 83 }, 00203 { 19, 49, 79, 9, 39, 69, 29, 59, 89 }, 00204 { 25, 55, 85, 15, 45, 75, 5, 35, 65 }, 00205 }; 00206 00207 static const uint8_t dv_audio_shuffle625[12][9] = { 00208 { 0, 36, 72, 26, 62, 98, 16, 52, 88}, /* 1st channel */ 00209 { 6, 42, 78, 32, 68, 104, 22, 58, 94}, 00210 { 12, 48, 84, 2, 38, 74, 28, 64, 100}, 00211 { 18, 54, 90, 8, 44, 80, 34, 70, 106}, 00212 { 24, 60, 96, 14, 50, 86, 4, 40, 76}, 00213 { 30, 66, 102, 20, 56, 92, 10, 46, 82}, 00214 00215 { 1, 37, 73, 27, 63, 99, 17, 53, 89}, /* 2nd channel */ 00216 { 7, 43, 79, 33, 69, 105, 23, 59, 95}, 00217 { 13, 49, 85, 3, 39, 75, 29, 65, 101}, 00218 { 19, 55, 91, 9, 45, 81, 35, 71, 107}, 00219 { 25, 61, 97, 15, 51, 87, 5, 41, 77}, 00220 { 31, 67, 103, 21, 57, 93, 11, 47, 83}, 00221 }; 00222 00223 static const av_unused int dv_audio_frequency[3] = { 00224 48000, 44100, 32000, 00225 }; 00226 00227 /* macroblock bit budgets */ 00228 static const uint8_t block_sizes_dv2550[8] = { 00229 112, 112, 112, 112, 80, 80, 0, 0, 00230 }; 00231 00232 static const uint8_t block_sizes_dv100[8] = { 00233 80, 80, 80, 80, 80, 80, 64, 64, 00234 }; 00235 00236 enum dv_section_type { 00237 dv_sect_header = 0x1f, 00238 dv_sect_subcode = 0x3f, 00239 dv_sect_vaux = 0x56, 00240 dv_sect_audio = 0x76, 00241 dv_sect_video = 0x96, 00242 }; 00243 00244 enum dv_pack_type { 00245 dv_header525 = 0x3f, /* see dv_write_pack for important details on */ 00246 dv_header625 = 0xbf, /* these two packs */ 00247 dv_timecode = 0x13, 00248 dv_audio_source = 0x50, 00249 dv_audio_control = 0x51, 00250 dv_audio_recdate = 0x52, 00251 dv_audio_rectime = 0x53, 00252 dv_video_source = 0x60, 00253 dv_video_control = 0x61, 00254 dv_video_recdate = 0x62, 00255 dv_video_rectime = 0x63, 00256 dv_unknown_pack = 0xff, 00257 }; 00258 00259 #define DV_PROFILE_IS_HD(p) ((p)->video_stype & 0x10) 00260 #define DV_PROFILE_IS_1080i50(p) (((p)->video_stype == 0x14) && ((p)->dsf == 1)) 00261 #define DV_PROFILE_IS_720p50(p) (((p)->video_stype == 0x18) && ((p)->dsf == 1)) 00262 00263 /* minimum number of bytes to read from a DV stream in order to 00264 determine the profile */ 00265 #define DV_PROFILE_BYTES (6*80) /* 6 DIF blocks */ 00266 00270 #define DV_MAX_FRAME_SIZE 576000 00271 00275 #define DV_MAX_BPM 8 00276 00277 const DVprofile* ff_dv_frame_profile(const DVprofile *sys, 00278 const uint8_t* frame, unsigned buf_size); 00279 const DVprofile* ff_dv_codec_profile(AVCodecContext* codec); 00280 00281 static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num, 00282 uint8_t seq_num, uint8_t dif_num, 00283 uint8_t* buf) 00284 { 00285 buf[0] = (uint8_t)t; /* Section type */ 00286 buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */ 00287 (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */ 00288 7; /* reserved -- always 1 */ 00289 buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */ 00290 return 3; 00291 } 00292 00293 00294 static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf) 00295 { 00296 if (syb_num == 0 || syb_num == 6) { 00297 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */ 00298 (0 << 4) | /* AP3 (Subcode application ID) */ 00299 0x0f; /* reserved -- always 1 */ 00300 } 00301 else if (syb_num == 11) { 00302 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */ 00303 0x7f; /* reserved -- always 1 */ 00304 } 00305 else { 00306 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */ 00307 (0 << 4) | /* APT (Track application ID) */ 00308 0x0f; /* reserved -- always 1 */ 00309 } 00310 buf[1] = 0xf0 | /* reserved -- always 1 */ 00311 (syb_num & 0x0f); /* SSYB number 0 - 11 */ 00312 buf[2] = 0xff; /* reserved -- always 1 */ 00313 return 3; 00314 } 00315 00316 #endif /* AVCODEC_DVDATA_H */