| 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 | 20953 | static int scan_mmco_reset(AVCodecParserContext *s, GetBitContext *gb, | |
| 174 | void *logctx) | ||
| 175 | { | ||
| 176 | H264PredWeightTable pwt; | ||
| 177 | 20953 | int slice_type_nos = s->pict_type & 3; | |
| 178 | 20953 | H264ParseContext *p = s->priv_data; | |
| 179 | int list_count, ref_count[2]; | ||
| 180 | |||
| 181 | |||
| 182 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 20953 times.
|
20953 | if (p->ps.pps->redundant_pic_cnt_present) |
| 183 | ✗ | get_ue_golomb(gb); // redundant_pic_count | |
| 184 | |||
| 185 |
2/2✓ Branch 0 taken 1136 times.
✓ Branch 1 taken 19817 times.
|
20953 | if (slice_type_nos == AV_PICTURE_TYPE_B) |
| 186 | 1136 | get_bits1(gb); // direct_spatial_mv_pred | |
| 187 | |||
| 188 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 20953 times.
|
20953 | 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 19126 times.
✓ Branch 1 taken 1827 times.
|
20953 | if (slice_type_nos != AV_PICTURE_TYPE_I) { |
| 193 | int list; | ||
| 194 |
2/2✓ Branch 0 taken 20262 times.
✓ Branch 1 taken 19126 times.
|
39388 | for (list = 0; list < list_count; list++) { |
| 195 |
2/2✓ Branch 1 taken 3151 times.
✓ Branch 2 taken 17111 times.
|
20262 | if (get_bits1(gb)) { |
| 196 | int index; | ||
| 197 | 15118 | for (index = 0; ; index++) { | |
| 198 | 15118 | unsigned int reordering_of_pic_nums_idc = get_ue_golomb_31(gb); | |
| 199 | |||
| 200 |
2/2✓ Branch 0 taken 11967 times.
✓ Branch 1 taken 3151 times.
|
15118 | if (reordering_of_pic_nums_idc < 3) |
| 201 | 11967 | get_ue_golomb_long(gb); | |
| 202 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3151 times.
|
3151 | 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 | 3151 | break; | |
| 209 | |||
| 210 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 11967 times.
|
11967 | 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 4281 times.
✓ Branch 1 taken 16672 times.
✓ Branch 2 taken 564 times.
✓ Branch 3 taken 3717 times.
|
20953 | if ((p->ps.pps->weighted_pred && slice_type_nos == AV_PICTURE_TYPE_P) || |
| 221 |
3/4✓ Branch 0 taken 24 times.
✓ Branch 1 taken 17212 times.
✓ Branch 2 taken 24 times.
✗ Branch 3 not taken.
|
17236 | (p->ps.pps->weighted_bipred_idc == 1 && slice_type_nos == AV_PICTURE_TYPE_B)) |
| 222 | 3741 | 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 2150 times.
✓ Branch 2 taken 18803 times.
|
20953 | if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag |
| 226 | int i; | ||
| 227 |
1/2✓ Branch 0 taken 6227 times.
✗ Branch 1 not taken.
|
6227 | for (i = 0; i < H264_MAX_MMCO_COUNT; i++) { |
| 228 | 6227 | MMCOOpcode opcode = get_ue_golomb_31(gb); | |
| 229 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6227 times.
|
6227 | if (opcode > (unsigned) MMCO_LONG) { |
| 230 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 231 | "illegal memory management control operation %d\n", | ||
| 232 | opcode); | ||
| 233 | ✗ | return AVERROR_INVALIDDATA; | |
| 234 | } | ||
| 235 |
2/2✓ Branch 0 taken 2100 times.
✓ Branch 1 taken 4127 times.
|
6227 | if (opcode == MMCO_END) |
| 236 | 2100 | return 0; | |
| 237 |
2/2✓ Branch 0 taken 50 times.
✓ Branch 1 taken 4077 times.
|
4127 | else if (opcode == MMCO_RESET) |
| 238 | 50 | return 1; | |
| 239 | |||
| 240 |
4/4✓ Branch 0 taken 808 times.
✓ Branch 1 taken 3269 times.
✓ Branch 2 taken 333 times.
✓ Branch 3 taken 475 times.
|
4077 | if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) |
| 241 | 3602 | get_ue_golomb_long(gb); // difference_of_pic_nums_minus1 | |
| 242 |
6/6✓ Branch 0 taken 3744 times.
✓ Branch 1 taken 333 times.
✓ Branch 2 taken 3664 times.
✓ Branch 3 taken 80 times.
✓ Branch 4 taken 3648 times.
✓ Branch 5 taken 16 times.
|
4077 | if (opcode == MMCO_SHORT2LONG || opcode == MMCO_LONG2UNUSED || |
| 243 |
2/2✓ Branch 0 taken 379 times.
✓ Branch 1 taken 3269 times.
|
3648 | opcode == MMCO_LONG || opcode == MMCO_SET_MAX_LONG) |
| 244 | 808 | get_ue_golomb_31(gb); | |
| 245 | } | ||
| 246 | } | ||
| 247 | |||
| 248 | 18803 | return 0; | |
| 249 | } | ||
| 250 | |||
| 251 | /** | ||
| 252 | * Parse NAL units of found picture and decode some basic information. | ||
| 253 | * | ||
| 254 | * @param s parser context. | ||
| 255 | * @param avctx codec context. | ||
| 256 | * @param buf buffer with field/frame data. | ||
| 257 | * @param buf_size size of the buffer. | ||
| 258 | */ | ||
| 259 | 34558 | static inline int parse_nal_units(AVCodecParserContext *s, | |
| 260 | AVCodecContext *avctx, | ||
| 261 | const uint8_t * const buf, int buf_size) | ||
| 262 | { | ||
| 263 | 34558 | H264ParseContext *p = s->priv_data; | |
| 264 | 34558 | H2645RBSP rbsp = { NULL }; | |
| 265 | 34558 | H2645NAL nal = { NULL }; | |
| 266 | int buf_index, next_avc; | ||
| 267 | unsigned int pps_id; | ||
| 268 | unsigned int slice_type; | ||
| 269 | 34558 | int state = -1, got_reset = 0; | |
| 270 |
3/4✓ Branch 0 taken 34224 times.
✓ Branch 1 taken 334 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 34224 times.
|
34558 | int q264 = buf_size >=4 && !memcmp("Q264", buf, 4); |
| 271 | int field_poc[2]; | ||
| 272 | int ret; | ||
| 273 | |||
| 274 | /* set some sane default values */ | ||
| 275 | 34558 | s->pict_type = AV_PICTURE_TYPE_I; | |
| 276 | 34558 | s->key_frame = 0; | |
| 277 | 34558 | s->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN; | |
| 278 | |||
| 279 | 34558 | ff_h264_sei_uninit(&p->sei); | |
| 280 | 34558 | p->sei.common.frame_packing.arrangement_cancel_flag = -1; | |
| 281 | 34558 | p->sei.common.unregistered.x264_build = -1; | |
| 282 | |||
| 283 |
2/2✓ Branch 0 taken 334 times.
✓ Branch 1 taken 34224 times.
|
34558 | if (!buf_size) |
| 284 | 334 | return 0; | |
| 285 | |||
| 286 | 34224 | av_fast_padded_malloc(&rbsp.rbsp_buffer, &rbsp.rbsp_buffer_alloc_size, buf_size); | |
| 287 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 34224 times.
|
34224 | if (!rbsp.rbsp_buffer) |
| 288 | ✗ | return AVERROR(ENOMEM); | |
| 289 | |||
| 290 | 34224 | buf_index = 0; | |
| 291 |
2/2✓ Branch 0 taken 27398 times.
✓ Branch 1 taken 6826 times.
|
34224 | next_avc = p->is_avc ? 0 : buf_size; |
| 292 | 16701 | for (;;) { | |
| 293 | const SPS *sps; | ||
| 294 | 50925 | int src_length, consumed, nalsize = 0; | |
| 295 | |||
| 296 |
2/2✓ Branch 0 taken 10897 times.
✓ Branch 1 taken 40028 times.
|
50925 | if (buf_index >= next_avc) { |
| 297 | 10897 | nalsize = get_nalsize(p->nal_length_size, buf, buf_size, &buf_index, avctx); | |
| 298 |
2/2✓ Branch 0 taken 332 times.
✓ Branch 1 taken 10565 times.
|
10897 | if (nalsize < 0) |
| 299 | 332 | break; | |
| 300 | 10565 | next_avc = buf_index + nalsize; | |
| 301 | } else { | ||
| 302 | 40028 | buf_index = find_start_code(buf, buf_size, buf_index, next_avc); | |
| 303 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 40028 times.
|
40028 | if (buf_index >= buf_size) |
| 304 | ✗ | break; | |
| 305 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 40028 times.
|
40028 | if (buf_index >= next_avc) |
| 306 | ✗ | continue; | |
| 307 | } | ||
| 308 | 50593 | src_length = next_avc - buf_index; | |
| 309 | |||
| 310 | 50593 | state = buf[buf_index]; | |
| 311 |
2/2✓ Branch 0 taken 33892 times.
✓ Branch 1 taken 16701 times.
|
50593 | switch (state & 0x1f) { |
| 312 | 33892 | case H264_NAL_SLICE: | |
| 313 | case H264_NAL_IDR_SLICE: | ||
| 314 | // Do not walk the whole buffer just to decode slice header | ||
| 315 |
4/4✓ Branch 0 taken 33020 times.
✓ Branch 1 taken 872 times.
✓ Branch 2 taken 11525 times.
✓ Branch 3 taken 21495 times.
|
33892 | if ((state & 0x1f) == H264_NAL_IDR_SLICE || ((state >> 5) & 0x3) == 0) { |
| 316 | /* IDR or disposable slice | ||
| 317 | * No need to decode many bytes because MMCOs shall not be present. */ | ||
| 318 |
2/2✓ Branch 0 taken 11969 times.
✓ Branch 1 taken 428 times.
|
12397 | if (src_length > 60) |
| 319 | 11969 | src_length = 60; | |
| 320 | } else { | ||
| 321 | /* To decode up to MMCOs */ | ||
| 322 |
2/2✓ Branch 0 taken 12104 times.
✓ Branch 1 taken 9391 times.
|
21495 | if (src_length > 1000) |
| 323 | 12104 | src_length = 1000; | |
| 324 | } | ||
| 325 | 33892 | break; | |
| 326 | } | ||
| 327 | 50593 | consumed = ff_h2645_extract_rbsp(buf + buf_index, src_length, &rbsp, &nal, 1); | |
| 328 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50593 times.
|
50593 | if (consumed < 0) |
| 329 | ✗ | break; | |
| 330 | |||
| 331 | 50593 | buf_index += consumed; | |
| 332 | |||
| 333 | 50593 | ret = init_get_bits8(&nal.gb, nal.data, nal.size); | |
| 334 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50593 times.
|
50593 | if (ret < 0) |
| 335 | ✗ | goto fail; | |
| 336 | 50593 | get_bits1(&nal.gb); | |
| 337 | 50593 | nal.ref_idc = get_bits(&nal.gb, 2); | |
| 338 | 50593 | nal.type = get_bits(&nal.gb, 5); | |
| 339 | |||
| 340 |
6/6✓ Branch 0 taken 944 times.
✓ Branch 1 taken 7647 times.
✓ Branch 2 taken 4235 times.
✓ Branch 3 taken 872 times.
✓ Branch 4 taken 33020 times.
✓ Branch 5 taken 3875 times.
|
50593 | switch (nal.type) { |
| 341 | 944 | case H264_NAL_SPS: | |
| 342 | 944 | ff_h264_decode_seq_parameter_set(&nal.gb, avctx, &p->ps, 0); | |
| 343 | 944 | break; | |
| 344 | 7647 | case H264_NAL_PPS: | |
| 345 | 7647 | ff_h264_decode_picture_parameter_set(&nal.gb, avctx, &p->ps, | |
| 346 | nal.size_bits); | ||
| 347 | 7647 | break; | |
| 348 | 4235 | case H264_NAL_SEI: | |
| 349 | 4235 | ff_h264_sei_decode(&p->sei, &nal.gb, &p->ps, avctx); | |
| 350 | 4235 | break; | |
| 351 | 872 | case H264_NAL_IDR_SLICE: | |
| 352 | 872 | s->key_frame = 1; | |
| 353 | |||
| 354 | 872 | p->poc.prev_frame_num = 0; | |
| 355 | 872 | p->poc.prev_frame_num_offset = 0; | |
| 356 | 872 | p->poc.prev_poc_msb = | |
| 357 | 872 | p->poc.prev_poc_lsb = 0; | |
| 358 | /* fall through */ | ||
| 359 | 33892 | case H264_NAL_SLICE: | |
| 360 | 33892 | get_ue_golomb_long(&nal.gb); // skip first_mb_in_slice | |
| 361 | 33892 | slice_type = get_ue_golomb_31(&nal.gb); | |
| 362 | 33892 | s->pict_type = ff_h264_golomb_to_pict_type[slice_type % 5]; | |
| 363 |
2/2✓ Branch 0 taken 213 times.
✓ Branch 1 taken 33679 times.
|
33892 | if (p->sei.recovery_point.recovery_frame_cnt >= 0) { |
| 364 | /* key frame, since recovery_frame_cnt is set */ | ||
| 365 | 213 | s->key_frame = 1; | |
| 366 | } | ||
| 367 | 33892 | pps_id = get_ue_golomb(&nal.gb); | |
| 368 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 33892 times.
|
33892 | if (pps_id >= MAX_PPS_COUNT) { |
| 369 | ✗ | av_log(avctx, AV_LOG_ERROR, | |
| 370 | "pps_id %u out of range\n", pps_id); | ||
| 371 | ✗ | goto fail; | |
| 372 | } | ||
| 373 |
2/2✓ Branch 0 taken 568 times.
✓ Branch 1 taken 33324 times.
|
33892 | if (!p->ps.pps_list[pps_id]) { |
| 374 | 568 | av_log(avctx, AV_LOG_ERROR, | |
| 375 | "non-existing PPS %u referenced\n", pps_id); | ||
| 376 | 568 | goto fail; | |
| 377 | } | ||
| 378 | |||
| 379 | 33324 | av_refstruct_replace(&p->ps.pps, p->ps.pps_list[pps_id]); | |
| 380 | 33324 | p->ps.sps = p->ps.pps->sps; | |
| 381 | 33324 | sps = p->ps.sps; | |
| 382 | |||
| 383 | // heuristic to detect non marked keyframes | ||
| 384 |
6/6✓ Branch 0 taken 8643 times.
✓ Branch 1 taken 24681 times.
✓ Branch 2 taken 8509 times.
✓ Branch 3 taken 134 times.
✓ Branch 4 taken 1029 times.
✓ Branch 5 taken 7480 times.
|
33324 | if (p->ps.sps->ref_frame_count <= 1 && p->ps.pps->ref_count[0] <= 1 && s->pict_type == AV_PICTURE_TYPE_I) |
| 385 | 1029 | s->key_frame = 1; | |
| 386 | |||
| 387 | 33324 | p->poc.frame_num = get_bits(&nal.gb, sps->log2_max_frame_num); | |
| 388 | |||
| 389 | 33324 | s->coded_width = 16 * sps->mb_width; | |
| 390 | 33324 | s->coded_height = 16 * sps->mb_height; | |
| 391 | 33324 | s->width = s->coded_width - (sps->crop_right + sps->crop_left); | |
| 392 | 33324 | s->height = s->coded_height - (sps->crop_top + sps->crop_bottom); | |
| 393 |
2/4✓ Branch 0 taken 33324 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 33324 times.
|
33324 | if (s->width <= 0 || s->height <= 0) { |
| 394 | ✗ | s->width = s->coded_width; | |
| 395 | ✗ | s->height = s->coded_height; | |
| 396 | } | ||
| 397 | |||
| 398 |
3/4✓ Branch 0 taken 150 times.
✓ Branch 1 taken 285 times.
✓ Branch 2 taken 32889 times.
✗ Branch 3 not taken.
|
33324 | switch (sps->bit_depth_luma) { |
| 399 | 150 | case 9: | |
| 400 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 150 times.
|
150 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P9; |
| 401 |
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; |
| 402 | 100 | else s->format = AV_PIX_FMT_YUV420P9; | |
| 403 | 150 | break; | |
| 404 | 285 | case 10: | |
| 405 |
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; |
| 406 |
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; |
| 407 | 148 | else s->format = AV_PIX_FMT_YUV420P10; | |
| 408 | 285 | break; | |
| 409 | 32889 | case 8: | |
| 410 |
2/2✓ Branch 0 taken 893 times.
✓ Branch 1 taken 31996 times.
|
32889 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P; |
| 411 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 31986 times.
|
31996 | else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P; |
| 412 | 31986 | else s->format = AV_PIX_FMT_YUV420P; | |
| 413 | 32889 | break; | |
| 414 | ✗ | default: | |
| 415 | ✗ | s->format = AV_PIX_FMT_NONE; | |
| 416 | } | ||
| 417 | |||
| 418 | 33324 | avctx->profile = ff_h264_get_profile(sps); | |
| 419 | 33324 | avctx->level = sps->level_idc; | |
| 420 | |||
| 421 |
2/2✓ Branch 0 taken 23876 times.
✓ Branch 1 taken 9448 times.
|
33324 | if (sps->frame_mbs_only_flag) { |
| 422 | 23876 | p->picture_structure = PICT_FRAME; | |
| 423 | } else { | ||
| 424 |
2/2✓ Branch 1 taken 6487 times.
✓ Branch 2 taken 2961 times.
|
9448 | if (get_bits1(&nal.gb)) { // field_pic_flag |
| 425 | 6487 | p->picture_structure = PICT_TOP_FIELD + get_bits1(&nal.gb); // bottom_field_flag | |
| 426 | } else { | ||
| 427 | 2961 | p->picture_structure = PICT_FRAME; | |
| 428 | } | ||
| 429 | } | ||
| 430 | |||
| 431 |
2/2✓ Branch 0 taken 870 times.
✓ Branch 1 taken 32454 times.
|
33324 | if (nal.type == H264_NAL_IDR_SLICE) |
| 432 | 870 | get_ue_golomb_long(&nal.gb); /* idr_pic_id */ | |
| 433 |
2/2✓ Branch 0 taken 25379 times.
✓ Branch 1 taken 7945 times.
|
33324 | if (sps->poc_type == 0) { |
| 434 | 25379 | p->poc.poc_lsb = get_bits(&nal.gb, sps->log2_max_poc_lsb); | |
| 435 | |||
| 436 |
2/2✓ Branch 0 taken 4225 times.
✓ Branch 1 taken 21154 times.
|
25379 | if (p->ps.pps->pic_order_present == 1 && |
| 437 |
2/2✓ Branch 0 taken 3270 times.
✓ Branch 1 taken 955 times.
|
4225 | p->picture_structure == PICT_FRAME) |
| 438 | 3270 | p->poc.delta_poc_bottom = get_se_golomb(&nal.gb); | |
| 439 | } | ||
| 440 | |||
| 441 |
2/2✓ Branch 0 taken 3245 times.
✓ Branch 1 taken 30079 times.
|
33324 | if (sps->poc_type == 1 && |
| 442 |
2/2✓ Branch 0 taken 3071 times.
✓ Branch 1 taken 174 times.
|
3245 | !sps->delta_pic_order_always_zero_flag) { |
| 443 | 3071 | p->poc.delta_poc[0] = get_se_golomb(&nal.gb); | |
| 444 | |||
| 445 |
2/2✓ Branch 0 taken 692 times.
✓ Branch 1 taken 2379 times.
|
3071 | if (p->ps.pps->pic_order_present == 1 && |
| 446 |
2/2✓ Branch 0 taken 406 times.
✓ Branch 1 taken 286 times.
|
692 | p->picture_structure == PICT_FRAME) |
| 447 | 406 | p->poc.delta_poc[1] = get_se_golomb(&nal.gb); | |
| 448 | } | ||
| 449 | |||
| 450 | /* Decode POC of this picture. | ||
| 451 | * The prev_ values needed for decoding POC of the next picture are not set here. */ | ||
| 452 | 33324 | field_poc[0] = field_poc[1] = INT_MAX; | |
| 453 | 33324 | ret = ff_h264_init_poc(field_poc, &s->output_picture_number, sps, | |
| 454 | &p->poc, p->picture_structure, nal.ref_idc); | ||
| 455 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 33324 times.
|
33324 | if (ret < 0) |
| 456 | ✗ | goto fail; | |
| 457 | |||
| 458 | /* Continue parsing to check if MMCO_RESET is present. | ||
| 459 | * FIXME: MMCO_RESET could appear in non-first slice. | ||
| 460 | * Maybe, we should parse all undisposable non-IDR slice of this | ||
| 461 | * picture until encountering MMCO_RESET in a slice of it. */ | ||
| 462 |
4/4✓ Branch 0 taken 21823 times.
✓ Branch 1 taken 11501 times.
✓ Branch 2 taken 20953 times.
✓ Branch 3 taken 870 times.
|
33324 | if (nal.ref_idc && nal.type != H264_NAL_IDR_SLICE) { |
| 463 | 20953 | got_reset = scan_mmco_reset(s, &nal.gb, avctx); | |
| 464 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 20953 times.
|
20953 | if (got_reset < 0) |
| 465 | ✗ | goto fail; | |
| 466 | } | ||
| 467 | |||
| 468 | /* Set up the prev_ values for decoding POC of the next picture. */ | ||
| 469 |
2/2✓ Branch 0 taken 33274 times.
✓ Branch 1 taken 50 times.
|
33324 | p->poc.prev_frame_num = got_reset ? 0 : p->poc.frame_num; |
| 470 |
2/2✓ Branch 0 taken 33274 times.
✓ Branch 1 taken 50 times.
|
33324 | p->poc.prev_frame_num_offset = got_reset ? 0 : p->poc.frame_num_offset; |
| 471 |
2/2✓ Branch 0 taken 21823 times.
✓ Branch 1 taken 11501 times.
|
33324 | if (nal.ref_idc != 0) { |
| 472 |
2/2✓ Branch 0 taken 21773 times.
✓ Branch 1 taken 50 times.
|
21823 | if (!got_reset) { |
| 473 | 21773 | p->poc.prev_poc_msb = p->poc.poc_msb; | |
| 474 | 21773 | p->poc.prev_poc_lsb = p->poc.poc_lsb; | |
| 475 | } else { | ||
| 476 | 50 | p->poc.prev_poc_msb = 0; | |
| 477 | 50 | p->poc.prev_poc_lsb = | |
| 478 |
1/2✓ Branch 0 taken 50 times.
✗ Branch 1 not taken.
|
50 | p->picture_structure == PICT_BOTTOM_FIELD ? 0 : field_poc[0]; |
| 479 | } | ||
| 480 | } | ||
| 481 | |||
| 482 |
2/2✓ Branch 0 taken 2989 times.
✓ Branch 1 taken 30335 times.
|
33324 | if (p->sei.picture_timing.present) { |
| 483 | 2989 | ret = ff_h264_sei_process_picture_timing(&p->sei.picture_timing, | |
| 484 | sps, avctx); | ||
| 485 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2989 times.
|
2989 | if (ret < 0) { |
| 486 | ✗ | av_log(avctx, AV_LOG_ERROR, "Error processing the picture timing SEI\n"); | |
| 487 | ✗ | p->sei.picture_timing.present = 0; | |
| 488 | } | ||
| 489 | } | ||
| 490 | |||
| 491 |
4/4✓ Branch 0 taken 3385 times.
✓ Branch 1 taken 29939 times.
✓ Branch 2 taken 2977 times.
✓ Branch 3 taken 408 times.
|
33324 | if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { |
| 492 |
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) { |
| 493 | 831 | case H264_SEI_PIC_STRUCT_TOP_FIELD: | |
| 494 | case H264_SEI_PIC_STRUCT_BOTTOM_FIELD: | ||
| 495 | 831 | s->repeat_pict = 0; | |
| 496 | 831 | break; | |
| 497 | 2008 | case H264_SEI_PIC_STRUCT_FRAME: | |
| 498 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | ||
| 499 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP: | ||
| 500 | 2008 | s->repeat_pict = 1; | |
| 501 | 2008 | break; | |
| 502 | 138 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | |
| 503 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | ||
| 504 | 138 | s->repeat_pict = 2; | |
| 505 | 138 | break; | |
| 506 | ✗ | case H264_SEI_PIC_STRUCT_FRAME_DOUBLING: | |
| 507 | ✗ | s->repeat_pict = 3; | |
| 508 | ✗ | break; | |
| 509 | ✗ | case H264_SEI_PIC_STRUCT_FRAME_TRIPLING: | |
| 510 | ✗ | s->repeat_pict = 5; | |
| 511 | ✗ | break; | |
| 512 | ✗ | default: | |
| 513 | ✗ | s->repeat_pict = p->picture_structure == PICT_FRAME ? 1 : 0; | |
| 514 | ✗ | break; | |
| 515 | } | ||
| 516 | } else { | ||
| 517 | 30347 | s->repeat_pict = p->picture_structure == PICT_FRAME ? 1 : 0; | |
| 518 | } | ||
| 519 | |||
| 520 |
2/2✓ Branch 0 taken 26837 times.
✓ Branch 1 taken 6487 times.
|
33324 | if (p->picture_structure == PICT_FRAME) { |
| 521 | 26837 | s->picture_structure = AV_PICTURE_STRUCTURE_FRAME; | |
| 522 |
4/4✓ Branch 0 taken 2225 times.
✓ Branch 1 taken 24612 times.
✓ Branch 2 taken 2146 times.
✓ Branch 3 taken 79 times.
|
26837 | if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { |
| 523 |
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) { |
| 524 | 1421 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | |
| 525 | case H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | ||
| 526 | 1421 | s->field_order = AV_FIELD_TT; | |
| 527 | 1421 | break; | |
| 528 | 150 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP: | |
| 529 | case H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | ||
| 530 | 150 | s->field_order = AV_FIELD_BB; | |
| 531 | 150 | break; | |
| 532 | 575 | default: | |
| 533 | 575 | s->field_order = AV_FIELD_PROGRESSIVE; | |
| 534 | 575 | break; | |
| 535 | } | ||
| 536 | } else { | ||
| 537 |
2/2✓ Branch 0 taken 1041 times.
✓ Branch 1 taken 23650 times.
|
24691 | if (field_poc[0] < field_poc[1]) |
| 538 | 1041 | s->field_order = AV_FIELD_TT; | |
| 539 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 23647 times.
|
23650 | else if (field_poc[0] > field_poc[1]) |
| 540 | 3 | s->field_order = AV_FIELD_BB; | |
| 541 | else | ||
| 542 | 23647 | s->field_order = AV_FIELD_PROGRESSIVE; | |
| 543 | } | ||
| 544 | } else { | ||
| 545 |
2/2✓ Branch 0 taken 3341 times.
✓ Branch 1 taken 3146 times.
|
6487 | if (p->picture_structure == PICT_TOP_FIELD) |
| 546 | 3341 | s->picture_structure = AV_PICTURE_STRUCTURE_TOP_FIELD; | |
| 547 | else | ||
| 548 | 3146 | s->picture_structure = AV_PICTURE_STRUCTURE_BOTTOM_FIELD; | |
| 549 |
2/2✓ Branch 0 taken 4884 times.
✓ Branch 1 taken 1603 times.
|
6487 | if (p->poc.frame_num == p->last_frame_num && |
| 550 |
1/2✓ Branch 0 taken 4884 times.
✗ Branch 1 not taken.
|
4884 | p->last_picture_structure != AV_PICTURE_STRUCTURE_UNKNOWN && |
| 551 |
1/2✓ Branch 0 taken 4884 times.
✗ Branch 1 not taken.
|
4884 | p->last_picture_structure != AV_PICTURE_STRUCTURE_FRAME && |
| 552 |
2/2✓ Branch 0 taken 4760 times.
✓ Branch 1 taken 124 times.
|
4884 | p->last_picture_structure != s->picture_structure) { |
| 553 |
2/2✓ Branch 0 taken 3140 times.
✓ Branch 1 taken 1620 times.
|
4760 | if (p->last_picture_structure == AV_PICTURE_STRUCTURE_TOP_FIELD) |
| 554 | 3140 | s->field_order = AV_FIELD_TT; | |
| 555 | else | ||
| 556 | 1620 | s->field_order = AV_FIELD_BB; | |
| 557 | } else { | ||
| 558 | 1727 | s->field_order = AV_FIELD_UNKNOWN; | |
| 559 | } | ||
| 560 | 6487 | p->last_picture_structure = s->picture_structure; | |
| 561 | 6487 | p->last_frame_num = p->poc.frame_num; | |
| 562 | } | ||
| 563 |
2/2✓ Branch 0 taken 10229 times.
✓ Branch 1 taken 23095 times.
|
33324 | if (sps->timing_info_present_flag) { |
| 564 | 10229 | int64_t den = sps->time_scale; | |
| 565 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10229 times.
|
10229 | if (p->sei.common.unregistered.x264_build < 44U) |
| 566 | ✗ | den *= 2; | |
| 567 | 10229 | av_reduce(&avctx->framerate.den, &avctx->framerate.num, | |
| 568 | 10229 | sps->num_units_in_tick * 2, den, 1 << 30); | |
| 569 | } | ||
| 570 | |||
| 571 | 33324 | av_freep(&rbsp.rbsp_buffer); | |
| 572 | 33324 | return 0; /* no need to evaluate the rest */ | |
| 573 | } | ||
| 574 | } | ||
| 575 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 332 times.
|
332 | if (q264) { |
| 576 | ✗ | av_freep(&rbsp.rbsp_buffer); | |
| 577 | ✗ | return 0; | |
| 578 | } | ||
| 579 | /* didn't find a picture! */ | ||
| 580 | 332 | av_log(avctx, AV_LOG_ERROR, "missing picture in access unit with size %d\n", buf_size); | |
| 581 | 900 | fail: | |
| 582 | 900 | av_freep(&rbsp.rbsp_buffer); | |
| 583 | 900 | return -1; | |
| 584 | } | ||
| 585 | |||
| 586 | 194298 | static int h264_parse(AVCodecParserContext *s, | |
| 587 | AVCodecContext *avctx, | ||
| 588 | const uint8_t **poutbuf, int *poutbuf_size, | ||
| 589 | const uint8_t *buf, int buf_size) | ||
| 590 | { | ||
| 591 | 194298 | H264ParseContext *p = s->priv_data; | |
| 592 | 194298 | ParseContext *pc = &p->pc; | |
| 593 | 194298 | AVRational time_base = { 0, 1 }; | |
| 594 | int next; | ||
| 595 | |||
| 596 |
2/2✓ Branch 0 taken 455 times.
✓ Branch 1 taken 193843 times.
|
194298 | if (!p->got_first) { |
| 597 | 455 | p->got_first = 1; | |
| 598 |
2/2✓ Branch 0 taken 222 times.
✓ Branch 1 taken 233 times.
|
455 | if (avctx->extradata_size) { |
| 599 | 222 | ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size, | |
| 600 | &p->ps, &p->is_avc, &p->nal_length_size, | ||
| 601 | avctx->err_recognition, avctx); | ||
| 602 | } | ||
| 603 | } | ||
| 604 | |||
| 605 |
2/2✓ Branch 0 taken 7011 times.
✓ Branch 1 taken 187287 times.
|
194298 | if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { |
| 606 | 7011 | next = buf_size; | |
| 607 | } else { | ||
| 608 | 187287 | next = h264_find_frame_end(p, buf, buf_size, avctx); | |
| 609 | |||
| 610 |
2/2✓ Branch 1 taken 159740 times.
✓ Branch 2 taken 27547 times.
|
187287 | if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { |
| 611 | 159740 | *poutbuf = NULL; | |
| 612 | 159740 | *poutbuf_size = 0; | |
| 613 | 159740 | return buf_size; | |
| 614 | } | ||
| 615 | |||
| 616 |
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) { |
| 617 | av_assert1(pc->last_index + next >= 0); | ||
| 618 | 122 | h264_find_frame_end(p, &pc->buffer[pc->last_index + next], -next, avctx); // update state | |
| 619 | } | ||
| 620 | } | ||
| 621 | |||
| 622 | 34558 | parse_nal_units(s, avctx, buf, buf_size); | |
| 623 | |||
| 624 |
2/2✓ Branch 0 taken 10670 times.
✓ Branch 1 taken 23888 times.
|
34558 | if (avctx->framerate.num) |
| 625 | 10670 | time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){2, 1})); | |
| 626 |
2/2✓ Branch 0 taken 1957 times.
✓ Branch 1 taken 32601 times.
|
34558 | if (p->sei.picture_timing.cpb_removal_delay >= 0) { |
| 627 | 1957 | s->dts_sync_point = p->sei.buffering_period.present; | |
| 628 | 1957 | s->dts_ref_dts_delta = p->sei.picture_timing.cpb_removal_delay; | |
| 629 | 1957 | s->pts_dts_delta = p->sei.picture_timing.dpb_output_delay; | |
| 630 | } else { | ||
| 631 | 32601 | s->dts_sync_point = INT_MIN; | |
| 632 | 32601 | s->dts_ref_dts_delta = INT_MIN; | |
| 633 | 32601 | s->pts_dts_delta = INT_MIN; | |
| 634 | } | ||
| 635 | |||
| 636 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 34558 times.
|
34558 | if (s->flags & PARSER_FLAG_ONCE) { |
| 637 | ✗ | s->flags &= PARSER_FLAG_COMPLETE_FRAMES; | |
| 638 | } | ||
| 639 | |||
| 640 |
2/2✓ Branch 0 taken 1957 times.
✓ Branch 1 taken 32601 times.
|
34558 | if (s->dts_sync_point >= 0) { |
| 641 | 1957 | int64_t den = time_base.den * (int64_t)avctx->pkt_timebase.num; | |
| 642 |
1/2✓ Branch 0 taken 1957 times.
✗ Branch 1 not taken.
|
1957 | if (den > 0) { |
| 643 | 1957 | int64_t num = time_base.num * (int64_t)avctx->pkt_timebase.den; | |
| 644 |
2/2✓ Branch 0 taken 1555 times.
✓ Branch 1 taken 402 times.
|
1957 | if (s->dts != AV_NOPTS_VALUE) { |
| 645 | // got DTS from the stream, update reference timestamp | ||
| 646 | 1555 | p->reference_dts = av_sat_sub64(s->dts, av_rescale(s->dts_ref_dts_delta, num, den)); | |
| 647 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 402 times.
|
402 | } else if (p->reference_dts != AV_NOPTS_VALUE) { |
| 648 | // compute DTS based on reference timestamp | ||
| 649 | ✗ | s->dts = av_sat_add64(p->reference_dts, av_rescale(s->dts_ref_dts_delta, num, den)); | |
| 650 | } | ||
| 651 | |||
| 652 |
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) |
| 653 | ✗ | s->pts = s->dts + av_rescale(s->pts_dts_delta, num, den); | |
| 654 | |||
| 655 |
2/2✓ Branch 0 taken 135 times.
✓ Branch 1 taken 1822 times.
|
1957 | if (s->dts_sync_point > 0) |
| 656 | 135 | p->reference_dts = s->dts; // new reference | |
| 657 | } | ||
| 658 | } | ||
| 659 | |||
| 660 | 34558 | *poutbuf = buf; | |
| 661 | 34558 | *poutbuf_size = buf_size; | |
| 662 | 34558 | return next; | |
| 663 | } | ||
| 664 | |||
| 665 | 458 | static av_cold void h264_close(AVCodecParserContext *s) | |
| 666 | { | ||
| 667 | 458 | H264ParseContext *p = s->priv_data; | |
| 668 | 458 | ParseContext *pc = &p->pc; | |
| 669 | |||
| 670 | 458 | av_freep(&pc->buffer); | |
| 671 | |||
| 672 | 458 | ff_h264_sei_uninit(&p->sei); | |
| 673 | 458 | ff_h264_ps_uninit(&p->ps); | |
| 674 | 458 | } | |
| 675 | |||
| 676 | 458 | static av_cold int init(AVCodecParserContext *s) | |
| 677 | { | ||
| 678 | 458 | H264ParseContext *p = s->priv_data; | |
| 679 | |||
| 680 | 458 | p->reference_dts = AV_NOPTS_VALUE; | |
| 681 | 458 | p->last_frame_num = INT_MAX; | |
| 682 | 458 | ff_h264dsp_init(&p->h264dsp, 8, 1); | |
| 683 | 458 | return 0; | |
| 684 | } | ||
| 685 | |||
| 686 | const FFCodecParser ff_h264_parser = { | ||
| 687 | PARSER_CODEC_LIST(AV_CODEC_ID_H264), | ||
| 688 | .priv_data_size = sizeof(H264ParseContext), | ||
| 689 | .init = init, | ||
| 690 | .parse = h264_parse, | ||
| 691 | .close = h264_close, | ||
| 692 | }; | ||
| 693 |