diff --git a/libavformat/avformat.h b/libavformat/avformat.h index b9e83bf73e..ac41fee95f 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -661,6 +661,12 @@ int av_read_play(AVFormatContext *s); */ int av_read_pause(AVFormatContext *s); +/** + * Free a AVFormatContext allocated by av_open_input_stream. + * @param s context to free + */ +void av_close_input_stream(AVFormatContext *s); + /** * Close a media file (but not its codecs). * diff --git a/libavformat/utils.c b/libavformat/utils.c index 386fe60718..f4cf10f14d 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2056,7 +2056,7 @@ int av_read_pause(AVFormatContext *s) return AVERROR(ENOSYS); } -void av_close_input_file(AVFormatContext *s) +void av_close_input_stream(AVFormatContext *s) { int i; AVStream *st; @@ -2085,12 +2085,18 @@ void av_close_input_file(AVFormatContext *s) av_freep(&s->programs[i]); } flush_packet_queue(s); - if (!(s->iformat->flags & AVFMT_NOFILE)) - url_fclose(s->pb); av_freep(&s->priv_data); av_free(s); } +void av_close_input_file(AVFormatContext *s) +{ + ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb; + av_close_input_stream(s); + if (pb) + url_fclose(pb); +} + AVStream *av_new_stream(AVFormatContext *s, int id) { AVStream *st;