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