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 */
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
codec_id
enum AVCodecID codec_id
Definition: qsv.c:72
H2645NAL::ref_idc
int ref_idc
H.264 only, nal_ref_idc.
Definition: h2645_parse.h:65
H2645Packet::nals_allocated
int nals_allocated
Definition: h2645_parse.h:80
H2645NAL::skipped_bytes_pos_size
int skipped_bytes_pos_size
Definition: h2645_parse.h:60
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:79
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:393
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:517
H2645Packet::rbsp
H2645RBSP rbsp
Definition: h2645_parse.h:78
src
#define src
Definition: vp8dsp.c:254
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
buf
void * buf
Definition: avisynth_c.h:766
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:61
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
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: avcodec.h:215
H2645NAL::skipped_bytes
int skipped_bytes
Definition: h2645_parse.h:59
H2645RBSP::rbsp_buffer
uint8_t * rbsp_buffer
Definition: h2645_parse.h:69
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:72
buffer.h
H2645Packet::nals
H2645NAL * nals
Definition: h2645_parse.h:77
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
uint8_t
uint8_t
Definition: audio_convert.c:194
H2645RBSP::rbsp_buffer_ref
AVBufferRef * rbsp_buffer_ref
Definition: h2645_parse.h:70
H2645RBSP::rbsp_buffer_alloc_size
int rbsp_buffer_alloc_size
Definition: h2645_parse.h:71
avcodec.h
H2645NAL::raw_data
const uint8_t * raw_data
Definition: h2645_parse.h:45
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:81
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:112
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
length
const char int length
Definition: avisynth_c.h:860
H2645Packet
Definition: h2645_parse.h:76
H2645RBSP
Definition: h2645_parse.h:68