Mercurial > libavcodec.hg
comparison dvdata.h @ 1489:337d13aee605 libavcodec
* DV handling was streamlined for both muxing/demuxing and
decoding. All muxing/demuxing functionality is now available
in libavformat/dv.[ch].
* dv1394.c and avidec.c were hooked up with general DV demuxer.
* DVAUDIO is dead! Long live pcm_s16le!
* DV audio is now always recognized -- which means we can
now hear all those ducks quaking in pond.dv.
author | romansh |
---|---|
date | Mon, 29 Sep 2003 17:54:07 +0000 |
parents | 35b80080b2db |
children | b340e83b8d0d |
comparison
equal
deleted
inserted
replaced
1488:766a2f4edbea | 1489:337d13aee605 |
---|---|
19 | 19 |
20 /** | 20 /** |
21 * @file dvdata.h | 21 * @file dvdata.h |
22 * Constants for DV codec. | 22 * Constants for DV codec. |
23 */ | 23 */ |
24 | 24 |
25 /* | |
26 * DVprofile is used to express the differences between various | |
27 * DV flavors. For now it's primarily used for differentiating | |
28 * 525/60 and 625/50, but the plans are to use it for various | |
29 * DV specs as well (e.g. SMPTE314M vs. IEC 61834). | |
30 */ | |
31 typedef struct DVprofile { | |
32 int dsf; /* value of the dsf in the DV header */ | |
33 int frame_size; /* total size of one frame in bytes */ | |
34 int difseg_size; /* number of DIF segments */ | |
35 int frame_rate; | |
36 int frame_rate_base; | |
37 int ltc_divisor; /* FPS from the LTS standpoint */ | |
38 int height; /* picture height in pixels */ | |
39 int width; /* picture width in pixels */ | |
40 const uint16_t *video_place; /* positions of all DV macro blocks */ | |
41 enum PixelFormat pix_fmt; /* picture pixel format */ | |
42 | |
43 int audio_stride; /* size of audio_shuffle table */ | |
44 int audio_min_samples[3];/* min ammount of audio samples */ | |
45 /* for 48Khz, 44.1Khz and 32Khz */ | |
46 int audio_samples_dist[5];/* how many samples are supposed to be */ | |
47 /* in each frame in a 5 frames window */ | |
48 const uint16_t (*audio_shuffle)[9]; /* PCM shuffling table */ | |
49 } DVprofile; | |
50 | |
25 #define NB_DV_VLC 409 | 51 #define NB_DV_VLC 409 |
26 #define AAUX_AS_OFFSET (80*6 + 80*16*3 + 3) | |
27 #define AAUX_ASC_OFFSET (80*6 + 80*16*4 + 3) | |
28 #define VAUX_TC61_OFFSET (80*5 + 48 + 5) | |
29 | 52 |
30 static const uint16_t dv_vlc_bits[409] = { | 53 static const uint16_t dv_vlc_bits[409] = { |
31 0x0000, 0x0002, 0x0007, 0x0008, 0x0009, 0x0014, 0x0015, 0x0016, | 54 0x0000, 0x0002, 0x0007, 0x0008, 0x0009, 0x0014, 0x0015, 0x0016, |
32 0x0017, 0x0030, 0x0031, 0x0032, 0x0033, 0x0068, 0x0069, 0x006a, | 55 0x0017, 0x0030, 0x0031, 0x0032, 0x0033, 0x0068, 0x0069, 0x006a, |
33 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x00e0, 0x00e1, 0x00e2, | 56 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x00e0, 0x00e1, 0x00e2, |
281 1,1,2,2,2,3,3,3, | 304 1,1,2,2,2,3,3,3, |
282 1,2,2,2,3,3,3,3, | 305 1,2,2,2,3,3,3,3, |
283 1,2,2,3,3,3,3,3, | 306 1,2,2,3,3,3,3,3, |
284 }; | 307 }; |
285 | 308 |
286 static uint8_t dv_quant_shifts[22][4] = { | 309 static const uint8_t dv_quant_shifts[22][4] = { |
287 { 3,3,4,4 }, | 310 { 3,3,4,4 }, |
288 { 3,3,4,4 }, | 311 { 3,3,4,4 }, |
289 { 2,3,3,4 }, | 312 { 2,3,3,4 }, |
290 { 2,3,3,4 }, | 313 { 2,3,3,4 }, |
291 { 2,2,3,3 }, | 314 { 2,2,3,3 }, |
1238 0x0634, 0x2120, 0x2d44, 0x3610, 0x1258, | 1261 0x0634, 0x2120, 0x2d44, 0x3610, 0x1258, |
1239 0x0734, 0x2220, 0x2e44, 0x3710, 0x1458, | 1262 0x0734, 0x2220, 0x2e44, 0x3710, 0x1458, |
1240 0x0834, 0x2320, 0x2f44, 0x3810, 0x1658, | 1263 0x0834, 0x2320, 0x2f44, 0x3810, 0x1658, |
1241 }; | 1264 }; |
1242 | 1265 |
1243 static const uint16_t dv_place_audio60[10][9] = { | 1266 static const uint16_t dv_audio_shuffle525[10][9] = { |
1244 { 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */ | 1267 { 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */ |
1245 { 6, 36, 66, 26, 56, 86, 16, 46, 76 }, | 1268 { 6, 36, 66, 26, 56, 86, 16, 46, 76 }, |
1246 { 12, 42, 72, 2, 32, 62, 22, 52, 82 }, | 1269 { 12, 42, 72, 2, 32, 62, 22, 52, 82 }, |
1247 { 18, 48, 78, 8, 38, 68, 28, 58, 88 }, | 1270 { 18, 48, 78, 8, 38, 68, 28, 58, 88 }, |
1248 { 24, 54, 84, 14, 44, 74, 4, 34, 64 }, | 1271 { 24, 54, 84, 14, 44, 74, 4, 34, 64 }, |
1252 { 13, 43, 73, 3, 33, 63, 23, 53, 83 }, | 1275 { 13, 43, 73, 3, 33, 63, 23, 53, 83 }, |
1253 { 19, 49, 79, 9, 39, 69, 29, 59, 89 }, | 1276 { 19, 49, 79, 9, 39, 69, 29, 59, 89 }, |
1254 { 25, 55, 85, 15, 45, 75, 5, 35, 65 }, | 1277 { 25, 55, 85, 15, 45, 75, 5, 35, 65 }, |
1255 }; | 1278 }; |
1256 | 1279 |
1257 static const uint16_t dv_place_audio50[12][9] = { | 1280 static const uint16_t dv_audio_shuffle625[12][9] = { |
1258 { 0, 36, 72, 26, 62, 98, 16, 52, 88}, /* 1st channel */ | 1281 { 0, 36, 72, 26, 62, 98, 16, 52, 88}, /* 1st channel */ |
1259 { 6, 42, 78, 32, 68, 104, 22, 58, 94}, | 1282 { 6, 42, 78, 32, 68, 104, 22, 58, 94}, |
1260 { 12, 48, 84, 2, 38, 74, 28, 64, 100}, | 1283 { 12, 48, 84, 2, 38, 74, 28, 64, 100}, |
1261 { 18, 54, 90, 8, 44, 80, 34, 70, 106}, | 1284 { 18, 54, 90, 8, 44, 80, 34, 70, 106}, |
1262 { 24, 60, 96, 14, 50, 86, 4, 40, 76}, | 1285 { 24, 60, 96, 14, 50, 86, 4, 40, 76}, |
1269 { 25, 61, 97, 15, 51, 87, 5, 41, 77}, | 1292 { 25, 61, 97, 15, 51, 87, 5, 41, 77}, |
1270 { 31, 67, 103, 21, 57, 93, 11, 47, 83}, | 1293 { 31, 67, 103, 21, 57, 93, 11, 47, 83}, |
1271 }; | 1294 }; |
1272 | 1295 |
1273 static const int dv_audio_frequency[3] = { | 1296 static const int dv_audio_frequency[3] = { |
1274 48000, 44100, 32000, | 1297 48000, 44100, 32000, |
1275 }; | 1298 }; |
1276 | 1299 |
1277 static const int dv_audio_min_samples[2][3] = { | 1300 static const DVprofile dv_profiles[] = { |
1278 { 1580, 1452, 1053 }, /* 60 fields */ | 1301 { .dsf = 0, |
1279 { 1896, 1742, 1264 }, /* 50 fileds */ | 1302 .frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */ |
1280 }; | 1303 .difseg_size = 10, |
1304 .frame_rate = 30000, | |
1305 .ltc_divisor = 30, | |
1306 .frame_rate_base = 1001, | |
1307 .height = 480, | |
1308 .width = 720, | |
1309 .video_place = dv_place_411, | |
1310 .pix_fmt = PIX_FMT_YUV411P, | |
1311 .audio_stride = 90, | |
1312 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */ | |
1313 .audio_samples_dist = { 1602, 1601, 1602, 1601, 1602 }, | |
1314 .audio_shuffle = dv_audio_shuffle525, | |
1315 }, | |
1316 { .dsf = 1, | |
1317 .frame_size = 144000, /* IEC 61834 - 625/50 (PAL) */ | |
1318 .difseg_size = 12, | |
1319 .frame_rate = 25, | |
1320 .frame_rate_base = 1, | |
1321 .ltc_divisor = 25, | |
1322 .height = 576, | |
1323 .width = 720, | |
1324 .video_place = dv_place_420, | |
1325 .pix_fmt = PIX_FMT_YUV420P, | |
1326 .audio_stride = 108, | |
1327 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */ | |
1328 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, | |
1329 .audio_shuffle = dv_audio_shuffle625, | |
1330 }, | |
1331 { .dsf = 1, | |
1332 .frame_size = 144000, /* SMPTE-314M - 625/50 (PAL) */ | |
1333 .difseg_size = 12, | |
1334 .frame_rate = 25, | |
1335 .frame_rate_base = 1, | |
1336 .ltc_divisor = 25, | |
1337 .height = 576, | |
1338 .width = 720, | |
1339 .video_place = dv_place_411P, | |
1340 .pix_fmt = PIX_FMT_YUV411P, | |
1341 .audio_stride = 108, | |
1342 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */ | |
1343 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, | |
1344 .audio_shuffle = dv_audio_shuffle625, | |
1345 } | |
1346 }; | |
1347 | |
1348 static inline const DVprofile* dv_frame_profile(uint8_t* frame) | |
1349 { | |
1350 if ((frame[3] & 0x80) == 0) { /* DSF flag */ | |
1351 return &dv_profiles[0]; | |
1352 } | |
1353 else if ((frame[5] & 0x07) == 0) { /* APT flag */ | |
1354 return &dv_profiles[1]; | |
1355 } | |
1356 else | |
1357 return &dv_profiles[2]; | |
1358 } | |
1359 | |
1360 static inline const DVprofile* dv_codec_profile(AVCodecContext* codec) | |
1361 { | |
1362 if (codec->width != 720) { | |
1363 return NULL; | |
1364 } | |
1365 else if (codec->height == 480) { | |
1366 return &dv_profiles[0]; | |
1367 } | |
1368 else | |
1369 return &dv_profiles[1]; | |
1370 } |