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