mirror of
https://github.com/mpv-player/mpv.git
synced 2024-09-20 12:02:23 +02:00
demux: add free_demuxer_and_stream() function
Although their lifetimes are conceptually different, it happens often that a demuxer is destroyed together with its stream.
This commit is contained in:
parent
44411674eb
commit
6c1355be96
@ -245,6 +245,15 @@ void free_demuxer(demuxer_t *demuxer)
|
|||||||
talloc_free(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.
|
// Start the demuxer thread, which reads ahead packets on its own.
|
||||||
void demux_start_thread(struct demuxer *demuxer)
|
void demux_start_thread(struct demuxer *demuxer)
|
||||||
{
|
{
|
||||||
|
@ -242,6 +242,7 @@ typedef struct {
|
|||||||
} demux_program_t;
|
} demux_program_t;
|
||||||
|
|
||||||
void free_demuxer(struct demuxer *demuxer);
|
void free_demuxer(struct demuxer *demuxer);
|
||||||
|
void free_demuxer_and_stream(struct demuxer *demuxer);
|
||||||
|
|
||||||
int demux_add_packet(struct sh_stream *stream, demux_packet_t *dp);
|
int demux_add_packet(struct sh_stream *stream, demux_packet_t *dp);
|
||||||
|
|
||||||
|
@ -157,9 +157,8 @@ static int enable_cache(struct mpv_global *global, struct stream **stream,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
char *filename = talloc_strdup(NULL, (*demuxer)->filename);
|
char *filename = talloc_strdup(NULL, (*demuxer)->filename);
|
||||||
free_demuxer(*demuxer);
|
|
||||||
free_stream(*stream);
|
|
||||||
|
|
||||||
|
free_demuxer_and_stream(*demuxer);
|
||||||
*stream = stream_open(filename, global);
|
*stream = stream_open(filename, global);
|
||||||
if (!*stream) {
|
if (!*stream) {
|
||||||
talloc_free(filename);
|
talloc_free(filename);
|
||||||
@ -251,8 +250,7 @@ static bool check_file_seg(struct tl_ctx *ctx, struct demuxer ***sources,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free_demuxer(d);
|
free_demuxer_and_stream(d);
|
||||||
free_stream(s);
|
|
||||||
return was_valid;
|
return was_valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,11 +32,8 @@ void timeline_destroy(struct timeline *tl)
|
|||||||
return;
|
return;
|
||||||
for (int n = 0; n < tl->num_sources; n++) {
|
for (int n = 0; n < tl->num_sources; n++) {
|
||||||
struct demuxer *d = tl->sources[n];
|
struct demuxer *d = tl->sources[n];
|
||||||
if (d != tl->demuxer) {
|
if (d != tl->demuxer)
|
||||||
struct stream *s = d->stream;
|
free_demuxer_and_stream(d);
|
||||||
free_demuxer(d);
|
|
||||||
free_stream(s);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
talloc_free(tl);
|
talloc_free(tl);
|
||||||
}
|
}
|
||||||
|
@ -75,10 +75,8 @@ static void close_unused_demuxers(struct MPContext *mpctx)
|
|||||||
goto skip;
|
goto skip;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct stream *s = d->stream;
|
|
||||||
uninit_stream_sub_decoders(d);
|
uninit_stream_sub_decoders(d);
|
||||||
free_demuxer(d);
|
free_demuxer_and_stream(d);
|
||||||
free_stream(s);
|
|
||||||
MP_TARRAY_REMOVE_AT(mpctx->sources, mpctx->num_sources, i);
|
MP_TARRAY_REMOVE_AT(mpctx->sources, mpctx->num_sources, i);
|
||||||
|
|
||||||
skip:;
|
skip:;
|
||||||
@ -723,10 +721,8 @@ struct track *mp_add_external_file(struct MPContext *mpctx, char *filename,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!first) {
|
if (!first) {
|
||||||
free_demuxer(demuxer);
|
free_demuxer_and_stream(demuxer);
|
||||||
free_stream(stream);
|
MP_WARN(mpctx, "No streams added from file %s.\n", disp_filename);
|
||||||
MP_WARN(mpctx, "No streams added from file %s.\n",
|
|
||||||
disp_filename);
|
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -736,8 +732,7 @@ struct track *mp_add_external_file(struct MPContext *mpctx, char *filename,
|
|||||||
return first;
|
return first;
|
||||||
|
|
||||||
err_out:
|
err_out:
|
||||||
MP_ERR(mpctx, "Can not open external file %s.\n",
|
MP_ERR(mpctx, "Can not open external file %s.\n", disp_filename);
|
||||||
disp_filename);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user