1/* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19#include <stdint.h> 20 21#include "config.h" 22 23#include "libavutil/common.h" 24#include "libavutil/intreadwrite.h" 25#include "libavutil/log.h" 26#include "libavutil/pixdesc.h" 27#include "avcodec.h" 28#include "dv_profile.h" 29#include "dv_profile_internal.h" 30 31#if CONFIG_DVPROFILE 32 33static const uint8_t dv_audio_shuffle525[10][9] = { 34 { 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */ 35 { 6, 36, 66, 26, 56, 86, 16, 46, 76 }, 36 { 12, 42, 72, 2, 32, 62, 22, 52, 82 }, 37 { 18, 48, 78, 8, 38, 68, 28, 58, 88 }, 38 { 24, 54, 84, 14, 44, 74, 4, 34, 64 }, 39 40 { 1, 31, 61, 21, 51, 81, 11, 41, 71 }, /* 2nd channel */ 41 { 7, 37, 67, 27, 57, 87, 17, 47, 77 }, 42 { 13, 43, 73, 3, 33, 63, 23, 53, 83 }, 43 { 19, 49, 79, 9, 39, 69, 29, 59, 89 }, 44 { 25, 55, 85, 15, 45, 75, 5, 35, 65 }, 45}; 46 47static const uint8_t dv_audio_shuffle625[12][9] = { 48 { 0, 36, 72, 26, 62, 98, 16, 52, 88}, /* 1st channel */ 49 { 6, 42, 78, 32, 68, 104, 22, 58, 94}, 50 { 12, 48, 84, 2, 38, 74, 28, 64, 100}, 51 { 18, 54, 90, 8, 44, 80, 34, 70, 106}, 52 { 24, 60, 96, 14, 50, 86, 4, 40, 76}, 53 { 30, 66, 102, 20, 56, 92, 10, 46, 82}, 54 55 { 1, 37, 73, 27, 63, 99, 17, 53, 89}, /* 2nd channel */ 56 { 7, 43, 79, 33, 69, 105, 23, 59, 95}, 57 { 13, 49, 85, 3, 39, 75, 29, 65, 101}, 58 { 19, 55, 91, 9, 45, 81, 35, 71, 107}, 59 { 25, 61, 97, 15, 51, 87, 5, 41, 77}, 60 { 31, 67, 103, 21, 57, 93, 11, 47, 83}, 61}; 62 63/* macroblock bit budgets */ 64static const uint8_t block_sizes_dv2550[8] = { 65 112, 112, 112, 112, 80, 80, 0, 0, 66}; 67 68static const uint8_t block_sizes_dv100[8] = { 69 80, 80, 80, 80, 80, 80, 64, 64, 70}; 71 72static const AVDVProfile dv_profiles[] = { 73 { .dsf = 0, 74 .video_stype = 0x0, 75 .frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */ 76 .difseg_size = 10, 77 .n_difchan = 1, 78 .time_base = { 1001, 30000 }, 79 .ltc_divisor = 30, 80 .height = 480, 81 .width = 720, 82 .sar = {{8, 9}, {32, 27}}, 83 .pix_fmt = AV_PIX_FMT_YUV411P, 84 .bpm = 6, 85 .block_sizes = block_sizes_dv2550, 86 .audio_stride = 90, 87 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32kHz */ 88 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */ 89 .audio_shuffle = dv_audio_shuffle525, 90 }, 91 { .dsf = 1, 92 .video_stype = 0x0, 93 .frame_size = 144000, /* IEC 61834 - 625/50 (PAL) */ 94 .difseg_size = 12, 95 .n_difchan = 1, 96 .time_base = { 1, 25 }, 97 .ltc_divisor = 25, 98 .height = 576, 99 .width = 720, 100 .sar = {{16, 15}, {64, 45}}, 101 .pix_fmt = AV_PIX_FMT_YUV420P, 102 .bpm = 6, 103 .block_sizes = block_sizes_dv2550, 104 .audio_stride = 108, 105 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32kHz */ 106 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, 107 .audio_shuffle = dv_audio_shuffle625, 108 }, 109 { .dsf = 1, 110 .video_stype = 0x0, 111 .frame_size = 144000, /* SMPTE-314M - 625/50 (PAL) */ 112 .difseg_size = 12, 113 .n_difchan = 1, 114 .time_base = { 1, 25 }, 115 .ltc_divisor = 25, 116 .height = 576, 117 .width = 720, 118 .sar = {{16, 15}, {64, 45}}, 119 .pix_fmt = AV_PIX_FMT_YUV411P, 120 .bpm = 6, 121 .block_sizes = block_sizes_dv2550, 122 .audio_stride = 108, 123 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32kHz */ 124 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, 125 .audio_shuffle = dv_audio_shuffle625, 126 }, 127 { .dsf = 0, 128 .video_stype = 0x4, 129 .frame_size = 240000, /* SMPTE-314M - 525/60 (NTSC) 50 Mbps */ 130 .difseg_size = 10, /* also known as "DVCPRO50" */ 131 .n_difchan = 2, 132 .time_base = { 1001, 30000 }, 133 .ltc_divisor = 30, 134 .height = 480, 135 .width = 720, 136 .sar = {{8, 9}, {32, 27}}, 137 .pix_fmt = AV_PIX_FMT_YUV422P, 138 .bpm = 6, 139 .block_sizes = block_sizes_dv2550, 140 .audio_stride = 90, 141 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32kHz */ 142 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */ 143 .audio_shuffle = dv_audio_shuffle525, 144 }, 145 { .dsf = 1, 146 .video_stype = 0x4, 147 .frame_size = 288000, /* SMPTE-314M - 625/50 (PAL) 50 Mbps */ 148 .difseg_size = 12, /* also known as "DVCPRO50" */ 149 .n_difchan = 2, 150 .time_base = { 1, 25 }, 151 .ltc_divisor = 25, 152 .height = 576, 153 .width = 720, 154 .sar = {{16, 15}, {64, 45}}, 155 .pix_fmt = AV_PIX_FMT_YUV422P, 156 .bpm = 6, 157 .block_sizes = block_sizes_dv2550, 158 .audio_stride = 108, 159 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32kHz */ 160 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, 161 .audio_shuffle = dv_audio_shuffle625, 162 }, 163 { .dsf = 0, 164 .video_stype = 0x14, 165 .frame_size = 480000, /* SMPTE-370M - 1080i60 100 Mbps */ 166 .difseg_size = 10, /* also known as "DVCPRO HD" */ 167 .n_difchan = 4, 168 .time_base = { 1001, 30000 }, 169 .ltc_divisor = 30, 170 .height = 1080, 171 .width = 1280, 172 .sar = {{1, 1}, {3, 2}}, 173 .pix_fmt = AV_PIX_FMT_YUV422P, 174 .bpm = 8, 175 .block_sizes = block_sizes_dv100, 176 .audio_stride = 90, 177 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32kHz */ 178 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */ 179 .audio_shuffle = dv_audio_shuffle525, 180 }, 181 { .dsf = 1, 182 .video_stype = 0x14, 183 .frame_size = 576000, /* SMPTE-370M - 1080i50 100 Mbps */ 184 .difseg_size = 12, /* also known as "DVCPRO HD" */ 185 .n_difchan = 4, 186 .time_base = { 1, 25 }, 187 .ltc_divisor = 25, 188 .height = 1080, 189 .width = 1440, 190 .sar = {{1, 1}, {4, 3}}, 191 .pix_fmt = AV_PIX_FMT_YUV422P, 192 .bpm = 8, 193 .block_sizes = block_sizes_dv100, 194 .audio_stride = 108, 195 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32kHz */ 196 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, 197 .audio_shuffle = dv_audio_shuffle625, 198 }, 199 { .dsf = 0, 200 .video_stype = 0x18, 201 .frame_size = 240000, /* SMPTE-370M - 720p60 100 Mbps */ 202 .difseg_size = 10, /* also known as "DVCPRO HD" */ 203 .n_difchan = 2, 204 .time_base = { 1001, 60000 }, 205 .ltc_divisor = 60, 206 .height = 720, 207 .width = 960, 208 .sar = {{1, 1}, {4, 3}}, 209 .pix_fmt = AV_PIX_FMT_YUV422P, 210 .bpm = 8, 211 .block_sizes = block_sizes_dv100, 212 .audio_stride = 90, 213 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32kHz */ 214 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */ 215 .audio_shuffle = dv_audio_shuffle525, 216 }, 217 { .dsf = 1, 218 .video_stype = 0x18, 219 .frame_size = 288000, /* SMPTE-370M - 720p50 100 Mbps */ 220 .difseg_size = 12, /* also known as "DVCPRO HD" */ 221 .n_difchan = 2, 222 .time_base = { 1, 50 }, 223 .ltc_divisor = 50, 224 .height = 720, 225 .width = 960, 226 .sar = {{1, 1}, {4, 3}}, 227 .pix_fmt = AV_PIX_FMT_YUV422P, 228 .bpm = 8, 229 .block_sizes = block_sizes_dv100, 230 .audio_stride = 90, 231 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32kHz */ 232 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, 233 .audio_shuffle = dv_audio_shuffle625, 234 }, 235 { .dsf = 1, 236 .video_stype = 0x1, 237 .frame_size = 144000, /* IEC 61883-5 - 625/50 (PAL) */ 238 .difseg_size = 12, 239 .n_difchan = 1, 240 .time_base = { 1, 25 }, 241 .ltc_divisor = 25, 242 .height = 576, 243 .width = 720, 244 .sar = {{16, 15}, {64, 45}}, 245 .pix_fmt = AV_PIX_FMT_YUV420P, 246 .bpm = 6, 247 .block_sizes = block_sizes_dv2550, 248 .audio_stride = 108, 249 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32kHz */ 250 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, 251 .audio_shuffle = dv_audio_shuffle625, 252 } 253}; 254 255void ff_dv_print_profiles(void *logctx, int loglevel) 256{ 257 int i; 258 for (i = 0; i < FF_ARRAY_ELEMS(dv_profiles); i++) { 259 const AVDVProfile *p = &dv_profiles[i]; 260 av_log(logctx, loglevel, "Frame size: %dx%d; pixel format: %s, " 261 "framerate: %d/%d\n", p->width, p->height, av_get_pix_fmt_name(p->pix_fmt), 262 p->time_base.den, p->time_base.num); 263 } 264} 265 266#endif /* CONFIG_DVPROFILE */ 267 268const AVDVProfile* avpriv_dv_frame_profile2(AVCodecContext* codec, const AVDVProfile *sys, 269 const uint8_t* frame, unsigned buf_size) 270{ 271#if CONFIG_DVPROFILE 272 int i, dsf, stype; 273 274 if(buf_size < DV_PROFILE_BYTES) 275 return NULL; 276 277 dsf = (frame[3] & 0x80) >> 7; 278 stype = frame[80 * 5 + 48 + 3] & 0x1f; 279 280 /* 576i50 25Mbps 4:1:1 is a special case */ 281 if ((dsf == 1 && stype == 0 && frame[4] & 0x07 /* the APT field */) || 282 (stype == 31 && codec && codec->codec_tag==AV_RL32("SL25") && codec->coded_width==720 && codec->coded_height==576)) { 283 return &dv_profiles[2]; 284 } 285 286 if( stype == 0 287 && codec 288 && (codec->codec_tag==AV_RL32("dvsd") || codec->codec_tag==AV_RL32("CDVC")) 289 && codec->coded_width ==720 290 && codec->coded_height==576) 291 return &dv_profiles[1]; 292 293 for (i = 0; i < FF_ARRAY_ELEMS(dv_profiles); i++) 294 if (dsf == dv_profiles[i].dsf && stype == dv_profiles[i].video_stype) 295 return &dv_profiles[i]; 296 297 /* check if old sys matches and assumes corrupted input */ 298 if (sys && buf_size == sys->frame_size) 299 return sys; 300 301 /* hack for trac issue #217, dv files created with QuickTime 3 */ 302 if ((frame[3] & 0x7f) == 0x3f && frame[80 * 5 + 48 + 3] == 0xff) 303 return &dv_profiles[dsf]; 304#endif 305 306 return NULL; 307} 308 309const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys, 310 const uint8_t* frame, unsigned buf_size) 311{ 312 return avpriv_dv_frame_profile2(NULL, sys, frame, buf_size); 313} 314 315const AVDVProfile *av_dv_codec_profile(int width, int height, 316 enum AVPixelFormat pix_fmt) 317{ 318#if CONFIG_DVPROFILE 319 int i; 320 321 for (i=0; i<FF_ARRAY_ELEMS(dv_profiles); i++) 322 if (height == dv_profiles[i].height && 323 pix_fmt == dv_profiles[i].pix_fmt && 324 width == dv_profiles[i].width) 325 return &dv_profiles[i]; 326#endif 327 328 return NULL; 329} 330 331#if LIBAVCODEC_VERSION_MAJOR < 56 332const AVDVProfile *avpriv_dv_frame_profile(const AVDVProfile *sys, 333 const uint8_t* frame, unsigned buf_size) 334{ 335 return av_dv_frame_profile(sys, frame, buf_size); 336} 337 338const AVDVProfile *avpriv_dv_codec_profile(AVCodecContext *codec) 339{ 340 if (codec->coded_width || codec->coded_height) { 341 return av_dv_codec_profile(codec->coded_width, codec->coded_height, codec->pix_fmt); 342 } else 343 return av_dv_codec_profile(codec->width, codec->height, codec->pix_fmt); 344} 345#endif 346