| 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 "parser_internal.h" | ||
| 53 | #include "startcode.h" | ||
| 54 | |||
| 55 | typedef struct H264ParseContext { | ||
| 56 | ParseContext pc; | ||
| 57 | H264ParamSets ps; | ||
| 58 | H264DSPContext h264dsp; | ||
| 59 | H264POCContext poc; | ||
| 60 | H264SEIContext sei; | ||
| 61 | int is_avc; | ||
| 62 | int nal_length_size; | ||
| 63 | int got_first; | ||
| 64 | int picture_structure; | ||
| 65 | uint8_t parse_history[6]; | ||
| 66 | int parse_history_count; | ||
| 67 | int parse_last_mb; | ||
| 68 | int64_t reference_dts; | ||
| 69 | int last_frame_num, last_picture_structure; | ||
| 70 | } H264ParseContext; | ||
| 71 | |||
| 72 | 40028 | static int find_start_code(const uint8_t *buf, int buf_size, | |
| 73 | int buf_index, int next_avc) | ||
| 74 | { | ||
| 75 | 40028 | uint32_t state = -1; | |
| 76 | |||
| 77 | 40028 | buf_index = avpriv_find_start_code(buf + buf_index, buf + next_avc + 1, &state) - buf - 1; | |
| 78 | |||
| 79 | 40028 | return FFMIN(buf_index, buf_size); | |
| 80 | } | ||
| 81 | |||
| 82 | 187409 | static int h264_find_frame_end(H264ParseContext *p, const uint8_t *buf, | |
| 83 | int buf_size, void *logctx) | ||
| 84 | { | ||
| 85 | int i, j; | ||
| 86 | uint32_t state; | ||
| 87 | 187409 | ParseContext *pc = &p->pc; | |
| 88 | |||
| 89 |
1/2✓ Branch 0 taken 187409 times.
✗ Branch 1 not taken.
|
187409 | int next_avc = p->is_avc ? 0 : buf_size; |
| 90 | // mb_addr= pc->mb_addr - 1; | ||
| 91 | 187409 | state = pc->state; | |
| 92 |
2/2✓ Branch 0 taken 98 times.
✓ Branch 1 taken 187311 times.
|
187409 | if (state > 13) |
| 93 | 98 | state = 7; | |
| 94 | |||
| 95 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 187409 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
187409 | if (p->is_avc && !p->nal_length_size) |
| 96 | ✗ | av_log(logctx, AV_LOG_ERROR, "AVC-parser: nal length size invalid\n"); | |
| 97 | |||
| 98 |
2/2✓ Branch 0 taken 2584297 times.
✓ Branch 1 taken 160332 times.
|
2744629 | for (i = 0; i < buf_size; i++) { |
| 99 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2584297 times.
|
2584297 | if (i >= next_avc) { |
| 100 | ✗ | int64_t nalsize = 0; | |
| 101 | ✗ | i = next_avc; | |
| 102 | ✗ | for (j = 0; j < p->nal_length_size; j++) | |
| 103 | ✗ | nalsize = (nalsize << 8) | buf[i++]; | |
| 104 | ✗ | if (!nalsize || nalsize > buf_size - i) { | |
| 105 | ✗ | av_log(logctx, AV_LOG_ERROR, "AVC-parser: nal size %"PRId64" " | |
| 106 | "remaining %d\n", nalsize, buf_size - i); | ||
| 107 | ✗ | return buf_size; | |
| 108 | } | ||
| 109 | ✗ | next_avc = i + nalsize; | |
| 110 | ✗ | state = 5; | |
| 111 | } | ||
| 112 | |||
| 113 |
2/2✓ Branch 0 taken 1211913 times.
✓ Branch 1 taken 1372384 times.
|
2584297 | if (state == 7) { |
| 114 | 1211913 | i += p->h264dsp.startcode_find_candidate(buf + i, next_avc - i); | |
| 115 |
2/2✓ Branch 0 taken 1054387 times.
✓ Branch 1 taken 157526 times.
|
1211913 | if (i < next_avc) |
| 116 | 1054387 | state = 2; | |
| 117 |
2/2✓ Branch 0 taken 1230143 times.
✓ Branch 1 taken 142241 times.
|
1372384 | } else if (state <= 2) { |
| 118 |
2/2✓ Branch 0 taken 101114 times.
✓ Branch 1 taken 1129029 times.
|
1230143 | if (buf[i] == 1) |
| 119 | 101114 | state ^= 5; // 2->7, 1->4, 0->5 | |
| 120 |
2/2✓ Branch 0 taken 953528 times.
✓ Branch 1 taken 175501 times.
|
1129029 | else if (buf[i]) |
| 121 | 953528 | state = 7; | |
| 122 | else | ||
| 123 | 175501 | state >>= 1; // 2->1, 1->0, 0->0 | |
| 124 |
2/2✓ Branch 0 taken 76147 times.
✓ Branch 1 taken 66094 times.
|
142241 | } else if (state <= 5) { |
| 125 | 76147 | int nalu_type = buf[i] & 0x1F; | |
| 126 |
6/6✓ Branch 0 taken 73896 times.
✓ Branch 1 taken 2251 times.
✓ Branch 2 taken 72447 times.
✓ Branch 3 taken 1449 times.
✓ Branch 4 taken 59535 times.
✓ Branch 5 taken 12912 times.
|
76147 | if (nalu_type == H264_NAL_SEI || nalu_type == H264_NAL_SPS || |
| 127 |
2/2✓ Branch 0 taken 4620 times.
✓ Branch 1 taken 54915 times.
|
59535 | nalu_type == H264_NAL_PPS || nalu_type == H264_NAL_AUD) { |
| 128 |
2/2✓ Branch 0 taken 8791 times.
✓ Branch 1 taken 12441 times.
|
21232 | if (pc->frame_start_found) { |
| 129 | 8791 | i++; | |
| 130 | 8791 | goto found; | |
| 131 | } | ||
| 132 |
5/6✓ Branch 0 taken 1845 times.
✓ Branch 1 taken 53070 times.
✓ Branch 2 taken 1845 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1311 times.
✓ Branch 5 taken 534 times.
|
54915 | } else if (nalu_type == H264_NAL_SLICE || nalu_type == H264_NAL_DPA || |
| 133 | nalu_type == H264_NAL_IDR_SLICE) { | ||
| 134 | 54381 | state += 8; | |
| 135 | 54381 | continue; | |
| 136 | } | ||
| 137 | 12975 | state = 7; | |
| 138 | } else { | ||
| 139 | 66094 | unsigned int mb, last_mb = p->parse_last_mb; | |
| 140 | GetBitContext gb; | ||
| 141 | 66094 | p->parse_history[p->parse_history_count++] = buf[i]; | |
| 142 | |||
| 143 | 66094 | init_get_bits(&gb, p->parse_history, 8*p->parse_history_count); | |
| 144 | 66094 | mb= get_ue_golomb_long(&gb); | |
| 145 |
3/4✓ Branch 1 taken 11713 times.
✓ Branch 2 taken 54381 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 11713 times.
|
66094 | if (get_bits_left(&gb) > 0 || p->parse_history_count > 5) { |
| 146 | 54381 | p->parse_last_mb = mb; | |
| 147 |
2/2✓ Branch 0 taken 27067 times.
✓ Branch 1 taken 27314 times.
|
54381 | if (pc->frame_start_found) { |
| 148 |
2/2✓ Branch 0 taken 18286 times.
✓ Branch 1 taken 8781 times.
|
27067 | if (mb <= last_mb) { |
| 149 | 18286 | i -= p->parse_history_count - 1; | |
| 150 | 18286 | p->parse_history_count = 0; | |
| 151 | 18286 | goto found; | |
| 152 | } | ||
| 153 | } else | ||
| 154 | 27314 | pc->frame_start_found = 1; | |
| 155 | 36095 | p->parse_history_count = 0; | |
| 156 | 36095 | state = 7; | |
| 157 | } | ||
| 158 | } | ||
| 159 | } | ||
| 160 | 160332 | pc->state = state; | |
| 161 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 160332 times.
|
160332 | if (p->is_avc) |
| 162 | ✗ | return next_avc; | |
| 163 | 160332 | return END_NOT_FOUND; | |
| 164 | |||
| 165 | 27077 | found: | |
| 166 | 27077 | pc->state = 7; | |
| 167 | 27077 | pc->frame_start_found = 0; | |
| 168 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 27077 times.
|
27077 | if (p->is_avc) |
| 169 | ✗ | return next_avc; | |
| 170 | 27077 | return i - (state & 5); | |
| 171 | } | ||
| 172 | |||
| 173 | 21074 | static int scan_mmco_reset(AVCodecParserContext *s, GetBitContext *gb, | |
| 174 | void *logctx) | ||
| 175 | { | ||
| 176 | H264PredWeightTable pwt; | ||
| 177 | 21074 | int slice_type_nos = s->pict_type & 3; | |
| 178 | 21074 | H264ParseContext *p = s->priv_data; | |
| 179 | int list_count, ref_count[2]; | ||
| 180 | |||
| 181 | |||
| 182 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 21074 times.
|
21074 | if (p->ps.pps->redundant_pic_cnt_present) |
| 183 | ✗ | get_ue_golomb(gb); // redundant_pic_count | |
| 184 | |||
| 185 |
2/2✓ Branch 0 taken 1152 times.
✓ Branch 1 taken 19922 times.
|
21074 | if (slice_type_nos == AV_PICTURE_TYPE_B) |
| 186 | 1152 | get_bits1(gb); // direct_spatial_mv_pred | |
| 187 | |||
| 188 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 21074 times.
|
21074 | if (ff_h264_parse_ref_count(&list_count, ref_count, gb, p->ps.pps, |
| 189 | slice_type_nos, p->picture_structure, logctx) < 0) | ||
| 190 | ✗ | return AVERROR_INVALIDDATA; | |
| 191 | |||
| 192 |
2/2✓ Branch 0 taken 19247 times.
✓ Branch 1 taken 1827 times.
|
21074 | if (slice_type_nos != AV_PICTURE_TYPE_I) { |
| 193 | int list; | ||
| 194 |
2/2✓ Branch 0 taken 20399 times.
✓ Branch 1 taken 19247 times.
|
39646 | for (list = 0; list < list_count; list++) { |
| 195 |
2/2✓ Branch 1 taken 3167 times.
✓ Branch 2 taken 17232 times.
|
20399 | if (get_bits1(gb)) { |
| 196 | int index; | ||
| 197 | 15198 | for (index = 0; ; index++) { | |
| 198 | 15198 | unsigned int reordering_of_pic_nums_idc = get_ue_golomb_31(gb); | |
| 199 | |||
| 200 |
2/2✓ Branch 0 taken 12031 times.
✓ Branch 1 taken 3167 times.
|
15198 | if (reordering_of_pic_nums_idc < 3) |
| 201 | 12031 | get_ue_golomb_long(gb); | |
| 202 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3167 times.
|
3167 | else if (reordering_of_pic_nums_idc > 3) { |
| 203 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 204 | "illegal reordering_of_pic_nums_idc %d\n", | ||
| 205 | reordering_of_pic_nums_idc); | ||
| 206 | ✗ | return AVERROR_INVALIDDATA; | |
| 207 | } else | ||
| 208 | 3167 | break; | |
| 209 | |||
| 210 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 12031 times.
|
12031 | if (index >= ref_count[list]) { |
| 211 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 212 | "reference count %d overflow\n", index); | ||
| 213 | ✗ | return AVERROR_INVALIDDATA; | |
| 214 | } | ||
| 215 | } | ||
| 216 | } | ||
| 217 | } | ||
| 218 | } | ||
| 219 | |||
| 220 |
4/4✓ Branch 0 taken 4319 times.
✓ Branch 1 taken 16755 times.
✓ Branch 2 taken 580 times.
✓ Branch 3 taken 3739 times.
|
21074 | if ((p->ps.pps->weighted_pred && slice_type_nos == AV_PICTURE_TYPE_P) || |
| 221 |
3/4✓ Branch 0 taken 24 times.
✓ Branch 1 taken 17311 times.
✓ Branch 2 taken 24 times.
✗ Branch 3 not taken.
|
17335 | (p->ps.pps->weighted_bipred_idc == 1 && slice_type_nos == AV_PICTURE_TYPE_B)) |
| 222 | 3763 | ff_h264_pred_weight_table(gb, p->ps.sps, ref_count, slice_type_nos, | |
| 223 | &pwt, p->picture_structure, logctx); | ||
| 224 | |||
| 225 |
2/2✓ Branch 1 taken 2154 times.
✓ Branch 2 taken 18920 times.
|
21074 | if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag |
| 226 | int i; | ||
| 227 |
1/2✓ Branch 0 taken 6239 times.
✗ Branch 1 not taken.
|
6239 | for (i = 0; i < H264_MAX_MMCO_COUNT; i++) { |
| 228 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 6239 times.
|
6239 | if (get_bits_left(gb) < 1) |
| 229 | ✗ | return AVERROR_INVALIDDATA; | |
| 230 | |||
| 231 | 6239 | MMCOOpcode opcode = get_ue_golomb_31(gb); | |
| 232 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6239 times.
|
6239 | if (opcode > (unsigned) MMCO_LONG) { |
| 233 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 234 | "illegal memory management control operation %d\n", | ||
| 235 | opcode); | ||
| 236 | ✗ | return AVERROR_INVALIDDATA; | |
| 237 | } | ||
| 238 |
2/2✓ Branch 0 taken 2104 times.
✓ Branch 1 taken 4135 times.
|
6239 | if (opcode == MMCO_END) |
| 239 | 2104 | return 0; | |
| 240 |
2/2✓ Branch 0 taken 50 times.
✓ Branch 1 taken 4085 times.
|
4135 | else if (opcode == MMCO_RESET) |
| 241 | 50 | return 1; | |
| 242 | |||
| 243 |
4/4✓ Branch 0 taken 808 times.
✓ Branch 1 taken 3277 times.
✓ Branch 2 taken 333 times.
✓ Branch 3 taken 475 times.
|
4085 | if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) |
| 244 | 3610 | get_ue_golomb_long(gb); // difference_of_pic_nums_minus1 | |
| 245 |
6/6✓ Branch 0 taken 3752 times.
✓ Branch 1 taken 333 times.
✓ Branch 2 taken 3672 times.
✓ Branch 3 taken 80 times.
✓ Branch 4 taken 3656 times.
✓ Branch 5 taken 16 times.
|
4085 | if (opcode == MMCO_SHORT2LONG || opcode == MMCO_LONG2UNUSED || |
| 246 |
2/2✓ Branch 0 taken 379 times.
✓ Branch 1 taken 3277 times.
|
3656 | opcode == MMCO_LONG || opcode == MMCO_SET_MAX_LONG) |
| 247 | 808 | get_ue_golomb_31(gb); | |
| 248 | } | ||
| 249 | } | ||
| 250 | |||
| 251 | 18920 | return 0; | |
| 252 | } | ||
| 253 | |||
| 254 | /** | ||
| 255 | * Parse NAL units of found picture and decode some basic information. | ||
| 256 | * | ||
| 257 | * @param s parser context. | ||
| 258 | * @param avctx codec context. | ||
| 259 | * @param buf buffer with field/frame data. | ||
| 260 | * @param buf_size size of the buffer. | ||
| 261 | */ | ||
| 262 | 34765 | static inline int parse_nal_units(AVCodecParserContext *s, | |
| 263 | AVCodecContext *avctx, | ||
| 264 | const uint8_t * const buf, int buf_size) | ||
| 265 | { | ||
| 266 | 34765 | H264ParseContext *p = s->priv_data; | |
| 267 | 34765 | H2645RBSP rbsp = { NULL }; | |
| 268 | 34765 | H2645NAL nal = { NULL }; | |
| 269 | int buf_index, next_avc; | ||
| 270 | unsigned int pps_id; | ||
| 271 | unsigned int slice_type; | ||
| 272 | 34765 | int state = -1, got_reset = 0; | |
| 273 |
3/4✓ Branch 0 taken 34428 times.
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 34428 times.
|
34765 | int q264 = buf_size >=4 && !memcmp("Q264", buf, 4); |
| 274 | int field_poc[2]; | ||
| 275 | int ret; | ||
| 276 | |||
| 277 | /* set some sane default values */ | ||
| 278 | 34765 | s->pict_type = AV_PICTURE_TYPE_I; | |
| 279 | 34765 | s->key_frame = 0; | |
| 280 | 34765 | s->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN; | |
| 281 | |||
| 282 | 34765 | ff_h264_sei_uninit(&p->sei); | |
| 283 | 34765 | p->sei.common.frame_packing.arrangement_cancel_flag = -1; | |
| 284 | 34765 | p->sei.common.unregistered.x264_build = -1; | |
| 285 | |||
| 286 |
2/2✓ Branch 0 taken 337 times.
✓ Branch 1 taken 34428 times.
|
34765 | if (!buf_size) |
| 287 | 337 | return 0; | |
| 288 | |||
| 289 | 34428 | av_fast_padded_malloc(&rbsp.rbsp_buffer, &rbsp.rbsp_buffer_alloc_size, buf_size); | |
| 290 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 34428 times.
|
34428 | if (!rbsp.rbsp_buffer) |
| 291 | ✗ | return AVERROR(ENOMEM); | |
| 292 | |||
| 293 | 34428 | buf_index = 0; | |
| 294 |
2/2✓ Branch 0 taken 27398 times.
✓ Branch 1 taken 7030 times.
|
34428 | next_avc = p->is_avc ? 0 : buf_size; |
| 295 | 16847 | for (;;) { | |
| 296 | const SPS *sps; | ||
| 297 | 51275 | int src_length, consumed, nalsize = 0; | |
| 298 | |||
| 299 |
2/2✓ Branch 0 taken 11247 times.
✓ Branch 1 taken 40028 times.
|
51275 | if (buf_index >= next_avc) { |
| 300 | 11247 | nalsize = get_nalsize(p->nal_length_size, buf, buf_size, &buf_index, avctx); | |
| 301 |
2/2✓ Branch 0 taken 332 times.
✓ Branch 1 taken 10915 times.
|
11247 | if (nalsize < 0) |
| 302 | 332 | break; | |
| 303 | 10915 | next_avc = buf_index + nalsize; | |
| 304 | } else { | ||
| 305 | 40028 | buf_index = find_start_code(buf, buf_size, buf_index, next_avc); | |
| 306 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 40028 times.
|
40028 | if (buf_index >= buf_size) |
| 307 | ✗ | break; | |
| 308 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 40028 times.
|
40028 | if (buf_index >= next_avc) |
| 309 | ✗ | continue; | |
| 310 | } | ||
| 311 | 50943 | src_length = next_avc - buf_index; | |
| 312 | |||
| 313 | 50943 | state = buf[buf_index]; | |
| 314 |
2/2✓ Branch 0 taken 34096 times.
✓ Branch 1 taken 16847 times.
|
50943 | switch (state & 0x1f) { |
| 315 | 34096 | case H264_NAL_SLICE: | |
| 316 | case H264_NAL_IDR_SLICE: | ||
| 317 | // Do not walk the whole buffer just to decode slice header | ||
| 318 |
4/4✓ Branch 0 taken 33165 times.
✓ Branch 1 taken 931 times.
✓ Branch 2 taken 11549 times.
✓ Branch 3 taken 21616 times.
|
34096 | if ((state & 0x1f) == H264_NAL_IDR_SLICE || ((state >> 5) & 0x3) == 0) { |
| 319 | /* IDR or disposable slice | ||
| 320 | * No need to decode many bytes because MMCOs shall not be present. */ | ||
| 321 |
2/2✓ Branch 0 taken 12052 times.
✓ Branch 1 taken 428 times.
|
12480 | if (src_length > 60) |
| 322 | 12052 | src_length = 60; | |
| 323 | } else { | ||
| 324 | /* To decode up to MMCOs */ | ||
| 325 |
2/2✓ Branch 0 taken 12142 times.
✓ Branch 1 taken 9474 times.
|
21616 | if (src_length > 1000) |
| 326 | 12142 | src_length = 1000; | |
| 327 | } | ||
| 328 | 34096 | break; | |
| 329 | } | ||
| 330 | 50943 | consumed = ff_h2645_extract_rbsp(buf + buf_index, src_length, &rbsp, &nal, 1); | |
| 331 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50943 times.
|
50943 | if (consumed < 0) |
| 332 | ✗ | break; | |
| 333 | |||
| 334 | 50943 | buf_index += consumed; | |
| 335 | |||
| 336 | 50943 | ret = init_get_bits8(&nal.gb, nal.data, nal.size); | |
| 337 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50943 times.
|
50943 | if (ret < 0) |
| 338 | ✗ | goto fail; | |
| 339 | 50943 | get_bits1(&nal.gb); | |
| 340 | 50943 | nal.ref_idc = get_bits(&nal.gb, 2); | |
| 341 | 50943 | nal.type = get_bits(&nal.gb, 5); | |
| 342 | |||
| 343 |
6/6✓ Branch 0 taken 944 times.
✓ Branch 1 taken 7647 times.
✓ Branch 2 taken 4381 times.
✓ Branch 3 taken 931 times.
✓ Branch 4 taken 33165 times.
✓ Branch 5 taken 3875 times.
|
50943 | switch (nal.type) { |
| 344 | 944 | case H264_NAL_SPS: | |
| 345 | 944 | ff_h264_decode_seq_parameter_set(&nal.gb, avctx, &p->ps, 0); | |
| 346 | 944 | break; | |
| 347 | 7647 | case H264_NAL_PPS: | |
| 348 | 7647 | ff_h264_decode_picture_parameter_set(&nal.gb, avctx, &p->ps, | |
| 349 | nal.size_bits); | ||
| 350 | 7647 | break; | |
| 351 | 4381 | case H264_NAL_SEI: | |
| 352 | 4381 | ff_h264_sei_decode(&p->sei, &nal.gb, &p->ps, avctx); | |
| 353 | 4381 | break; | |
| 354 | 931 | case H264_NAL_IDR_SLICE: | |
| 355 | 931 | s->key_frame = 1; | |
| 356 | |||
| 357 | 931 | p->poc.prev_frame_num = 0; | |
| 358 | 931 | p->poc.prev_frame_num_offset = 0; | |
| 359 | 931 | p->poc.prev_poc_msb = | |
| 360 | 931 | p->poc.prev_poc_lsb = 0; | |
| 361 | /* fall through */ | ||
| 362 | 34096 | case H264_NAL_SLICE: | |
| 363 | 34096 | get_ue_golomb_long(&nal.gb); // skip first_mb_in_slice | |
| 364 | 34096 | slice_type = get_ue_golomb_31(&nal.gb); | |
| 365 | 34096 | s->pict_type = ff_h264_golomb_to_pict_type[slice_type % 5]; | |
| 366 |
2/2✓ Branch 0 taken 213 times.
✓ Branch 1 taken 33883 times.
|
34096 | if (p->sei.recovery_point.recovery_frame_cnt >= 0) { |
| 367 | /* key frame, since recovery_frame_cnt is set */ | ||
| 368 | 213 | s->key_frame = 1; | |
| 369 | } | ||
| 370 | 34096 | pps_id = get_ue_golomb(&nal.gb); | |
| 371 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 34096 times.
|
34096 | if (pps_id >= MAX_PPS_COUNT) { |
| 372 | ✗ | av_log(avctx, AV_LOG_ERROR, | |
| 373 | "pps_id %u out of range\n", pps_id); | ||
| 374 | ✗ | goto fail; | |
| 375 | } | ||
| 376 |
2/2✓ Branch 0 taken 568 times.
✓ Branch 1 taken 33528 times.
|
34096 | if (!p->ps.pps_list[pps_id]) { |
| 377 | 568 | av_log(avctx, AV_LOG_ERROR, | |
| 378 | "non-existing PPS %u referenced\n", pps_id); | ||
| 379 | 568 | goto fail; | |
| 380 | } | ||
| 381 | |||
| 382 | 33528 | av_refstruct_replace(&p->ps.pps, p->ps.pps_list[pps_id]); | |
| 383 | 33528 | p->ps.sps = p->ps.pps->sps; | |
| 384 | 33528 | sps = p->ps.sps; | |
| 385 | |||
| 386 | // heuristic to detect non marked keyframes | ||
| 387 |
6/6✓ Branch 0 taken 8777 times.
✓ Branch 1 taken 24751 times.
✓ Branch 2 taken 8643 times.
✓ Branch 3 taken 134 times.
✓ Branch 4 taken 1080 times.
✓ Branch 5 taken 7563 times.
|
33528 | if (p->ps.sps->ref_frame_count <= 1 && p->ps.pps->ref_count[0] <= 1 && s->pict_type == AV_PICTURE_TYPE_I) |
| 388 | 1080 | s->key_frame = 1; | |
| 389 | |||
| 390 | 33528 | p->poc.frame_num = get_bits(&nal.gb, sps->log2_max_frame_num); | |
| 391 | |||
| 392 | 33528 | s->coded_width = 16 * sps->mb_width; | |
| 393 | 33528 | s->coded_height = 16 * sps->mb_height; | |
| 394 | 33528 | s->width = s->coded_width - (sps->crop_right + sps->crop_left); | |
| 395 | 33528 | s->height = s->coded_height - (sps->crop_top + sps->crop_bottom); | |
| 396 |
2/4✓ Branch 0 taken 33528 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 33528 times.
|
33528 | 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 285 times.
✓ Branch 2 taken 33093 times.
✗ Branch 3 not taken.
|
33528 | 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 | 285 | case 10: | |
| 408 |
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; |
| 409 |
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; |
| 410 | 148 | else s->format = AV_PIX_FMT_YUV420P10; | |
| 411 | 285 | break; | |
| 412 | 33093 | case 8: | |
| 413 |
2/2✓ Branch 0 taken 889 times.
✓ Branch 1 taken 32204 times.
|
33093 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P; |
| 414 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 32194 times.
|
32204 | else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P; |
| 415 | 32194 | else s->format = AV_PIX_FMT_YUV420P; | |
| 416 | 33093 | break; | |
| 417 | ✗ | default: | |
| 418 | ✗ | s->format = AV_PIX_FMT_NONE; | |
| 419 | } | ||
| 420 | |||
| 421 | 33528 | avctx->profile = ff_h264_get_profile(sps); | |
| 422 | 33528 | avctx->level = sps->level_idc; | |
| 423 | |||
| 424 |
2/2✓ Branch 0 taken 24080 times.
✓ Branch 1 taken 9448 times.
|
33528 | if (sps->frame_mbs_only_flag) { |
| 425 | 24080 | p->picture_structure = PICT_FRAME; | |
| 426 | } else { | ||
| 427 |
2/2✓ Branch 1 taken 6487 times.
✓ Branch 2 taken 2961 times.
|
9448 | if (get_bits1(&nal.gb)) { // field_pic_flag |
| 428 | 6487 | p->picture_structure = PICT_TOP_FIELD + get_bits1(&nal.gb); // bottom_field_flag | |
| 429 | } else { | ||
| 430 | 2961 | p->picture_structure = PICT_FRAME; | |
| 431 | } | ||
| 432 | } | ||
| 433 | |||
| 434 |
2/2✓ Branch 0 taken 929 times.
✓ Branch 1 taken 32599 times.
|
33528 | if (nal.type == H264_NAL_IDR_SLICE) |
| 435 | 929 | get_ue_golomb_long(&nal.gb); /* idr_pic_id */ | |
| 436 |
2/2✓ Branch 0 taken 25449 times.
✓ Branch 1 taken 8079 times.
|
33528 | if (sps->poc_type == 0) { |
| 437 | 25449 | p->poc.poc_lsb = get_bits(&nal.gb, sps->log2_max_poc_lsb); | |
| 438 | |||
| 439 |
2/2✓ Branch 0 taken 4225 times.
✓ Branch 1 taken 21224 times.
|
25449 | if (p->ps.pps->pic_order_present == 1 && |
| 440 |
2/2✓ Branch 0 taken 3270 times.
✓ Branch 1 taken 955 times.
|
4225 | p->picture_structure == PICT_FRAME) |
| 441 | 3270 | p->poc.delta_poc_bottom = get_se_golomb(&nal.gb); | |
| 442 | } | ||
| 443 | |||
| 444 |
2/2✓ Branch 0 taken 3245 times.
✓ Branch 1 taken 30283 times.
|
33528 | 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 | 33528 | field_poc[0] = field_poc[1] = INT_MAX; | |
| 456 | 33528 | 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 33528 times.
|
33528 | 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 22003 times.
✓ Branch 1 taken 11525 times.
✓ Branch 2 taken 21074 times.
✓ Branch 3 taken 929 times.
|
33528 | if (nal.ref_idc && nal.type != H264_NAL_IDR_SLICE) { |
| 466 | 21074 | got_reset = scan_mmco_reset(s, &nal.gb, avctx); | |
| 467 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 21074 times.
|
21074 | 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 33478 times.
✓ Branch 1 taken 50 times.
|
33528 | p->poc.prev_frame_num = got_reset ? 0 : p->poc.frame_num; |
| 473 |
2/2✓ Branch 0 taken 33478 times.
✓ Branch 1 taken 50 times.
|
33528 | p->poc.prev_frame_num_offset = got_reset ? 0 : p->poc.frame_num_offset; |
| 474 |
2/2✓ Branch 0 taken 22003 times.
✓ Branch 1 taken 11525 times.
|
33528 | if (nal.ref_idc != 0) { |
| 475 |
2/2✓ Branch 0 taken 21953 times.
✓ Branch 1 taken 50 times.
|
22003 | if (!got_reset) { |
| 476 | 21953 | p->poc.prev_poc_msb = p->poc.poc_msb; | |
| 477 | 21953 | 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 3085 times.
✓ Branch 1 taken 30443 times.
|
33528 | if (p->sei.picture_timing.present) { |
| 486 | 3085 | ret = ff_h264_sei_process_picture_timing(&p->sei.picture_timing, | |
| 487 | sps, avctx); | ||
| 488 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3085 times.
|
3085 | 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 3481 times.
✓ Branch 1 taken 30047 times.
✓ Branch 2 taken 3073 times.
✓ Branch 3 taken 408 times.
|
33528 | if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { |
| 495 |
3/6✓ Branch 0 taken 831 times.
✓ Branch 1 taken 2104 times.
✓ Branch 2 taken 138 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
3073 | switch (p->sei.picture_timing.pic_struct) { |
| 496 | 831 | case H264_SEI_PIC_STRUCT_TOP_FIELD: | |
| 497 | case H264_SEI_PIC_STRUCT_BOTTOM_FIELD: | ||
| 498 | 831 | s->repeat_pict = 0; | |
| 499 | 831 | break; | |
| 500 | 2104 | case H264_SEI_PIC_STRUCT_FRAME: | |
| 501 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | ||
| 502 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP: | ||
| 503 | 2104 | s->repeat_pict = 1; | |
| 504 | 2104 | 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 | 30455 | s->repeat_pict = p->picture_structure == PICT_FRAME ? 1 : 0; | |
| 521 | } | ||
| 522 | |||
| 523 |
2/2✓ Branch 0 taken 27041 times.
✓ Branch 1 taken 6487 times.
|
33528 | if (p->picture_structure == PICT_FRAME) { |
| 524 | 27041 | s->picture_structure = AV_PICTURE_STRUCTURE_FRAME; | |
| 525 |
4/4✓ Branch 0 taken 2321 times.
✓ Branch 1 taken 24720 times.
✓ Branch 2 taken 2242 times.
✓ Branch 3 taken 79 times.
|
27041 | if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { |
| 526 |
3/3✓ Branch 0 taken 1421 times.
✓ Branch 1 taken 150 times.
✓ Branch 2 taken 671 times.
|
2242 | switch (p->sei.picture_timing.pic_struct) { |
| 527 | 1421 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | |
| 528 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | ||
| 529 | 1421 | s->field_order = AV_FIELD_TT; | |
| 530 | 1421 | 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 | 671 | default: | |
| 536 | 671 | s->field_order = AV_FIELD_PROGRESSIVE; | |
| 537 | 671 | break; | |
| 538 | } | ||
| 539 | } else { | ||
| 540 |
2/2✓ Branch 0 taken 1041 times.
✓ Branch 1 taken 23758 times.
|
24799 | 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 23755 times.
|
23758 | else if (field_poc[0] > field_poc[1]) |
| 543 | 3 | s->field_order = AV_FIELD_BB; | |
| 544 | else | ||
| 545 | 23755 | s->field_order = AV_FIELD_PROGRESSIVE; | |
| 546 | } | ||
| 547 | } else { | ||
| 548 |
2/2✓ Branch 0 taken 3341 times.
✓ Branch 1 taken 3146 times.
|
6487 | if (p->picture_structure == PICT_TOP_FIELD) |
| 549 | 3341 | s->picture_structure = AV_PICTURE_STRUCTURE_TOP_FIELD; | |
| 550 | else | ||
| 551 | 3146 | s->picture_structure = AV_PICTURE_STRUCTURE_BOTTOM_FIELD; | |
| 552 |
2/2✓ Branch 0 taken 4884 times.
✓ Branch 1 taken 1603 times.
|
6487 | if (p->poc.frame_num == p->last_frame_num && |
| 553 |
1/2✓ Branch 0 taken 4884 times.
✗ Branch 1 not taken.
|
4884 | p->last_picture_structure != AV_PICTURE_STRUCTURE_UNKNOWN && |
| 554 |
1/2✓ Branch 0 taken 4884 times.
✗ Branch 1 not taken.
|
4884 | p->last_picture_structure != AV_PICTURE_STRUCTURE_FRAME && |
| 555 |
2/2✓ Branch 0 taken 4760 times.
✓ Branch 1 taken 124 times.
|
4884 | p->last_picture_structure != s->picture_structure) { |
| 556 |
2/2✓ Branch 0 taken 3140 times.
✓ Branch 1 taken 1620 times.
|
4760 | if (p->last_picture_structure == AV_PICTURE_STRUCTURE_TOP_FIELD) |
| 557 | 3140 | s->field_order = AV_FIELD_TT; | |
| 558 | else | ||
| 559 | 1620 | s->field_order = AV_FIELD_BB; | |
| 560 | } else { | ||
| 561 | 1727 | s->field_order = AV_FIELD_UNKNOWN; | |
| 562 | } | ||
| 563 | 6487 | p->last_picture_structure = s->picture_structure; | |
| 564 | 6487 | p->last_frame_num = p->poc.frame_num; | |
| 565 | } | ||
| 566 |
2/2✓ Branch 0 taken 10433 times.
✓ Branch 1 taken 23095 times.
|
33528 | if (sps->timing_info_present_flag) { |
| 567 | 10433 | int64_t den = sps->time_scale; | |
| 568 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10433 times.
|
10433 | if (p->sei.common.unregistered.x264_build < 44U) |
| 569 | ✗ | den *= 2; | |
| 570 | 10433 | av_reduce(&avctx->framerate.den, &avctx->framerate.num, | |
| 571 | 10433 | sps->num_units_in_tick * 2, den, 1 << 30); | |
| 572 | } | ||
| 573 | |||
| 574 | 33528 | av_freep(&rbsp.rbsp_buffer); | |
| 575 | 33528 | 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 | 194505 | 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 | 194505 | H264ParseContext *p = s->priv_data; | |
| 595 | 194505 | ParseContext *pc = &p->pc; | |
| 596 | 194505 | AVRational time_base = { 0, 1 }; | |
| 597 | int next; | ||
| 598 | |||
| 599 |
2/2✓ Branch 0 taken 460 times.
✓ Branch 1 taken 194045 times.
|
194505 | if (!p->got_first) { |
| 600 | 460 | p->got_first = 1; | |
| 601 |
2/2✓ Branch 0 taken 227 times.
✓ Branch 1 taken 233 times.
|
460 | if (avctx->extradata_size) { |
| 602 | 227 | ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size, | |
| 603 | &p->ps, &p->is_avc, &p->nal_length_size, | ||
| 604 | avctx->err_recognition, avctx); | ||
| 605 | } | ||
| 606 | } | ||
| 607 | |||
| 608 |
2/2✓ Branch 0 taken 7218 times.
✓ Branch 1 taken 187287 times.
|
194505 | if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { |
| 609 | 7218 | next = buf_size; | |
| 610 | } else { | ||
| 611 | 187287 | next = h264_find_frame_end(p, buf, buf_size, avctx); | |
| 612 | |||
| 613 |
2/2✓ Branch 1 taken 159740 times.
✓ Branch 2 taken 27547 times.
|
187287 | if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { |
| 614 | 159740 | *poutbuf = NULL; | |
| 615 | 159740 | *poutbuf_size = 0; | |
| 616 | 159740 | return buf_size; | |
| 617 | } | ||
| 618 | |||
| 619 |
4/4✓ Branch 0 taken 592 times.
✓ Branch 1 taken 26955 times.
✓ Branch 2 taken 122 times.
✓ Branch 3 taken 470 times.
|
27547 | if (next < 0 && next != END_NOT_FOUND) { |
| 620 | av_assert1(pc->last_index + next >= 0); | ||
| 621 | 122 | h264_find_frame_end(p, &pc->buffer[pc->last_index + next], -next, avctx); // update state | |
| 622 | } | ||
| 623 | } | ||
| 624 | |||
| 625 | 34765 | parse_nal_units(s, avctx, buf, buf_size); | |
| 626 | |||
| 627 |
2/2✓ Branch 0 taken 10877 times.
✓ Branch 1 taken 23888 times.
|
34765 | if (avctx->framerate.num) |
| 628 | 10877 | time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){2, 1})); | |
| 629 |
2/2✓ Branch 0 taken 2053 times.
✓ Branch 1 taken 32712 times.
|
34765 | if (p->sei.picture_timing.cpb_removal_delay >= 0) { |
| 630 | 2053 | s->dts_sync_point = p->sei.buffering_period.present; | |
| 631 | 2053 | s->dts_ref_dts_delta = p->sei.picture_timing.cpb_removal_delay; | |
| 632 | 2053 | s->pts_dts_delta = p->sei.picture_timing.dpb_output_delay; | |
| 633 | } else { | ||
| 634 | 32712 | s->dts_sync_point = INT_MIN; | |
| 635 | 32712 | s->dts_ref_dts_delta = INT_MIN; | |
| 636 | 32712 | s->pts_dts_delta = INT_MIN; | |
| 637 | } | ||
| 638 | |||
| 639 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 34765 times.
|
34765 | if (s->flags & PARSER_FLAG_ONCE) { |
| 640 | ✗ | s->flags &= PARSER_FLAG_COMPLETE_FRAMES; | |
| 641 | } | ||
| 642 | |||
| 643 |
2/2✓ Branch 0 taken 2053 times.
✓ Branch 1 taken 32712 times.
|
34765 | if (s->dts_sync_point >= 0) { |
| 644 | 2053 | int64_t den = time_base.den * (int64_t)avctx->pkt_timebase.num; | |
| 645 |
1/2✓ Branch 0 taken 2053 times.
✗ Branch 1 not taken.
|
2053 | if (den > 0) { |
| 646 | 2053 | int64_t num = time_base.num * (int64_t)avctx->pkt_timebase.den; | |
| 647 |
2/2✓ Branch 0 taken 1651 times.
✓ Branch 1 taken 402 times.
|
2053 | if (s->dts != AV_NOPTS_VALUE) { |
| 648 | // got DTS from the stream, update reference timestamp | ||
| 649 | 1651 | p->reference_dts = av_sat_sub64(s->dts, av_rescale(s->dts_ref_dts_delta, num, den)); | |
| 650 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 402 times.
|
402 | } else if (p->reference_dts != AV_NOPTS_VALUE) { |
| 651 | // compute DTS based on reference timestamp | ||
| 652 | ✗ | s->dts = av_sat_add64(p->reference_dts, av_rescale(s->dts_ref_dts_delta, num, den)); | |
| 653 | } | ||
| 654 | |||
| 655 |
3/4✓ Branch 0 taken 1651 times.
✓ Branch 1 taken 402 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1651 times.
|
2053 | if (p->reference_dts != AV_NOPTS_VALUE && s->pts == AV_NOPTS_VALUE) { |
| 656 | ✗ | int64_t pts_dts_delta = av_rescale(s->pts_dts_delta, num, den); | |
| 657 | ✗ | uint64_t pts = (uint64_t)s->dts + pts_dts_delta; | |
| 658 | ✗ | if (pts == av_sat_add64(s->dts, pts_dts_delta)) | |
| 659 | ✗ | s->pts = pts; | |
| 660 | } | ||
| 661 | |||
| 662 |
2/2✓ Branch 0 taken 184 times.
✓ Branch 1 taken 1869 times.
|
2053 | if (s->dts_sync_point > 0) |
| 663 | 184 | p->reference_dts = s->dts; // new reference | |
| 664 | } | ||
| 665 | } | ||
| 666 | |||
| 667 | 34765 | *poutbuf = buf; | |
| 668 | 34765 | *poutbuf_size = buf_size; | |
| 669 | 34765 | return next; | |
| 670 | } | ||
| 671 | |||
| 672 | 463 | static av_cold void h264_close(AVCodecParserContext *s) | |
| 673 | { | ||
| 674 | 463 | H264ParseContext *p = s->priv_data; | |
| 675 | 463 | ParseContext *pc = &p->pc; | |
| 676 | |||
| 677 | 463 | av_freep(&pc->buffer); | |
| 678 | |||
| 679 | 463 | ff_h264_sei_uninit(&p->sei); | |
| 680 | 463 | ff_h264_ps_uninit(&p->ps); | |
| 681 | 463 | } | |
| 682 | |||
| 683 | 463 | static av_cold int init(AVCodecParserContext *s) | |
| 684 | { | ||
| 685 | 463 | H264ParseContext *p = s->priv_data; | |
| 686 | |||
| 687 | 463 | p->reference_dts = AV_NOPTS_VALUE; | |
| 688 | 463 | p->last_frame_num = INT_MAX; | |
| 689 | 463 | ff_h264dsp_init(&p->h264dsp, 8, 1); | |
| 690 | 463 | return 0; | |
| 691 | } | ||
| 692 | |||
| 693 | const FFCodecParser ff_h264_parser = { | ||
| 694 | PARSER_CODEC_LIST(AV_CODEC_ID_H264), | ||
| 695 | .priv_data_size = sizeof(H264ParseContext), | ||
| 696 | .init = init, | ||
| 697 | .parse = h264_parse, | ||
| 698 | .close = h264_close, | ||
| 699 | }; | ||
| 700 |