1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * H.264/HEVC common parsing code 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#ifndef AVCODEC_H2645_PARSE_H 22cabdff1aSopenharmony_ci#define AVCODEC_H2645_PARSE_H 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include <stdint.h> 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include "libavutil/buffer.h" 27cabdff1aSopenharmony_ci#include "libavutil/error.h" 28cabdff1aSopenharmony_ci#include "libavutil/log.h" 29cabdff1aSopenharmony_ci#include "codec_id.h" 30cabdff1aSopenharmony_ci#include "get_bits.h" 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#define MAX_MBPAIR_SIZE (256*1024) // a tighter bound could be calculated if someone cares about a few bytes 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_citypedef struct H2645NAL { 35cabdff1aSopenharmony_ci const uint8_t *data; 36cabdff1aSopenharmony_ci int size; 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci /** 39cabdff1aSopenharmony_ci * Size, in bits, of just the data, excluding the stop bit and any trailing 40cabdff1aSopenharmony_ci * padding. I.e. what HEVC calls SODB. 41cabdff1aSopenharmony_ci */ 42cabdff1aSopenharmony_ci int size_bits; 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci int raw_size; 45cabdff1aSopenharmony_ci const uint8_t *raw_data; 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ci GetBitContext gb; 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci /** 50cabdff1aSopenharmony_ci * NAL unit type 51cabdff1aSopenharmony_ci */ 52cabdff1aSopenharmony_ci int type; 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci /** 55cabdff1aSopenharmony_ci * H.264 only, nal_ref_idc 56cabdff1aSopenharmony_ci */ 57cabdff1aSopenharmony_ci int ref_idc; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci /** 60cabdff1aSopenharmony_ci * HEVC only, nuh_temporal_id_plus_1 - 1 61cabdff1aSopenharmony_ci */ 62cabdff1aSopenharmony_ci int temporal_id; 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci /* 65cabdff1aSopenharmony_ci * HEVC only, identifier of layer to which nal unit belongs 66cabdff1aSopenharmony_ci */ 67cabdff1aSopenharmony_ci int nuh_layer_id; 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci int skipped_bytes; 70cabdff1aSopenharmony_ci int skipped_bytes_pos_size; 71cabdff1aSopenharmony_ci int *skipped_bytes_pos; 72cabdff1aSopenharmony_ci} H2645NAL; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_citypedef struct H2645RBSP { 75cabdff1aSopenharmony_ci uint8_t *rbsp_buffer; 76cabdff1aSopenharmony_ci AVBufferRef *rbsp_buffer_ref; 77cabdff1aSopenharmony_ci int rbsp_buffer_alloc_size; 78cabdff1aSopenharmony_ci int rbsp_buffer_size; 79cabdff1aSopenharmony_ci} H2645RBSP; 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci/* an input packet split into unescaped NAL units */ 82cabdff1aSopenharmony_citypedef struct H2645Packet { 83cabdff1aSopenharmony_ci H2645NAL *nals; 84cabdff1aSopenharmony_ci H2645RBSP rbsp; 85cabdff1aSopenharmony_ci int nb_nals; 86cabdff1aSopenharmony_ci int nals_allocated; 87cabdff1aSopenharmony_ci unsigned nal_buffer_size; 88cabdff1aSopenharmony_ci} H2645Packet; 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ci/** 91cabdff1aSopenharmony_ci * Extract the raw (unescaped) bitstream. 92cabdff1aSopenharmony_ci */ 93cabdff1aSopenharmony_ciint ff_h2645_extract_rbsp(const uint8_t *src, int length, H2645RBSP *rbsp, 94cabdff1aSopenharmony_ci H2645NAL *nal, int small_padding); 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_ci/** 97cabdff1aSopenharmony_ci * Split an input packet into NAL units. 98cabdff1aSopenharmony_ci * 99cabdff1aSopenharmony_ci * If data == raw_data holds true for a NAL unit of the returned pkt, then 100cabdff1aSopenharmony_ci * said NAL unit does not contain any emulation_prevention_three_byte and 101cabdff1aSopenharmony_ci * the data is contained in the input buffer pointed to by buf. 102cabdff1aSopenharmony_ci * Otherwise, the unescaped data is part of the rbsp_buffer described by the 103cabdff1aSopenharmony_ci * packet's H2645RBSP. 104cabdff1aSopenharmony_ci * 105cabdff1aSopenharmony_ci * If the packet's rbsp_buffer_ref is not NULL, the underlying AVBuffer must 106cabdff1aSopenharmony_ci * own rbsp_buffer. If not and rbsp_buffer is not NULL, use_ref must be 0. 107cabdff1aSopenharmony_ci * If use_ref is set, rbsp_buffer will be reference-counted and owned by 108cabdff1aSopenharmony_ci * the underlying AVBuffer of rbsp_buffer_ref. 109cabdff1aSopenharmony_ci */ 110cabdff1aSopenharmony_ciint ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, 111cabdff1aSopenharmony_ci void *logctx, int is_nalff, int nal_length_size, 112cabdff1aSopenharmony_ci enum AVCodecID codec_id, int small_padding, int use_ref); 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci/** 115cabdff1aSopenharmony_ci * Free all the allocated memory in the packet. 116cabdff1aSopenharmony_ci */ 117cabdff1aSopenharmony_civoid ff_h2645_packet_uninit(H2645Packet *pkt); 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_cistatic inline int get_nalsize(int nal_length_size, const uint8_t *buf, 120cabdff1aSopenharmony_ci int buf_size, int *buf_index, void *logctx) 121cabdff1aSopenharmony_ci{ 122cabdff1aSopenharmony_ci int i, nalsize = 0; 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci if (*buf_index >= buf_size - nal_length_size) { 125cabdff1aSopenharmony_ci // the end of the buffer is reached, refill it 126cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 127cabdff1aSopenharmony_ci } 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci for (i = 0; i < nal_length_size; i++) 130cabdff1aSopenharmony_ci nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++]; 131cabdff1aSopenharmony_ci if (nalsize <= 0 || nalsize > buf_size - *buf_index) { 132cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_ERROR, 133cabdff1aSopenharmony_ci "Invalid NAL unit size (%d > %d).\n", nalsize, buf_size - *buf_index); 134cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 135cabdff1aSopenharmony_ci } 136cabdff1aSopenharmony_ci return nalsize; 137cabdff1aSopenharmony_ci} 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci#endif /* AVCODEC_H2645_PARSE_H */ 140