mirror of
https://github.com/mpv-player/mpv
synced 2024-12-23 15:22:09 +00:00
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.
This commit is contained in:
parent
562d8e6d32
commit
d33e5972b3
@ -297,7 +297,7 @@ struct playlist *playlist_parse_file(const char *file, struct mp_cancel *cancel,
|
||||
"pass it to the player\ndirectly. Don't use --playlist.\n");
|
||||
}
|
||||
}
|
||||
free_demuxer_and_stream(d);
|
||||
demux_free(d);
|
||||
|
||||
if (ret) {
|
||||
mp_verbose(log, "Playlist successfully parsed\n");
|
||||
|
@ -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)
|
||||
|
@ -177,6 +177,7 @@ struct demuxer_params {
|
||||
bool initial_readahead;
|
||||
bstr init_fragment;
|
||||
bool skip_lavf_probing;
|
||||
bool does_not_own_stream; // if false, stream is free'd on demux_free()
|
||||
// -- demux_open_url() only
|
||||
int stream_flags;
|
||||
bool disable_cache;
|
||||
@ -249,8 +250,7 @@ typedef struct {
|
||||
int aid, vid, sid; //audio, video and subtitle id
|
||||
} demux_program_t;
|
||||
|
||||
void free_demuxer(struct demuxer *demuxer);
|
||||
void free_demuxer_and_stream(struct demuxer *demuxer);
|
||||
void demux_free(struct demuxer *demuxer);
|
||||
|
||||
void demux_add_packet(struct sh_stream *stream, demux_packet_t *dp);
|
||||
void demuxer_feed_caption(struct sh_stream *stream, demux_packet_t *dp);
|
||||
|
@ -285,7 +285,10 @@ static int d_open(demuxer_t *demuxer, enum demux_check check)
|
||||
if (check != DEMUX_CHECK_FORCE)
|
||||
return -1;
|
||||
|
||||
struct demuxer_params params = {.force_format = "+lavf"};
|
||||
struct demuxer_params params = {
|
||||
.force_format = "+lavf",
|
||||
.does_not_own_stream = true,
|
||||
};
|
||||
|
||||
struct stream *cur = demuxer->stream;
|
||||
const char *sname = "";
|
||||
@ -350,7 +353,7 @@ static int d_open(demuxer_t *demuxer, enum demux_check check)
|
||||
static void d_close(demuxer_t *demuxer)
|
||||
{
|
||||
struct priv *p = demuxer->priv;
|
||||
free_demuxer(p->slave);
|
||||
demux_free(p->slave);
|
||||
}
|
||||
|
||||
static int d_control(demuxer_t *demuxer, int cmd, void *arg)
|
||||
|
@ -217,7 +217,7 @@ static bool check_file_seg(struct tl_ctx *ctx, char *filename, int segment)
|
||||
}
|
||||
|
||||
if (stream_wants_cache(d->stream, ctx->opts->stream_cache)) {
|
||||
free_demuxer_and_stream(d);
|
||||
demux_free(d);
|
||||
params.disable_cache = false;
|
||||
params.matroska_wanted_uids = ctx->uids; // potentially reallocated, same data
|
||||
d = demux_open_url(filename, ¶ms, cancel, ctx->global);
|
||||
@ -230,7 +230,7 @@ static bool check_file_seg(struct tl_ctx *ctx, char *filename, int segment)
|
||||
}
|
||||
}
|
||||
|
||||
free_demuxer_and_stream(d);
|
||||
demux_free(d);
|
||||
return was_valid;
|
||||
}
|
||||
|
||||
|
@ -147,7 +147,7 @@ static void close_lazy_segments(struct demuxer *demuxer)
|
||||
for (int n = 0; n < p->num_segments; n++) {
|
||||
struct segment *seg = p->segments[n];
|
||||
if (seg != p->current && seg->d && seg->lazy) {
|
||||
free_demuxer_and_stream(seg->d);
|
||||
demux_free(seg->d);
|
||||
seg->d = NULL;
|
||||
}
|
||||
}
|
||||
@ -431,7 +431,7 @@ static void d_close(struct demuxer *demuxer)
|
||||
p->current = NULL;
|
||||
close_lazy_segments(demuxer);
|
||||
timeline_destroy(p->tl);
|
||||
free_demuxer(master);
|
||||
demux_free(master);
|
||||
}
|
||||
|
||||
static int d_control(struct demuxer *demuxer, int cmd, void *arg)
|
||||
|
@ -34,9 +34,9 @@ void timeline_destroy(struct timeline *tl)
|
||||
for (int n = 0; n < tl->num_sources; n++) {
|
||||
struct demuxer *d = tl->sources[n];
|
||||
if (d != tl->demuxer && d != tl->track_layout)
|
||||
free_demuxer_and_stream(d);
|
||||
demux_free(d);
|
||||
}
|
||||
if (tl->track_layout && tl->track_layout != tl->demuxer)
|
||||
free_demuxer_and_stream(tl->track_layout);
|
||||
demux_free(tl->track_layout);
|
||||
talloc_free(tl);
|
||||
}
|
||||
|
@ -136,7 +136,7 @@ static void cancel_and_free_demuxer(struct MPContext *mpctx,
|
||||
if (cancel)
|
||||
mp_cancel_trigger(cancel);
|
||||
|
||||
free_demuxer_and_stream(*demuxer);
|
||||
demux_free(*demuxer);
|
||||
*demuxer = NULL;
|
||||
|
||||
talloc_free(cancel);
|
||||
|
Loading…
Reference in New Issue
Block a user