summaryrefslogtreecommitdiff
path: root/libavcodec/bytestream.h
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-01-07 02:02:13 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-01-07 02:30:27 +0100
commit6a56f4e63423d616b2224f654c1794fac25d6cfb (patch)
treeec0756ebd0ecbdee1932c95824101214367c96ee /libavcodec/bytestream.h
parent12d8340f16eed211f153e859b749ad415c1ba384 (diff)
parentb348c852aa8312d361123df0fa20e16feff7c2f1 (diff)
downloadffmpeg-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.h31
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)