Directory: | ../../../ffmpeg/ |
---|---|
File: | src/libavcodec/h264_parser.c |
Date: | 2022-07-04 19:11:22 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 341 | 392 | 87.0% |
Branches: | 244 | 293 | 83.3% |
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/avutil.h" | ||
33 | #include "libavutil/error.h" | ||
34 | #include "libavutil/log.h" | ||
35 | #include "libavutil/mem.h" | ||
36 | #include "libavutil/pixfmt.h" | ||
37 | |||
38 | #include "avcodec.h" | ||
39 | #include "get_bits.h" | ||
40 | #include "golomb.h" | ||
41 | #include "h264.h" | ||
42 | #include "h264dsp.h" | ||
43 | #include "h264_parse.h" | ||
44 | #include "h264_sei.h" | ||
45 | #include "h264_ps.h" | ||
46 | #include "h2645_parse.h" | ||
47 | #include "h264data.h" | ||
48 | #include "mpegutils.h" | ||
49 | #include "parser.h" | ||
50 | #include "startcode.h" | ||
51 | |||
52 | typedef struct H264ParseContext { | ||
53 | ParseContext pc; | ||
54 | H264ParamSets ps; | ||
55 | H264DSPContext h264dsp; | ||
56 | H264POCContext poc; | ||
57 | H264SEIContext sei; | ||
58 | int is_avc; | ||
59 | int nal_length_size; | ||
60 | int got_first; | ||
61 | int picture_structure; | ||
62 | uint8_t parse_history[6]; | ||
63 | int parse_history_count; | ||
64 | int parse_last_mb; | ||
65 | int64_t reference_dts; | ||
66 | int last_frame_num, last_picture_structure; | ||
67 | } H264ParseContext; | ||
68 | |||
69 | 36351 | static int find_start_code(const uint8_t *buf, int buf_size, | |
70 | int buf_index, int next_avc) | ||
71 | { | ||
72 | 36351 | uint32_t state = -1; | |
73 | |||
74 | 36351 | buf_index = avpriv_find_start_code(buf + buf_index, buf + next_avc + 1, &state) - buf - 1; | |
75 | |||
76 | 36351 | return FFMIN(buf_index, buf_size); | |
77 | } | ||
78 | |||
79 | 179997 | static int h264_find_frame_end(H264ParseContext *p, const uint8_t *buf, | |
80 | int buf_size, void *logctx) | ||
81 | { | ||
82 | int i, j; | ||
83 | uint32_t state; | ||
84 | 179997 | ParseContext *pc = &p->pc; | |
85 | |||
86 |
1/2✓ Branch 0 taken 179997 times.
✗ Branch 1 not taken.
|
179997 | int next_avc = p->is_avc ? 0 : buf_size; |
87 | // mb_addr= pc->mb_addr - 1; | ||
88 | 179997 | state = pc->state; | |
89 |
2/2✓ Branch 0 taken 85 times.
✓ Branch 1 taken 179912 times.
|
179997 | if (state > 13) |
90 | 85 | state = 7; | |
91 | |||
92 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 179997 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
179997 | if (p->is_avc && !p->nal_length_size) |
93 | ✗ | av_log(logctx, AV_LOG_ERROR, "AVC-parser: nal length size invalid\n"); | |
94 | |||
95 |
2/2✓ Branch 0 taken 2495860 times.
✓ Branch 1 taken 155627 times.
|
2651487 | for (i = 0; i < buf_size; i++) { |
96 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2495860 times.
|
2495860 | if (i >= next_avc) { |
97 | ✗ | int64_t nalsize = 0; | |
98 | ✗ | i = next_avc; | |
99 | ✗ | for (j = 0; j < p->nal_length_size; j++) | |
100 | ✗ | nalsize = (nalsize << 8) | buf[i++]; | |
101 | ✗ | if (!nalsize || nalsize > buf_size - i) { | |
102 | ✗ | av_log(logctx, AV_LOG_ERROR, "AVC-parser: nal size %"PRId64" " | |
103 | "remaining %d\n", nalsize, buf_size - i); | ||
104 | ✗ | return buf_size; | |
105 | } | ||
106 | ✗ | next_avc = i + nalsize; | |
107 | ✗ | state = 5; | |
108 | } | ||
109 | |||
110 |
2/2✓ Branch 0 taken 1179946 times.
✓ Branch 1 taken 1315914 times.
|
2495860 | if (state == 7) { |
111 | 1179946 | i += p->h264dsp.startcode_find_candidate(buf + i, next_avc - i); | |
112 |
2/2✓ Branch 0 taken 1027014 times.
✓ Branch 1 taken 152932 times.
|
1179946 | if (i < next_avc) |
113 | 1027014 | state = 2; | |
114 |
2/2✓ Branch 0 taken 1186706 times.
✓ Branch 1 taken 129208 times.
|
1315914 | } else if (state <= 2) { |
115 |
2/2✓ Branch 0 taken 93957 times.
✓ Branch 1 taken 1092749 times.
|
1186706 | if (buf[i] == 1) |
116 | 93957 | state ^= 5; // 2->7, 1->4, 0->5 | |
117 |
2/2✓ Branch 0 taken 933301 times.
✓ Branch 1 taken 159448 times.
|
1092749 | else if (buf[i]) |
118 | 933301 | state = 7; | |
119 | else | ||
120 | 159448 | state >>= 1; // 2->1, 1->0, 0->0 | |
121 |
2/2✓ Branch 0 taken 69203 times.
✓ Branch 1 taken 60005 times.
|
129208 | } else if (state <= 5) { |
122 | 69203 | int nalu_type = buf[i] & 0x1F; | |
123 |
6/6✓ Branch 0 taken 67067 times.
✓ Branch 1 taken 2136 times.
✓ Branch 2 taken 65802 times.
✓ Branch 3 taken 1265 times.
✓ Branch 4 taken 54114 times.
✓ Branch 5 taken 11688 times.
|
69203 | if (nalu_type == H264_NAL_SEI || nalu_type == H264_NAL_SPS || |
124 |
2/2✓ Branch 0 taken 4463 times.
✓ Branch 1 taken 49651 times.
|
54114 | nalu_type == H264_NAL_PPS || nalu_type == H264_NAL_AUD) { |
125 |
2/2✓ Branch 0 taken 8070 times.
✓ Branch 1 taken 11482 times.
|
19552 | if (pc->frame_start_found) { |
126 | 8070 | i++; | |
127 | 8070 | goto found; | |
128 | } | ||
129 |
5/6✓ Branch 0 taken 1759 times.
✓ Branch 1 taken 47892 times.
✓ Branch 2 taken 1759 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1290 times.
✓ Branch 5 taken 469 times.
|
49651 | } else if (nalu_type == H264_NAL_SLICE || nalu_type == H264_NAL_DPA || |
130 | nalu_type == H264_NAL_IDR_SLICE) { | ||
131 | 49182 | state += 8; | |
132 | 49182 | continue; | |
133 | } | ||
134 | 11951 | state = 7; | |
135 | } else { | ||
136 | 60005 | unsigned int mb, last_mb = p->parse_last_mb; | |
137 | GetBitContext gb; | ||
138 | 60005 | p->parse_history[p->parse_history_count++] = buf[i]; | |
139 | |||
140 | 60005 | init_get_bits(&gb, p->parse_history, 8*p->parse_history_count); | |
141 | 60005 | mb= get_ue_golomb_long(&gb); | |
142 |
3/4✓ Branch 1 taken 10823 times.
✓ Branch 2 taken 49182 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10823 times.
|
60005 | if (get_bits_left(&gb) > 0 || p->parse_history_count > 5) { |
143 | 49182 | p->parse_last_mb = mb; | |
144 |
2/2✓ Branch 0 taken 24586 times.
✓ Branch 1 taken 24596 times.
|
49182 | if (pc->frame_start_found) { |
145 |
2/2✓ Branch 0 taken 16300 times.
✓ Branch 1 taken 8286 times.
|
24586 | if (mb <= last_mb) { |
146 | 16300 | i -= p->parse_history_count - 1; | |
147 | 16300 | p->parse_history_count = 0; | |
148 | 16300 | goto found; | |
149 | } | ||
150 | } else | ||
151 | 24596 | pc->frame_start_found = 1; | |
152 | 32882 | p->parse_history_count = 0; | |
153 | 32882 | state = 7; | |
154 | } | ||
155 | } | ||
156 | } | ||
157 | 155627 | pc->state = state; | |
158 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 155627 times.
|
155627 | if (p->is_avc) |
159 | ✗ | return next_avc; | |
160 | 155627 | return END_NOT_FOUND; | |
161 | |||
162 | 24370 | found: | |
163 | 24370 | pc->state = 7; | |
164 | 24370 | pc->frame_start_found = 0; | |
165 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 24370 times.
|
24370 | if (p->is_avc) |
166 | ✗ | return next_avc; | |
167 | 24370 | return i - (state & 5); | |
168 | } | ||
169 | |||
170 | 18424 | static int scan_mmco_reset(AVCodecParserContext *s, GetBitContext *gb, | |
171 | void *logctx) | ||
172 | { | ||
173 | H264PredWeightTable pwt; | ||
174 | 18424 | int slice_type_nos = s->pict_type & 3; | |
175 | 18424 | H264ParseContext *p = s->priv_data; | |
176 | int list_count, ref_count[2]; | ||
177 | |||
178 | |||
179 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 18424 times.
|
18424 | if (p->ps.pps->redundant_pic_cnt_present) |
180 | ✗ | get_ue_golomb(gb); // redundant_pic_count | |
181 | |||
182 |
2/2✓ Branch 0 taken 850 times.
✓ Branch 1 taken 17574 times.
|
18424 | if (slice_type_nos == AV_PICTURE_TYPE_B) |
183 | 850 | get_bits1(gb); // direct_spatial_mv_pred | |
184 | |||
185 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 18424 times.
|
18424 | if (ff_h264_parse_ref_count(&list_count, ref_count, gb, p->ps.pps, |
186 | slice_type_nos, p->picture_structure, logctx) < 0) | ||
187 | ✗ | return AVERROR_INVALIDDATA; | |
188 | |||
189 |
2/2✓ Branch 0 taken 16665 times.
✓ Branch 1 taken 1759 times.
|
18424 | if (slice_type_nos != AV_PICTURE_TYPE_I) { |
190 | int list; | ||
191 |
2/2✓ Branch 0 taken 17515 times.
✓ Branch 1 taken 16665 times.
|
34180 | for (list = 0; list < list_count; list++) { |
192 |
2/2✓ Branch 1 taken 2880 times.
✓ Branch 2 taken 14635 times.
|
17515 | if (get_bits1(gb)) { |
193 | int index; | ||
194 | 13942 | for (index = 0; ; index++) { | |
195 | 13942 | unsigned int reordering_of_pic_nums_idc = get_ue_golomb_31(gb); | |
196 | |||
197 |
2/2✓ Branch 0 taken 11062 times.
✓ Branch 1 taken 2880 times.
|
13942 | if (reordering_of_pic_nums_idc < 3) |
198 | 11062 | get_ue_golomb_long(gb); | |
199 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2880 times.
|
2880 | else if (reordering_of_pic_nums_idc > 3) { |
200 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
201 | "illegal reordering_of_pic_nums_idc %d\n", | ||
202 | reordering_of_pic_nums_idc); | ||
203 | ✗ | return AVERROR_INVALIDDATA; | |
204 | } else | ||
205 | 2880 | break; | |
206 | |||
207 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 11062 times.
|
11062 | if (index >= ref_count[list]) { |
208 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
209 | "reference count %d overflow\n", index); | ||
210 | ✗ | return AVERROR_INVALIDDATA; | |
211 | } | ||
212 | } | ||
213 | } | ||
214 | } | ||
215 | } | ||
216 | |||
217 |
4/4✓ Branch 0 taken 2623 times.
✓ Branch 1 taken 15801 times.
✓ Branch 2 taken 481 times.
✓ Branch 3 taken 2142 times.
|
18424 | if ((p->ps.pps->weighted_pred && slice_type_nos == AV_PICTURE_TYPE_P) || |
218 |
3/4✓ Branch 0 taken 18 times.
✓ Branch 1 taken 16264 times.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
|
16282 | (p->ps.pps->weighted_bipred_idc == 1 && slice_type_nos == AV_PICTURE_TYPE_B)) |
219 | 2160 | ff_h264_pred_weight_table(gb, p->ps.sps, ref_count, slice_type_nos, | |
220 | &pwt, p->picture_structure, logctx); | ||
221 | |||
222 |
2/2✓ Branch 1 taken 1928 times.
✓ Branch 2 taken 16496 times.
|
18424 | if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag |
223 | int i; | ||
224 |
1/2✓ Branch 0 taken 5527 times.
✗ Branch 1 not taken.
|
5527 | for (i = 0; i < H264_MAX_MMCO_COUNT; i++) { |
225 | 5527 | MMCOOpcode opcode = get_ue_golomb_31(gb); | |
226 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5527 times.
|
5527 | if (opcode > (unsigned) MMCO_LONG) { |
227 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
228 | "illegal memory management control operation %d\n", | ||
229 | opcode); | ||
230 | ✗ | return AVERROR_INVALIDDATA; | |
231 | } | ||
232 |
2/2✓ Branch 0 taken 1878 times.
✓ Branch 1 taken 3649 times.
|
5527 | if (opcode == MMCO_END) |
233 | 1878 | return 0; | |
234 |
2/2✓ Branch 0 taken 50 times.
✓ Branch 1 taken 3599 times.
|
3649 | else if (opcode == MMCO_RESET) |
235 | 50 | return 1; | |
236 | |||
237 |
4/4✓ Branch 0 taken 808 times.
✓ Branch 1 taken 2791 times.
✓ Branch 2 taken 333 times.
✓ Branch 3 taken 475 times.
|
3599 | if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) |
238 | 3124 | get_ue_golomb_long(gb); // difference_of_pic_nums_minus1 | |
239 |
6/6✓ Branch 0 taken 3266 times.
✓ Branch 1 taken 333 times.
✓ Branch 2 taken 3186 times.
✓ Branch 3 taken 80 times.
✓ Branch 4 taken 3170 times.
✓ Branch 5 taken 16 times.
|
3599 | if (opcode == MMCO_SHORT2LONG || opcode == MMCO_LONG2UNUSED || |
240 |
2/2✓ Branch 0 taken 379 times.
✓ Branch 1 taken 2791 times.
|
3170 | opcode == MMCO_LONG || opcode == MMCO_SET_MAX_LONG) |
241 | 808 | get_ue_golomb_31(gb); | |
242 | } | ||
243 | } | ||
244 | |||
245 | 16496 | return 0; | |
246 | } | ||
247 | |||
248 | /** | ||
249 | * Parse NAL units of found picture and decode some basic information. | ||
250 | * | ||
251 | * @param s parser context. | ||
252 | * @param avctx codec context. | ||
253 | * @param buf buffer with field/frame data. | ||
254 | * @param buf_size size of the buffer. | ||
255 | */ | ||
256 | 30711 | static inline int parse_nal_units(AVCodecParserContext *s, | |
257 | AVCodecContext *avctx, | ||
258 | const uint8_t * const buf, int buf_size) | ||
259 | { | ||
260 | 30711 | H264ParseContext *p = s->priv_data; | |
261 | 30711 | H2645RBSP rbsp = { NULL }; | |
262 | 30711 | H2645NAL nal = { NULL }; | |
263 | int buf_index, next_avc; | ||
264 | unsigned int pps_id; | ||
265 | unsigned int slice_type; | ||
266 | 30711 | int state = -1, got_reset = 0; | |
267 |
3/4✓ Branch 0 taken 30416 times.
✓ Branch 1 taken 295 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 30416 times.
|
30711 | int q264 = buf_size >=4 && !memcmp("Q264", buf, 4); |
268 | int field_poc[2]; | ||
269 | int ret; | ||
270 | |||
271 | /* set some sane default values */ | ||
272 | 30711 | s->pict_type = AV_PICTURE_TYPE_I; | |
273 | 30711 | s->key_frame = 0; | |
274 | 30711 | s->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN; | |
275 | |||
276 | 30711 | ff_h264_sei_uninit(&p->sei); | |
277 | 30711 | p->sei.frame_packing.arrangement_cancel_flag = -1; | |
278 | 30711 | p->sei.unregistered.x264_build = -1; | |
279 | |||
280 |
2/2✓ Branch 0 taken 295 times.
✓ Branch 1 taken 30416 times.
|
30711 | if (!buf_size) |
281 | 295 | return 0; | |
282 | |||
283 | 30416 | av_fast_padded_malloc(&rbsp.rbsp_buffer, &rbsp.rbsp_buffer_alloc_size, buf_size); | |
284 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 30416 times.
|
30416 | if (!rbsp.rbsp_buffer) |
285 | ✗ | return AVERROR(ENOMEM); | |
286 | |||
287 | 30416 | buf_index = 0; | |
288 |
2/2✓ Branch 0 taken 24680 times.
✓ Branch 1 taken 5736 times.
|
30416 | next_avc = p->is_avc ? 0 : buf_size; |
289 | 14519 | for (;;) { | |
290 | const SPS *sps; | ||
291 | 44935 | int src_length, consumed, nalsize = 0; | |
292 | |||
293 |
2/2✓ Branch 0 taken 8584 times.
✓ Branch 1 taken 36351 times.
|
44935 | if (buf_index >= next_avc) { |
294 | 8584 | nalsize = get_nalsize(p->nal_length_size, buf, buf_size, &buf_index, avctx); | |
295 |
2/2✓ Branch 0 taken 332 times.
✓ Branch 1 taken 8252 times.
|
8584 | if (nalsize < 0) |
296 | 332 | break; | |
297 | 8252 | next_avc = buf_index + nalsize; | |
298 | } else { | ||
299 | 36351 | buf_index = find_start_code(buf, buf_size, buf_index, next_avc); | |
300 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 36351 times.
|
36351 | if (buf_index >= buf_size) |
301 | ✗ | break; | |
302 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 36351 times.
|
36351 | if (buf_index >= next_avc) |
303 | ✗ | continue; | |
304 | } | ||
305 | 44603 | src_length = next_avc - buf_index; | |
306 | |||
307 | 44603 | state = buf[buf_index]; | |
308 |
2/2✓ Branch 0 taken 30084 times.
✓ Branch 1 taken 14519 times.
|
44603 | switch (state & 0x1f) { |
309 | 30084 | case H264_NAL_SLICE: | |
310 | case H264_NAL_IDR_SLICE: | ||
311 | // Do not walk the whole buffer just to decode slice header | ||
312 |
4/4✓ Branch 0 taken 29284 times.
✓ Branch 1 taken 800 times.
✓ Branch 2 taken 10318 times.
✓ Branch 3 taken 18966 times.
|
30084 | if ((state & 0x1f) == H264_NAL_IDR_SLICE || ((state >> 5) & 0x3) == 0) { |
313 | /* IDR or disposable slice | ||
314 | * No need to decode many bytes because MMCOs shall not be present. */ | ||
315 |
2/2✓ Branch 0 taken 10795 times.
✓ Branch 1 taken 323 times.
|
11118 | if (src_length > 60) |
316 | 10795 | src_length = 60; | |
317 | } else { | ||
318 | /* To decode up to MMCOs */ | ||
319 |
2/2✓ Branch 0 taken 10797 times.
✓ Branch 1 taken 8169 times.
|
18966 | if (src_length > 1000) |
320 | 10797 | src_length = 1000; | |
321 | } | ||
322 | 30084 | break; | |
323 | } | ||
324 | 44603 | consumed = ff_h2645_extract_rbsp(buf + buf_index, src_length, &rbsp, &nal, 1); | |
325 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 44603 times.
|
44603 | if (consumed < 0) |
326 | ✗ | break; | |
327 | |||
328 | 44603 | buf_index += consumed; | |
329 | |||
330 | 44603 | ret = init_get_bits8(&nal.gb, nal.data, nal.size); | |
331 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 44603 times.
|
44603 | if (ret < 0) |
332 | ✗ | goto fail; | |
333 | 44603 | get_bits1(&nal.gb); | |
334 | 44603 | nal.ref_idc = get_bits(&nal.gb, 2); | |
335 | 44603 | nal.type = get_bits(&nal.gb, 5); | |
336 | |||
337 |
6/6✓ Branch 0 taken 838 times.
✓ Branch 1 taken 6979 times.
✓ Branch 2 taken 3432 times.
✓ Branch 3 taken 800 times.
✓ Branch 4 taken 29284 times.
✓ Branch 5 taken 3270 times.
|
44603 | switch (nal.type) { |
338 | 838 | case H264_NAL_SPS: | |
339 | 838 | ff_h264_decode_seq_parameter_set(&nal.gb, avctx, &p->ps, 0); | |
340 | 838 | break; | |
341 | 6979 | case H264_NAL_PPS: | |
342 | 6979 | ff_h264_decode_picture_parameter_set(&nal.gb, avctx, &p->ps, | |
343 | nal.size_bits); | ||
344 | 6979 | break; | |
345 | 3432 | case H264_NAL_SEI: | |
346 | 3432 | ff_h264_sei_decode(&p->sei, &nal.gb, &p->ps, avctx); | |
347 | 3432 | break; | |
348 | 800 | case H264_NAL_IDR_SLICE: | |
349 | 800 | s->key_frame = 1; | |
350 | |||
351 | 800 | p->poc.prev_frame_num = 0; | |
352 | 800 | p->poc.prev_frame_num_offset = 0; | |
353 | 800 | p->poc.prev_poc_msb = | |
354 | 800 | p->poc.prev_poc_lsb = 0; | |
355 | /* fall through */ | ||
356 | 30084 | case H264_NAL_SLICE: | |
357 | 30084 | get_ue_golomb_long(&nal.gb); // skip first_mb_in_slice | |
358 | 30084 | slice_type = get_ue_golomb_31(&nal.gb); | |
359 | 30084 | s->pict_type = ff_h264_golomb_to_pict_type[slice_type % 5]; | |
360 |
2/2✓ Branch 0 taken 158 times.
✓ Branch 1 taken 29926 times.
|
30084 | if (p->sei.recovery_point.recovery_frame_cnt >= 0) { |
361 | /* key frame, since recovery_frame_cnt is set */ | ||
362 | 158 | s->key_frame = 1; | |
363 | } | ||
364 | 30084 | pps_id = get_ue_golomb(&nal.gb); | |
365 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 30084 times.
|
30084 | if (pps_id >= MAX_PPS_COUNT) { |
366 | ✗ | av_log(avctx, AV_LOG_ERROR, | |
367 | "pps_id %u out of range\n", pps_id); | ||
368 | ✗ | goto fail; | |
369 | } | ||
370 |
2/2✓ Branch 0 taken 568 times.
✓ Branch 1 taken 29516 times.
|
30084 | if (!p->ps.pps_list[pps_id]) { |
371 | 568 | av_log(avctx, AV_LOG_ERROR, | |
372 | "non-existing PPS %u referenced\n", pps_id); | ||
373 | 568 | goto fail; | |
374 | } | ||
375 | |||
376 | 29516 | av_buffer_unref(&p->ps.pps_ref); | |
377 | 29516 | p->ps.pps = NULL; | |
378 | 29516 | p->ps.sps = NULL; | |
379 | 29516 | p->ps.pps_ref = av_buffer_ref(p->ps.pps_list[pps_id]); | |
380 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 29516 times.
|
29516 | if (!p->ps.pps_ref) |
381 | ✗ | goto fail; | |
382 | 29516 | p->ps.pps = (const PPS*)p->ps.pps_ref->data; | |
383 | 29516 | p->ps.sps = p->ps.pps->sps; | |
384 | 29516 | sps = p->ps.sps; | |
385 | |||
386 | // heuristic to detect non marked keyframes | ||
387 |
6/6✓ Branch 0 taken 8427 times.
✓ Branch 1 taken 21089 times.
✓ Branch 2 taken 8293 times.
✓ Branch 3 taken 134 times.
✓ Branch 4 taken 1025 times.
✓ Branch 5 taken 7268 times.
|
29516 | if (p->ps.sps->ref_frame_count <= 1 && p->ps.pps->ref_count[0] <= 1 && s->pict_type == AV_PICTURE_TYPE_I) |
388 | 1025 | s->key_frame = 1; | |
389 | |||
390 | 29516 | p->poc.frame_num = get_bits(&nal.gb, sps->log2_max_frame_num); | |
391 | |||
392 | 29516 | s->coded_width = 16 * sps->mb_width; | |
393 | 29516 | s->coded_height = 16 * sps->mb_height; | |
394 | 29516 | s->width = s->coded_width - (sps->crop_right + sps->crop_left); | |
395 | 29516 | s->height = s->coded_height - (sps->crop_top + sps->crop_bottom); | |
396 |
2/4✓ Branch 0 taken 29516 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 29516 times.
|
29516 | if (s->width <= 0 || s->height <= 0) { |
397 | ✗ | s->width = s->coded_width; | |
398 | ✗ | s->height = s->coded_height; | |
399 | } | ||
400 | |||
401 |
3/4✓ Branch 0 taken 150 times.
✓ Branch 1 taken 219 times.
✓ Branch 2 taken 29147 times.
✗ Branch 3 not taken.
|
29516 | switch (sps->bit_depth_luma) { |
402 | 150 | case 9: | |
403 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 150 times.
|
150 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P9; |
404 |
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; |
405 | 100 | else s->format = AV_PIX_FMT_YUV420P9; | |
406 | 150 | break; | |
407 | 219 | case 10: | |
408 |
2/2✓ Branch 0 taken 50 times.
✓ Branch 1 taken 169 times.
|
219 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P10; |
409 |
2/2✓ Branch 0 taken 87 times.
✓ Branch 1 taken 82 times.
|
169 | else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P10; |
410 | 82 | else s->format = AV_PIX_FMT_YUV420P10; | |
411 | 219 | break; | |
412 | 29147 | case 8: | |
413 |
2/2✓ Branch 0 taken 887 times.
✓ Branch 1 taken 28260 times.
|
29147 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P; |
414 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 28250 times.
|
28260 | else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P; |
415 | 28250 | else s->format = AV_PIX_FMT_YUV420P; | |
416 | 29147 | break; | |
417 | ✗ | default: | |
418 | ✗ | s->format = AV_PIX_FMT_NONE; | |
419 | } | ||
420 | |||
421 | 29516 | avctx->profile = ff_h264_get_profile(sps); | |
422 | 29516 | avctx->level = sps->level_idc; | |
423 | |||
424 |
2/2✓ Branch 0 taken 20902 times.
✓ Branch 1 taken 8614 times.
|
29516 | if (sps->frame_mbs_only_flag) { |
425 | 20902 | p->picture_structure = PICT_FRAME; | |
426 | } else { | ||
427 |
2/2✓ Branch 1 taken 6222 times.
✓ Branch 2 taken 2392 times.
|
8614 | if (get_bits1(&nal.gb)) { // field_pic_flag |
428 | 6222 | p->picture_structure = PICT_TOP_FIELD + get_bits1(&nal.gb); // bottom_field_flag | |
429 | } else { | ||
430 | 2392 | p->picture_structure = PICT_FRAME; | |
431 | } | ||
432 | } | ||
433 | |||
434 |
2/2✓ Branch 0 taken 798 times.
✓ Branch 1 taken 28718 times.
|
29516 | if (nal.type == H264_NAL_IDR_SLICE) |
435 | 798 | get_ue_golomb_long(&nal.gb); /* idr_pic_id */ | |
436 |
2/2✓ Branch 0 taken 22388 times.
✓ Branch 1 taken 7128 times.
|
29516 | if (sps->poc_type == 0) { |
437 | 22388 | p->poc.poc_lsb = get_bits(&nal.gb, sps->log2_max_poc_lsb); | |
438 | |||
439 |
2/2✓ Branch 0 taken 3552 times.
✓ Branch 1 taken 18836 times.
|
22388 | if (p->ps.pps->pic_order_present == 1 && |
440 |
2/2✓ Branch 0 taken 2655 times.
✓ Branch 1 taken 897 times.
|
3552 | p->picture_structure == PICT_FRAME) |
441 | 2655 | p->poc.delta_poc_bottom = get_se_golomb(&nal.gb); | |
442 | } | ||
443 | |||
444 |
2/2✓ Branch 0 taken 3245 times.
✓ Branch 1 taken 26271 times.
|
29516 | if (sps->poc_type == 1 && |
445 |
2/2✓ Branch 0 taken 3071 times.
✓ Branch 1 taken 174 times.
|
3245 | !sps->delta_pic_order_always_zero_flag) { |
446 | 3071 | p->poc.delta_poc[0] = get_se_golomb(&nal.gb); | |
447 | |||
448 |
2/2✓ Branch 0 taken 692 times.
✓ Branch 1 taken 2379 times.
|
3071 | if (p->ps.pps->pic_order_present == 1 && |
449 |
2/2✓ Branch 0 taken 406 times.
✓ Branch 1 taken 286 times.
|
692 | p->picture_structure == PICT_FRAME) |
450 | 406 | p->poc.delta_poc[1] = get_se_golomb(&nal.gb); | |
451 | } | ||
452 | |||
453 | /* Decode POC of this picture. | ||
454 | * The prev_ values needed for decoding POC of the next picture are not set here. */ | ||
455 | 29516 | field_poc[0] = field_poc[1] = INT_MAX; | |
456 | 29516 | ret = ff_h264_init_poc(field_poc, &s->output_picture_number, sps, | |
457 | &p->poc, p->picture_structure, nal.ref_idc); | ||
458 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 29516 times.
|
29516 | if (ret < 0) |
459 | ✗ | goto fail; | |
460 | |||
461 | /* Continue parsing to check if MMCO_RESET is present. | ||
462 | * FIXME: MMCO_RESET could appear in non-first slice. | ||
463 | * Maybe, we should parse all undisposable non-IDR slice of this | ||
464 | * picture until encountering MMCO_RESET in a slice of it. */ | ||
465 |
4/4✓ Branch 0 taken 19222 times.
✓ Branch 1 taken 10294 times.
✓ Branch 2 taken 18424 times.
✓ Branch 3 taken 798 times.
|
29516 | if (nal.ref_idc && nal.type != H264_NAL_IDR_SLICE) { |
466 | 18424 | got_reset = scan_mmco_reset(s, &nal.gb, avctx); | |
467 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 18424 times.
|
18424 | if (got_reset < 0) |
468 | ✗ | goto fail; | |
469 | } | ||
470 | |||
471 | /* Set up the prev_ values for decoding POC of the next picture. */ | ||
472 |
2/2✓ Branch 0 taken 29466 times.
✓ Branch 1 taken 50 times.
|
29516 | p->poc.prev_frame_num = got_reset ? 0 : p->poc.frame_num; |
473 |
2/2✓ Branch 0 taken 29466 times.
✓ Branch 1 taken 50 times.
|
29516 | p->poc.prev_frame_num_offset = got_reset ? 0 : p->poc.frame_num_offset; |
474 |
2/2✓ Branch 0 taken 19222 times.
✓ Branch 1 taken 10294 times.
|
29516 | if (nal.ref_idc != 0) { |
475 |
2/2✓ Branch 0 taken 19172 times.
✓ Branch 1 taken 50 times.
|
19222 | if (!got_reset) { |
476 | 19172 | p->poc.prev_poc_msb = p->poc.poc_msb; | |
477 | 19172 | p->poc.prev_poc_lsb = p->poc.poc_lsb; | |
478 | } else { | ||
479 | 50 | p->poc.prev_poc_msb = 0; | |
480 | 50 | p->poc.prev_poc_lsb = | |
481 |
1/2✓ Branch 0 taken 50 times.
✗ Branch 1 not taken.
|
50 | p->picture_structure == PICT_BOTTOM_FIELD ? 0 : field_poc[0]; |
482 | } | ||
483 | } | ||
484 | |||
485 |
2/2✓ Branch 0 taken 2384 times.
✓ Branch 1 taken 27132 times.
|
29516 | if (p->sei.picture_timing.present) { |
486 | 2384 | ret = ff_h264_sei_process_picture_timing(&p->sei.picture_timing, | |
487 | sps, avctx); | ||
488 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2384 times.
|
2384 | if (ret < 0) { |
489 | ✗ | av_log(avctx, AV_LOG_ERROR, "Error processing the picture timing SEI\n"); | |
490 | ✗ | p->sei.picture_timing.present = 0; | |
491 | } | ||
492 | } | ||
493 | |||
494 |
4/4✓ Branch 0 taken 2780 times.
✓ Branch 1 taken 26736 times.
✓ Branch 2 taken 2372 times.
✓ Branch 3 taken 408 times.
|
29516 | if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { |
495 |
3/6✓ Branch 0 taken 762 times.
✓ Branch 1 taken 1472 times.
✓ Branch 2 taken 138 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4744 | switch (p->sei.picture_timing.pic_struct) { |
496 | 762 | case H264_SEI_PIC_STRUCT_TOP_FIELD: | |
497 | case H264_SEI_PIC_STRUCT_BOTTOM_FIELD: | ||
498 | 762 | s->repeat_pict = 0; | |
499 | 762 | break; | |
500 | 1472 | case H264_SEI_PIC_STRUCT_FRAME: | |
501 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | ||
502 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP: | ||
503 | 1472 | s->repeat_pict = 1; | |
504 | 1472 | break; | |
505 | 138 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | |
506 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | ||
507 | 138 | s->repeat_pict = 2; | |
508 | 138 | break; | |
509 | ✗ | case H264_SEI_PIC_STRUCT_FRAME_DOUBLING: | |
510 | ✗ | s->repeat_pict = 3; | |
511 | ✗ | break; | |
512 | ✗ | case H264_SEI_PIC_STRUCT_FRAME_TRIPLING: | |
513 | ✗ | s->repeat_pict = 5; | |
514 | ✗ | break; | |
515 | ✗ | default: | |
516 | ✗ | s->repeat_pict = p->picture_structure == PICT_FRAME ? 1 : 0; | |
517 | ✗ | break; | |
518 | } | ||
519 | } else { | ||
520 | 27144 | s->repeat_pict = p->picture_structure == PICT_FRAME ? 1 : 0; | |
521 | } | ||
522 | |||
523 |
2/2✓ Branch 0 taken 23294 times.
✓ Branch 1 taken 6222 times.
|
29516 | if (p->picture_structure == PICT_FRAME) { |
524 | 23294 | s->picture_structure = AV_PICTURE_STRUCTURE_FRAME; | |
525 |
4/4✓ Branch 0 taken 1689 times.
✓ Branch 1 taken 21605 times.
✓ Branch 2 taken 1610 times.
✓ Branch 3 taken 79 times.
|
23294 | if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { |
526 |
3/3✓ Branch 0 taken 885 times.
✓ Branch 1 taken 150 times.
✓ Branch 2 taken 575 times.
|
3220 | switch (p->sei.picture_timing.pic_struct) { |
527 | 885 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | |
528 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | ||
529 | 885 | s->field_order = AV_FIELD_TT; | |
530 | 885 | break; | |
531 | 150 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP: | |
532 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | ||
533 | 150 | s->field_order = AV_FIELD_BB; | |
534 | 150 | break; | |
535 | 575 | default: | |
536 | 575 | s->field_order = AV_FIELD_PROGRESSIVE; | |
537 | 575 | break; | |
538 | } | ||
539 | } else { | ||
540 |
2/2✓ Branch 0 taken 1041 times.
✓ Branch 1 taken 20643 times.
|
21684 | if (field_poc[0] < field_poc[1]) |
541 | 1041 | s->field_order = AV_FIELD_TT; | |
542 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 20640 times.
|
20643 | else if (field_poc[0] > field_poc[1]) |
543 | 3 | s->field_order = AV_FIELD_BB; | |
544 | else | ||
545 | 20640 | s->field_order = AV_FIELD_PROGRESSIVE; | |
546 | } | ||
547 | } else { | ||
548 |
2/2✓ Branch 0 taken 3203 times.
✓ Branch 1 taken 3019 times.
|
6222 | if (p->picture_structure == PICT_TOP_FIELD) |
549 | 3203 | s->picture_structure = AV_PICTURE_STRUCTURE_TOP_FIELD; | |
550 | else | ||
551 | 3019 | s->picture_structure = AV_PICTURE_STRUCTURE_BOTTOM_FIELD; | |
552 |
2/2✓ Branch 0 taken 4714 times.
✓ Branch 1 taken 1508 times.
|
6222 | if (p->poc.frame_num == p->last_frame_num && |
553 |
1/2✓ Branch 0 taken 4714 times.
✗ Branch 1 not taken.
|
4714 | p->last_picture_structure != AV_PICTURE_STRUCTURE_UNKNOWN && |
554 |
1/2✓ Branch 0 taken 4714 times.
✗ Branch 1 not taken.
|
4714 | p->last_picture_structure != AV_PICTURE_STRUCTURE_FRAME && |
555 |
2/2✓ Branch 0 taken 4597 times.
✓ Branch 1 taken 117 times.
|
4714 | p->last_picture_structure != s->picture_structure) { |
556 |
2/2✓ Branch 0 taken 3013 times.
✓ Branch 1 taken 1584 times.
|
4597 | if (p->last_picture_structure == AV_PICTURE_STRUCTURE_TOP_FIELD) |
557 | 3013 | s->field_order = AV_FIELD_TT; | |
558 | else | ||
559 | 1584 | s->field_order = AV_FIELD_BB; | |
560 | } else { | ||
561 | 1625 | s->field_order = AV_FIELD_UNKNOWN; | |
562 | } | ||
563 | 6222 | p->last_picture_structure = s->picture_structure; | |
564 | 6222 | p->last_frame_num = p->poc.frame_num; | |
565 | } | ||
566 |
2/2✓ Branch 0 taken 7229 times.
✓ Branch 1 taken 22287 times.
|
29516 | if (sps->timing_info_present_flag) { |
567 | 7229 | int64_t den = sps->time_scale; | |
568 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 7229 times.
|
7229 | if (p->sei.unregistered.x264_build < 44U) |
569 | ✗ | den *= 2; | |
570 | 7229 | av_reduce(&avctx->framerate.den, &avctx->framerate.num, | |
571 | 7229 | sps->num_units_in_tick * avctx->ticks_per_frame, den, 1 << 30); | |
572 | } | ||
573 | |||
574 | 29516 | av_freep(&rbsp.rbsp_buffer); | |
575 | 29516 | return 0; /* no need to evaluate the rest */ | |
576 | } | ||
577 | } | ||
578 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 332 times.
|
332 | if (q264) { |
579 | ✗ | av_freep(&rbsp.rbsp_buffer); | |
580 | ✗ | return 0; | |
581 | } | ||
582 | /* didn't find a picture! */ | ||
583 | 332 | av_log(avctx, AV_LOG_ERROR, "missing picture in access unit with size %d\n", buf_size); | |
584 | 900 | fail: | |
585 | 900 | av_freep(&rbsp.rbsp_buffer); | |
586 | 900 | return -1; | |
587 | } | ||
588 | |||
589 | 185782 | static int h264_parse(AVCodecParserContext *s, | |
590 | AVCodecContext *avctx, | ||
591 | const uint8_t **poutbuf, int *poutbuf_size, | ||
592 | const uint8_t *buf, int buf_size) | ||
593 | { | ||
594 | 185782 | H264ParseContext *p = s->priv_data; | |
595 | 185782 | ParseContext *pc = &p->pc; | |
596 | int next; | ||
597 | |||
598 |
2/2✓ Branch 0 taken 408 times.
✓ Branch 1 taken 185374 times.
|
185782 | if (!p->got_first) { |
599 | 408 | p->got_first = 1; | |
600 |
2/2✓ Branch 0 taken 186 times.
✓ Branch 1 taken 222 times.
|
408 | if (avctx->extradata_size) { |
601 | 186 | ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size, | |
602 | &p->ps, &p->is_avc, &p->nal_length_size, | ||
603 | avctx->err_recognition, avctx); | ||
604 | } | ||
605 | } | ||
606 | |||
607 |
2/2✓ Branch 0 taken 5893 times.
✓ Branch 1 taken 179889 times.
|
185782 | if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { |
608 | 5893 | next = buf_size; | |
609 | } else { | ||
610 | 179889 | next = h264_find_frame_end(p, buf, buf_size, avctx); | |
611 | |||
612 |
2/2✓ Branch 1 taken 155071 times.
✓ Branch 2 taken 24818 times.
|
179889 | if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { |
613 | 155071 | *poutbuf = NULL; | |
614 | 155071 | *poutbuf_size = 0; | |
615 | 155071 | return buf_size; | |
616 | } | ||
617 | |||
618 |
4/4✓ Branch 0 taken 556 times.
✓ Branch 1 taken 24262 times.
✓ Branch 2 taken 108 times.
✓ Branch 3 taken 448 times.
|
24818 | if (next < 0 && next != END_NOT_FOUND) { |
619 | av_assert1(pc->last_index + next >= 0); | ||
620 | 108 | h264_find_frame_end(p, &pc->buffer[pc->last_index + next], -next, avctx); // update state | |
621 | } | ||
622 | } | ||
623 | |||
624 | 30711 | parse_nal_units(s, avctx, buf, buf_size); | |
625 | |||
626 |
2/2✓ Branch 0 taken 29855 times.
✓ Branch 1 taken 856 times.
|
30711 | if (avctx->framerate.num) |
627 | 29855 | avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1})); | |
628 |
2/2✓ Branch 0 taken 1431 times.
✓ Branch 1 taken 29280 times.
|
30711 | if (p->sei.picture_timing.cpb_removal_delay >= 0) { |
629 | 1431 | s->dts_sync_point = p->sei.buffering_period.present; | |
630 | 1431 | s->dts_ref_dts_delta = p->sei.picture_timing.cpb_removal_delay; | |
631 | 1431 | s->pts_dts_delta = p->sei.picture_timing.dpb_output_delay; | |
632 | } else { | ||
633 | 29280 | s->dts_sync_point = INT_MIN; | |
634 | 29280 | s->dts_ref_dts_delta = INT_MIN; | |
635 | 29280 | s->pts_dts_delta = INT_MIN; | |
636 | } | ||
637 | |||
638 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 30711 times.
|
30711 | if (s->flags & PARSER_FLAG_ONCE) { |
639 | ✗ | s->flags &= PARSER_FLAG_COMPLETE_FRAMES; | |
640 | } | ||
641 | |||
642 |
2/2✓ Branch 0 taken 1431 times.
✓ Branch 1 taken 29280 times.
|
30711 | if (s->dts_sync_point >= 0) { |
643 | 1431 | int64_t den = avctx->time_base.den * (int64_t)avctx->pkt_timebase.num; | |
644 |
1/2✓ Branch 0 taken 1431 times.
✗ Branch 1 not taken.
|
1431 | if (den > 0) { |
645 | 1431 | int64_t num = avctx->time_base.num * (int64_t)avctx->pkt_timebase.den; | |
646 |
2/2✓ Branch 0 taken 1029 times.
✓ Branch 1 taken 402 times.
|
1431 | if (s->dts != AV_NOPTS_VALUE) { |
647 | // got DTS from the stream, update reference timestamp | ||
648 | 1029 | p->reference_dts = s->dts - av_rescale(s->dts_ref_dts_delta, num, den); | |
649 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 402 times.
|
402 | } else if (p->reference_dts != AV_NOPTS_VALUE) { |
650 | // compute DTS based on reference timestamp | ||
651 | ✗ | s->dts = p->reference_dts + av_rescale(s->dts_ref_dts_delta, num, den); | |
652 | } | ||
653 | |||
654 |
3/4✓ Branch 0 taken 1029 times.
✓ Branch 1 taken 402 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1029 times.
|
1431 | if (p->reference_dts != AV_NOPTS_VALUE && s->pts == AV_NOPTS_VALUE) |
655 | ✗ | s->pts = s->dts + av_rescale(s->pts_dts_delta, num, den); | |
656 | |||
657 |
2/2✓ Branch 0 taken 109 times.
✓ Branch 1 taken 1322 times.
|
1431 | if (s->dts_sync_point > 0) |
658 | 109 | p->reference_dts = s->dts; // new reference | |
659 | } | ||
660 | } | ||
661 | |||
662 | 30711 | *poutbuf = buf; | |
663 | 30711 | *poutbuf_size = buf_size; | |
664 | 30711 | return next; | |
665 | } | ||
666 | |||
667 | 409 | static void h264_close(AVCodecParserContext *s) | |
668 | { | ||
669 | 409 | H264ParseContext *p = s->priv_data; | |
670 | 409 | ParseContext *pc = &p->pc; | |
671 | |||
672 | 409 | av_freep(&pc->buffer); | |
673 | |||
674 | 409 | ff_h264_sei_uninit(&p->sei); | |
675 | 409 | ff_h264_ps_uninit(&p->ps); | |
676 | 409 | } | |
677 | |||
678 | 409 | static av_cold int init(AVCodecParserContext *s) | |
679 | { | ||
680 | 409 | H264ParseContext *p = s->priv_data; | |
681 | |||
682 | 409 | p->reference_dts = AV_NOPTS_VALUE; | |
683 | 409 | p->last_frame_num = INT_MAX; | |
684 | 409 | ff_h264dsp_init(&p->h264dsp, 8, 1); | |
685 | 409 | return 0; | |
686 | } | ||
687 | |||
688 | const AVCodecParser ff_h264_parser = { | ||
689 | .codec_ids = { AV_CODEC_ID_H264 }, | ||
690 | .priv_data_size = sizeof(H264ParseContext), | ||
691 | .parser_init = init, | ||
692 | .parser_parse = h264_parse, | ||
693 | .parser_close = h264_close, | ||
694 | }; | ||
695 |