FFmpeg
h2645_parse.h
Go to the documentation of this file.
1 /*
2  * H.264/HEVC common parsing code
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #ifndef AVCODEC_H2645_PARSE_H
22 #define AVCODEC_H2645_PARSE_H
23 
24 #include <stdint.h>
25 
26 #include "libavutil/buffer.h"
27 #include "libavutil/error.h"
28 #include "libavutil/log.h"
29 #include "codec_id.h"
30 #include "get_bits.h"
31 
32 #define MAX_MBPAIR_SIZE (256*1024) // a tighter bound could be calculated if someone cares about a few bytes
33 
34 typedef struct H2645NAL {
35  const uint8_t *data;
36  int size;
37 
38  /**
39  * Size, in bits, of just the data, excluding the stop bit and any trailing
40  * padding. I.e. what HEVC calls SODB.
41  */
42  int size_bits;
43 
44  int raw_size;
45  const uint8_t *raw_data;
46 
48 
49  /**
50  * NAL unit type
51  */
52  int type;
53 
54  /**
55  * H.264 only, nal_ref_idc
56  */
57  int ref_idc;
58 
59  /**
60  * HEVC only, nuh_temporal_id_plus_1 - 1
61  */
63 
64  /*
65  * HEVC only, identifier of layer to which nal unit belongs
66  */
68 
72 } H2645NAL;
73 
74 typedef struct H2645RBSP {
75  uint8_t *rbsp_buffer;
79 } H2645RBSP;
80 
81 /* an input packet split into unescaped NAL units */
82 typedef struct H2645Packet {
85  int nb_nals;
87  unsigned nal_buffer_size;
88 } H2645Packet;
89 
90 /**
91  * Extract the raw (unescaped) bitstream.
92  */
93 int ff_h2645_extract_rbsp(const uint8_t *src, int length, H2645RBSP *rbsp,
94  H2645NAL *nal, int small_padding);
95 
96 /**
97  * Split an input packet into NAL units.
98  *
99  * If data == raw_data holds true for a NAL unit of the returned pkt, then
100  * said NAL unit does not contain any emulation_prevention_three_byte and
101  * the data is contained in the input buffer pointed to by buf.
102  * Otherwise, the unescaped data is part of the rbsp_buffer described by the
103  * packet's H2645RBSP.
104  *
105  * If the packet's rbsp_buffer_ref is not NULL, the underlying AVBuffer must
106  * own rbsp_buffer. If not and rbsp_buffer is not NULL, use_ref must be 0.
107  * If use_ref is set, rbsp_buffer will be reference-counted and owned by
108  * the underlying AVBuffer of rbsp_buffer_ref.
109  */
110 int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
111  void *logctx, int is_nalff, int nal_length_size,
112  enum AVCodecID codec_id, int small_padding, int use_ref);
113 
114 /**
115  * Free all the allocated memory in the packet.
116  */
118 
119 static inline int get_nalsize(int nal_length_size, const uint8_t *buf,
120  int buf_size, int *buf_index, void *logctx)
121 {
122  int i, nalsize = 0;
123 
124  if (*buf_index >= buf_size - nal_length_size) {
125  // the end of the buffer is reached, refill it
126  return AVERROR(EAGAIN);
127  }
128 
129  for (i = 0; i < nal_length_size; i++)
130  nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++];
131  if (nalsize <= 0 || nalsize > buf_size - *buf_index) {
132  av_log(logctx, AV_LOG_ERROR,
133  "Invalid NAL unit size (%d > %d).\n", nalsize, buf_size - *buf_index);
134  return AVERROR_INVALIDDATA;
135  }
136  return nalsize;
137 }
138 
139 #endif /* AVCODEC_H2645_PARSE_H */
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
H2645NAL::ref_idc
int ref_idc
H.264 only, nal_ref_idc.
Definition: h2645_parse.h:57
H2645NAL::nuh_layer_id
int nuh_layer_id
Definition: h2645_parse.h:67
H2645Packet::nals_allocated
int nals_allocated
Definition: h2645_parse.h:86
H2645NAL::skipped_bytes_pos_size
int skipped_bytes_pos_size
Definition: h2645_parse.h:70
H2645NAL::temporal_id
int temporal_id
HEVC only, nuh_temporal_id_plus_1 - 1.
Definition: h2645_parse.h:62
H2645Packet::nb_nals
int nb_nals
Definition: h2645_parse.h:85
H2645NAL::size_bits
int size_bits
Size, in bits, of just the data, excluding the stop bit and any trailing padding.
Definition: h2645_parse.h:42
ff_h2645_packet_split
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, void *logctx, int is_nalff, int nal_length_size, enum AVCodecID codec_id, int small_padding, int use_ref)
Split an input packet into NAL units.
Definition: h2645_parse.c:396
GetBitContext
Definition: get_bits.h:61
ff_h2645_packet_uninit
void ff_h2645_packet_uninit(H2645Packet *pkt)
Free all the allocated memory in the packet.
Definition: h2645_parse.c:528
H2645Packet::rbsp
H2645RBSP rbsp
Definition: h2645_parse.h:84
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
codec_id.h
H2645NAL::size
int size
Definition: h2645_parse.h:36
get_bits.h
H2645NAL::data
const uint8_t * data
Definition: h2645_parse.h:35
H2645NAL::skipped_bytes_pos
int * skipped_bytes_pos
Definition: h2645_parse.h:71
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:371
H2645NAL::type
int type
NAL unit type.
Definition: h2645_parse.h:52
H2645NAL::raw_size
int raw_size
Definition: h2645_parse.h:44
error.h
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:47
H2645NAL::skipped_bytes
int skipped_bytes
Definition: h2645_parse.h:69
H2645RBSP::rbsp_buffer
uint8_t * rbsp_buffer
Definition: h2645_parse.h:75
H2645NAL::gb
GetBitContext gb
Definition: h2645_parse.h:47
H2645NAL
Definition: h2645_parse.h:34
H2645RBSP::rbsp_buffer_size
int rbsp_buffer_size
Definition: h2645_parse.h:78
buffer.h
H2645Packet::nal_buffer_size
unsigned nal_buffer_size
Definition: h2645_parse.h:87
H2645Packet::nals
H2645NAL * nals
Definition: h2645_parse.h:83
log.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
H2645RBSP::rbsp_buffer_ref
AVBufferRef * rbsp_buffer_ref
Definition: h2645_parse.h:76
H2645RBSP::rbsp_buffer_alloc_size
int rbsp_buffer_alloc_size
Definition: h2645_parse.h:77
H2645NAL::raw_data
const uint8_t * raw_data
Definition: h2645_parse.h:45
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
get_nalsize
static int get_nalsize(int nal_length_size, const uint8_t *buf, int buf_size, int *buf_index, void *logctx)
Definition: h2645_parse.h:119
ff_h2645_extract_rbsp
int ff_h2645_extract_rbsp(const uint8_t *src, int length, H2645RBSP *rbsp, H2645NAL *nal, int small_padding)
Extract the raw (unescaped) bitstream.
Definition: h2645_parse.c:34
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
H2645Packet
Definition: h2645_parse.h:82
H2645RBSP
Definition: h2645_parse.h:74