1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Bytestream functions
3cabdff1aSopenharmony_ci * copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@free.fr>
4cabdff1aSopenharmony_ci * Copyright (c) 2012 Aneesh Dogra (lionaneesh) <lionaneesh@gmail.com>
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * This file is part of FFmpeg.
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cabdff1aSopenharmony_ci * Lesser General Public License for more details.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21cabdff1aSopenharmony_ci */
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci#ifndef AVCODEC_BYTESTREAM_H
24cabdff1aSopenharmony_ci#define AVCODEC_BYTESTREAM_H
25cabdff1aSopenharmony_ci
26cabdff1aSopenharmony_ci#include <stdint.h>
27cabdff1aSopenharmony_ci#include <string.h>
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#include "libavutil/avassert.h"
30cabdff1aSopenharmony_ci#include "libavutil/common.h"
31cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h"
32cabdff1aSopenharmony_ci
33cabdff1aSopenharmony_citypedef struct GetByteContext {
34cabdff1aSopenharmony_ci    const uint8_t *buffer, *buffer_end, *buffer_start;
35cabdff1aSopenharmony_ci} GetByteContext;
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_citypedef struct PutByteContext {
38cabdff1aSopenharmony_ci    uint8_t *buffer, *buffer_end, *buffer_start;
39cabdff1aSopenharmony_ci    int eof;
40cabdff1aSopenharmony_ci} PutByteContext;
41cabdff1aSopenharmony_ci
42cabdff1aSopenharmony_ci#define DEF(type, name, bytes, read, write)                                  \
43cabdff1aSopenharmony_cistatic av_always_inline type bytestream_get_ ## name(const uint8_t **b)        \
44cabdff1aSopenharmony_ci{                                                                              \
45cabdff1aSopenharmony_ci    (*b) += bytes;                                                             \
46cabdff1aSopenharmony_ci    return read(*b - bytes);                                                   \
47cabdff1aSopenharmony_ci}                                                                              \
48cabdff1aSopenharmony_cistatic av_always_inline void bytestream_put_ ## name(uint8_t **b,              \
49cabdff1aSopenharmony_ci                                                     const type value)         \
50cabdff1aSopenharmony_ci{                                                                              \
51cabdff1aSopenharmony_ci    write(*b, value);                                                          \
52cabdff1aSopenharmony_ci    (*b) += bytes;                                                             \
53cabdff1aSopenharmony_ci}                                                                              \
54cabdff1aSopenharmony_cistatic av_always_inline void bytestream2_put_ ## name ## u(PutByteContext *p,  \
55cabdff1aSopenharmony_ci                                                           const type value)   \
56cabdff1aSopenharmony_ci{                                                                              \
57cabdff1aSopenharmony_ci    bytestream_put_ ## name(&p->buffer, value);                                \
58cabdff1aSopenharmony_ci}                                                                              \
59cabdff1aSopenharmony_cistatic av_always_inline void bytestream2_put_ ## name(PutByteContext *p,       \
60cabdff1aSopenharmony_ci                                                      const type value)        \
61cabdff1aSopenharmony_ci{                                                                              \
62cabdff1aSopenharmony_ci    if (!p->eof && (p->buffer_end - p->buffer >= bytes)) {                     \
63cabdff1aSopenharmony_ci        write(p->buffer, value);                                               \
64cabdff1aSopenharmony_ci        p->buffer += bytes;                                                    \
65cabdff1aSopenharmony_ci    } else                                                                     \
66cabdff1aSopenharmony_ci        p->eof = 1;                                                            \
67cabdff1aSopenharmony_ci}                                                                              \
68cabdff1aSopenharmony_cistatic av_always_inline type bytestream2_get_ ## name ## u(GetByteContext *g)  \
69cabdff1aSopenharmony_ci{                                                                              \
70cabdff1aSopenharmony_ci    return bytestream_get_ ## name(&g->buffer);                                \
71cabdff1aSopenharmony_ci}                                                                              \
72cabdff1aSopenharmony_cistatic av_always_inline type bytestream2_get_ ## name(GetByteContext *g)       \
73cabdff1aSopenharmony_ci{                                                                              \
74cabdff1aSopenharmony_ci    if (g->buffer_end - g->buffer < bytes) {                                   \
75cabdff1aSopenharmony_ci        g->buffer = g->buffer_end;                                             \
76cabdff1aSopenharmony_ci        return 0;                                                              \
77cabdff1aSopenharmony_ci    }                                                                          \
78cabdff1aSopenharmony_ci    return bytestream2_get_ ## name ## u(g);                                   \
79cabdff1aSopenharmony_ci}                                                                              \
80cabdff1aSopenharmony_cistatic av_always_inline type bytestream2_peek_ ## name ## u(GetByteContext *g) \
81cabdff1aSopenharmony_ci{                                                                              \
82cabdff1aSopenharmony_ci    return read(g->buffer);                                                    \
83cabdff1aSopenharmony_ci}                                                                              \
84cabdff1aSopenharmony_cistatic av_always_inline type bytestream2_peek_ ## name(GetByteContext *g)      \
85cabdff1aSopenharmony_ci{                                                                              \
86cabdff1aSopenharmony_ci    if (g->buffer_end - g->buffer < bytes)                                     \
87cabdff1aSopenharmony_ci        return 0;                                                              \
88cabdff1aSopenharmony_ci    return bytestream2_peek_ ## name ## u(g);                                  \
89cabdff1aSopenharmony_ci}
90cabdff1aSopenharmony_ci
91cabdff1aSopenharmony_ciDEF(uint64_t,     le64, 8, AV_RL64, AV_WL64)
92cabdff1aSopenharmony_ciDEF(unsigned int, le32, 4, AV_RL32, AV_WL32)
93cabdff1aSopenharmony_ciDEF(unsigned int, le24, 3, AV_RL24, AV_WL24)
94cabdff1aSopenharmony_ciDEF(unsigned int, le16, 2, AV_RL16, AV_WL16)
95cabdff1aSopenharmony_ciDEF(uint64_t,     be64, 8, AV_RB64, AV_WB64)
96cabdff1aSopenharmony_ciDEF(unsigned int, be32, 4, AV_RB32, AV_WB32)
97cabdff1aSopenharmony_ciDEF(unsigned int, be24, 3, AV_RB24, AV_WB24)
98cabdff1aSopenharmony_ciDEF(unsigned int, be16, 2, AV_RB16, AV_WB16)
99cabdff1aSopenharmony_ciDEF(unsigned int, byte, 1, AV_RB8 , AV_WB8)
100cabdff1aSopenharmony_ci
101cabdff1aSopenharmony_ci#if AV_HAVE_BIGENDIAN
102cabdff1aSopenharmony_ci#   define bytestream2_get_ne16  bytestream2_get_be16
103cabdff1aSopenharmony_ci#   define bytestream2_get_ne24  bytestream2_get_be24
104cabdff1aSopenharmony_ci#   define bytestream2_get_ne32  bytestream2_get_be32
105cabdff1aSopenharmony_ci#   define bytestream2_get_ne64  bytestream2_get_be64
106cabdff1aSopenharmony_ci#   define bytestream2_get_ne16u bytestream2_get_be16u
107cabdff1aSopenharmony_ci#   define bytestream2_get_ne24u bytestream2_get_be24u
108cabdff1aSopenharmony_ci#   define bytestream2_get_ne32u bytestream2_get_be32u
109cabdff1aSopenharmony_ci#   define bytestream2_get_ne64u bytestream2_get_be64u
110cabdff1aSopenharmony_ci#   define bytestream2_put_ne16  bytestream2_put_be16
111cabdff1aSopenharmony_ci#   define bytestream2_put_ne24  bytestream2_put_be24
112cabdff1aSopenharmony_ci#   define bytestream2_put_ne32  bytestream2_put_be32
113cabdff1aSopenharmony_ci#   define bytestream2_put_ne64  bytestream2_put_be64
114cabdff1aSopenharmony_ci#   define bytestream2_peek_ne16 bytestream2_peek_be16
115cabdff1aSopenharmony_ci#   define bytestream2_peek_ne24 bytestream2_peek_be24
116cabdff1aSopenharmony_ci#   define bytestream2_peek_ne32 bytestream2_peek_be32
117cabdff1aSopenharmony_ci#   define bytestream2_peek_ne64 bytestream2_peek_be64
118cabdff1aSopenharmony_ci#else
119cabdff1aSopenharmony_ci#   define bytestream2_get_ne16  bytestream2_get_le16
120cabdff1aSopenharmony_ci#   define bytestream2_get_ne24  bytestream2_get_le24
121cabdff1aSopenharmony_ci#   define bytestream2_get_ne32  bytestream2_get_le32
122cabdff1aSopenharmony_ci#   define bytestream2_get_ne64  bytestream2_get_le64
123cabdff1aSopenharmony_ci#   define bytestream2_get_ne16u bytestream2_get_le16u
124cabdff1aSopenharmony_ci#   define bytestream2_get_ne24u bytestream2_get_le24u
125cabdff1aSopenharmony_ci#   define bytestream2_get_ne32u bytestream2_get_le32u
126cabdff1aSopenharmony_ci#   define bytestream2_get_ne64u bytestream2_get_le64u
127cabdff1aSopenharmony_ci#   define bytestream2_put_ne16  bytestream2_put_le16
128cabdff1aSopenharmony_ci#   define bytestream2_put_ne24  bytestream2_put_le24
129cabdff1aSopenharmony_ci#   define bytestream2_put_ne32  bytestream2_put_le32
130cabdff1aSopenharmony_ci#   define bytestream2_put_ne64  bytestream2_put_le64
131cabdff1aSopenharmony_ci#   define bytestream2_peek_ne16 bytestream2_peek_le16
132cabdff1aSopenharmony_ci#   define bytestream2_peek_ne24 bytestream2_peek_le24
133cabdff1aSopenharmony_ci#   define bytestream2_peek_ne32 bytestream2_peek_le32
134cabdff1aSopenharmony_ci#   define bytestream2_peek_ne64 bytestream2_peek_le64
135cabdff1aSopenharmony_ci#endif
136cabdff1aSopenharmony_ci
137cabdff1aSopenharmony_cistatic av_always_inline void bytestream2_init(GetByteContext *g,
138cabdff1aSopenharmony_ci                                              const uint8_t *buf,
139cabdff1aSopenharmony_ci                                              int buf_size)
140cabdff1aSopenharmony_ci{
141cabdff1aSopenharmony_ci    av_assert0(buf_size >= 0);
142cabdff1aSopenharmony_ci    g->buffer       = buf;
143cabdff1aSopenharmony_ci    g->buffer_start = buf;
144cabdff1aSopenharmony_ci    g->buffer_end   = buf + buf_size;
145cabdff1aSopenharmony_ci}
146cabdff1aSopenharmony_ci
147cabdff1aSopenharmony_cistatic av_always_inline void bytestream2_init_writer(PutByteContext *p,
148cabdff1aSopenharmony_ci                                                     uint8_t *buf,
149cabdff1aSopenharmony_ci                                                     int buf_size)
150cabdff1aSopenharmony_ci{
151cabdff1aSopenharmony_ci    av_assert0(buf_size >= 0);
152cabdff1aSopenharmony_ci    p->buffer       = buf;
153cabdff1aSopenharmony_ci    p->buffer_start = buf;
154cabdff1aSopenharmony_ci    p->buffer_end   = buf + buf_size;
155cabdff1aSopenharmony_ci    p->eof          = 0;
156cabdff1aSopenharmony_ci}
157cabdff1aSopenharmony_ci
158cabdff1aSopenharmony_cistatic av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
159cabdff1aSopenharmony_ci{
160cabdff1aSopenharmony_ci    return g->buffer_end - g->buffer;
161cabdff1aSopenharmony_ci}
162cabdff1aSopenharmony_ci
163cabdff1aSopenharmony_cistatic av_always_inline int bytestream2_get_bytes_left_p(PutByteContext *p)
164cabdff1aSopenharmony_ci{
165cabdff1aSopenharmony_ci    return p->buffer_end - p->buffer;
166cabdff1aSopenharmony_ci}
167cabdff1aSopenharmony_ci
168cabdff1aSopenharmony_cistatic av_always_inline void bytestream2_skip(GetByteContext *g,
169cabdff1aSopenharmony_ci                                              unsigned int size)
170cabdff1aSopenharmony_ci{
171cabdff1aSopenharmony_ci    g->buffer += FFMIN(g->buffer_end - g->buffer, size);
172cabdff1aSopenharmony_ci}
173cabdff1aSopenharmony_ci
174cabdff1aSopenharmony_cistatic av_always_inline void bytestream2_skipu(GetByteContext *g,
175cabdff1aSopenharmony_ci                                               unsigned int size)
176cabdff1aSopenharmony_ci{
177cabdff1aSopenharmony_ci    g->buffer += size;
178cabdff1aSopenharmony_ci}
179cabdff1aSopenharmony_ci
180cabdff1aSopenharmony_cistatic av_always_inline void bytestream2_skip_p(PutByteContext *p,
181cabdff1aSopenharmony_ci                                                unsigned int size)
182cabdff1aSopenharmony_ci{
183cabdff1aSopenharmony_ci    int size2;
184cabdff1aSopenharmony_ci    if (p->eof)
185cabdff1aSopenharmony_ci        return;
186cabdff1aSopenharmony_ci    size2 = FFMIN(p->buffer_end - p->buffer, size);
187cabdff1aSopenharmony_ci    if (size2 != size)
188cabdff1aSopenharmony_ci        p->eof = 1;
189cabdff1aSopenharmony_ci    p->buffer += size2;
190cabdff1aSopenharmony_ci}
191cabdff1aSopenharmony_ci
192cabdff1aSopenharmony_cistatic av_always_inline int bytestream2_tell(GetByteContext *g)
193cabdff1aSopenharmony_ci{
194cabdff1aSopenharmony_ci    return (int)(g->buffer - g->buffer_start);
195cabdff1aSopenharmony_ci}
196cabdff1aSopenharmony_ci
197cabdff1aSopenharmony_cistatic av_always_inline int bytestream2_tell_p(PutByteContext *p)
198cabdff1aSopenharmony_ci{
199cabdff1aSopenharmony_ci    return (int)(p->buffer - p->buffer_start);
200cabdff1aSopenharmony_ci}
201cabdff1aSopenharmony_ci
202cabdff1aSopenharmony_cistatic av_always_inline int bytestream2_size(GetByteContext *g)
203cabdff1aSopenharmony_ci{
204cabdff1aSopenharmony_ci    return (int)(g->buffer_end - g->buffer_start);
205cabdff1aSopenharmony_ci}
206cabdff1aSopenharmony_ci
207cabdff1aSopenharmony_cistatic av_always_inline int bytestream2_size_p(PutByteContext *p)
208cabdff1aSopenharmony_ci{
209cabdff1aSopenharmony_ci    return (int)(p->buffer_end - p->buffer_start);
210cabdff1aSopenharmony_ci}
211cabdff1aSopenharmony_ci
212cabdff1aSopenharmony_cistatic av_always_inline int bytestream2_seek(GetByteContext *g,
213cabdff1aSopenharmony_ci                                             int offset,
214cabdff1aSopenharmony_ci                                             int whence)
215cabdff1aSopenharmony_ci{
216cabdff1aSopenharmony_ci    switch (whence) {
217cabdff1aSopenharmony_ci    case SEEK_CUR:
218cabdff1aSopenharmony_ci        offset     = av_clip(offset, -(g->buffer - g->buffer_start),
219cabdff1aSopenharmony_ci                             g->buffer_end - g->buffer);
220cabdff1aSopenharmony_ci        g->buffer += offset;
221cabdff1aSopenharmony_ci        break;
222cabdff1aSopenharmony_ci    case SEEK_END:
223cabdff1aSopenharmony_ci        offset    = av_clip(offset, -(g->buffer_end - g->buffer_start), 0);
224cabdff1aSopenharmony_ci        g->buffer = g->buffer_end + offset;
225cabdff1aSopenharmony_ci        break;
226cabdff1aSopenharmony_ci    case SEEK_SET:
227cabdff1aSopenharmony_ci        offset    = av_clip(offset, 0, g->buffer_end - g->buffer_start);
228cabdff1aSopenharmony_ci        g->buffer = g->buffer_start + offset;
229cabdff1aSopenharmony_ci        break;
230cabdff1aSopenharmony_ci    default:
231cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
232cabdff1aSopenharmony_ci    }
233cabdff1aSopenharmony_ci    return bytestream2_tell(g);
234cabdff1aSopenharmony_ci}
235cabdff1aSopenharmony_ci
236cabdff1aSopenharmony_cistatic av_always_inline int bytestream2_seek_p(PutByteContext *p,
237cabdff1aSopenharmony_ci                                               int offset,
238cabdff1aSopenharmony_ci                                               int whence)
239cabdff1aSopenharmony_ci{
240cabdff1aSopenharmony_ci    p->eof = 0;
241cabdff1aSopenharmony_ci    switch (whence) {
242cabdff1aSopenharmony_ci    case SEEK_CUR:
243cabdff1aSopenharmony_ci        if (p->buffer_end - p->buffer < offset)
244cabdff1aSopenharmony_ci            p->eof = 1;
245cabdff1aSopenharmony_ci        offset     = av_clip(offset, -(p->buffer - p->buffer_start),
246cabdff1aSopenharmony_ci                             p->buffer_end - p->buffer);
247cabdff1aSopenharmony_ci        p->buffer += offset;
248cabdff1aSopenharmony_ci        break;
249cabdff1aSopenharmony_ci    case SEEK_END:
250cabdff1aSopenharmony_ci        if (offset > 0)
251cabdff1aSopenharmony_ci            p->eof = 1;
252cabdff1aSopenharmony_ci        offset    = av_clip(offset, -(p->buffer_end - p->buffer_start), 0);
253cabdff1aSopenharmony_ci        p->buffer = p->buffer_end + offset;
254cabdff1aSopenharmony_ci        break;
255cabdff1aSopenharmony_ci    case SEEK_SET:
256cabdff1aSopenharmony_ci        if (p->buffer_end - p->buffer_start < offset)
257cabdff1aSopenharmony_ci            p->eof = 1;
258cabdff1aSopenharmony_ci        offset    = av_clip(offset, 0, p->buffer_end - p->buffer_start);
259cabdff1aSopenharmony_ci        p->buffer = p->buffer_start + offset;
260cabdff1aSopenharmony_ci        break;
261cabdff1aSopenharmony_ci    default:
262cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
263cabdff1aSopenharmony_ci    }
264cabdff1aSopenharmony_ci    return bytestream2_tell_p(p);
265cabdff1aSopenharmony_ci}
266cabdff1aSopenharmony_ci
267cabdff1aSopenharmony_cistatic av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g,
268cabdff1aSopenharmony_ci                                                            uint8_t *dst,
269cabdff1aSopenharmony_ci                                                            unsigned int size)
270cabdff1aSopenharmony_ci{
271cabdff1aSopenharmony_ci    int size2 = FFMIN(g->buffer_end - g->buffer, size);
272cabdff1aSopenharmony_ci    memcpy(dst, g->buffer, size2);
273cabdff1aSopenharmony_ci    g->buffer += size2;
274cabdff1aSopenharmony_ci    return size2;
275cabdff1aSopenharmony_ci}
276cabdff1aSopenharmony_ci
277cabdff1aSopenharmony_cistatic av_always_inline unsigned int bytestream2_get_bufferu(GetByteContext *g,
278cabdff1aSopenharmony_ci                                                             uint8_t *dst,
279cabdff1aSopenharmony_ci                                                             unsigned int size)
280cabdff1aSopenharmony_ci{
281cabdff1aSopenharmony_ci    memcpy(dst, g->buffer, size);
282cabdff1aSopenharmony_ci    g->buffer += size;
283cabdff1aSopenharmony_ci    return size;
284cabdff1aSopenharmony_ci}
285cabdff1aSopenharmony_ci
286cabdff1aSopenharmony_cistatic av_always_inline unsigned int bytestream2_put_buffer(PutByteContext *p,
287cabdff1aSopenharmony_ci                                                            const uint8_t *src,
288cabdff1aSopenharmony_ci                                                            unsigned int size)
289cabdff1aSopenharmony_ci{
290cabdff1aSopenharmony_ci    int size2;
291cabdff1aSopenharmony_ci    if (p->eof)
292cabdff1aSopenharmony_ci        return 0;
293cabdff1aSopenharmony_ci    size2 = FFMIN(p->buffer_end - p->buffer, size);
294cabdff1aSopenharmony_ci    if (size2 != size)
295cabdff1aSopenharmony_ci        p->eof = 1;
296cabdff1aSopenharmony_ci    memcpy(p->buffer, src, size2);
297cabdff1aSopenharmony_ci    p->buffer += size2;
298cabdff1aSopenharmony_ci    return size2;
299cabdff1aSopenharmony_ci}
300cabdff1aSopenharmony_ci
301cabdff1aSopenharmony_cistatic av_always_inline unsigned int bytestream2_put_bufferu(PutByteContext *p,
302cabdff1aSopenharmony_ci                                                             const uint8_t *src,
303cabdff1aSopenharmony_ci                                                             unsigned int size)
304cabdff1aSopenharmony_ci{
305cabdff1aSopenharmony_ci    memcpy(p->buffer, src, size);
306cabdff1aSopenharmony_ci    p->buffer += size;
307cabdff1aSopenharmony_ci    return size;
308cabdff1aSopenharmony_ci}
309cabdff1aSopenharmony_ci
310cabdff1aSopenharmony_cistatic av_always_inline void bytestream2_set_buffer(PutByteContext *p,
311cabdff1aSopenharmony_ci                                                    const uint8_t c,
312cabdff1aSopenharmony_ci                                                    unsigned int size)
313cabdff1aSopenharmony_ci{
314cabdff1aSopenharmony_ci    int size2;
315cabdff1aSopenharmony_ci    if (p->eof)
316cabdff1aSopenharmony_ci        return;
317cabdff1aSopenharmony_ci    size2 = FFMIN(p->buffer_end - p->buffer, size);
318cabdff1aSopenharmony_ci    if (size2 != size)
319cabdff1aSopenharmony_ci        p->eof = 1;
320cabdff1aSopenharmony_ci    memset(p->buffer, c, size2);
321cabdff1aSopenharmony_ci    p->buffer += size2;
322cabdff1aSopenharmony_ci}
323cabdff1aSopenharmony_ci
324cabdff1aSopenharmony_cistatic av_always_inline void bytestream2_set_bufferu(PutByteContext *p,
325cabdff1aSopenharmony_ci                                                     const uint8_t c,
326cabdff1aSopenharmony_ci                                                     unsigned int size)
327cabdff1aSopenharmony_ci{
328cabdff1aSopenharmony_ci    memset(p->buffer, c, size);
329cabdff1aSopenharmony_ci    p->buffer += size;
330cabdff1aSopenharmony_ci}
331cabdff1aSopenharmony_ci
332cabdff1aSopenharmony_cistatic av_always_inline unsigned int bytestream2_get_eof(PutByteContext *p)
333cabdff1aSopenharmony_ci{
334cabdff1aSopenharmony_ci    return p->eof;
335cabdff1aSopenharmony_ci}
336cabdff1aSopenharmony_ci
337cabdff1aSopenharmony_cistatic av_always_inline unsigned int bytestream2_copy_bufferu(PutByteContext *p,
338cabdff1aSopenharmony_ci                                                              GetByteContext *g,
339cabdff1aSopenharmony_ci                                                              unsigned int size)
340cabdff1aSopenharmony_ci{
341cabdff1aSopenharmony_ci    memcpy(p->buffer, g->buffer, size);
342cabdff1aSopenharmony_ci    p->buffer += size;
343cabdff1aSopenharmony_ci    g->buffer += size;
344cabdff1aSopenharmony_ci    return size;
345cabdff1aSopenharmony_ci}
346cabdff1aSopenharmony_ci
347cabdff1aSopenharmony_cistatic av_always_inline unsigned int bytestream2_copy_buffer(PutByteContext *p,
348cabdff1aSopenharmony_ci                                                             GetByteContext *g,
349cabdff1aSopenharmony_ci                                                             unsigned int size)
350cabdff1aSopenharmony_ci{
351cabdff1aSopenharmony_ci    int size2;
352cabdff1aSopenharmony_ci
353cabdff1aSopenharmony_ci    if (p->eof)
354cabdff1aSopenharmony_ci        return 0;
355cabdff1aSopenharmony_ci    size  = FFMIN(g->buffer_end - g->buffer, size);
356cabdff1aSopenharmony_ci    size2 = FFMIN(p->buffer_end - p->buffer, size);
357cabdff1aSopenharmony_ci    if (size2 != size)
358cabdff1aSopenharmony_ci        p->eof = 1;
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_ci    return bytestream2_copy_bufferu(p, g, size2);
361cabdff1aSopenharmony_ci}
362cabdff1aSopenharmony_ci
363cabdff1aSopenharmony_cistatic av_always_inline unsigned int bytestream_get_buffer(const uint8_t **b,
364cabdff1aSopenharmony_ci                                                           uint8_t *dst,
365cabdff1aSopenharmony_ci                                                           unsigned int size)
366cabdff1aSopenharmony_ci{
367cabdff1aSopenharmony_ci    memcpy(dst, *b, size);
368cabdff1aSopenharmony_ci    (*b) += size;
369cabdff1aSopenharmony_ci    return size;
370cabdff1aSopenharmony_ci}
371cabdff1aSopenharmony_ci
372cabdff1aSopenharmony_cistatic av_always_inline void bytestream_put_buffer(uint8_t **b,
373cabdff1aSopenharmony_ci                                                   const uint8_t *src,
374cabdff1aSopenharmony_ci                                                   unsigned int size)
375cabdff1aSopenharmony_ci{
376cabdff1aSopenharmony_ci    memcpy(*b, src, size);
377cabdff1aSopenharmony_ci    (*b) += size;
378cabdff1aSopenharmony_ci}
379cabdff1aSopenharmony_ci
380cabdff1aSopenharmony_ci#endif /* AVCODEC_BYTESTREAM_H */
381