[FFmpeg-devel] [PATCH] avformat/concatdec: don't call open_file when seek position within a file
raymond zheng
raymondzheng1412 at gmail.com
Thu Sep 22 05:02:36 EEST 2016
ping...
2016-09-20 15:04 GMT+08:00 raymond zheng <raymondzheng1412 at gmail.com>:
> Submit reasons:
>
> I have enabled concat and async protocol,but ffmpeg will flush async
> buffer when doing seek. I don't want flush async buffer when doing seek
> within the same segment file.
> I found, the concatdev will call open_file everytime I try to do seek,
> which will cause call async_open,and then flush async buffer.
>
>
> Solution:
>
> I will judge if seek range in the same segment file, if so, I‘ll only call
> try_seek.
>
>
> 2016-09-20 12:31 GMT+08:00 raymond <raymondzheng1412 at gmail.com>:
>
>> ---
>> libavformat/concatdec.c | 27 ++++++++++++++++++++-------
>> 1 file changed, 20 insertions(+), 7 deletions(-)
>>
>> diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
>> index b3a430e..1cd9ec1 100644
>> --- a/libavformat/concatdec.c
>> +++ b/libavformat/concatdec.c
>> @@ -64,6 +64,8 @@ typedef struct {
>> ConcatMatchMode stream_match_mode;
>> unsigned auto_convert;
>> int segment_time_metadata;
>> + int cur_fileno;
>> + AVFormatContext *cur_avf_saved;
>> } ConcatContext;
>>
>> static int concat_probe(AVProbeData *probe)
>> @@ -333,6 +335,8 @@ static int open_file(AVFormatContext *avf, unsigned
>> fileno)
>> avformat_close_input(&cat->avf);
>> return ret;
>> }
>> +
>> + cat->cur_fileno = fileno;
>> cat->cur_file = file;
>> if (file->start_time == AV_NOPTS_VALUE)
>> file->start_time = !fileno ? 0 :
>> @@ -711,13 +715,18 @@ static int real_seek(AVFormatContext *avf, int
>> stream,
>> left = mid;
>> }
>>
>> - if ((ret = open_file(avf, left)) < 0)
>> - return ret;
>> + if (cat->cur_fileno != left) {
>> + if ((ret = open_file(avf, left)) < 0)
>> + return ret;
>> + } else {
>> + cat->avf = cat->cur_avf_saved;
>> + }
>>
>> ret = try_seek(avf, stream, min_ts, ts, max_ts, flags);
>> if (ret < 0 &&
>> left < cat->nb_files - 1 &&
>> cat->files[left + 1].start_time < max_ts) {
>> + cat->avf = NULL;
>> if ((ret = open_file(avf, left + 1)) < 0)
>> return ret;
>> ret = try_seek(avf, stream, min_ts, ts, max_ts, flags);
>> @@ -730,7 +739,7 @@ static int concat_seek(AVFormatContext *avf, int
>> stream,
>> {
>> ConcatContext *cat = avf->priv_data;
>> ConcatFile *cur_file_saved = cat->cur_file;
>> - AVFormatContext *cur_avf_saved = cat->avf;
>> + cat->cur_avf_saved = cat->avf;
>> int ret;
>>
>> if (!cat->seekable)
>> @@ -739,12 +748,16 @@ static int concat_seek(AVFormatContext *avf, int
>> stream,
>> return AVERROR(ENOSYS);
>> cat->avf = NULL;
>> if ((ret = real_seek(avf, stream, min_ts, ts, max_ts, flags)) < 0) {
>> - if (cat->avf)
>> - avformat_close_input(&cat->avf);
>> - cat->avf = cur_avf_saved;
>> + if (cat->cur_file != cur_file_saved) {
>> + if (cat->avf)
>> + avformat_close_input(&cat->avf);
>> + }
>> + cat->avf = cat->cur_avf_saved;
>> cat->cur_file = cur_file_saved;
>> } else {
>> - avformat_close_input(&cur_avf_saved);
>> + if (cat->cur_file != cur_file_saved) {
>> + avformat_close_input(&cat->cur_avf_saved);
>> + }
>> cat->eof = 0;
>> }
>> return ret;
>> --
>> 2.7.4
>>
>>
>
More information about the ffmpeg-devel
mailing list