26
26
#include "libavutil/common.h"
27
27
#include "libavutil/intreadwrite.h"
30
const uint8_t *buffer, *buffer_end, *buffer_start;
29
33
#define DEF_T(type, name, bytes, read, write) \
30
34
static av_always_inline type bytestream_get_ ## name(const uint8_t **b){\
34
38
static av_always_inline void bytestream_put_ ##name(uint8_t **b, const type value){\
42
static av_always_inline type bytestream2_get_ ## name ## u(GetByteContext *g)\
44
return bytestream_get_ ## name(&g->buffer);\
46
static av_always_inline type bytestream2_get_ ## name(GetByteContext *g)\
48
if (g->buffer_end - g->buffer < bytes)\
50
return bytestream2_get_ ## name ## u(g);\
52
static av_always_inline type bytestream2_peek_ ## name(GetByteContext *g)\
54
if (g->buffer_end - g->buffer < bytes)\
56
return read(g->buffer);\
39
59
#define DEF(name, bytes, read, write) \
78
static av_always_inline void bytestream2_init(GetByteContext *g,
79
const uint8_t *buf, int buf_size)
82
g->buffer_start = buf;
83
g->buffer_end = buf + buf_size;
86
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
88
return g->buffer_end - g->buffer;
91
static av_always_inline void bytestream2_skip(GetByteContext *g,
94
g->buffer += FFMIN(g->buffer_end - g->buffer, size);
97
static av_always_inline int bytestream2_tell(GetByteContext *g)
99
return (int)(g->buffer - g->buffer_start);
102
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset,
107
offset = av_clip(offset, -(g->buffer - g->buffer_start),
108
g->buffer_end - g->buffer);
112
offset = av_clip(offset, -(g->buffer_end - g->buffer_start), 0);
113
g->buffer = g->buffer_end + offset;
116
offset = av_clip(offset, 0, g->buffer_end - g->buffer_start);
117
g->buffer = g->buffer_start + offset;
120
return AVERROR(EINVAL);
122
return bytestream2_tell(g);
125
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g,
129
int size2 = FFMIN(g->buffer_end - g->buffer, size);
130
memcpy(dst, g->buffer, size2);
58
135
static av_always_inline unsigned int bytestream_get_buffer(const uint8_t **b, uint8_t *dst, unsigned int size)
60
137
memcpy(dst, *b, size);