From d33e5972b38c1a8d1ed2c19095a94c70c33881c3 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 19 May 2018 14:41:06 +0200 Subject: demux: get rid of free_demuxer[_and_stream]() Them being separate is just dumb. Replace them with a single demux_free() function, and free its stream by default. Not freeing the stream is only needed in 1 special case (demux_disc.c), use a special flag to not free the stream in this case. --- demux/demux.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'demux/demux.c') diff --git a/demux/demux.c b/demux/demux.c index ef420eb5ab..7807a919ae 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -130,6 +130,8 @@ struct demux_internal { struct demuxer *d_thread; // accessed by demuxer impl. (producer) struct demuxer *d_user; // accessed by player (consumer) + bool owns_stream; + // The lock protects the packet queues (struct demux_stream), // and the fields below. pthread_mutex_t lock; @@ -943,7 +945,7 @@ int demux_get_num_stream(struct demuxer *demuxer) return r; } -void free_demuxer(demuxer_t *demuxer) +void demux_free(struct demuxer *demuxer) { if (!demuxer) return; @@ -958,6 +960,9 @@ void free_demuxer(demuxer_t *demuxer) demux_flush(demuxer); assert(in->total_bytes == 0); + if (in->owns_stream) + free_stream(demuxer->stream); + for (int n = 0; n < in->num_streams; n++) talloc_free(in->streams[n]); pthread_mutex_destroy(&in->lock); @@ -965,15 +970,6 @@ void free_demuxer(demuxer_t *demuxer) talloc_free(demuxer); } -void free_demuxer_and_stream(struct demuxer *demuxer) -{ - if (!demuxer) - return; - struct stream *s = demuxer->stream; - free_demuxer(demuxer); - free_stream(s); -} - // Start the demuxer thread, which reads ahead packets on its own. void demux_start_thread(struct demuxer *demuxer) { @@ -2307,7 +2303,7 @@ static struct demuxer *open_given_type(struct mpv_global *global, return demuxer; } - free_demuxer(demuxer); + demux_free(demuxer); return NULL; } @@ -2316,6 +2312,9 @@ static const int d_request[] = {DEMUX_CHECK_REQUEST, -1}; static const int d_force[] = {DEMUX_CHECK_FORCE, -1}; // params can be NULL +// If params->does_not_own_stream==false, this does _not_ free the stream if +// opening fails. But if it succeeds, a later demux_free() call will free the +// stream. struct demuxer *demux_open(struct stream *stream, struct demuxer_params *params, struct mpv_global *global) { @@ -2355,6 +2354,8 @@ struct demuxer *demux_open(struct stream *stream, struct demuxer_params *params, if (demuxer) { talloc_steal(demuxer, log); log = NULL; + demuxer->in->owns_stream = + params ? !params->does_not_own_stream : false; goto done; } } @@ -2368,16 +2369,16 @@ done: // Convenience function: open the stream, enable the cache (according to params // and global opts.), open the demuxer. -// (use free_demuxer_and_stream() to free the underlying stream too) // Also for some reason may close the opened stream if it's not needed. struct demuxer *demux_open_url(const char *url, - struct demuxer_params *params, - struct mp_cancel *cancel, - struct mpv_global *global) + struct demuxer_params *params, + struct mp_cancel *cancel, + struct mpv_global *global) { struct demuxer_params dummy = {0}; if (!params) params = &dummy; + assert(!params->does_not_own_stream); // API user error struct stream *s = stream_create(url, STREAM_READ | params->stream_flags, cancel, global); if (!s) -- cgit v1.2.3