Mercurial > mplayer.hg
comparison libmpdemux/demux_mkv.cpp @ 11557:32411c15cebc
Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
author | mosu |
---|---|
date | Fri, 05 Dec 2003 11:03:43 +0000 |
parents | 3abf5b7cb308 |
children | f9fccf97d588 |
comparison
equal
deleted
inserted
replaced
11556:b52b8bedf2ac | 11557:32411c15cebc |
---|---|
208 float v_frate; | 208 float v_frate; |
209 | 209 |
210 uint32_t a_formattag; | 210 uint32_t a_formattag; |
211 uint32_t a_channels, a_bps; | 211 uint32_t a_channels, a_bps; |
212 float a_sfreq; | 212 float a_sfreq; |
213 | |
214 float default_duration; | |
213 | 215 |
214 int default_track; | 216 int default_track; |
215 | 217 |
216 void *private_data; | 218 void *private_data; |
217 unsigned int private_size; | 219 unsigned int private_size; |
979 t->a_formattag = 0x2000; | 981 t->a_formattag = 0x2000; |
980 else if (!strcmp(t->codec_id, MKV_A_PCM) || | 982 else if (!strcmp(t->codec_id, MKV_A_PCM) || |
981 !strcmp(t->codec_id, MKV_A_PCM_BE)) | 983 !strcmp(t->codec_id, MKV_A_PCM_BE)) |
982 t->a_formattag = 0x0001; | 984 t->a_formattag = 0x0001; |
983 else if (!strcmp(t->codec_id, MKV_A_AAC_2MAIN) || | 985 else if (!strcmp(t->codec_id, MKV_A_AAC_2MAIN) || |
984 !strcmp(t->codec_id, MKV_A_AAC_2LC) || | 986 !strncmp(t->codec_id, MKV_A_AAC_2LC, |
987 strlen(MKV_A_AAC_2LC)) || | |
985 !strcmp(t->codec_id, MKV_A_AAC_2SSR) || | 988 !strcmp(t->codec_id, MKV_A_AAC_2SSR) || |
986 !strcmp(t->codec_id, MKV_A_AAC_4MAIN) || | 989 !strcmp(t->codec_id, MKV_A_AAC_4MAIN) || |
987 !strcmp(t->codec_id, MKV_A_AAC_4LC) || | 990 !strncmp(t->codec_id, MKV_A_AAC_4LC, |
991 strlen(MKV_A_AAC_4LC)) || | |
988 !strcmp(t->codec_id, MKV_A_AAC_4SSR) || | 992 !strcmp(t->codec_id, MKV_A_AAC_4SSR) || |
989 !strcmp(t->codec_id, MKV_A_AAC_4LTP) || | 993 !strcmp(t->codec_id, MKV_A_AAC_4LTP)) |
990 !strcmp(t->codec_id, MKV_A_AAC_4SBR)) | |
991 t->a_formattag = mmioFOURCC('M', 'P', '4', 'A'); | 994 t->a_formattag = mmioFOURCC('M', 'P', '4', 'A'); |
992 else if (!strcmp(t->codec_id, MKV_A_VORBIS)) { | 995 else if (!strcmp(t->codec_id, MKV_A_VORBIS)) { |
993 if (t->private_data == NULL) { | 996 if (t->private_data == NULL) { |
994 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for " | 997 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for " |
995 "track %u is '" MKV_A_VORBIS | 998 "track %u is '" MKV_A_VORBIS |
1484 delete kseekhead; | 1487 delete kseekhead; |
1485 | 1488 |
1486 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing seek head ] ---------\n"); | 1489 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing seek head ] ---------\n"); |
1487 } | 1490 } |
1488 | 1491 |
1492 #define AAC_SYNC_EXTENSION_TYPE 0x02b7 | |
1493 static int aac_get_sample_rate_index(uint32_t sample_rate) { | |
1494 if (92017 <= sample_rate) | |
1495 return 0; | |
1496 else if (75132 <= sample_rate) | |
1497 return 1; | |
1498 else if (55426 <= sample_rate) | |
1499 return 2; | |
1500 else if (46009 <= sample_rate) | |
1501 return 3; | |
1502 else if (37566 <= sample_rate) | |
1503 return 4; | |
1504 else if (27713 <= sample_rate) | |
1505 return 5; | |
1506 else if (23004 <= sample_rate) | |
1507 return 6; | |
1508 else if (18783 <= sample_rate) | |
1509 return 7; | |
1510 else if (13856 <= sample_rate) | |
1511 return 8; | |
1512 else if (11502 <= sample_rate) | |
1513 return 9; | |
1514 else if (9391 <= sample_rate) | |
1515 return 10; | |
1516 else | |
1517 return 11; | |
1518 } | |
1519 | |
1489 extern "C" void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs, | 1520 extern "C" void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs, |
1490 int flags); | 1521 int flags); |
1491 | 1522 |
1492 extern "C" int demux_mkv_open(demuxer_t *demuxer) { | 1523 extern "C" int demux_mkv_open(demuxer_t *demuxer) { |
1493 unsigned char signature[4]; | 1524 unsigned char signature[4]; |
1662 track->v_frate = 1000000000.0 / (float)uint64(*kdefdur); | 1693 track->v_frate = 1000000000.0 / (float)uint64(*kdefdur); |
1663 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: " | 1694 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: " |
1664 "%.3fms ( = %.3f fps)\n", | 1695 "%.3fms ( = %.3f fps)\n", |
1665 (float)uint64(*kdefdur) / 1000000.0, track->v_frate); | 1696 (float)uint64(*kdefdur) / 1000000.0, track->v_frate); |
1666 } | 1697 } |
1698 track->default_duration = (float)uint64(*kdefdur) / 1000000000.0; | |
1667 } | 1699 } |
1668 | 1700 |
1669 kttype = FINDFIRST(ktentry, KaxTrackType); | 1701 kttype = FINDFIRST(ktentry, KaxTrackType); |
1670 if (kttype != NULL) { | 1702 if (kttype != NULL) { |
1671 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: "); | 1703 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: "); |
2263 sh_a->wf->nBlockAlign = 1024; | 2295 sh_a->wf->nBlockAlign = 1024; |
2264 sh_a->wf->wBitsPerSample = 0; | 2296 sh_a->wf->wBitsPerSample = 0; |
2265 sh_a->samplesize = 0; | 2297 sh_a->samplesize = 0; |
2266 | 2298 |
2267 // Recreate the 'private data' which faad2 uses in its initialization. | 2299 // Recreate the 'private data' which faad2 uses in its initialization. |
2268 // A_AAC/MPEG2/MAIN | 2300 srate_idx = aac_get_sample_rate_index(sh_a->samplerate); |
2269 // 0123456789012345 | 2301 if (!strncmp(&track->codec_id[12], "MAIN", 4)) |
2270 if (!strcmp(&track->codec_id[12], "MAIN")) | |
2271 profile = 0; | 2302 profile = 0; |
2272 else if (!strcmp(&track->codec_id[12], "LC")) | 2303 else if (!strncmp(&track->codec_id[12], "LC", 2)) |
2273 profile = 1; | 2304 profile = 1; |
2274 else if (!strcmp(&track->codec_id[12], "SSR")) | 2305 else if (!strncmp(&track->codec_id[12], "SSR", 3)) |
2275 profile = 2; | 2306 profile = 2; |
2276 else | 2307 else |
2277 profile = 3; | 2308 profile = 3; |
2278 if (92017 <= sh_a->samplerate) | 2309 sh_a->codecdata = (unsigned char *)safemalloc(5); |
2279 srate_idx = 0; | |
2280 else if (75132 <= sh_a->samplerate) | |
2281 srate_idx = 1; | |
2282 else if (55426 <= sh_a->samplerate) | |
2283 srate_idx = 2; | |
2284 else if (46009 <= sh_a->samplerate) | |
2285 srate_idx = 3; | |
2286 else if (37566 <= sh_a->samplerate) | |
2287 srate_idx = 4; | |
2288 else if (27713 <= sh_a->samplerate) | |
2289 srate_idx = 5; | |
2290 else if (23004 <= sh_a->samplerate) | |
2291 srate_idx = 6; | |
2292 else if (18783 <= sh_a->samplerate) | |
2293 srate_idx = 7; | |
2294 else if (13856 <= sh_a->samplerate) | |
2295 srate_idx = 8; | |
2296 else if (11502 <= sh_a->samplerate) | |
2297 srate_idx = 9; | |
2298 else if (9391 <= sh_a->samplerate) | |
2299 srate_idx = 10; | |
2300 else | |
2301 srate_idx = 11; | |
2302 | |
2303 sh_a->codecdata = (unsigned char *)safemalloc(2); | |
2304 sh_a->codecdata_len = 2; | |
2305 sh_a->codecdata[0] = ((profile + 1) << 3) | ((srate_idx & 0xe) >> 1); | 2310 sh_a->codecdata[0] = ((profile + 1) << 3) | ((srate_idx & 0xe) >> 1); |
2306 sh_a->codecdata[1] = ((srate_idx & 0x1) << 7) | (track->a_channels << 3); | 2311 sh_a->codecdata[1] = ((srate_idx & 0x1) << 7) | |
2312 (track->a_channels << 3); | |
2313 | |
2314 if (strstr(track->codec_id, "SBR") != NULL) { | |
2315 // HE-AAC (aka SBR AAC) | |
2316 sh_a->codecdata_len = 5; | |
2317 | |
2318 sh_a->samplerate *= 2; | |
2319 sh_a->wf->nSamplesPerSec *= 2; | |
2320 srate_idx = aac_get_sample_rate_index(sh_a->samplerate); | |
2321 sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3; | |
2322 sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5; | |
2323 sh_a->codecdata[4] = (1 << 7) | (srate_idx << 3); | |
2324 track->default_duration = 1024.0 / (float)(sh_a->samplerate / 2); | |
2325 | |
2326 } else { | |
2327 sh_a->codecdata_len = 2; | |
2328 track->default_duration = 1024.0 / (float)sh_a->samplerate; | |
2329 } | |
2307 | 2330 |
2308 } else if (!strcmp(track->codec_id, MKV_A_VORBIS)) { | 2331 } else if (!strcmp(track->codec_id, MKV_A_VORBIS)) { |
2309 for (i = 0; i < 3; i++) { | 2332 for (i = 0; i < 3; i++) { |
2310 dp = new_demux_packet(track->header_sizes[i]); | 2333 dp = new_demux_packet(track->header_sizes[i]); |
2311 memcpy(dp->buffer, track->headers[i], track->header_sizes[i]); | 2334 memcpy(dp->buffer, track->headers[i], track->header_sizes[i]); |
2588 | 2611 |
2589 extern "C" int demux_mkv_fill_buffer(demuxer_t *d) { | 2612 extern "C" int demux_mkv_fill_buffer(demuxer_t *d) { |
2590 demux_packet_t *dp; | 2613 demux_packet_t *dp; |
2591 demux_stream_t *ds; | 2614 demux_stream_t *ds; |
2592 mkv_demuxer_t *mkv_d; | 2615 mkv_demuxer_t *mkv_d; |
2593 mkv_track_t *t; | 2616 mkv_track_t *t = NULL; |
2594 int upper_lvl_el, exit_loop, found_data, i, linei, sl; | 2617 int upper_lvl_el, exit_loop, found_data, i, linei, sl; |
2595 char *texttmp; | 2618 char *texttmp; |
2596 // Elements for different levels | 2619 // Elements for different levels |
2597 EbmlElement *l0 = NULL, *l1 = NULL, *l2 = NULL, *l3 = NULL; | 2620 EbmlElement *l0 = NULL, *l1 = NULL, *l2 = NULL, *l3 = NULL; |
2598 EbmlStream *es; | 2621 EbmlStream *es; |
2790 } else | 2813 } else |
2791 use_this_block = false; | 2814 use_this_block = false; |
2792 | 2815 |
2793 if (use_this_block) { | 2816 if (use_this_block) { |
2794 mkv_d->last_pts = current_pts; | 2817 mkv_d->last_pts = current_pts; |
2818 ds->pts = current_pts; | |
2795 d->filepos = mkv_d->in->getFilePointer(); | 2819 d->filepos = mkv_d->in->getFilePointer(); |
2796 mkv_d->last_filepos = d->filepos; | 2820 mkv_d->last_filepos = d->filepos; |
2797 | 2821 |
2798 for (i = 0; i < (int)kblock->NumberFrames(); i++) { | 2822 for (i = 0; i < (int)kblock->NumberFrames(); i++) { |
2799 unsigned char *re_buffer; | 2823 unsigned char *re_buffer; |
2815 | 2839 |
2816 else { | 2840 else { |
2817 dp = new_demux_packet(re_size); | 2841 dp = new_demux_packet(re_size); |
2818 memcpy(dp->buffer, re_buffer, re_size); | 2842 memcpy(dp->buffer, re_buffer, re_size); |
2819 dp->flags = block_bref == 0 ? 1 : 0; | 2843 dp->flags = block_bref == 0 ? 1 : 0; |
2820 dp->pts = mkv_d->last_pts; | 2844 dp->pts = mkv_d->last_pts + i * t->default_duration; |
2821 ds_add_packet(ds, dp); | 2845 ds_add_packet(ds, dp); |
2822 found_data++; | 2846 found_data++; |
2823 } | 2847 } |
2824 if (re_modified) | 2848 if (re_modified) |
2825 safefree(re_buffer); | 2849 safefree(re_buffer); |