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);