31 #include "config-adpcm.h"
32 #include "intreadwrite.h"
34 namespace adpcm_ffmpeg {
37 const uint8_t *buffer, *buffer_end, *buffer_start;
41 uint8_t *buffer, *buffer_end, *buffer_start;
45 #define DEF(type, name, bytes, read, write) \
46 static av_always_inline type bytestream_get_##name(const uint8_t **b) { \
48 return read(*b - bytes); \
50 static av_always_inline void bytestream_put_##name(uint8_t **b, \
55 static av_always_inline void bytestream2_put_##name##u(PutByteContext *p, \
57 bytestream_put_##name(&p->buffer, value); \
59 static av_always_inline void bytestream2_put_##name(PutByteContext *p, \
61 if (!p->eof && (p->buffer_end - p->buffer >= bytes)) { \
62 write(p->buffer, value); \
67 static av_always_inline type bytestream2_get_##name##u(GetByteContext *g) { \
68 return bytestream_get_##name(&g->buffer); \
70 static av_always_inline type bytestream2_get_##name(GetByteContext *g) { \
71 if (g->buffer_end - g->buffer < bytes) { \
72 g->buffer = g->buffer_end; \
75 return bytestream2_get_##name##u(g); \
77 static av_always_inline type bytestream2_peek_##name##u(GetByteContext *g) { \
78 return read(g->buffer); \
80 static av_always_inline type bytestream2_peek_##name(GetByteContext *g) { \
81 if (g->buffer_end - g->buffer < bytes) return 0; \
82 return bytestream2_peek_##name##u(g); \
85 DEF(uint64_t, le64, 8, AV_RL64, AV_WL64)
86 DEF(
unsigned int, le32, 4, AV_RL32, AV_WL32)
87 DEF(
unsigned int, le24, 3, AV_RL24, AV_WL24)
88 DEF(
unsigned int, le16, 2, AV_RL16, AV_WL16)
89 DEF(uint64_t, be64, 8, AV_RB64, AV_WB64)
90 DEF(
unsigned int, be32, 4, AV_RB32, AV_WB32)
91 DEF(
unsigned int, be24, 3, AV_RB24, AV_WB24)
92 DEF(
unsigned int, be16, 2, AV_RB16, AV_WB16)
93 DEF(
unsigned int,
byte, 1, AV_RB8, AV_WB8)
96 #define bytestream2_get_ne16 bytestream2_get_be16
97 #define bytestream2_get_ne24 bytestream2_get_be24
98 #define bytestream2_get_ne32 bytestream2_get_be32
99 #define bytestream2_get_ne64 bytestream2_get_be64
100 #define bytestream2_get_ne16u bytestream2_get_be16u
101 #define bytestream2_get_ne24u bytestream2_get_be24u
102 #define bytestream2_get_ne32u bytestream2_get_be32u
103 #define bytestream2_get_ne64u bytestream2_get_be64u
104 #define bytestream2_put_ne16 bytestream2_put_be16
105 #define bytestream2_put_ne24 bytestream2_put_be24
106 #define bytestream2_put_ne32 bytestream2_put_be32
107 #define bytestream2_put_ne64 bytestream2_put_be64
108 #define bytestream2_peek_ne16 bytestream2_peek_be16
109 #define bytestream2_peek_ne24 bytestream2_peek_be24
110 #define bytestream2_peek_ne32 bytestream2_peek_be32
111 #define bytestream2_peek_ne64 bytestream2_peek_be64
113 #define bytestream2_get_ne16 bytestream2_get_le16
114 #define bytestream2_get_ne24 bytestream2_get_le24
115 #define bytestream2_get_ne32 bytestream2_get_le32
116 #define bytestream2_get_ne64 bytestream2_get_le64
117 #define bytestream2_get_ne16u bytestream2_get_le16u
118 #define bytestream2_get_ne24u bytestream2_get_le24u
119 #define bytestream2_get_ne32u bytestream2_get_le32u
120 #define bytestream2_get_ne64u bytestream2_get_le64u
121 #define bytestream2_put_ne16 bytestream2_put_le16
122 #define bytestream2_put_ne24 bytestream2_put_le24
123 #define bytestream2_put_ne32 bytestream2_put_le32
124 #define bytestream2_put_ne64 bytestream2_put_le64
125 #define bytestream2_peek_ne16 bytestream2_peek_le16
126 #define bytestream2_peek_ne24 bytestream2_peek_le24
127 #define bytestream2_peek_ne32 bytestream2_peek_le32
128 #define bytestream2_peek_ne64 bytestream2_peek_le64
134 av_assert(buf_size >= 0);
136 g->buffer_start = buf;
137 g->buffer_end = buf + buf_size;
140 static av_always_inline
void bytestream2_init_writer(PutByteContext *p,
143 av_assert(buf_size >= 0);
145 p->buffer_start = buf;
146 p->buffer_end = buf + buf_size;
150 static av_always_inline
int bytestream2_get_bytes_left(GetByteContext *g) {
151 return g->buffer_end - g->buffer;
154 static av_always_inline
int bytestream2_get_bytes_left_p(PutByteContext *p) {
155 return p->buffer_end - p->buffer;
158 static av_always_inline
void bytestream2_skip(GetByteContext *g,
160 g->buffer += FFMIN(g->buffer_end - g->buffer, size);
163 static av_always_inline
void bytestream2_skipu(GetByteContext *g,
168 static av_always_inline
void bytestream2_skip_p(PutByteContext *p,
172 size2 = FFMIN(p->buffer_end - p->buffer, size);
173 if (size2 != size) p->eof = 1;
177 static av_always_inline
int bytestream2_tell(GetByteContext *g) {
178 return (
int)(g->buffer - g->buffer_start);
181 static av_always_inline
int bytestream2_tell_p(PutByteContext *p) {
182 return (
int)(p->buffer - p->buffer_start);
185 static av_always_inline
int bytestream2_size(GetByteContext *g) {
186 return (
int)(g->buffer_end - g->buffer_start);
189 static av_always_inline
int bytestream2_size_p(PutByteContext *p) {
190 return (
int)(p->buffer_end - p->buffer_start);
193 static av_always_inline
int bytestream2_seek(GetByteContext *g,
int offset,
197 offset = av_clip(offset, -(g->buffer - g->buffer_start),
198 g->buffer_end - g->buffer);
202 offset = av_clip(offset, -(g->buffer_end - g->buffer_start), 0);
203 g->buffer = g->buffer_end + offset;
206 offset = av_clip(offset, 0, g->buffer_end - g->buffer_start);
207 g->buffer = g->buffer_start + offset;
210 return AVERROR(AVERROR_INVALID);
212 return bytestream2_tell(g);
215 static av_always_inline
int bytestream2_seek_p(PutByteContext *p,
int offset,
220 if (p->buffer_end - p->buffer < offset) p->eof = 1;
221 offset = av_clip(offset, -(p->buffer - p->buffer_start),
222 p->buffer_end - p->buffer);
226 if (offset > 0) p->eof = 1;
227 offset = av_clip(offset, -(p->buffer_end - p->buffer_start), 0);
228 p->buffer = p->buffer_end + offset;
231 if (p->buffer_end - p->buffer_start < offset) p->eof = 1;
232 offset = av_clip(offset, 0, p->buffer_end - p->buffer_start);
233 p->buffer = p->buffer_start + offset;
236 return AVERROR(AVERROR_INVALID);
238 return bytestream2_tell_p(p);
241 static av_always_inline
unsigned int bytestream2_get_buffer(GetByteContext *g,
244 unsigned int size2 = FFMIN(g->buffer_end - g->buffer, size);
245 memcpy(dst, g->buffer, size2);
250 static av_always_inline
unsigned int bytestream2_get_bufferu(
251 GetByteContext *g, uint8_t *dst,
unsigned int size) {
252 memcpy(dst, g->buffer, size);
257 static av_always_inline
unsigned int bytestream2_put_buffer(PutByteContext *p,
261 if (p->eof)
return 0;
262 size2 = FFMIN(p->buffer_end - p->buffer, size);
263 if (size2 != size) p->eof = 1;
264 memcpy(p->buffer, src, size2);
269 static av_always_inline
unsigned int bytestream2_put_bufferu(
270 PutByteContext *p,
const uint8_t *src,
unsigned int size) {
271 memcpy(p->buffer, src, size);
276 static av_always_inline
void bytestream2_set_buffer(PutByteContext *p,
281 size2 = FFMIN(p->buffer_end - p->buffer, size);
282 if (size2 != size) p->eof = 1;
283 memset(p->buffer, c, size2);
287 static av_always_inline
void bytestream2_set_bufferu(PutByteContext *p,
290 memset(p->buffer, c, size);
294 static av_always_inline
unsigned int bytestream2_get_eof(PutByteContext *p) {
298 static av_always_inline
unsigned int bytestream2_copy_bufferu(
299 PutByteContext *p, GetByteContext *g,
unsigned int size) {
300 memcpy(p->buffer, g->buffer, size);
306 static av_always_inline
unsigned int bytestream2_copy_buffer(
307 PutByteContext *p, GetByteContext *g,
unsigned int size) {
310 if (p->eof)
return 0;
311 size = FFMIN(g->buffer_end - g->buffer, size);
312 size2 = FFMIN(p->buffer_end - p->buffer, size);
313 if (size2 != size) p->eof = 1;
315 return bytestream2_copy_bufferu(p, g, size2);
318 static av_always_inline
unsigned int bytestream_get_buffer(
const uint8_t **b,
321 memcpy(dst, *b, size);
326 static av_always_inline
void bytestream_put_buffer(uint8_t **b,
329 memcpy(*b, src, size);
Definition: bytestream.h:36
Definition: bytestream.h:40