From c4f33d784a058325b26ba82f34c43dab0cb19dc8 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 8 Jul 2013 00:35:04 +0200 Subject: demux: remove some old stream header functions --- demux/demux_mng.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'demux/demux_mng.c') diff --git a/demux/demux_mng.c b/demux/demux_mng.c index bd86b3e3b8..4b2077d31f 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -423,7 +423,8 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) } // create a new video stream header - sh_video = new_sh_video(demuxer, 0); + struct sh_stream *sh = new_sh_stream(demuxer, STREAM_VIDEO); + sh_video = sh->video; // Make sure the demuxer knows about the new video stream header // (even though new_sh_video() ought to take care of it). -- 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_mng.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'demux/demux_mng.c') diff --git a/demux/demux_mng.c b/demux/demux_mng.c index 4b2077d31f..1f73399902 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -426,11 +426,6 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) struct sh_stream *sh = new_sh_stream(demuxer, STREAM_VIDEO); sh_video = sh->video; - // Make sure the demuxer knows about the new video stream header - // (even though new_sh_video() ought to take care of it). - // (Thanks to demux_gif.c for this.) - demuxer->video->sh = sh_video; - // Make sure that the video demuxer stream header knows about its // parent video demuxer stream (this is getting wacky), or else // video_read_properties() will choke. -- cgit v1.2.3 From 32ad3138445dbf4ac16199ced2ad239a1a8c4e3f Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 8 Jul 2013 23:18:31 +0200 Subject: demux: remove some more minor unused things --- demux/demux_mng.c | 1 - 1 file changed, 1 deletion(-) (limited to 'demux/demux_mng.c') diff --git a/demux/demux_mng.c b/demux/demux_mng.c index 1f73399902..76b742f019 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -346,7 +346,6 @@ static int demux_mng_fill_buffer(demuxer_t * demuxer, // Set position and timing information in demuxer video and demuxer packet. // - Time must be time of next frame and always be > 0 for the variable // frame time mechanism (GIF, MATROSKA, MNG) in video.c to work. - demuxer->video->dpos++; dp->pts = (float)mng_priv->show_next_time_ms / 1000.0f + MNG_START_PTS; dp->pos = stream_tell(demuxer->stream); ds_add_packet(demuxer->video, dp); -- cgit v1.2.3 From a5224836293ac02bd13f688cfc848aae6818e963 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 11 Jul 2013 19:10:33 +0200 Subject: demux: remove facility for partial packet reads Partial packet reads were needed because the video/audio parsers were working on top of them. So it could happen that a parser read a part of a packet, and returned that to the decoder. With libavformat/libavcodec, packets are already parsed, and everything is much simpler. Most of the simplifications in ad_spdif could have been done earlier. Remove some other stuff as well, like the questionable slave mode start time reporting (could be replaced by proper code, but we don't bother). Remove the unused skip_audio_frame() functionality as well (it was used by old demuxers). Some functions become private to demux.c, like demux_fill_buffer(). Introduce new packet read functions, which have simpler semantics. Packets returned from them are owned by the caller, and all packets in the demux.c packet queue are considered unread. Remove special code that dropped subtitle packets with size 0. This used to be needed because it caused special cases in the old code. --- demux/demux_mng.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) (limited to 'demux/demux_mng.c') diff --git a/demux/demux_mng.c b/demux/demux_mng.c index 76b742f019..6dc0e352e8 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -37,14 +37,6 @@ #define MNG_SUPPORT_DISPLAY #include -/** - * \brief some small fixed start time > 0 - * - * Start time must be > 0 for the variable frame time mechanism - * (GIF, MATROSKA, MNG) in video.c to work for the first frame. - */ -#define MNG_START_PTS 0.01f - /** * \brief private context structure * @@ -346,7 +338,7 @@ static int demux_mng_fill_buffer(demuxer_t * demuxer, // Set position and timing information in demuxer video and demuxer packet. // - Time must be time of next frame and always be > 0 for the variable // frame time mechanism (GIF, MATROSKA, MNG) in video.c to work. - dp->pts = (float)mng_priv->show_next_time_ms / 1000.0f + MNG_START_PTS; + dp->pts = (float)mng_priv->show_next_time_ms / 1000.0f; dp->pos = stream_tell(demuxer->stream); ds_add_packet(demuxer->video, dp); @@ -447,11 +439,6 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) sh_video->bih->biBitCount = 32; sh_video->bih->biPlanes = 1; - // Set start time to something > 0. - // - This is required for the variable frame time mechanism - // (GIF, MATROSKA, MNG) in video.c to work for the first frame. - sh_video->ds->pts = MNG_START_PTS; - // set private data in demuxer and return demuxer demuxer->priv = mng_priv; return demuxer; -- 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_mng.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) (limited to 'demux/demux_mng.c') diff --git a/demux/demux_mng.c b/demux/demux_mng.c index 6dc0e352e8..22299ea17b 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -272,11 +272,9 @@ static int demux_mng_check_file(demuxer_t *demuxer) /** * \brief MPlayer callback: Fill buffer from MNG stream. * \param[in] demuxer demuxer structure - * \param[in] ds demuxer stream * \return \p 1 on success, \p 0 on error */ -static int demux_mng_fill_buffer(demuxer_t * demuxer, - demux_stream_t * ds) +static int demux_mng_fill_buffer(demuxer_t * demuxer) { mng_priv_t * mng_priv = demuxer->priv; mng_handle h_mng = mng_priv->h_mng; @@ -340,7 +338,7 @@ static int demux_mng_fill_buffer(demuxer_t * demuxer, // frame time mechanism (GIF, MATROSKA, MNG) in video.c to work. dp->pts = (float)mng_priv->show_next_time_ms / 1000.0f; dp->pos = stream_tell(demuxer->stream); - ds_add_packet(demuxer->video, dp); + demuxer_add_packet(demuxer, demuxer->streams[0], dp); return 1; } @@ -417,12 +415,6 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) struct sh_stream *sh = new_sh_stream(demuxer, STREAM_VIDEO); sh_video = sh->video; - // Make sure that the video demuxer stream header knows about its - // parent video demuxer stream (this is getting wacky), or else - // video_read_properties() will choke. - // (Thanks to demux_gif.c for this.) - sh_video->ds = demuxer->video; - // set format of pixels in video packets sh_video->gsh->codec = "rawvideo"; sh_video->format = MP_FOURCC_RGB32; -- 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_mng.c | 1 - 1 file changed, 1 deletion(-) (limited to 'demux/demux_mng.c') diff --git a/demux/demux_mng.c b/demux/demux_mng.c index 22299ea17b..34fdf521b5 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -421,7 +421,6 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) // set framerate to some value (MNG does not have a fixed framerate) sh_video->fps = 5.0f; - sh_video->frametime = 1.0f / sh_video->fps; // set video frame parameters sh_video->bih = calloc(1, sizeof(*sh_video->bih)); -- 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_mng.c | 49 ++++++++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 27 deletions(-) (limited to 'demux/demux_mng.c') diff --git a/demux/demux_mng.c b/demux/demux_mng.c index 34fdf521b5..824a668868 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -263,10 +263,10 @@ static int demux_mng_check_file(demuxer_t *demuxer) { char buf[4]; if (stream_read(demuxer->stream, buf, 4) != 4) - return 0; + return -1; if (memcmp(buf, "\x8AMNG", 4)) - return 0; - return DEMUXER_TYPE_MNG; + return -1; + return 0; } /** @@ -343,12 +343,7 @@ static int demux_mng_fill_buffer(demuxer_t * demuxer) return 1; } -/** - * \brief MPlayer callback: Open MNG stream. - * \param[in] demuxer demuxer structure - * \return demuxer structure on success, \p NULL on error - */ -static demuxer_t * demux_mng_open(demuxer_t * demuxer) +static int demux_mng_open(demuxer_t * demuxer) { mng_priv_t * mng_priv; mng_handle h_mng; @@ -368,7 +363,7 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) mp_msg(MSGT_DEMUX, MSGL_ERR, "demux_mng: could not initialize MNG image instance\n"); free(mng_priv); - return NULL; + return -1; } // MNG image handle into private data @@ -388,7 +383,7 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) "demux_mng: could not set MNG callbacks\n"); mng_cleanup(&h_mng); free(mng_priv); - return NULL; + return -1; } // start reading MNG data @@ -399,7 +394,7 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) "mng_retcode %d\n", mng_ret); mng_cleanup(&h_mng); free(mng_priv); - return NULL; + return -1; } // check that MNG header is processed now @@ -408,7 +403,7 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) "demux_mng: internal error: header not processed\n"); mng_cleanup(&h_mng); free(mng_priv); - return NULL; + return -1; } // create a new video stream header @@ -432,7 +427,7 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer) // set private data in demuxer and return demuxer demuxer->priv = mng_priv; - return demuxer; + return 0; } /** @@ -569,17 +564,17 @@ static int demux_mng_control(demuxer_t * demuxer, int cmd, void * arg) } const demuxer_desc_t demuxer_desc_mng = { - "MNG demuxer", - "mng", - "MNG", - "Stefan Schuermans ", - "MNG files, using libmng", - DEMUXER_TYPE_MNG, - 0, // unsafe autodetect (only checking magic at beginning of stream) - demux_mng_check_file, - demux_mng_fill_buffer, - demux_mng_open, - demux_mng_close, - demux_mng_seek, - demux_mng_control + .info = "MNG demuxer", + .name = "mng", + .shortdesc = "MNG", + .author = "Stefan Schuermans ", + .comment = "MNG files, using libmng", + .type = DEMUXER_TYPE_MNG, + .safe_check = 0, // unsafe autodetect (only checking magic at beginning of stream) + .check_file = demux_mng_check_file, + .fill_buffer = demux_mng_fill_buffer, + .open = demux_mng_open, + .close = demux_mng_close, + .seek = demux_mng_seek, + .control = demux_mng_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_mng.c | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) (limited to 'demux/demux_mng.c') diff --git a/demux/demux_mng.c b/demux/demux_mng.c index 824a668868..6c5bbc2e45 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -254,21 +254,6 @@ static mng_bool demux_mng_settimer(mng_handle h_mng, mng_uint32 msecs) return MNG_TRUE; } -/** - * \brief MPlayer callback: Check if stream contains MNG data. - * \param[in] demuxer demuxer structure - * \return demuxer type constant, \p 0 if unknown - */ -static int demux_mng_check_file(demuxer_t *demuxer) -{ - char buf[4]; - if (stream_read(demuxer->stream, buf, 4) != 4) - return -1; - if (memcmp(buf, "\x8AMNG", 4)) - return -1; - return 0; -} - /** * \brief MPlayer callback: Fill buffer from MNG stream. * \param[in] demuxer demuxer structure @@ -343,13 +328,24 @@ static int demux_mng_fill_buffer(demuxer_t * demuxer) return 1; } -static int demux_mng_open(demuxer_t * demuxer) +static int demux_mng_open(demuxer_t * demuxer, enum demux_check check) { mng_priv_t * mng_priv; mng_handle h_mng; mng_retcode mng_ret; sh_video_t * sh_video; + if (check > DEMUX_CHECK_REQUEST) + return -1; // check too unsafe + if (check > DEMUX_CHECK_FORCE) { + char buf[4]; + if (stream_read(demuxer->stream, buf, 4) != 4) + return -1; + if (memcmp(buf, "\x8AMNG", 4)) + return -1; + stream_seek(demuxer->stream, demuxer->stream->start_pos); + } + // create private data structure mng_priv = calloc(1, sizeof(mng_priv_t)); @@ -569,9 +565,6 @@ const demuxer_desc_t demuxer_desc_mng = { .shortdesc = "MNG", .author = "Stefan Schuermans ", .comment = "MNG files, using libmng", - .type = DEMUXER_TYPE_MNG, - .safe_check = 0, // unsafe autodetect (only checking magic at beginning of stream) - .check_file = demux_mng_check_file, .fill_buffer = demux_mng_fill_buffer, .open = demux_mng_open, .close = demux_mng_close, -- 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_mng.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'demux/demux_mng.c') diff --git a/demux/demux_mng.c b/demux/demux_mng.c index 6c5bbc2e45..ea82ab257f 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -560,11 +560,8 @@ static int demux_mng_control(demuxer_t * demuxer, int cmd, void * arg) } const demuxer_desc_t demuxer_desc_mng = { - .info = "MNG demuxer", .name = "mng", - .shortdesc = "MNG", - .author = "Stefan Schuermans ", - .comment = "MNG files, using libmng", + .desc = "MNG", .fill_buffer = demux_mng_fill_buffer, .open = demux_mng_open, .close = demux_mng_close, -- 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_mng.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'demux/demux_mng.c') diff --git a/demux/demux_mng.c b/demux/demux_mng.c index ea82ab257f..f6cb66302c 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -421,6 +421,9 @@ static int demux_mng_open(demuxer_t * demuxer, enum demux_check check) sh_video->bih->biBitCount = 32; sh_video->bih->biPlanes = 1; + // weirdly broken + demuxer->accurate_seek = false; + // set private data in demuxer and return demuxer demuxer->priv = mng_priv; return 0; -- cgit v1.2.3