Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * H.26L/H.264/AVC/JVT/14496-10/... parser | ||
3 | * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | ||
4 | * | ||
5 | * This file is part of FFmpeg. | ||
6 | * | ||
7 | * FFmpeg is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU Lesser General Public | ||
9 | * License as published by the Free Software Foundation; either | ||
10 | * version 2.1 of the License, or (at your option) any later version. | ||
11 | * | ||
12 | * FFmpeg is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * Lesser General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU Lesser General Public | ||
18 | * License along with FFmpeg; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | */ | ||
21 | |||
22 | /** | ||
23 | * @file | ||
24 | * H.264 / AVC / MPEG-4 part10 parser. | ||
25 | * @author Michael Niedermayer <michaelni@gmx.at> | ||
26 | */ | ||
27 | |||
28 | #define UNCHECKED_BITSTREAM_READER 1 | ||
29 | |||
30 | #include <stdint.h> | ||
31 | |||
32 | #include "libavutil/attributes.h" | ||
33 | #include "libavutil/avutil.h" | ||
34 | #include "libavutil/error.h" | ||
35 | #include "libavutil/log.h" | ||
36 | #include "libavutil/mem.h" | ||
37 | #include "libavutil/pixfmt.h" | ||
38 | |||
39 | #include "avcodec.h" | ||
40 | #include "get_bits.h" | ||
41 | #include "golomb.h" | ||
42 | #include "h264.h" | ||
43 | #include "h264dsp.h" | ||
44 | #include "h264_parse.h" | ||
45 | #include "h264_sei.h" | ||
46 | #include "h264_ps.h" | ||
47 | #include "h2645_parse.h" | ||
48 | #include "h264data.h" | ||
49 | #include "mpegutils.h" | ||
50 | #include "parser.h" | ||
51 | #include "libavutil/refstruct.h" | ||
52 | #include "startcode.h" | ||
53 | |||
54 | typedef struct H264ParseContext { | ||
55 | ParseContext pc; | ||
56 | H264ParamSets ps; | ||
57 | H264DSPContext h264dsp; | ||
58 | H264POCContext poc; | ||
59 | H264SEIContext sei; | ||
60 | int is_avc; | ||
61 | int nal_length_size; | ||
62 | int got_first; | ||
63 | int picture_structure; | ||
64 | uint8_t parse_history[6]; | ||
65 | int parse_history_count; | ||
66 | int parse_last_mb; | ||
67 | int64_t reference_dts; | ||
68 | int last_frame_num, last_picture_structure; | ||
69 | } H264ParseContext; | ||
70 | |||
71 | 39547 | static int find_start_code(const uint8_t *buf, int buf_size, | |
72 | int buf_index, int next_avc) | ||
73 | { | ||
74 | 39547 | uint32_t state = -1; | |
75 | |||
76 | 39547 | buf_index = avpriv_find_start_code(buf + buf_index, buf + next_avc + 1, &state) - buf - 1; | |
77 | |||
78 | 39547 | return FFMIN(buf_index, buf_size); | |
79 | } | ||
80 | |||
81 | 186424 | static int h264_find_frame_end(H264ParseContext *p, const uint8_t *buf, | |
82 | int buf_size, void *logctx) | ||
83 | { | ||
84 | int i, j; | ||
85 | uint32_t state; | ||
86 | 186424 | ParseContext *pc = &p->pc; | |
87 | |||
88 |
1/2✓ Branch 0 taken 186424 times.
✗ Branch 1 not taken.
|
186424 | int next_avc = p->is_avc ? 0 : buf_size; |
89 | // mb_addr= pc->mb_addr - 1; | ||
90 | 186424 | state = pc->state; | |
91 |
2/2✓ Branch 0 taken 96 times.
✓ Branch 1 taken 186328 times.
|
186424 | if (state > 13) |
92 | 96 | state = 7; | |
93 | |||
94 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 186424 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
186424 | if (p->is_avc && !p->nal_length_size) |
95 | ✗ | av_log(logctx, AV_LOG_ERROR, "AVC-parser: nal length size invalid\n"); | |
96 | |||
97 |
2/2✓ Branch 0 taken 2573588 times.
✓ Branch 1 taken 159795 times.
|
2733383 | for (i = 0; i < buf_size; i++) { |
98 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2573588 times.
|
2573588 | if (i >= next_avc) { |
99 | ✗ | int64_t nalsize = 0; | |
100 | ✗ | i = next_avc; | |
101 | ✗ | for (j = 0; j < p->nal_length_size; j++) | |
102 | ✗ | nalsize = (nalsize << 8) | buf[i++]; | |
103 | ✗ | if (!nalsize || nalsize > buf_size - i) { | |
104 | ✗ | av_log(logctx, AV_LOG_ERROR, "AVC-parser: nal size %"PRId64" " | |
105 | "remaining %d\n", nalsize, buf_size - i); | ||
106 | ✗ | return buf_size; | |
107 | } | ||
108 | ✗ | next_avc = i + nalsize; | |
109 | ✗ | state = 5; | |
110 | } | ||
111 | |||
112 |
2/2✓ Branch 0 taken 1208147 times.
✓ Branch 1 taken 1365441 times.
|
2573588 | if (state == 7) { |
113 | 1208147 | i += p->h264dsp.startcode_find_candidate(buf + i, next_avc - i); | |
114 |
2/2✓ Branch 0 taken 1051144 times.
✓ Branch 1 taken 157003 times.
|
1208147 | if (i < next_avc) |
115 | 1051144 | state = 2; | |
116 |
2/2✓ Branch 0 taken 1225015 times.
✓ Branch 1 taken 140426 times.
|
1365441 | } else if (state <= 2) { |
117 |
2/2✓ Branch 0 taken 100173 times.
✓ Branch 1 taken 1124842 times.
|
1225015 | if (buf[i] == 1) |
118 | 100173 | state ^= 5; // 2->7, 1->4, 0->5 | |
119 |
2/2✓ Branch 0 taken 951225 times.
✓ Branch 1 taken 173617 times.
|
1124842 | else if (buf[i]) |
120 | 951225 | state = 7; | |
121 | else | ||
122 | 173617 | state >>= 1; // 2->1, 1->0, 0->0 | |
123 |
2/2✓ Branch 0 taken 75218 times.
✓ Branch 1 taken 65208 times.
|
140426 | } else if (state <= 5) { |
124 | 75218 | int nalu_type = buf[i] & 0x1F; | |
125 |
6/6✓ Branch 0 taken 72975 times.
✓ Branch 1 taken 2243 times.
✓ Branch 2 taken 71549 times.
✓ Branch 3 taken 1426 times.
✓ Branch 4 taken 58649 times.
✓ Branch 5 taken 12900 times.
|
75218 | if (nalu_type == H264_NAL_SEI || nalu_type == H264_NAL_SPS || |
126 |
2/2✓ Branch 0 taken 4620 times.
✓ Branch 1 taken 54029 times.
|
58649 | nalu_type == H264_NAL_PPS || nalu_type == H264_NAL_AUD) { |
127 |
2/2✓ Branch 0 taken 8780 times.
✓ Branch 1 taken 12409 times.
|
21189 | if (pc->frame_start_found) { |
128 | 8780 | i++; | |
129 | 8780 | goto found; | |
130 | } | ||
131 |
5/6✓ Branch 0 taken 1842 times.
✓ Branch 1 taken 52187 times.
✓ Branch 2 taken 1842 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1308 times.
✓ Branch 5 taken 534 times.
|
54029 | } else if (nalu_type == H264_NAL_SLICE || nalu_type == H264_NAL_DPA || |
132 | nalu_type == H264_NAL_IDR_SLICE) { | ||
133 | 53495 | state += 8; | |
134 | 53495 | continue; | |
135 | } | ||
136 | 12943 | state = 7; | |
137 | } else { | ||
138 | 65208 | unsigned int mb, last_mb = p->parse_last_mb; | |
139 | GetBitContext gb; | ||
140 | 65208 | p->parse_history[p->parse_history_count++] = buf[i]; | |
141 | |||
142 | 65208 | init_get_bits(&gb, p->parse_history, 8*p->parse_history_count); | |
143 | 65208 | mb= get_ue_golomb_long(&gb); | |
144 |
3/4✓ Branch 1 taken 11713 times.
✓ Branch 2 taken 53495 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 11713 times.
|
65208 | if (get_bits_left(&gb) > 0 || p->parse_history_count > 5) { |
145 | 53495 | p->parse_last_mb = mb; | |
146 |
2/2✓ Branch 0 taken 26630 times.
✓ Branch 1 taken 26865 times.
|
53495 | if (pc->frame_start_found) { |
147 |
2/2✓ Branch 0 taken 17849 times.
✓ Branch 1 taken 8781 times.
|
26630 | if (mb <= last_mb) { |
148 | 17849 | i -= p->parse_history_count - 1; | |
149 | 17849 | p->parse_history_count = 0; | |
150 | 17849 | goto found; | |
151 | } | ||
152 | } else | ||
153 | 26865 | pc->frame_start_found = 1; | |
154 | 35646 | p->parse_history_count = 0; | |
155 | 35646 | state = 7; | |
156 | } | ||
157 | } | ||
158 | } | ||
159 | 159795 | pc->state = state; | |
160 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 159795 times.
|
159795 | if (p->is_avc) |
161 | ✗ | return next_avc; | |
162 | 159795 | return END_NOT_FOUND; | |
163 | |||
164 | 26629 | found: | |
165 | 26629 | pc->state = 7; | |
166 | 26629 | pc->frame_start_found = 0; | |
167 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 26629 times.
|
26629 | if (p->is_avc) |
168 | ✗ | return next_avc; | |
169 | 26629 | return i - (state & 5); | |
170 | } | ||
171 | |||
172 | 20681 | static int scan_mmco_reset(AVCodecParserContext *s, GetBitContext *gb, | |
173 | void *logctx) | ||
174 | { | ||
175 | H264PredWeightTable pwt; | ||
176 | 20681 | int slice_type_nos = s->pict_type & 3; | |
177 | 20681 | H264ParseContext *p = s->priv_data; | |
178 | int list_count, ref_count[2]; | ||
179 | |||
180 | |||
181 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 20681 times.
|
20681 | if (p->ps.pps->redundant_pic_cnt_present) |
182 | ✗ | get_ue_golomb(gb); // redundant_pic_count | |
183 | |||
184 |
2/2✓ Branch 0 taken 1134 times.
✓ Branch 1 taken 19547 times.
|
20681 | if (slice_type_nos == AV_PICTURE_TYPE_B) |
185 | 1134 | get_bits1(gb); // direct_spatial_mv_pred | |
186 | |||
187 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 20681 times.
|
20681 | if (ff_h264_parse_ref_count(&list_count, ref_count, gb, p->ps.pps, |
188 | slice_type_nos, p->picture_structure, logctx) < 0) | ||
189 | ✗ | return AVERROR_INVALIDDATA; | |
190 | |||
191 |
2/2✓ Branch 0 taken 18854 times.
✓ Branch 1 taken 1827 times.
|
20681 | if (slice_type_nos != AV_PICTURE_TYPE_I) { |
192 | int list; | ||
193 |
2/2✓ Branch 0 taken 19988 times.
✓ Branch 1 taken 18854 times.
|
38842 | for (list = 0; list < list_count; list++) { |
194 |
2/2✓ Branch 1 taken 3149 times.
✓ Branch 2 taken 16839 times.
|
19988 | if (get_bits1(gb)) { |
195 | int index; | ||
196 | 15108 | for (index = 0; ; index++) { | |
197 | 15108 | unsigned int reordering_of_pic_nums_idc = get_ue_golomb_31(gb); | |
198 | |||
199 |
2/2✓ Branch 0 taken 11959 times.
✓ Branch 1 taken 3149 times.
|
15108 | if (reordering_of_pic_nums_idc < 3) |
200 | 11959 | get_ue_golomb_long(gb); | |
201 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3149 times.
|
3149 | else if (reordering_of_pic_nums_idc > 3) { |
202 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
203 | "illegal reordering_of_pic_nums_idc %d\n", | ||
204 | reordering_of_pic_nums_idc); | ||
205 | ✗ | return AVERROR_INVALIDDATA; | |
206 | } else | ||
207 | 3149 | break; | |
208 | |||
209 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 11959 times.
|
11959 | if (index >= ref_count[list]) { |
210 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
211 | "reference count %d overflow\n", index); | ||
212 | ✗ | return AVERROR_INVALIDDATA; | |
213 | } | ||
214 | } | ||
215 | } | ||
216 | } | ||
217 | } | ||
218 | |||
219 |
4/4✓ Branch 0 taken 4008 times.
✓ Branch 1 taken 16673 times.
✓ Branch 2 taken 562 times.
✓ Branch 3 taken 3446 times.
|
20681 | if ((p->ps.pps->weighted_pred && slice_type_nos == AV_PICTURE_TYPE_P) || |
220 |
3/4✓ Branch 0 taken 24 times.
✓ Branch 1 taken 17211 times.
✓ Branch 2 taken 24 times.
✗ Branch 3 not taken.
|
17235 | (p->ps.pps->weighted_bipred_idc == 1 && slice_type_nos == AV_PICTURE_TYPE_B)) |
221 | 3470 | ff_h264_pred_weight_table(gb, p->ps.sps, ref_count, slice_type_nos, | |
222 | &pwt, p->picture_structure, logctx); | ||
223 | |||
224 |
2/2✓ Branch 1 taken 2148 times.
✓ Branch 2 taken 18533 times.
|
20681 | if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag |
225 | int i; | ||
226 |
1/2✓ Branch 0 taken 6221 times.
✗ Branch 1 not taken.
|
6221 | for (i = 0; i < H264_MAX_MMCO_COUNT; i++) { |
227 | 6221 | MMCOOpcode opcode = get_ue_golomb_31(gb); | |
228 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6221 times.
|
6221 | if (opcode > (unsigned) MMCO_LONG) { |
229 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
230 | "illegal memory management control operation %d\n", | ||
231 | opcode); | ||
232 | ✗ | return AVERROR_INVALIDDATA; | |
233 | } | ||
234 |
2/2✓ Branch 0 taken 2098 times.
✓ Branch 1 taken 4123 times.
|
6221 | if (opcode == MMCO_END) |
235 | 2098 | return 0; | |
236 |
2/2✓ Branch 0 taken 50 times.
✓ Branch 1 taken 4073 times.
|
4123 | else if (opcode == MMCO_RESET) |
237 | 50 | return 1; | |
238 | |||
239 |
4/4✓ Branch 0 taken 808 times.
✓ Branch 1 taken 3265 times.
✓ Branch 2 taken 333 times.
✓ Branch 3 taken 475 times.
|
4073 | if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) |
240 | 3598 | get_ue_golomb_long(gb); // difference_of_pic_nums_minus1 | |
241 |
6/6✓ Branch 0 taken 3740 times.
✓ Branch 1 taken 333 times.
✓ Branch 2 taken 3660 times.
✓ Branch 3 taken 80 times.
✓ Branch 4 taken 3644 times.
✓ Branch 5 taken 16 times.
|
4073 | if (opcode == MMCO_SHORT2LONG || opcode == MMCO_LONG2UNUSED || |
242 |
2/2✓ Branch 0 taken 379 times.
✓ Branch 1 taken 3265 times.
|
3644 | opcode == MMCO_LONG || opcode == MMCO_SET_MAX_LONG) |
243 | 808 | get_ue_golomb_31(gb); | |
244 | } | ||
245 | } | ||
246 | |||
247 | 18533 | return 0; | |
248 | } | ||
249 | |||
250 | /** | ||
251 | * Parse NAL units of found picture and decode some basic information. | ||
252 | * | ||
253 | * @param s parser context. | ||
254 | * @param avctx codec context. | ||
255 | * @param buf buffer with field/frame data. | ||
256 | * @param buf_size size of the buffer. | ||
257 | */ | ||
258 | 34106 | static inline int parse_nal_units(AVCodecParserContext *s, | |
259 | AVCodecContext *avctx, | ||
260 | const uint8_t * const buf, int buf_size) | ||
261 | { | ||
262 | 34106 | H264ParseContext *p = s->priv_data; | |
263 | 34106 | H2645RBSP rbsp = { NULL }; | |
264 | 34106 | H2645NAL nal = { NULL }; | |
265 | int buf_index, next_avc; | ||
266 | unsigned int pps_id; | ||
267 | unsigned int slice_type; | ||
268 | 34106 | int state = -1, got_reset = 0; | |
269 |
3/4✓ Branch 0 taken 33773 times.
✓ Branch 1 taken 333 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 33773 times.
|
34106 | int q264 = buf_size >=4 && !memcmp("Q264", buf, 4); |
270 | int field_poc[2]; | ||
271 | int ret; | ||
272 | |||
273 | /* set some sane default values */ | ||
274 | 34106 | s->pict_type = AV_PICTURE_TYPE_I; | |
275 | 34106 | s->key_frame = 0; | |
276 | 34106 | s->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN; | |
277 | |||
278 | 34106 | ff_h264_sei_uninit(&p->sei); | |
279 | 34106 | p->sei.common.frame_packing.arrangement_cancel_flag = -1; | |
280 | 34106 | p->sei.common.unregistered.x264_build = -1; | |
281 | |||
282 |
2/2✓ Branch 0 taken 333 times.
✓ Branch 1 taken 33773 times.
|
34106 | if (!buf_size) |
283 | 333 | return 0; | |
284 | |||
285 | 33773 | av_fast_padded_malloc(&rbsp.rbsp_buffer, &rbsp.rbsp_buffer_alloc_size, buf_size); | |
286 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 33773 times.
|
33773 | if (!rbsp.rbsp_buffer) |
287 | ✗ | return AVERROR(ENOMEM); | |
288 | |||
289 | 33773 | buf_index = 0; | |
290 |
2/2✓ Branch 0 taken 26949 times.
✓ Branch 1 taken 6824 times.
|
33773 | next_avc = p->is_avc ? 0 : buf_size; |
291 | 16672 | for (;;) { | |
292 | const SPS *sps; | ||
293 | 50445 | int src_length, consumed, nalsize = 0; | |
294 | |||
295 |
2/2✓ Branch 0 taken 10898 times.
✓ Branch 1 taken 39547 times.
|
50445 | if (buf_index >= next_avc) { |
296 | 10898 | nalsize = get_nalsize(p->nal_length_size, buf, buf_size, &buf_index, avctx); | |
297 |
2/2✓ Branch 0 taken 332 times.
✓ Branch 1 taken 10566 times.
|
10898 | if (nalsize < 0) |
298 | 332 | break; | |
299 | 10566 | next_avc = buf_index + nalsize; | |
300 | } else { | ||
301 | 39547 | buf_index = find_start_code(buf, buf_size, buf_index, next_avc); | |
302 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 39547 times.
|
39547 | if (buf_index >= buf_size) |
303 | ✗ | break; | |
304 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 39547 times.
|
39547 | if (buf_index >= next_avc) |
305 | ✗ | continue; | |
306 | } | ||
307 | 50113 | src_length = next_avc - buf_index; | |
308 | |||
309 | 50113 | state = buf[buf_index]; | |
310 |
2/2✓ Branch 0 taken 33441 times.
✓ Branch 1 taken 16672 times.
|
50113 | switch (state & 0x1f) { |
311 | 33441 | case H264_NAL_SLICE: | |
312 | case H264_NAL_IDR_SLICE: | ||
313 | // Do not walk the whole buffer just to decode slice header | ||
314 |
4/4✓ Branch 0 taken 32573 times.
✓ Branch 1 taken 868 times.
✓ Branch 2 taken 11350 times.
✓ Branch 3 taken 21223 times.
|
33441 | if ((state & 0x1f) == H264_NAL_IDR_SLICE || ((state >> 5) & 0x3) == 0) { |
315 | /* IDR or disposable slice | ||
316 | * No need to decode many bytes because MMCOs shall not be present. */ | ||
317 |
2/2✓ Branch 0 taken 11814 times.
✓ Branch 1 taken 404 times.
|
12218 | if (src_length > 60) |
318 | 11814 | src_length = 60; | |
319 | } else { | ||
320 | /* To decode up to MMCOs */ | ||
321 |
2/2✓ Branch 0 taken 11913 times.
✓ Branch 1 taken 9310 times.
|
21223 | if (src_length > 1000) |
322 | 11913 | src_length = 1000; | |
323 | } | ||
324 | 33441 | break; | |
325 | } | ||
326 | 50113 | consumed = ff_h2645_extract_rbsp(buf + buf_index, src_length, &rbsp, &nal, 1); | |
327 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50113 times.
|
50113 | if (consumed < 0) |
328 | ✗ | break; | |
329 | |||
330 | 50113 | buf_index += consumed; | |
331 | |||
332 | 50113 | ret = init_get_bits8(&nal.gb, nal.data, nal.size); | |
333 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50113 times.
|
50113 | if (ret < 0) |
334 | ✗ | goto fail; | |
335 | 50113 | get_bits1(&nal.gb); | |
336 | 50113 | nal.ref_idc = get_bits(&nal.gb, 2); | |
337 | 50113 | nal.type = get_bits(&nal.gb, 5); | |
338 | |||
339 |
6/6✓ Branch 0 taken 932 times.
✓ Branch 1 taken 7635 times.
✓ Branch 2 taken 4230 times.
✓ Branch 3 taken 868 times.
✓ Branch 4 taken 32573 times.
✓ Branch 5 taken 3875 times.
|
50113 | switch (nal.type) { |
340 | 932 | case H264_NAL_SPS: | |
341 | 932 | ff_h264_decode_seq_parameter_set(&nal.gb, avctx, &p->ps, 0); | |
342 | 932 | break; | |
343 | 7635 | case H264_NAL_PPS: | |
344 | 7635 | ff_h264_decode_picture_parameter_set(&nal.gb, avctx, &p->ps, | |
345 | nal.size_bits); | ||
346 | 7635 | break; | |
347 | 4230 | case H264_NAL_SEI: | |
348 | 4230 | ff_h264_sei_decode(&p->sei, &nal.gb, &p->ps, avctx); | |
349 | 4230 | break; | |
350 | 868 | case H264_NAL_IDR_SLICE: | |
351 | 868 | s->key_frame = 1; | |
352 | |||
353 | 868 | p->poc.prev_frame_num = 0; | |
354 | 868 | p->poc.prev_frame_num_offset = 0; | |
355 | 868 | p->poc.prev_poc_msb = | |
356 | 868 | p->poc.prev_poc_lsb = 0; | |
357 | /* fall through */ | ||
358 | 33441 | case H264_NAL_SLICE: | |
359 | 33441 | get_ue_golomb_long(&nal.gb); // skip first_mb_in_slice | |
360 | 33441 | slice_type = get_ue_golomb_31(&nal.gb); | |
361 | 33441 | s->pict_type = ff_h264_golomb_to_pict_type[slice_type % 5]; | |
362 |
2/2✓ Branch 0 taken 205 times.
✓ Branch 1 taken 33236 times.
|
33441 | if (p->sei.recovery_point.recovery_frame_cnt >= 0) { |
363 | /* key frame, since recovery_frame_cnt is set */ | ||
364 | 205 | s->key_frame = 1; | |
365 | } | ||
366 | 33441 | pps_id = get_ue_golomb(&nal.gb); | |
367 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 33441 times.
|
33441 | if (pps_id >= MAX_PPS_COUNT) { |
368 | ✗ | av_log(avctx, AV_LOG_ERROR, | |
369 | "pps_id %u out of range\n", pps_id); | ||
370 | ✗ | goto fail; | |
371 | } | ||
372 |
2/2✓ Branch 0 taken 568 times.
✓ Branch 1 taken 32873 times.
|
33441 | if (!p->ps.pps_list[pps_id]) { |
373 | 568 | av_log(avctx, AV_LOG_ERROR, | |
374 | "non-existing PPS %u referenced\n", pps_id); | ||
375 | 568 | goto fail; | |
376 | } | ||
377 | |||
378 | 32873 | av_refstruct_replace(&p->ps.pps, p->ps.pps_list[pps_id]); | |
379 | 32873 | p->ps.sps = p->ps.pps->sps; | |
380 | 32873 | sps = p->ps.sps; | |
381 | |||
382 | // heuristic to detect non marked keyframes | ||
383 |
6/6✓ Branch 0 taken 8643 times.
✓ Branch 1 taken 24230 times.
✓ Branch 2 taken 8509 times.
✓ Branch 3 taken 134 times.
✓ Branch 4 taken 1029 times.
✓ Branch 5 taken 7480 times.
|
32873 | if (p->ps.sps->ref_frame_count <= 1 && p->ps.pps->ref_count[0] <= 1 && s->pict_type == AV_PICTURE_TYPE_I) |
384 | 1029 | s->key_frame = 1; | |
385 | |||
386 | 32873 | p->poc.frame_num = get_bits(&nal.gb, sps->log2_max_frame_num); | |
387 | |||
388 | 32873 | s->coded_width = 16 * sps->mb_width; | |
389 | 32873 | s->coded_height = 16 * sps->mb_height; | |
390 | 32873 | s->width = s->coded_width - (sps->crop_right + sps->crop_left); | |
391 | 32873 | s->height = s->coded_height - (sps->crop_top + sps->crop_bottom); | |
392 |
2/4✓ Branch 0 taken 32873 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 32873 times.
|
32873 | if (s->width <= 0 || s->height <= 0) { |
393 | ✗ | s->width = s->coded_width; | |
394 | ✗ | s->height = s->coded_height; | |
395 | } | ||
396 | |||
397 |
3/4✓ Branch 0 taken 150 times.
✓ Branch 1 taken 285 times.
✓ Branch 2 taken 32438 times.
✗ Branch 3 not taken.
|
32873 | switch (sps->bit_depth_luma) { |
398 | 150 | case 9: | |
399 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 150 times.
|
150 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P9; |
400 |
2/2✓ Branch 0 taken 50 times.
✓ Branch 1 taken 100 times.
|
150 | else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P9; |
401 | 100 | else s->format = AV_PIX_FMT_YUV420P9; | |
402 | 150 | break; | |
403 | 285 | case 10: | |
404 |
2/2✓ Branch 0 taken 50 times.
✓ Branch 1 taken 235 times.
|
285 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P10; |
405 |
2/2✓ Branch 0 taken 87 times.
✓ Branch 1 taken 148 times.
|
235 | else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P10; |
406 | 148 | else s->format = AV_PIX_FMT_YUV420P10; | |
407 | 285 | break; | |
408 | 32438 | case 8: | |
409 |
2/2✓ Branch 0 taken 889 times.
✓ Branch 1 taken 31549 times.
|
32438 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P; |
410 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 31539 times.
|
31549 | else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P; |
411 | 31539 | else s->format = AV_PIX_FMT_YUV420P; | |
412 | 32438 | break; | |
413 | ✗ | default: | |
414 | ✗ | s->format = AV_PIX_FMT_NONE; | |
415 | } | ||
416 | |||
417 | 32873 | avctx->profile = ff_h264_get_profile(sps); | |
418 | 32873 | avctx->level = sps->level_idc; | |
419 | |||
420 |
2/2✓ Branch 0 taken 23425 times.
✓ Branch 1 taken 9448 times.
|
32873 | if (sps->frame_mbs_only_flag) { |
421 | 23425 | p->picture_structure = PICT_FRAME; | |
422 | } else { | ||
423 |
2/2✓ Branch 1 taken 6487 times.
✓ Branch 2 taken 2961 times.
|
9448 | if (get_bits1(&nal.gb)) { // field_pic_flag |
424 | 6487 | p->picture_structure = PICT_TOP_FIELD + get_bits1(&nal.gb); // bottom_field_flag | |
425 | } else { | ||
426 | 2961 | p->picture_structure = PICT_FRAME; | |
427 | } | ||
428 | } | ||
429 | |||
430 |
2/2✓ Branch 0 taken 866 times.
✓ Branch 1 taken 32007 times.
|
32873 | if (nal.type == H264_NAL_IDR_SLICE) |
431 | 866 | get_ue_golomb_long(&nal.gb); /* idr_pic_id */ | |
432 |
2/2✓ Branch 0 taken 24929 times.
✓ Branch 1 taken 7944 times.
|
32873 | if (sps->poc_type == 0) { |
433 | 24929 | p->poc.poc_lsb = get_bits(&nal.gb, sps->log2_max_poc_lsb); | |
434 | |||
435 |
2/2✓ Branch 0 taken 4228 times.
✓ Branch 1 taken 20701 times.
|
24929 | if (p->ps.pps->pic_order_present == 1 && |
436 |
2/2✓ Branch 0 taken 3273 times.
✓ Branch 1 taken 955 times.
|
4228 | p->picture_structure == PICT_FRAME) |
437 | 3273 | p->poc.delta_poc_bottom = get_se_golomb(&nal.gb); | |
438 | } | ||
439 | |||
440 |
2/2✓ Branch 0 taken 3245 times.
✓ Branch 1 taken 29628 times.
|
32873 | if (sps->poc_type == 1 && |
441 |
2/2✓ Branch 0 taken 3071 times.
✓ Branch 1 taken 174 times.
|
3245 | !sps->delta_pic_order_always_zero_flag) { |
442 | 3071 | p->poc.delta_poc[0] = get_se_golomb(&nal.gb); | |
443 | |||
444 |
2/2✓ Branch 0 taken 692 times.
✓ Branch 1 taken 2379 times.
|
3071 | if (p->ps.pps->pic_order_present == 1 && |
445 |
2/2✓ Branch 0 taken 406 times.
✓ Branch 1 taken 286 times.
|
692 | p->picture_structure == PICT_FRAME) |
446 | 406 | p->poc.delta_poc[1] = get_se_golomb(&nal.gb); | |
447 | } | ||
448 | |||
449 | /* Decode POC of this picture. | ||
450 | * The prev_ values needed for decoding POC of the next picture are not set here. */ | ||
451 | 32873 | field_poc[0] = field_poc[1] = INT_MAX; | |
452 | 32873 | ret = ff_h264_init_poc(field_poc, &s->output_picture_number, sps, | |
453 | &p->poc, p->picture_structure, nal.ref_idc); | ||
454 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 32873 times.
|
32873 | if (ret < 0) |
455 | ✗ | goto fail; | |
456 | |||
457 | /* Continue parsing to check if MMCO_RESET is present. | ||
458 | * FIXME: MMCO_RESET could appear in non-first slice. | ||
459 | * Maybe, we should parse all undisposable non-IDR slice of this | ||
460 | * picture until encountering MMCO_RESET in a slice of it. */ | ||
461 |
4/4✓ Branch 0 taken 21547 times.
✓ Branch 1 taken 11326 times.
✓ Branch 2 taken 20681 times.
✓ Branch 3 taken 866 times.
|
32873 | if (nal.ref_idc && nal.type != H264_NAL_IDR_SLICE) { |
462 | 20681 | got_reset = scan_mmco_reset(s, &nal.gb, avctx); | |
463 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 20681 times.
|
20681 | if (got_reset < 0) |
464 | ✗ | goto fail; | |
465 | } | ||
466 | |||
467 | /* Set up the prev_ values for decoding POC of the next picture. */ | ||
468 |
2/2✓ Branch 0 taken 32823 times.
✓ Branch 1 taken 50 times.
|
32873 | p->poc.prev_frame_num = got_reset ? 0 : p->poc.frame_num; |
469 |
2/2✓ Branch 0 taken 32823 times.
✓ Branch 1 taken 50 times.
|
32873 | p->poc.prev_frame_num_offset = got_reset ? 0 : p->poc.frame_num_offset; |
470 |
2/2✓ Branch 0 taken 21547 times.
✓ Branch 1 taken 11326 times.
|
32873 | if (nal.ref_idc != 0) { |
471 |
2/2✓ Branch 0 taken 21497 times.
✓ Branch 1 taken 50 times.
|
21547 | if (!got_reset) { |
472 | 21497 | p->poc.prev_poc_msb = p->poc.poc_msb; | |
473 | 21497 | p->poc.prev_poc_lsb = p->poc.poc_lsb; | |
474 | } else { | ||
475 | 50 | p->poc.prev_poc_msb = 0; | |
476 | 50 | p->poc.prev_poc_lsb = | |
477 |
1/2✓ Branch 0 taken 50 times.
✗ Branch 1 not taken.
|
50 | p->picture_structure == PICT_BOTTOM_FIELD ? 0 : field_poc[0]; |
478 | } | ||
479 | } | ||
480 | |||
481 |
2/2✓ Branch 0 taken 2989 times.
✓ Branch 1 taken 29884 times.
|
32873 | if (p->sei.picture_timing.present) { |
482 | 2989 | ret = ff_h264_sei_process_picture_timing(&p->sei.picture_timing, | |
483 | sps, avctx); | ||
484 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2989 times.
|
2989 | if (ret < 0) { |
485 | ✗ | av_log(avctx, AV_LOG_ERROR, "Error processing the picture timing SEI\n"); | |
486 | ✗ | p->sei.picture_timing.present = 0; | |
487 | } | ||
488 | } | ||
489 | |||
490 |
4/4✓ Branch 0 taken 3385 times.
✓ Branch 1 taken 29488 times.
✓ Branch 2 taken 2977 times.
✓ Branch 3 taken 408 times.
|
32873 | if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { |
491 |
3/6✓ Branch 0 taken 831 times.
✓ Branch 1 taken 2008 times.
✓ Branch 2 taken 138 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2977 | switch (p->sei.picture_timing.pic_struct) { |
492 | 831 | case H264_SEI_PIC_STRUCT_TOP_FIELD: | |
493 | case H264_SEI_PIC_STRUCT_BOTTOM_FIELD: | ||
494 | 831 | s->repeat_pict = 0; | |
495 | 831 | break; | |
496 | 2008 | case H264_SEI_PIC_STRUCT_FRAME: | |
497 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | ||
498 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP: | ||
499 | 2008 | s->repeat_pict = 1; | |
500 | 2008 | break; | |
501 | 138 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | |
502 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | ||
503 | 138 | s->repeat_pict = 2; | |
504 | 138 | break; | |
505 | ✗ | case H264_SEI_PIC_STRUCT_FRAME_DOUBLING: | |
506 | ✗ | s->repeat_pict = 3; | |
507 | ✗ | break; | |
508 | ✗ | case H264_SEI_PIC_STRUCT_FRAME_TRIPLING: | |
509 | ✗ | s->repeat_pict = 5; | |
510 | ✗ | break; | |
511 | ✗ | default: | |
512 | ✗ | s->repeat_pict = p->picture_structure == PICT_FRAME ? 1 : 0; | |
513 | ✗ | break; | |
514 | } | ||
515 | } else { | ||
516 | 29896 | s->repeat_pict = p->picture_structure == PICT_FRAME ? 1 : 0; | |
517 | } | ||
518 | |||
519 |
2/2✓ Branch 0 taken 26386 times.
✓ Branch 1 taken 6487 times.
|
32873 | if (p->picture_structure == PICT_FRAME) { |
520 | 26386 | s->picture_structure = AV_PICTURE_STRUCTURE_FRAME; | |
521 |
4/4✓ Branch 0 taken 2225 times.
✓ Branch 1 taken 24161 times.
✓ Branch 2 taken 2146 times.
✓ Branch 3 taken 79 times.
|
26386 | if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { |
522 |
3/3✓ Branch 0 taken 1421 times.
✓ Branch 1 taken 150 times.
✓ Branch 2 taken 575 times.
|
2146 | switch (p->sei.picture_timing.pic_struct) { |
523 | 1421 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | |
524 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | ||
525 | 1421 | s->field_order = AV_FIELD_TT; | |
526 | 1421 | break; | |
527 | 150 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP: | |
528 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | ||
529 | 150 | s->field_order = AV_FIELD_BB; | |
530 | 150 | break; | |
531 | 575 | default: | |
532 | 575 | s->field_order = AV_FIELD_PROGRESSIVE; | |
533 | 575 | break; | |
534 | } | ||
535 | } else { | ||
536 |
2/2✓ Branch 0 taken 1041 times.
✓ Branch 1 taken 23199 times.
|
24240 | if (field_poc[0] < field_poc[1]) |
537 | 1041 | s->field_order = AV_FIELD_TT; | |
538 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 23196 times.
|
23199 | else if (field_poc[0] > field_poc[1]) |
539 | 3 | s->field_order = AV_FIELD_BB; | |
540 | else | ||
541 | 23196 | s->field_order = AV_FIELD_PROGRESSIVE; | |
542 | } | ||
543 | } else { | ||
544 |
2/2✓ Branch 0 taken 3341 times.
✓ Branch 1 taken 3146 times.
|
6487 | if (p->picture_structure == PICT_TOP_FIELD) |
545 | 3341 | s->picture_structure = AV_PICTURE_STRUCTURE_TOP_FIELD; | |
546 | else | ||
547 | 3146 | s->picture_structure = AV_PICTURE_STRUCTURE_BOTTOM_FIELD; | |
548 |
2/2✓ Branch 0 taken 4884 times.
✓ Branch 1 taken 1603 times.
|
6487 | if (p->poc.frame_num == p->last_frame_num && |
549 |
1/2✓ Branch 0 taken 4884 times.
✗ Branch 1 not taken.
|
4884 | p->last_picture_structure != AV_PICTURE_STRUCTURE_UNKNOWN && |
550 |
1/2✓ Branch 0 taken 4884 times.
✗ Branch 1 not taken.
|
4884 | p->last_picture_structure != AV_PICTURE_STRUCTURE_FRAME && |
551 |
2/2✓ Branch 0 taken 4760 times.
✓ Branch 1 taken 124 times.
|
4884 | p->last_picture_structure != s->picture_structure) { |
552 |
2/2✓ Branch 0 taken 3140 times.
✓ Branch 1 taken 1620 times.
|
4760 | if (p->last_picture_structure == AV_PICTURE_STRUCTURE_TOP_FIELD) |
553 | 3140 | s->field_order = AV_FIELD_TT; | |
554 | else | ||
555 | 1620 | s->field_order = AV_FIELD_BB; | |
556 | } else { | ||
557 | 1727 | s->field_order = AV_FIELD_UNKNOWN; | |
558 | } | ||
559 | 6487 | p->last_picture_structure = s->picture_structure; | |
560 | 6487 | p->last_frame_num = p->poc.frame_num; | |
561 | } | ||
562 |
2/2✓ Branch 0 taken 9775 times.
✓ Branch 1 taken 23098 times.
|
32873 | if (sps->timing_info_present_flag) { |
563 | 9775 | int64_t den = sps->time_scale; | |
564 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9775 times.
|
9775 | if (p->sei.common.unregistered.x264_build < 44U) |
565 | ✗ | den *= 2; | |
566 | 9775 | av_reduce(&avctx->framerate.den, &avctx->framerate.num, | |
567 | 9775 | sps->num_units_in_tick * 2, den, 1 << 30); | |
568 | } | ||
569 | |||
570 | 32873 | av_freep(&rbsp.rbsp_buffer); | |
571 | 32873 | return 0; /* no need to evaluate the rest */ | |
572 | } | ||
573 | } | ||
574 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 332 times.
|
332 | if (q264) { |
575 | ✗ | av_freep(&rbsp.rbsp_buffer); | |
576 | ✗ | return 0; | |
577 | } | ||
578 | /* didn't find a picture! */ | ||
579 | 332 | av_log(avctx, AV_LOG_ERROR, "missing picture in access unit with size %d\n", buf_size); | |
580 | 900 | fail: | |
581 | 900 | av_freep(&rbsp.rbsp_buffer); | |
582 | 900 | return -1; | |
583 | } | ||
584 | |||
585 | 193313 | static int h264_parse(AVCodecParserContext *s, | |
586 | AVCodecContext *avctx, | ||
587 | const uint8_t **poutbuf, int *poutbuf_size, | ||
588 | const uint8_t *buf, int buf_size) | ||
589 | { | ||
590 | 193313 | H264ParseContext *p = s->priv_data; | |
591 | 193313 | ParseContext *pc = &p->pc; | |
592 | 193313 | AVRational time_base = { 0, 1 }; | |
593 | int next; | ||
594 | |||
595 |
2/2✓ Branch 0 taken 448 times.
✓ Branch 1 taken 192865 times.
|
193313 | if (!p->got_first) { |
596 | 448 | p->got_first = 1; | |
597 |
2/2✓ Branch 0 taken 216 times.
✓ Branch 1 taken 232 times.
|
448 | if (avctx->extradata_size) { |
598 | 216 | ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size, | |
599 | &p->ps, &p->is_avc, &p->nal_length_size, | ||
600 | avctx->err_recognition, avctx); | ||
601 | } | ||
602 | } | ||
603 | |||
604 |
2/2✓ Branch 0 taken 7009 times.
✓ Branch 1 taken 186304 times.
|
193313 | if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { |
605 | 7009 | next = buf_size; | |
606 | } else { | ||
607 | 186304 | next = h264_find_frame_end(p, buf, buf_size, avctx); | |
608 | |||
609 |
2/2✓ Branch 1 taken 159207 times.
✓ Branch 2 taken 27097 times.
|
186304 | if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { |
610 | 159207 | *poutbuf = NULL; | |
611 | 159207 | *poutbuf_size = 0; | |
612 | 159207 | return buf_size; | |
613 | } | ||
614 | |||
615 |
4/4✓ Branch 0 taken 588 times.
✓ Branch 1 taken 26509 times.
✓ Branch 2 taken 120 times.
✓ Branch 3 taken 468 times.
|
27097 | if (next < 0 && next != END_NOT_FOUND) { |
616 | av_assert1(pc->last_index + next >= 0); | ||
617 | 120 | h264_find_frame_end(p, &pc->buffer[pc->last_index + next], -next, avctx); // update state | |
618 | } | ||
619 | } | ||
620 | |||
621 | 34106 | parse_nal_units(s, avctx, buf, buf_size); | |
622 | |||
623 |
2/2✓ Branch 0 taken 10215 times.
✓ Branch 1 taken 23891 times.
|
34106 | if (avctx->framerate.num) |
624 | 10215 | time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){2, 1})); | |
625 |
2/2✓ Branch 0 taken 1957 times.
✓ Branch 1 taken 32149 times.
|
34106 | if (p->sei.picture_timing.cpb_removal_delay >= 0) { |
626 | 1957 | s->dts_sync_point = p->sei.buffering_period.present; | |
627 | 1957 | s->dts_ref_dts_delta = p->sei.picture_timing.cpb_removal_delay; | |
628 | 1957 | s->pts_dts_delta = p->sei.picture_timing.dpb_output_delay; | |
629 | } else { | ||
630 | 32149 | s->dts_sync_point = INT_MIN; | |
631 | 32149 | s->dts_ref_dts_delta = INT_MIN; | |
632 | 32149 | s->pts_dts_delta = INT_MIN; | |
633 | } | ||
634 | |||
635 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 34106 times.
|
34106 | if (s->flags & PARSER_FLAG_ONCE) { |
636 | ✗ | s->flags &= PARSER_FLAG_COMPLETE_FRAMES; | |
637 | } | ||
638 | |||
639 |
2/2✓ Branch 0 taken 1957 times.
✓ Branch 1 taken 32149 times.
|
34106 | if (s->dts_sync_point >= 0) { |
640 | 1957 | int64_t den = time_base.den * (int64_t)avctx->pkt_timebase.num; | |
641 |
1/2✓ Branch 0 taken 1957 times.
✗ Branch 1 not taken.
|
1957 | if (den > 0) { |
642 | 1957 | int64_t num = time_base.num * (int64_t)avctx->pkt_timebase.den; | |
643 |
2/2✓ Branch 0 taken 1555 times.
✓ Branch 1 taken 402 times.
|
1957 | if (s->dts != AV_NOPTS_VALUE) { |
644 | // got DTS from the stream, update reference timestamp | ||
645 | 1555 | p->reference_dts = av_sat_sub64(s->dts, av_rescale(s->dts_ref_dts_delta, num, den)); | |
646 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 402 times.
|
402 | } else if (p->reference_dts != AV_NOPTS_VALUE) { |
647 | // compute DTS based on reference timestamp | ||
648 | ✗ | s->dts = av_sat_add64(p->reference_dts, av_rescale(s->dts_ref_dts_delta, num, den)); | |
649 | } | ||
650 | |||
651 |
3/4✓ Branch 0 taken 1555 times.
✓ Branch 1 taken 402 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1555 times.
|
1957 | if (p->reference_dts != AV_NOPTS_VALUE && s->pts == AV_NOPTS_VALUE) |
652 | ✗ | s->pts = s->dts + av_rescale(s->pts_dts_delta, num, den); | |
653 | |||
654 |
2/2✓ Branch 0 taken 135 times.
✓ Branch 1 taken 1822 times.
|
1957 | if (s->dts_sync_point > 0) |
655 | 135 | p->reference_dts = s->dts; // new reference | |
656 | } | ||
657 | } | ||
658 | |||
659 | 34106 | *poutbuf = buf; | |
660 | 34106 | *poutbuf_size = buf_size; | |
661 | 34106 | return next; | |
662 | } | ||
663 | |||
664 | 451 | static av_cold void h264_close(AVCodecParserContext *s) | |
665 | { | ||
666 | 451 | H264ParseContext *p = s->priv_data; | |
667 | 451 | ParseContext *pc = &p->pc; | |
668 | |||
669 | 451 | av_freep(&pc->buffer); | |
670 | |||
671 | 451 | ff_h264_sei_uninit(&p->sei); | |
672 | 451 | ff_h264_ps_uninit(&p->ps); | |
673 | 451 | } | |
674 | |||
675 | 451 | static av_cold int init(AVCodecParserContext *s) | |
676 | { | ||
677 | 451 | H264ParseContext *p = s->priv_data; | |
678 | |||
679 | 451 | p->reference_dts = AV_NOPTS_VALUE; | |
680 | 451 | p->last_frame_num = INT_MAX; | |
681 | 451 | ff_h264dsp_init(&p->h264dsp, 8, 1); | |
682 | 451 | return 0; | |
683 | } | ||
684 | |||
685 | const AVCodecParser ff_h264_parser = { | ||
686 | .codec_ids = { AV_CODEC_ID_H264 }, | ||
687 | .priv_data_size = sizeof(H264ParseContext), | ||
688 | .parser_init = init, | ||
689 | .parser_parse = h264_parse, | ||
690 | .parser_close = h264_close, | ||
691 | }; | ||
692 |