[FFmpeg-devel] [PATCH v2] fftools/ffmpeg: accelerate seeking while reading input at native frame rate

Gyan Doshi ffmpeg at gyani.pro
Sun Jul 18 08:21:02 EEST 2021



On 2021-07-18 10:42, Linjie Fu wrote:
> Hi Gyan,
> On Sun, Jul 18, 2021 at 12:24 PM Gyan Doshi <ffmpeg at gyani.pro> wrote:
>>
>>
>> On 2021-07-18 09:32, Linjie Fu wrote:
>>> On Wed, Jul 7, 2021 at 9:42 AM Linjie Fu <linjie.justin.fu at gmail.com> wrote:
>>>> On Sun, Jul 4, 2021 at 10:50 PM Linjie Fu <fulinjie at zju.edu.cn> wrote:
>>>>> From: Linjie Fu <linjie.justin.fu at gmail.com>
>>>>>
>>>>> Skip the logic of frame rate emulation until the input reaches the
>>>>> specified start time.
>>>>>
>>>>> Test CMD:
>>>>>      $ffmpeg -re -ss 30 -i input.mp4 -pix_fmt yuv420p -f sdl2 -
>>>>>
>>>>> Before the patch:
>>>>> first time to got frame, it takes 257305 us
>>>>> After this patch:
>>>>> first time to got frame, it takes 48879 us
>>>>>
>>>>> Signed-off-by: Linjie Fu <linjie.justin.fu at gmail.com>
>>>>> ---
>>>>> [v2]: fixed the mixed declaration and code warning
>>>>> Calculate the time to get the first frame:
>>>>> https://github.com/fulinjie/ffmpeg/commit/2aa4762e1e65709997b1ab9dd596332244db80ed
>>>>>    fftools/ffmpeg.c | 8 ++++++--
>>>>>    1 file changed, 6 insertions(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
>>>>> index e97d879cb3..c8849e4250 100644
>>>>> --- a/fftools/ffmpeg.c
>>>>> +++ b/fftools/ffmpeg.c
>>>>> @@ -4221,10 +4221,14 @@ static int get_input_packet(InputFile *f, AVPacket **pkt)
>>>>>    {
>>>>>        if (f->rate_emu) {
>>>>>            int i;
>>>>> +        int64_t pts;
>>>>> +        int64_t now;
>>>>>            for (i = 0; i < f->nb_streams; i++) {
>>>>>                InputStream *ist = input_streams[f->ist_index + i];
>>>>> -            int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
>>>>> -            int64_t now = av_gettime_relative() - ist->start;
>>>>> +            if (!ist->got_output)
>>>>> +                continue;
>>>>> +            pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
>>>>> +            now = av_gettime_relative() - ist->start;
>>>>>                if (pts > now)
>>>>>                    return AVERROR(EAGAIN);
>>>>>            }
>>>>> --
>>>>> 2.31.1
>>>> ping, thx.
>>>>
>>> Another ping, thx.
>> I pushed changes to this code yesterday. I don't think it's required
>> anymore, but do test.
>>
> Thanks for the review, tested after applying the readrate patch, I'm
> afraid that it's not identical as hope,
> since ist->nb_packets would increase no matter input stream got output or not:
>
> (lldb) p ist->nb_packets
> (uint64_t) $4 = 1
>
> (lldb) p ist->got_output
> (int) $5 = 0
>
> Hence we still need to add the check for  ist->got_output, or replace
> the ist->nb_packets.

No, test the speed, not the parity of got_output. got_output is only 
incremented when the stream is decoded. Won't work with streamcopy.
nb_packets is the correct check since it's incremented after the initial 
packet is demuxed.

> Also there is a new warning caught by the check in patchwork, probably
> "mixed declaration and code warning".
> Will send patches to rebase and fix.

There is already patch for the mixed warning.

Regards,
Gyan


More information about the ffmpeg-devel mailing list