[FFmpeg-devel] [RFC] seek when streamed
Baptiste Coudurier
baptiste.coudurier
Sat Nov 24 14:12:49 CET 2007
Hi,
Michael Niedermayer wrote:
> On Tue, Nov 13, 2007 at 12:31:55AM +0100, Baptiste Coudurier wrote:
>
>>Hi,
>>
>>Michael Niedermayer wrote:
>>
>>>On Sun, Oct 07, 2007 at 10:59:33PM +0200, Baptiste Coudurier wrote:
>>>
>>>
>>>>Hi
>>>>
>>>>I noticed a weird behaviour (bug ?) when seeking is requested when file
>>>>is streamed:
>>>>
>>>>in url_fseek:
>>>> } else if(s->is_streamed && !s->write_flag &&
>>>> offset1 >= 0 && offset1 < (s->buf_end - s->buffer) + (1<<16)){
>>>> while(s->pos < offset && !s->eof_reached)
>>>> fill_buffer(s);
>>>> s->buf_ptr = s->buf_end + offset - s->pos;
>>>>
>>>>if eof_is_reached then s->pos might be < offset, therefore buf_ptr might
>>>>be > buf_end. Next get_buffer will memcpy negative size:
>>>>
>>>>int get_buffer(ByteIOContext *s, unsigned char *buf, int size)
>>>>{
>>>> int len, size1;
>>>>
>>>> size1 = size;
>>>> while (size > 0) {
>>>> len = s->buf_end - s->buf_ptr;
>>>> if (len > size)
>>>> len = size;
>>>> if (len == 0) {
>>>> [...]
>>>> } else {
>>>> memcpy(buf, s->buf_ptr, len);
>>>> buf += len;
>>>> [...]
>>>>
>>>>Note that url_fseek clear eof_reached.
>>>>
>>>>That will only happen when reading a streamed file.
>>>>Im submitting the attached patch, but Im not sure what the correct
>>>>behaviour should be. Any suggestion welcome.
>>>
>>>
>>>i think returning some error for attempts to seek after the end of the
>>>file seems appropriate
>>>
>>
>>Ok, patch attached.
>
>
> i think this is buggy, that is if the seek is slightly to before EOF
> fill_buffer() could still set EOF as the end of the buffer is further
> ahead
>
Im not sure I understood the sentence correctly.
According to fill_buffer code, eof_reached will be set only when
URLContext read_packet will return <= 0, so when nothing could be read.
If the seek is close to EOF fill_buffer may read less than
s->buffer_size but still > 0, update s->pos which may still be < offset,
then fill_buffer another time, and maybe set eof_reached this time
though s->pos will still be < offset since nothing could be read, so we
would end with s->pos < offset, so seek failed and reporting error seems
appropriate.
I see that s->eof_reached would still be set to 1, that would not be
false as we are at eof effectively.
What would be buggy exactly ?
--
Baptiste COUDURIER GnuPG Key Id: 0x5C1ABAAA
SMARTJOG S.A. http://www.smartjog.com
Key fingerprint 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
Phone: +33 1 49966312
More information about the ffmpeg-devel
mailing list