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 { |
33 |
|
|
uint8_t *rbsp_buffer; |
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 |
|
|
|
47 |
|
|
GetBitContext gb; |
48 |
|
|
|
49 |
|
|
/** |
50 |
|
|
* NAL unit type |
51 |
|
|
*/ |
52 |
|
|
int type; |
53 |
|
|
|
54 |
|
|
/** |
55 |
|
|
* HEVC only, nuh_temporal_id_plus_1 - 1 |
56 |
|
|
*/ |
57 |
|
|
int temporal_id; |
58 |
|
|
|
59 |
|
|
/* |
60 |
|
|
* HEVC only, identifier of layer to which nal unit belongs |
61 |
|
|
*/ |
62 |
|
|
int nuh_layer_id; |
63 |
|
|
|
64 |
|
|
int skipped_bytes; |
65 |
|
|
int skipped_bytes_pos_size; |
66 |
|
|
int *skipped_bytes_pos; |
67 |
|
|
/** |
68 |
|
|
* H.264 only, nal_ref_idc |
69 |
|
|
*/ |
70 |
|
|
int ref_idc; |
71 |
|
|
} H2645NAL; |
72 |
|
|
|
73 |
|
|
typedef struct H2645RBSP { |
74 |
|
|
uint8_t *rbsp_buffer; |
75 |
|
|
AVBufferRef *rbsp_buffer_ref; |
76 |
|
|
int rbsp_buffer_alloc_size; |
77 |
|
|
int rbsp_buffer_size; |
78 |
|
|
} H2645RBSP; |
79 |
|
|
|
80 |
|
|
/* an input packet split into unescaped NAL units */ |
81 |
|
|
typedef struct H2645Packet { |
82 |
|
|
H2645NAL *nals; |
83 |
|
|
H2645RBSP rbsp; |
84 |
|
|
int nb_nals; |
85 |
|
|
int nals_allocated; |
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 |
|
|
*/ |
116 |
|
|
void ff_h2645_packet_uninit(H2645Packet *pkt); |
117 |
|
|
|
118 |
|
8562 |
static inline int get_nalsize(int nal_length_size, const uint8_t *buf, |
119 |
|
|
int buf_size, int *buf_index, void *logctx) |
120 |
|
|
{ |
121 |
|
8562 |
int i, nalsize = 0; |
122 |
|
|
|
123 |
✗✓ |
8562 |
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 |
✓✓ |
42134 |
for (i = 0; i < nal_length_size; i++) |
129 |
|
33572 |
nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++]; |
130 |
✓✗✓✓
|
8562 |
if (nalsize <= 0 || nalsize > buf_size - *buf_index) { |
131 |
|
2 |
av_log(logctx, AV_LOG_ERROR, |
132 |
|
2 |
"Invalid NAL unit size (%d > %d).\n", nalsize, buf_size - *buf_index); |
133 |
|
2 |
return AVERROR_INVALIDDATA; |
134 |
|
|
} |
135 |
|
8560 |
return nalsize; |
136 |
|
|
} |
137 |
|
|
|
138 |
|
|
#endif /* AVCODEC_H2645_PARSE_H */ |