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 "avcodec.h"
28 #include "get_bits.h"
29 
30 #define MAX_MBPAIR_SIZE (256*1024) // a tighter bound could be calculated if someone cares about a few bytes
31 
32 typedef struct H2645NAL {
34 
35  int size;
36  const uint8_t *data;
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  * HEVC only, nuh_temporal_id_plus_1 - 1
56  */
58 
59  /*
60  * HEVC only, identifier of layer to which nal unit belongs
61  */
63 
67  /**
68  * H.264 only, nal_ref_idc
69  */
70  int ref_idc;
71 } H2645NAL;
72 
73 typedef struct H2645RBSP {
78 } H2645RBSP;
79 
80 /* an input packet split into unescaped NAL units */
81 typedef struct H2645Packet {
84  int nb_nals;
86  unsigned nal_buffer_size;
87 } H2645Packet;
88 
89 /**
90  * Extract the raw (unescaped) bitstream.
91  */
92 int ff_h2645_extract_rbsp(const uint8_t *src, int length, H2645RBSP *rbsp,
93  H2645NAL *nal, int small_padding);
94 
95 /**
96  * Split an input packet into NAL units.
97  *
98  * If data == raw_data holds true for a NAL unit of the returned pkt, then
99  * said NAL unit does not contain any emulation_prevention_three_byte and
100  * the data is contained in the input buffer pointed to by buf.
101  * Otherwise, the unescaped data is part of the rbsp_buffer described by the
102  * packet's H2645RBSP.
103  *
104  * If the packet's rbsp_buffer_ref is not NULL, the underlying AVBuffer must
105  * own rbsp_buffer. If not and rbsp_buffer is not NULL, use_ref must be 0.
106  * If use_ref is set, rbsp_buffer will be reference-counted and owned by
107  * the underlying AVBuffer of rbsp_buffer_ref.
108  */
109 int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
110  void *logctx, int is_nalff, int nal_length_size,
111  enum AVCodecID codec_id, int small_padding, int use_ref);
112 
113 /**
114  * Free all the allocated memory in the packet.
115  */
117 
118 static inline int get_nalsize(int nal_length_size, const uint8_t *buf,
119  int buf_size, int *buf_index, void *logctx)
120 {
121  int i, nalsize = 0;
122 
123  if (*buf_index >= buf_size - nal_length_size) {
124  // the end of the buffer is reached, refill it
125  return AVERROR(EAGAIN);
126  }
127 
128  for (i = 0; i < nal_length_size; i++)
129  nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++];
130  if (nalsize <= 0 || nalsize > buf_size - *buf_index) {
131  av_log(logctx, AV_LOG_ERROR,
132  "Invalid NAL unit size (%d > %d).\n", nalsize, buf_size - *buf_index);
133  return AVERROR_INVALIDDATA;
134  }
135  return nalsize;
136 }
137 
138 #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:70
H2645NAL::nuh_layer_id
int nuh_layer_id
Definition: h2645_parse.h:62
H2645Packet::nals_allocated
int nals_allocated
Definition: h2645_parse.h:85
H2645NAL::skipped_bytes_pos_size
int skipped_bytes_pos_size
Definition: h2645_parse.h:65
H2645NAL::temporal_id
int temporal_id
HEVC only, nuh_temporal_id_plus_1 - 1.
Definition: h2645_parse.h:57
H2645Packet::nb_nals
int nb_nals
Definition: h2645_parse.h:84
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:392
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:523
H2645Packet::rbsp
H2645RBSP rbsp
Definition: h2645_parse.h:83
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:194
H2645NAL::size
int size
Definition: h2645_parse.h:35
get_bits.h
H2645NAL::data
const uint8_t * data
Definition: h2645_parse.h:36
H2645NAL::skipped_bytes_pos
int * skipped_bytes_pos
Definition: h2645_parse.h:66
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:369
H2645NAL::type
int type
NAL unit type.
Definition: h2645_parse.h:52
H2645NAL::raw_size
int raw_size
Definition: h2645_parse.h:44
H2645NAL::rbsp_buffer
uint8_t * rbsp_buffer
Definition: h2645_parse.h:33
src
#define src
Definition: vp8dsp.c:255
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:46
H2645NAL::skipped_bytes
int skipped_bytes
Definition: h2645_parse.h:64
H2645RBSP::rbsp_buffer
uint8_t * rbsp_buffer
Definition: h2645_parse.h:74
H2645NAL::gb
GetBitContext gb
Definition: h2645_parse.h:47
H2645NAL
Definition: h2645_parse.h:32
H2645RBSP::rbsp_buffer_size
int rbsp_buffer_size
Definition: h2645_parse.h:77
buffer.h
H2645Packet::nal_buffer_size
unsigned nal_buffer_size
Definition: h2645_parse.h:86
H2645Packet::nals
H2645NAL * nals
Definition: h2645_parse.h:82
i
int i
Definition: input.c:407
uint8_t
uint8_t
Definition: audio_convert.c:194
H2645RBSP::rbsp_buffer_ref
AVBufferRef * rbsp_buffer_ref
Definition: h2645_parse.h:75
H2645RBSP::rbsp_buffer_alloc_size
int rbsp_buffer_alloc_size
Definition: h2645_parse.h:76
avcodec.h
H2645NAL::raw_data
const uint8_t * raw_data
Definition: h2645_parse.h:45
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:84
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:118
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:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
H2645Packet
Definition: h2645_parse.h:81
H2645RBSP
Definition: h2645_parse.h:73