summaryrefslogtreecommitdiff
path: root/libavformat/aviobuf.c
diff options
context:
space:
mode:
authorTomas Härdin <tomas.hardin@codemill.se>2010-04-08 09:02:27 +0000
committerTomas Härdin <tomas.hardin@codemill.se>2010-04-08 09:02:27 +0000
commit01d91b9be978753803fa6f5e73b17ab9f03a5c7b (patch)
tree35a484f2b8a8da202fdf2c815f41f8f9d14053d7 /libavformat/aviobuf.c
parentba659bedb806cb4a1dd375f723a2b0017d6afb33 (diff)
Reusing the probe buffer to rewind the ByteIOContext in ff_probe_input_buffer() instead of seeking back to the start of the file. Once exhausted, the size of the buffer is reduced.
Originally committed as revision 22821 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/aviobuf.c')
-rw-r--r--libavformat/aviobuf.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 37a6f6dee3..43e62daff6 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -295,6 +295,7 @@ static void fill_buffer(ByteIOContext *s)
{
uint8_t *dst= !s->max_packet_size && s->buf_end - s->buffer < s->buffer_size ? s->buf_ptr : s->buffer;
int len= s->buffer_size - (dst - s->buffer);
+ int max_buffer_size = s->max_packet_size ? s->max_packet_size : IO_BUFFER_SIZE;
assert(s->buf_ptr == s->buf_end);
@@ -308,6 +309,14 @@ static void fill_buffer(ByteIOContext *s)
s->checksum_ptr= s->buffer;
}
+ /* make buffer smaller in case it ended up large after probing */
+ if (s->buffer_size > max_buffer_size) {
+ url_setbufsize(s, max_buffer_size);
+
+ s->checksum_ptr = dst = s->buffer;
+ len = s->buffer_size;
+ }
+
if(s->read_packet)
len = s->read_packet(s->opaque, dst, len);
else
@@ -611,6 +620,42 @@ static int url_resetbuf(ByteIOContext *s, int flags)
return 0;
}
+int ff_rewind_with_probe_data(ByteIOContext *s, unsigned char *buf, int buf_size)
+{
+ int64_t buffer_start;
+ int buffer_size;
+ int overlap, new_size;
+
+ if (s->write_flag)
+ return AVERROR(EINVAL);
+
+ buffer_size = s->buf_end - s->buffer;
+
+ /* the buffers must touch or overlap */
+ if ((buffer_start = s->pos - buffer_size) > buf_size)
+ return AVERROR(EINVAL);
+
+ overlap = buf_size - buffer_start;
+ new_size = buf_size + buffer_size - overlap;
+
+ if (new_size > buf_size) {
+ if (!(buf = av_realloc(buf, new_size)))
+ return AVERROR(ENOMEM);
+
+ memcpy(buf + buf_size, s->buffer + overlap, buffer_size - overlap);
+ buf_size = new_size;
+ }
+
+ av_free(s->buffer);
+ s->buf_ptr = s->buffer = buf;
+ s->pos = s->buffer_size = buf_size;
+ s->buf_end = s->buf_ptr + buf_size;
+ s->eof_reached = 0;
+ s->must_flush = 0;
+
+ return 0;
+}
+
int url_fopen(ByteIOContext **s, const char *filename, int flags)
{
URLContext *h;