[FFmpeg-devel] [PATCH] RTMP seek support

Howard Chu hyc
Mon Apr 12 01:40:06 CEST 2010

Michael Niedermayer wrote:
> On Sat, Apr 10, 2010 at 07:20:46PM -0700, Howard Chu wrote:
>> Michael Niedermayer wrote:
>>> On Sat, Apr 10, 2010 at 04:27:00PM -0700, Howard Chu wrote:
>>>> Michael Niedermayer wrote:
>>>>> On Sat, Apr 10, 2010 at 09:26:31AM -0700, Howard Chu wrote:
>>>>>> Michael Niedermayer wrote:
>>>>>>> On Wed, Apr 07, 2010 at 08:48:44AM -0700, Howard Chu wrote:
>>>>>>>> Michael Niedermayer wrote:
>>>>>>>>> so will you fix it? or will you knowingly round the wrong direction
>>>>>>>>> because there are other unrelated problems?
>>>>>>>> I've been trying to fix it. But while you're telling me that it's
>>>>>>>> wrong,
>>>>>>>> no
>>>>>>>> one is telling me how to do it right.
>>>>>>> av_rescale_rnd() in this case
>>>>>> One more go-round.
>>>>> [...]
>>>>>> Index: libavformat/librtmp.c
>>>>>> ===================================================================
>>>>>> --- libavformat/librtmp.c	(revision 22813)
>>>>>> +++ libavformat/librtmp.c	(working copy)
>>>>>> @@ -124,10 +141,12 @@
>>>>>>         RTMP *r = s->priv_data;
>>>>>>         if (flags&    AVSEEK_FLAG_BYTE)
>>>>>> -        return AVERROR_NOTSUPP;
>>>>>> +        return AVERROR(ENOSYS);
>>>>>>         /* seeks are in milliseconds */
>>>>>> -    timestamp = av_rescale(timestamp, AV_TIME_BASE, 1000);
>>>>>> +    if (stream_index<    0)
>>>>>> +        timestamp = av_rescale_rnd(timestamp, 1000, AV_TIME_BASE,
>>>>>> AV_ROUND_DOWN);
>>>>> the rounding direction depends on the the flags for the old seeking
>>>>> API
>>>> I thought about that, but I disagree. The stream is playing forward
>>>> regardless, so any difference between rounding up or rounding down will
>>>> disappear by the time the next frame plays.
>>> The old as well as new APIs clearly specify what a demuxer should do.
>>> unless you suggest to change a deprecated API implementing it to the
>>> best that is possible is what should be done
>> Ok.
>> Should certainly think about it again in the new API. There's no
>> information available for a caller to decide what min_ts/max_ts intervals
>> to use. E.g., typically the minimum seek quantum will be the distance
>> between two keyframes, and that won't necessarily be a constant in any
>> given stream. Looks like the caller would have to go to a lot of trouble to
>> get this info.
> the idea is generally for a calling application to use
> for forward seeks:
> min_ts = current displayed time +1
> max_ts = INT64_MAX
> target_ts= min_ts + how far the cursor "->" key should seek
> for backward seeks:
> min_ts = INT64_MIN
> max_ts = current displayed time -1
> target_ts= max_ts - how far the cursor "<-" key should seek
> for an exact seek:
> min_ts = INT64_MIN
> max_ts = target_ts= the time the user wants to seek to

Thanks for the explanation. In each case one of the 3 ts parameters is always 
a constant. Sounds to me like this was better handled with only two ts 
parameters at most, in combination with AVSEEK_FLAG_BACKWARD.

Also sounds like the convention for exact seek was pretty arbitrary, it could 
just as easily have been min_ts = target_ts, max_ts = INT64_MAX.

Instead of these magical conventions that aren't at all obvious from reading 
the code or its documentation, why not use:
   current_ts, target_ts, flag.

For exact seek you can still use current_ts = INT64_MIN as a special case but 
otherwise you drop one useless parameter.

>>>> If you round up while seeking forward, it's possible to overshoot the
>>>> target and completely miss it,
>>> no, i dont think its possible in this case.
>>> If it where then no rounding could be done because rounding down is wrong
>>> that would mean the code would need to work with the exact timestamp
>> Even if you have the exact timestamp it may be useless, if you're trying to
>> seek to a non-keyframe. I don't know what apps you're thinking of that
>> depend on this accuracy, certainly most users watching their media players
>> don't care.
> Video editing applications requir frame exact seeking

>> But there will be plenty of cases where rounding up can
>> overshoot, if the underlying stream is forced to seek to the next keyframe.
> please show me an example

Never mind. I was thinking in terms of RTMP streams, and no one is going to do 
video editing with an RTMP stream, they'll work on a local file.

   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

More information about the ffmpeg-devel mailing list