From 6e8bf6db489f66d6fa553fa04904464af768c540 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 21 Dec 2011 22:32:04 -0500 Subject: add bytestream2_tell() and bytestream2_seek() functions --- libavcodec/bytestream.h | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'libavcodec/bytestream.h') diff --git a/libavcodec/bytestream.h b/libavcodec/bytestream.h index 8fbceacc4f..9ec74cf9a7 100644 --- a/libavcodec/bytestream.h +++ b/libavcodec/bytestream.h @@ -27,7 +27,7 @@ #include "libavutil/intreadwrite.h" typedef struct { - const uint8_t *buffer, *buffer_end; + const uint8_t *buffer, *buffer_end, *buffer_start; } GetByteContext; #define DEF_T(type, name, bytes, read, write) \ @@ -79,6 +79,7 @@ static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size) { g->buffer = buf; + g->buffer_start = buf; g->buffer_end = buf + buf_size; } @@ -93,6 +94,34 @@ static av_always_inline void bytestream2_skip(GetByteContext *g, g->buffer += FFMIN(g->buffer_end - g->buffer, size); } +static av_always_inline int bytestream2_tell(GetByteContext *g) +{ + return (int)(g->buffer - g->buffer_start); +} + +static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, + int whence) +{ + switch (whence) { + case SEEK_CUR: + offset = av_clip(offset, -(g->buffer - g->buffer_start), + g->buffer_end - g->buffer); + g->buffer += offset; + break; + case SEEK_END: + offset = av_clip(offset, -(g->buffer_end - g->buffer_start), 0); + g->buffer = g->buffer_end + offset; + break; + case SEEK_SET: + offset = av_clip(offset, 0, g->buffer_end - g->buffer_start); + g->buffer = g->buffer_start + offset; + break; + default: + return AVERROR(EINVAL); + } + return bytestream2_tell(g); +} + static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size) -- cgit v1.2.3