diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-12-21 22:32:04 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-01-05 23:36:36 -0500 |
commit | 6e8bf6db489f66d6fa553fa04904464af768c540 (patch) | |
tree | 6c6f9efe586e3656fd40e1503569299792ab7b96 /libavcodec | |
parent | f907615f0813e8499f06a7eebccf1c63fce87c8e (diff) | |
download | ffmpeg-6e8bf6db489f66d6fa553fa04904464af768c540.tar.gz |
add bytestream2_tell() and bytestream2_seek() functions
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/bytestream.h | 31 |
1 files changed, 30 insertions, 1 deletions
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) |