diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-01-07 02:02:13 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-01-07 02:30:27 +0100 |
commit | 6a56f4e63423d616b2224f654c1794fac25d6cfb (patch) | |
tree | ec0756ebd0ecbdee1932c95824101214367c96ee /libavcodec/bytestream.h | |
parent | 12d8340f16eed211f153e859b749ad415c1ba384 (diff) | |
parent | b348c852aa8312d361123df0fa20e16feff7c2f1 (diff) | |
download | ffmpeg-6a56f4e63423d616b2224f654c1794fac25d6cfb.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
flicvideo: fix invalid reads
vorbis: Avoid some out-of-bounds reads
vqf: add more known extensions
cabac: remove unused function renorm_cabac_decoder
h264: Only use symbols from the SVQ3 decoder under proper conditionals.
add bytestream2_tell() and bytestream2_seek() functions
parsers: initialize MpegEncContext.slice_context_count to 1
spdifenc: use special alignment for DTS-HD length_code
Conflicts:
libavcodec/flicvideo.c
libavcodec/h264.c
libavcodec/mpeg4video_parser.c
libavcodec/vorbis.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/bytestream.h')
-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 73ea0c880f..4e17e9d9f7 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) |