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 
62  /**
63  * H.264 only, nal_ref_idc
64  */
65  int ref_idc;
66 } H2645NAL;
67 
68 typedef struct H2645RBSP {
73 } H2645RBSP;
74 
75 /* an input packet split into unescaped NAL units */
76 typedef struct H2645Packet {
79  int nb_nals;
81 } H2645Packet;
82 
83 /**
84  * Extract the raw (unescaped) bitstream.
85  */
86 int ff_h2645_extract_rbsp(const uint8_t *src, int length, H2645RBSP *rbsp,
87  H2645NAL *nal, int small_padding);
88 
89 /**
90  * Split an input packet into NAL units.
91  *
92  * If data == raw_data holds true for a NAL unit of the returned pkt, then
93  * said NAL unit does not contain any emulation_prevention_three_byte and
94  * the data is contained in the input buffer pointed to by buf.
95  * Otherwise, the unescaped data is part of the rbsp_buffer described by the
96  * packet's H2645RBSP.
97  *
98  * If the packet's rbsp_buffer_ref is not NULL, the underlying AVBuffer must
99  * own rbsp_buffer. If not and rbsp_buffer is not NULL, use_ref must be 0.
100  * If use_ref is set, rbsp_buffer will be reference-counted and owned by
101  * the underlying AVBuffer of rbsp_buffer_ref.
102  */
104  void *logctx, int is_nalff, int nal_length_size,
105  enum AVCodecID codec_id, int small_padding, int use_ref);
106 
107 /**
108  * Free all the allocated memory in the packet.
109  */
111 
112 static inline int get_nalsize(int nal_length_size, const uint8_t *buf,
113  int buf_size, int *buf_index, void *logctx)
114 {
115  int i, nalsize = 0;
116 
117  if (*buf_index >= buf_size - nal_length_size) {
118  // the end of the buffer is reached, refill it
119  return AVERROR(EAGAIN);
120  }
121 
122  for (i = 0; i < nal_length_size; i++)
123  nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++];
124  if (nalsize <= 0 || nalsize > buf_size - *buf_index) {
125  av_log(logctx, AV_LOG_ERROR,
126  "Invalid NAL unit size (%d > %d).\n", nalsize, buf_size - *buf_index);
127  return AVERROR_INVALIDDATA;
128  }
129  return nalsize;
130 }
131 
132 #endif /* AVCODEC_H2645_PARSE_H */
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int size
Definition: h2645_parse.h:35
enum AVCodecID codec_id
Definition: qsv.c:72
static AVPacket pkt
#define src
Definition: vp8dsp.c:254
int size_bits
Size, in bits, of just the data, excluding the stop bit and any trailing padding. ...
Definition: h2645_parse.h:42
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
int skipped_bytes_pos_size
Definition: h2645_parse.h:60
uint8_t
bitstream reader API header.
#define av_log(a,...)
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: avcodec.h:215
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
int * skipped_bytes_pos
Definition: h2645_parse.h:61
void ff_h2645_packet_uninit(H2645Packet *pkt)
Free all the allocated memory in the packet.
Definition: h2645_parse.c:512
GLsizei GLsizei * length
Definition: opengl_enc.c:114
int raw_size
Definition: h2645_parse.h:44
static int get_nalsize(int nal_length_size, const uint8_t *buf, int buf_size, int *buf_index, void *logctx)
Definition: h2645_parse.h:112
int ref_idc
H.264 only, nal_ref_idc.
Definition: h2645_parse.h:65
int type
NAL unit type.
Definition: h2645_parse.h:52
Libavcodec external API header.
int nals_allocated
Definition: h2645_parse.h:80
AVBufferRef * rbsp_buffer_ref
Definition: h2645_parse.h:70
const uint8_t * data
Definition: h2645_parse.h:36
void * buf
Definition: avisynth_c.h:766
int rbsp_buffer_size
Definition: h2645_parse.h:72
int rbsp_buffer_alloc_size
Definition: h2645_parse.h:71
uint8_t * rbsp_buffer
Definition: h2645_parse.h:69
refcounted data buffer API
H2645RBSP rbsp
Definition: h2645_parse.h:78
A reference to a data buffer.
Definition: buffer.h:81
int skipped_bytes
Definition: h2645_parse.h:59
GetBitContext gb
Definition: h2645_parse.h:47
const uint8_t * raw_data
Definition: h2645_parse.h:45
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:388
H2645NAL * nals
Definition: h2645_parse.h:77
int temporal_id
HEVC only, nuh_temporal_id_plus_1 - 1.
Definition: h2645_parse.h:57
uint8_t * rbsp_buffer
Definition: h2645_parse.h:33
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