From af0c41e162725b0edcd6c3d066a2dbef05a3b896 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 7 Jul 2013 23:54:11 +0200 Subject: Remove old demuxers Delete demux_avi, demux_asf, demux_mpg, demux_ts. libavformat does better than them (except in rare corner cases), and the demuxers have a bad influence on the rest of the code. Often they don't output proper packets, and require additional audio and video parsing. Most work only in --no-correct-pts mode. Remove them to facilitate further cleanups. --- demux/demux_mkv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 1c93fa588c..724bf6255b 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -722,10 +722,11 @@ static void add_block_position(demuxer_t *demuxer, struct mkv_track *track, static int demux_mkv_read_cues(demuxer_t *demuxer) { + struct MPOpts *opts = demuxer->opts; mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; stream_t *s = demuxer->stream; - if (index_mode == 0 || index_mode == 2) { + if (opts->index_mode == 0 || opts->index_mode == 2) { ebml_read_skip(s, NULL); return 0; } -- cgit v1.2.3 From 05ae5afd6249af9770eb1e55104fbd4f510c2342 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 8 Jul 2013 01:26:13 +0200 Subject: demux: remove separate arrays for audio/video/sub streams, simplify These separate arrays were used by the old demuxers and are not needed anymore. We can simplify track switching as well. One interesting thing is that stream/tv.c (which is a demuxer) won't respect --no-audio anymore. It will probably work as expected, but it will still open an audio device etc. - this is because track selection is now always done with the runtime track switching mechanism. Maybe the TV code could be updated to do proper runtime switching, but I can't test this stuff. --- demux/demux_mkv.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 724bf6255b..b00c115ef2 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1962,9 +1962,8 @@ static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track, } else dp->pts = real_fix_timestamp(dp->buffer, timestamp, - ((sh_video_t *) demuxer->video->sh)->bih-> - biCompression, &track->rv_kf_base, - &track->rv_kf_pts, NULL); + demuxer->video->gsh->video->bih->biCompression, + &track->rv_kf_base, &track->rv_kf_pts, NULL); dp->pos = demuxer->filepos; dp->keyframe = keyframe; @@ -2047,8 +2046,7 @@ static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track, if (track->sub_packet_cnt == 0) track->audio_filepos = demuxer->filepos; if (++(track->sub_packet_cnt) == sph) { - int apk_usize = - ((sh_audio_t *) demuxer->audio->sh)->wf->nBlockAlign; + int apk_usize = demuxer->audio->gsh->audio->wf->nBlockAlign; track->sub_packet_cnt = 0; // Release all the audio packets for (x = 0; x < sph * w / apk_usize; x++) { -- cgit v1.2.3 From 6ede485e4b2ea1093e84d8589a1c321fe8a8462a Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 11 Jul 2013 19:17:51 +0200 Subject: core: don't access demux_stream outside of demux.c, make it private Generally remove all accesses to demux_stream from all the code, except inside of demux.c. Make it completely private to demux.c. This simplifies the code because it removes an extra concept. In demux.c it is reduced to a simple packet queue. There were other uses of demux_stream, but they were removed or are removed with this commit. Remove the extra "ds" argument to demux fill_buffer callback. It was used by demux_avi and the TV pseudo-demuxer only. Remove usage of d_video->last_pts from the no-correct-pts code. This field contains the last PTS retrieved after a packet that is not NOPTS. We can easily get this value manually because we read the packets ourselves. Reuse sh_video->last_pts to store the packet PTS values. It was used only by the correct-pts code before, and like d_video->last_pts, it is reset on seek. The behavior should be exactly the same. --- demux/demux_mkv.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index b00c115ef2..7b674c9465 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1962,7 +1962,7 @@ static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track, } else dp->pts = real_fix_timestamp(dp->buffer, timestamp, - demuxer->video->gsh->video->bih->biCompression, + track->stream->video->bih->biCompression, &track->rv_kf_base, &track->rv_kf_pts, NULL); dp->pos = demuxer->filepos; dp->keyframe = keyframe; @@ -2046,7 +2046,7 @@ static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track, if (track->sub_packet_cnt == 0) track->audio_filepos = demuxer->filepos; if (++(track->sub_packet_cnt) == sph) { - int apk_usize = demuxer->audio->gsh->audio->wf->nBlockAlign; + int apk_usize = track->stream->audio->wf->nBlockAlign; track->sub_packet_cnt = 0; // Release all the audio packets for (x = 0; x < sph * w / apk_usize; x++) { @@ -2465,7 +2465,7 @@ static int read_next_block(demuxer_t *demuxer, struct block_info *block) } } -static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) +static int demux_mkv_fill_buffer(demuxer_t *demuxer) { for (;;) { int res; @@ -2657,7 +2657,7 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs, : 0; mkv_d->a_skip_to_keyframe = 1; - demux_mkv_fill_buffer(demuxer, NULL); + demux_mkv_fill_buffer(demuxer); } else if ((demuxer->movi_end <= 0) || !(flags & SEEK_ABSOLUTE)) mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n"); else { @@ -2696,7 +2696,7 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs, mkv_d->skip_to_timecode = index->timecode * mkv_d->tc_scale; mkv_d->a_skip_to_keyframe = 1; - demux_mkv_fill_buffer(demuxer, NULL); + demux_mkv_fill_buffer(demuxer); } } -- cgit v1.2.3 From a6706c41d8d89bc1a72dd21e215885e79a766db2 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 11 Jul 2013 19:21:45 +0200 Subject: video: eliminate frametime variable --- demux/demux_mkv.c | 1 - 1 file changed, 1 deletion(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 7b674c9465..c84bdf4392 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1283,7 +1283,6 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) if (track->v_frate == 0.0) track->v_frate = 25.0; sh_v->fps = track->v_frate; - sh_v->frametime = 1 / track->v_frate; sh_v->aspect = 0; if (!track->realmedia) { sh_v->disp_w = track->v_width; -- cgit v1.2.3 From ac080c77fb9835db3c5a8c42e0ea18fdf209ea09 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 11 Jul 2013 19:35:09 +0200 Subject: stheader: minor cleanup Move codec_tags.h include to demux_mkv.c, because this is the only file which still uses it. Move new_sh_stream() to demux.h, because this is more proper. --- demux/demux_mkv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index c84bdf4392..0d174639c7 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -49,7 +49,7 @@ #include "stheader.h" #include "ebml.h" #include "matroska.h" -//#include "demux_real.h" +#include "codec_tags.h" #include "core/mp_msg.h" -- cgit v1.2.3 From d17d2fdc7c536821b3fea8c4a37c0ad09fc487db Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 11 Jul 2013 20:08:12 +0200 Subject: demux: change signature of open functions, cleanups Preparation for redoing the open functions. --- demux/demux_mkv.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 0d174639c7..a60172cce9 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1759,11 +1759,11 @@ static int demux_mkv_open(demuxer_t *demuxer) stream_seek(s, s->start_pos); if (!read_ebml_header(demuxer)) - return 0; + return -1; mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n"); if (!read_mkv_segment_header(demuxer)) - return 0; + return -1; mkv_d = talloc_zero(demuxer, struct mkv_demuxer); demuxer->priv = mkv_d; @@ -1788,7 +1788,7 @@ static int demux_mkv_open(demuxer_t *demuxer) } int res = read_header_element(demuxer, id, 0); if (res <= -2) - return 0; + return -1; if (res < 0) break; } @@ -1805,7 +1805,7 @@ static int demux_mkv_open(demuxer_t *demuxer) demuxer->accurate_seek = true; - return DEMUXER_TYPE_MATROSKA; + return 0; } static bool bstr_read_u8(bstr *buffer, uint8_t *out_u8) @@ -2718,17 +2718,16 @@ static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg) } const demuxer_desc_t demuxer_desc_matroska = { - "Matroska demuxer", - "mkv", - "Matroska", - "Aurelien Jacobs", - "", - DEMUXER_TYPE_MATROSKA, - 1, // safe autodetect - demux_mkv_open, - demux_mkv_fill_buffer, - NULL, - mkv_free, - demux_mkv_seek, - demux_mkv_control + .info = "Matroska demuxer", + .name = "mkv", + .shortdesc = "Matroska", + .author = "Aurelien Jacobs", + .comment = "", + .type = DEMUXER_TYPE_MATROSKA, + .safe_check = 1, // safe autodetect + .check_file = demux_mkv_open, + .fill_buffer = demux_mkv_fill_buffer, + .close = mkv_free, + .seek = demux_mkv_seek, + .control = demux_mkv_control }; -- cgit v1.2.3 From 3269bd178020c5d821e8b2d1fd807a38d63e93ce Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 12 Jul 2013 21:58:11 +0200 Subject: demux: rewrite probing and demuxer initialization Get rid of the strange and messy reliance on DEMUXER_TYPE_ constants. Instead of having two open functions for the demuxer callbacks (which somehow are both optional, but you can also decide to implement both...), just have one function. This function takes a parameter that tells the demuxer how strictly it should check for the file headers. This is a nice simplification and allows more flexibility. Remove the file extension code. This literally did nothing (anymore). Change demux_lavf so that we check our other builtin demuxers first before libavformat tries to guess by file extension. --- demux/demux_mkv.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index a60172cce9..efc4c8f989 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1751,7 +1751,7 @@ static int read_mkv_segment_header(demuxer_t *demuxer) return 0; } -static int demux_mkv_open(demuxer_t *demuxer) +static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check) { stream_t *s = demuxer->stream; mkv_demuxer_t *mkv_d; @@ -2724,8 +2724,7 @@ const demuxer_desc_t demuxer_desc_matroska = { .author = "Aurelien Jacobs", .comment = "", .type = DEMUXER_TYPE_MATROSKA, - .safe_check = 1, // safe autodetect - .check_file = demux_mkv_open, + .open = demux_mkv_open, .fill_buffer = demux_mkv_fill_buffer, .close = mkv_free, .seek = demux_mkv_seek, -- cgit v1.2.3 From 6c414f8c7a66ce3bb0c2446cb7fb0fb802a9e98b Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 12 Jul 2013 22:12:02 +0200 Subject: demux: remove useless author/comment fields Same deal as with previous commit. --- demux/demux_mkv.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index efc4c8f989..3fb57423a8 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -2718,11 +2718,8 @@ static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg) } const demuxer_desc_t demuxer_desc_matroska = { - .info = "Matroska demuxer", .name = "mkv", - .shortdesc = "Matroska", - .author = "Aurelien Jacobs", - .comment = "", + .desc = "Matroska", .type = DEMUXER_TYPE_MATROSKA, .open = demux_mkv_open, .fill_buffer = demux_mkv_fill_buffer, -- cgit v1.2.3 From 879c7a101b36674a952791d2f97cc38782052435 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 12 Jul 2013 22:12:31 +0200 Subject: demux: assume correct-pts mode by default All demuxers make a reasonable effort to set packet timestamps, and thus support correct-pts mode. This commit also implicitly switches demux_rawvideo to correct-pts mode. We still allow demuxers to disable correct-pts mode in theory. --- demux/demux_mkv.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 3fb57423a8..69ace3b4db 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -2704,8 +2704,6 @@ static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg) mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; switch (cmd) { - case DEMUXER_CTRL_CORRECT_PTS: - return DEMUXER_CTRL_OK; case DEMUXER_CTRL_GET_TIME_LENGTH: if (mkv_d->duration == 0) return DEMUXER_CTRL_DONTKNOW; -- cgit v1.2.3 From 6c1e9e4a45d92216a1433ed73ba8f2e09529ca19 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 12 Jul 2013 22:26:15 +0200 Subject: demux: make claiming accurate seek the default Enables hr-seek for raw audio/video demuxers. --- demux/demux_mkv.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 69ace3b4db..76b7c1d059 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1803,8 +1803,6 @@ static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check) demuxer->seekable = 1; } - demuxer->accurate_seek = true; - return 0; } -- cgit v1.2.3 From 84b69dcda51bc4efdac78eaf9a1087eafcc91c1e Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 12 Jul 2013 23:30:29 +0200 Subject: demux_mkv: remove weird i_bps calculation code Useless, as i_bps isn't really used for anything anymore. --- demux/demux_mkv.c | 20 -------------------- 1 file changed, 20 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 76b7c1d059..ed6de6a69c 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -142,10 +142,6 @@ typedef struct mkv_track { int sub_packet_cnt; ///< number of subpacket already received int audio_filepos; ///< file position of first audio packet in block - /* stuff for quicktime */ - int fix_i_bps; - double qt_last_a_pts; - /* generic content encoding support */ mkv_content_encoding_t *encodings; int num_encodings; @@ -1430,8 +1426,6 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) || !strcmp(track->codec_id, MKV_A_QDMC2)) { sh_a->wf->nAvgBytesPerSec = 16000; sh_a->wf->nBlockAlign = 1486; - track->fix_i_bps = 1; - track->qt_last_a_pts = 0.0; copy_audio_private_data(sh_a, track); } else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) { int profile, srate_idx; @@ -2273,20 +2267,6 @@ static int handle_block(demuxer_t *demuxer, struct block_info *block_info) use_this_block = keyframe; if (mkv_d->v_skip_to_keyframe) use_this_block = 0; - - if (track->fix_i_bps && use_this_block) { - sh_audio_t *sh = stream->audio; - - if (block_duration != 0) { - sh->i_bps = data.len * 1e9 / block_duration; - track->fix_i_bps = 0; - } else if (track->qt_last_a_pts == 0.0) - track->qt_last_a_pts = current_pts; - else if (track->qt_last_a_pts != current_pts) { - sh->i_bps = data.len / (current_pts - track->qt_last_a_pts); - track->fix_i_bps = 0; - } - } } else if (track->type == MATROSKA_TRACK_SUBTITLE) { use_this_block |= mkv_d->subtitle_preroll; if (use_this_block) { -- cgit v1.2.3