| 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 | 39547 | static int find_start_code(const uint8_t *buf, int buf_size, | |
| 73 | int buf_index, int next_avc) | ||
| 74 | { | ||
| 75 | 39547 | uint32_t state = -1; | |
| 76 | |||
| 77 | 39547 | buf_index = avpriv_find_start_code(buf + buf_index, buf + next_avc + 1, &state) - buf - 1; | |
| 78 | |||
| 79 | 39547 | return FFMIN(buf_index, buf_size); | |
| 80 | } | ||
| 81 | |||
| 82 | 186424 | 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 | 186424 | ParseContext *pc = &p->pc; | |
| 88 | |||
| 89 | 
        1/2✓ Branch 0 taken 186424 times. 
          ✗ Branch 1 not taken. 
         | 
      186424 | int next_avc = p->is_avc ? 0 : buf_size; | 
| 90 | // mb_addr= pc->mb_addr - 1; | ||
| 91 | 186424 | state = pc->state; | |
| 92 | 
        2/2✓ Branch 0 taken 96 times. 
          ✓ Branch 1 taken 186328 times. 
         | 
      186424 | if (state > 13) | 
| 93 | 96 | state = 7; | |
| 94 | |||
| 95 | 
        1/4✗ Branch 0 not taken. 
          ✓ Branch 1 taken 186424 times. 
          ✗ Branch 2 not taken. 
          ✗ Branch 3 not taken. 
         | 
      186424 | if (p->is_avc && !p->nal_length_size) | 
| 96 | ✗ | av_log(logctx, AV_LOG_ERROR, "AVC-parser: nal length size invalid\n"); | |
| 97 | |||
| 98 | 
        2/2✓ Branch 0 taken 2573588 times. 
          ✓ Branch 1 taken 159795 times. 
         | 
      2733383 | for (i = 0; i < buf_size; i++) { | 
| 99 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 2573588 times. 
         | 
      2573588 | 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 1208147 times. 
          ✓ Branch 1 taken 1365441 times. 
         | 
      2573588 | if (state == 7) { | 
| 114 | 1208147 | i += p->h264dsp.startcode_find_candidate(buf + i, next_avc - i); | |
| 115 | 
        2/2✓ Branch 0 taken 1051144 times. 
          ✓ Branch 1 taken 157003 times. 
         | 
      1208147 | if (i < next_avc) | 
| 116 | 1051144 | state = 2; | |
| 117 | 
        2/2✓ Branch 0 taken 1225015 times. 
          ✓ Branch 1 taken 140426 times. 
         | 
      1365441 | } else if (state <= 2) { | 
| 118 | 
        2/2✓ Branch 0 taken 100173 times. 
          ✓ Branch 1 taken 1124842 times. 
         | 
      1225015 | if (buf[i] == 1) | 
| 119 | 100173 | state ^= 5; // 2->7, 1->4, 0->5 | |
| 120 | 
        2/2✓ Branch 0 taken 951225 times. 
          ✓ Branch 1 taken 173617 times. 
         | 
      1124842 | else if (buf[i]) | 
| 121 | 951225 | state = 7; | |
| 122 | else | ||
| 123 | 173617 | state >>= 1; // 2->1, 1->0, 0->0 | |
| 124 | 
        2/2✓ Branch 0 taken 75218 times. 
          ✓ Branch 1 taken 65208 times. 
         | 
      140426 | } else if (state <= 5) { | 
| 125 | 75218 | int nalu_type = buf[i] & 0x1F; | |
| 126 | 
        6/6✓ Branch 0 taken 72975 times. 
          ✓ Branch 1 taken 2243 times. 
          ✓ Branch 2 taken 71549 times. 
          ✓ Branch 3 taken 1426 times. 
          ✓ Branch 4 taken 58649 times. 
          ✓ Branch 5 taken 12900 times. 
         | 
      75218 | if (nalu_type == H264_NAL_SEI || nalu_type == H264_NAL_SPS || | 
| 127 | 
        2/2✓ Branch 0 taken 4620 times. 
          ✓ Branch 1 taken 54029 times. 
         | 
      58649 | nalu_type == H264_NAL_PPS || nalu_type == H264_NAL_AUD) { | 
| 128 | 
        2/2✓ Branch 0 taken 8780 times. 
          ✓ Branch 1 taken 12409 times. 
         | 
      21189 | if (pc->frame_start_found) { | 
| 129 | 8780 | i++; | |
| 130 | 8780 | goto found; | |
| 131 | } | ||
| 132 | 
        5/6✓ Branch 0 taken 1842 times. 
          ✓ Branch 1 taken 52187 times. 
          ✓ Branch 2 taken 1842 times. 
          ✗ Branch 3 not taken. 
          ✓ Branch 4 taken 1308 times. 
          ✓ Branch 5 taken 534 times. 
         | 
      54029 | } else if (nalu_type == H264_NAL_SLICE || nalu_type == H264_NAL_DPA || | 
| 133 | nalu_type == H264_NAL_IDR_SLICE) { | ||
| 134 | 53495 | state += 8; | |
| 135 | 53495 | continue; | |
| 136 | } | ||
| 137 | 12943 | state = 7; | |
| 138 | } else { | ||
| 139 | 65208 | unsigned int mb, last_mb = p->parse_last_mb; | |
| 140 | GetBitContext gb; | ||
| 141 | 65208 | p->parse_history[p->parse_history_count++] = buf[i]; | |
| 142 | |||
| 143 | 65208 | init_get_bits(&gb, p->parse_history, 8*p->parse_history_count); | |
| 144 | 65208 | mb= get_ue_golomb_long(&gb); | |
| 145 | 
        3/4✓ Branch 1 taken 11713 times. 
          ✓ Branch 2 taken 53495 times. 
          ✗ Branch 3 not taken. 
          ✓ Branch 4 taken 11713 times. 
         | 
      65208 | if (get_bits_left(&gb) > 0 || p->parse_history_count > 5) { | 
| 146 | 53495 | p->parse_last_mb = mb; | |
| 147 | 
        2/2✓ Branch 0 taken 26630 times. 
          ✓ Branch 1 taken 26865 times. 
         | 
      53495 | if (pc->frame_start_found) { | 
| 148 | 
        2/2✓ Branch 0 taken 17849 times. 
          ✓ Branch 1 taken 8781 times. 
         | 
      26630 | if (mb <= last_mb) { | 
| 149 | 17849 | i -= p->parse_history_count - 1; | |
| 150 | 17849 | p->parse_history_count = 0; | |
| 151 | 17849 | goto found; | |
| 152 | } | ||
| 153 | } else | ||
| 154 | 26865 | pc->frame_start_found = 1; | |
| 155 | 35646 | p->parse_history_count = 0; | |
| 156 | 35646 | state = 7; | |
| 157 | } | ||
| 158 | } | ||
| 159 | } | ||
| 160 | 159795 | pc->state = state; | |
| 161 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 159795 times. 
         | 
      159795 | if (p->is_avc) | 
| 162 | ✗ | return next_avc; | |
| 163 | 159795 | return END_NOT_FOUND; | |
| 164 | |||
| 165 | 26629 | found: | |
| 166 | 26629 | pc->state = 7; | |
| 167 | 26629 | pc->frame_start_found = 0; | |
| 168 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 26629 times. 
         | 
      26629 | if (p->is_avc) | 
| 169 | ✗ | return next_avc; | |
| 170 | 26629 | return i - (state & 5); | |
| 171 | } | ||
| 172 | |||
| 173 | 20682 | static int scan_mmco_reset(AVCodecParserContext *s, GetBitContext *gb, | |
| 174 | void *logctx) | ||
| 175 | { | ||
| 176 | H264PredWeightTable pwt; | ||
| 177 | 20682 | int slice_type_nos = s->pict_type & 3; | |
| 178 | 20682 | H264ParseContext *p = s->priv_data; | |
| 179 | int list_count, ref_count[2]; | ||
| 180 | |||
| 181 | |||
| 182 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 20682 times. 
         | 
      20682 | if (p->ps.pps->redundant_pic_cnt_present) | 
| 183 | ✗ | get_ue_golomb(gb); // redundant_pic_count | |
| 184 | |||
| 185 | 
        2/2✓ Branch 0 taken 1135 times. 
          ✓ Branch 1 taken 19547 times. 
         | 
      20682 | if (slice_type_nos == AV_PICTURE_TYPE_B) | 
| 186 | 1135 | get_bits1(gb); // direct_spatial_mv_pred | |
| 187 | |||
| 188 | 
        1/2✗ Branch 1 not taken. 
          ✓ Branch 2 taken 20682 times. 
         | 
      20682 | 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 18855 times. 
          ✓ Branch 1 taken 1827 times. 
         | 
      20682 | if (slice_type_nos != AV_PICTURE_TYPE_I) { | 
| 193 | int list; | ||
| 194 | 
        2/2✓ Branch 0 taken 19990 times. 
          ✓ Branch 1 taken 18855 times. 
         | 
      38845 | for (list = 0; list < list_count; list++) { | 
| 195 | 
        2/2✓ Branch 1 taken 3150 times. 
          ✓ Branch 2 taken 16840 times. 
         | 
      19990 | if (get_bits1(gb)) { | 
| 196 | int index; | ||
| 197 | 15112 | for (index = 0; ; index++) { | |
| 198 | 15112 | unsigned int reordering_of_pic_nums_idc = get_ue_golomb_31(gb); | |
| 199 | |||
| 200 | 
        2/2✓ Branch 0 taken 11962 times. 
          ✓ Branch 1 taken 3150 times. 
         | 
      15112 | if (reordering_of_pic_nums_idc < 3) | 
| 201 | 11962 | get_ue_golomb_long(gb); | |
| 202 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 3150 times. 
         | 
      3150 | 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 | 3150 | break; | |
| 209 | |||
| 210 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 11962 times. 
         | 
      11962 | 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 4010 times. 
          ✓ Branch 1 taken 16672 times. 
          ✓ Branch 2 taken 563 times. 
          ✓ Branch 3 taken 3447 times. 
         | 
      20682 | if ((p->ps.pps->weighted_pred && slice_type_nos == AV_PICTURE_TYPE_P) || | 
| 221 | 
        3/4✓ Branch 0 taken 24 times. 
          ✓ Branch 1 taken 17211 times. 
          ✓ Branch 2 taken 24 times. 
          ✗ Branch 3 not taken. 
         | 
      17235 | (p->ps.pps->weighted_bipred_idc == 1 && slice_type_nos == AV_PICTURE_TYPE_B)) | 
| 222 | 3471 | 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 2149 times. 
          ✓ Branch 2 taken 18533 times. 
         | 
      20682 | if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag | 
| 226 | int i; | ||
| 227 | 
        1/2✓ Branch 0 taken 6224 times. 
          ✗ Branch 1 not taken. 
         | 
      6224 | for (i = 0; i < H264_MAX_MMCO_COUNT; i++) { | 
| 228 | 6224 | MMCOOpcode opcode = get_ue_golomb_31(gb); | |
| 229 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 6224 times. 
         | 
      6224 | 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 2099 times. 
          ✓ Branch 1 taken 4125 times. 
         | 
      6224 | if (opcode == MMCO_END) | 
| 236 | 2099 | return 0; | |
| 237 | 
        2/2✓ Branch 0 taken 50 times. 
          ✓ Branch 1 taken 4075 times. 
         | 
      4125 | else if (opcode == MMCO_RESET) | 
| 238 | 50 | return 1; | |
| 239 | |||
| 240 | 
        4/4✓ Branch 0 taken 808 times. 
          ✓ Branch 1 taken 3267 times. 
          ✓ Branch 2 taken 333 times. 
          ✓ Branch 3 taken 475 times. 
         | 
      4075 | if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) | 
| 241 | 3600 | get_ue_golomb_long(gb); // difference_of_pic_nums_minus1 | |
| 242 | 
        6/6✓ Branch 0 taken 3742 times. 
          ✓ Branch 1 taken 333 times. 
          ✓ Branch 2 taken 3662 times. 
          ✓ Branch 3 taken 80 times. 
          ✓ Branch 4 taken 3646 times. 
          ✓ Branch 5 taken 16 times. 
         | 
      4075 | if (opcode == MMCO_SHORT2LONG || opcode == MMCO_LONG2UNUSED || | 
| 243 | 
        2/2✓ Branch 0 taken 379 times. 
          ✓ Branch 1 taken 3267 times. 
         | 
      3646 | opcode == MMCO_LONG || opcode == MMCO_SET_MAX_LONG) | 
| 244 | 808 | get_ue_golomb_31(gb); | |
| 245 | } | ||
| 246 | } | ||
| 247 | |||
| 248 | 18533 | 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 | 34105 | static inline int parse_nal_units(AVCodecParserContext *s, | |
| 260 | AVCodecContext *avctx, | ||
| 261 | const uint8_t * const buf, int buf_size) | ||
| 262 | { | ||
| 263 | 34105 | H264ParseContext *p = s->priv_data; | |
| 264 | 34105 | H2645RBSP rbsp = { NULL }; | |
| 265 | 34105 | H2645NAL nal = { NULL }; | |
| 266 | int buf_index, next_avc; | ||
| 267 | unsigned int pps_id; | ||
| 268 | unsigned int slice_type; | ||
| 269 | 34105 | int state = -1, got_reset = 0; | |
| 270 | 
        3/4✓ Branch 0 taken 33773 times. 
          ✓ Branch 1 taken 332 times. 
          ✗ Branch 2 not taken. 
          ✓ Branch 3 taken 33773 times. 
         | 
      34105 | 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 | 34105 | s->pict_type = AV_PICTURE_TYPE_I; | |
| 276 | 34105 | s->key_frame = 0; | |
| 277 | 34105 | s->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN; | |
| 278 | |||
| 279 | 34105 | ff_h264_sei_uninit(&p->sei); | |
| 280 | 34105 | p->sei.common.frame_packing.arrangement_cancel_flag = -1; | |
| 281 | 34105 | p->sei.common.unregistered.x264_build = -1; | |
| 282 | |||
| 283 | 
        2/2✓ Branch 0 taken 332 times. 
          ✓ Branch 1 taken 33773 times. 
         | 
      34105 | if (!buf_size) | 
| 284 | 332 | return 0; | |
| 285 | |||
| 286 | 33773 | av_fast_padded_malloc(&rbsp.rbsp_buffer, &rbsp.rbsp_buffer_alloc_size, buf_size); | |
| 287 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 33773 times. 
         | 
      33773 | if (!rbsp.rbsp_buffer) | 
| 288 | ✗ | return AVERROR(ENOMEM); | |
| 289 | |||
| 290 | 33773 | buf_index = 0; | |
| 291 | 
        2/2✓ Branch 0 taken 26949 times. 
          ✓ Branch 1 taken 6824 times. 
         | 
      33773 | next_avc = p->is_avc ? 0 : buf_size; | 
| 292 | 16669 | for (;;) { | |
| 293 | const SPS *sps; | ||
| 294 | 50442 | int src_length, consumed, nalsize = 0; | |
| 295 | |||
| 296 | 
        2/2✓ Branch 0 taken 10895 times. 
          ✓ Branch 1 taken 39547 times. 
         | 
      50442 | if (buf_index >= next_avc) { | 
| 297 | 10895 | nalsize = get_nalsize(p->nal_length_size, buf, buf_size, &buf_index, avctx); | |
| 298 | 
        2/2✓ Branch 0 taken 332 times. 
          ✓ Branch 1 taken 10563 times. 
         | 
      10895 | if (nalsize < 0) | 
| 299 | 332 | break; | |
| 300 | 10563 | next_avc = buf_index + nalsize; | |
| 301 | } else { | ||
| 302 | 39547 | buf_index = find_start_code(buf, buf_size, buf_index, next_avc); | |
| 303 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 39547 times. 
         | 
      39547 | if (buf_index >= buf_size) | 
| 304 | ✗ | break; | |
| 305 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 39547 times. 
         | 
      39547 | if (buf_index >= next_avc) | 
| 306 | ✗ | continue; | |
| 307 | } | ||
| 308 | 50110 | src_length = next_avc - buf_index; | |
| 309 | |||
| 310 | 50110 | state = buf[buf_index]; | |
| 311 | 
        2/2✓ Branch 0 taken 33441 times. 
          ✓ Branch 1 taken 16669 times. 
         | 
      50110 | switch (state & 0x1f) { | 
| 312 | 33441 | 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 32573 times. 
          ✓ Branch 1 taken 868 times. 
          ✓ Branch 2 taken 11349 times. 
          ✓ Branch 3 taken 21224 times. 
         | 
      33441 | 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 11813 times. 
          ✓ Branch 1 taken 404 times. 
         | 
      12217 | if (src_length > 60) | 
| 319 | 11813 | src_length = 60; | |
| 320 | } else { | ||
| 321 | /* To decode up to MMCOs */ | ||
| 322 | 
        2/2✓ Branch 0 taken 11912 times. 
          ✓ Branch 1 taken 9312 times. 
         | 
      21224 | if (src_length > 1000) | 
| 323 | 11912 | src_length = 1000; | |
| 324 | } | ||
| 325 | 33441 | break; | |
| 326 | } | ||
| 327 | 50110 | consumed = ff_h2645_extract_rbsp(buf + buf_index, src_length, &rbsp, &nal, 1); | |
| 328 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 50110 times. 
         | 
      50110 | if (consumed < 0) | 
| 329 | ✗ | break; | |
| 330 | |||
| 331 | 50110 | buf_index += consumed; | |
| 332 | |||
| 333 | 50110 | ret = init_get_bits8(&nal.gb, nal.data, nal.size); | |
| 334 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 50110 times. 
         | 
      50110 | if (ret < 0) | 
| 335 | ✗ | goto fail; | |
| 336 | 50110 | get_bits1(&nal.gb); | |
| 337 | 50110 | nal.ref_idc = get_bits(&nal.gb, 2); | |
| 338 | 50110 | nal.type = get_bits(&nal.gb, 5); | |
| 339 | |||
| 340 | 
        6/6✓ Branch 0 taken 932 times. 
          ✓ Branch 1 taken 7635 times. 
          ✓ Branch 2 taken 4227 times. 
          ✓ Branch 3 taken 868 times. 
          ✓ Branch 4 taken 32573 times. 
          ✓ Branch 5 taken 3875 times. 
         | 
      50110 | switch (nal.type) { | 
| 341 | 932 | case H264_NAL_SPS: | |
| 342 | 932 | ff_h264_decode_seq_parameter_set(&nal.gb, avctx, &p->ps, 0); | |
| 343 | 932 | break; | |
| 344 | 7635 | case H264_NAL_PPS: | |
| 345 | 7635 | ff_h264_decode_picture_parameter_set(&nal.gb, avctx, &p->ps, | |
| 346 | nal.size_bits); | ||
| 347 | 7635 | break; | |
| 348 | 4227 | case H264_NAL_SEI: | |
| 349 | 4227 | ff_h264_sei_decode(&p->sei, &nal.gb, &p->ps, avctx); | |
| 350 | 4227 | break; | |
| 351 | 868 | case H264_NAL_IDR_SLICE: | |
| 352 | 868 | s->key_frame = 1; | |
| 353 | |||
| 354 | 868 | p->poc.prev_frame_num = 0; | |
| 355 | 868 | p->poc.prev_frame_num_offset = 0; | |
| 356 | 868 | p->poc.prev_poc_msb = | |
| 357 | 868 | p->poc.prev_poc_lsb = 0; | |
| 358 | /* fall through */ | ||
| 359 | 33441 | case H264_NAL_SLICE: | |
| 360 | 33441 | get_ue_golomb_long(&nal.gb); // skip first_mb_in_slice | |
| 361 | 33441 | slice_type = get_ue_golomb_31(&nal.gb); | |
| 362 | 33441 | s->pict_type = ff_h264_golomb_to_pict_type[slice_type % 5]; | |
| 363 | 
        2/2✓ Branch 0 taken 205 times. 
          ✓ Branch 1 taken 33236 times. 
         | 
      33441 | if (p->sei.recovery_point.recovery_frame_cnt >= 0) { | 
| 364 | /* key frame, since recovery_frame_cnt is set */ | ||
| 365 | 205 | s->key_frame = 1; | |
| 366 | } | ||
| 367 | 33441 | pps_id = get_ue_golomb(&nal.gb); | |
| 368 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 33441 times. 
         | 
      33441 | 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 32873 times. 
         | 
      33441 | 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 | 32873 | av_refstruct_replace(&p->ps.pps, p->ps.pps_list[pps_id]); | |
| 380 | 32873 | p->ps.sps = p->ps.pps->sps; | |
| 381 | 32873 | sps = p->ps.sps; | |
| 382 | |||
| 383 | // heuristic to detect non marked keyframes | ||
| 384 | 
        6/6✓ Branch 0 taken 8643 times. 
          ✓ Branch 1 taken 24230 times. 
          ✓ Branch 2 taken 8509 times. 
          ✓ Branch 3 taken 134 times. 
          ✓ Branch 4 taken 1029 times. 
          ✓ Branch 5 taken 7480 times. 
         | 
      32873 | if (p->ps.sps->ref_frame_count <= 1 && p->ps.pps->ref_count[0] <= 1 && s->pict_type == AV_PICTURE_TYPE_I) | 
| 385 | 1029 | s->key_frame = 1; | |
| 386 | |||
| 387 | 32873 | p->poc.frame_num = get_bits(&nal.gb, sps->log2_max_frame_num); | |
| 388 | |||
| 389 | 32873 | s->coded_width = 16 * sps->mb_width; | |
| 390 | 32873 | s->coded_height = 16 * sps->mb_height; | |
| 391 | 32873 | s->width = s->coded_width - (sps->crop_right + sps->crop_left); | |
| 392 | 32873 | s->height = s->coded_height - (sps->crop_top + sps->crop_bottom); | |
| 393 | 
        2/4✓ Branch 0 taken 32873 times. 
          ✗ Branch 1 not taken. 
          ✗ Branch 2 not taken. 
          ✓ Branch 3 taken 32873 times. 
         | 
      32873 | if (s->width <= 0 || s->height <= 0) { | 
| 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 288 times. 
          ✓ Branch 2 taken 32435 times. 
          ✗ Branch 3 not taken. 
         | 
      32873 | 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 | 288 | case 10: | |
| 405 | 
        2/2✓ Branch 0 taken 50 times. 
          ✓ Branch 1 taken 238 times. 
         | 
      288 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P10; | 
| 406 | 
        2/2✓ Branch 0 taken 87 times. 
          ✓ Branch 1 taken 151 times. 
         | 
      238 | else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P10; | 
| 407 | 151 | else s->format = AV_PIX_FMT_YUV420P10; | |
| 408 | 288 | break; | |
| 409 | 32435 | case 8: | |
| 410 | 
        2/2✓ Branch 0 taken 889 times. 
          ✓ Branch 1 taken 31546 times. 
         | 
      32435 | if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P; | 
| 411 | 
        2/2✓ Branch 0 taken 10 times. 
          ✓ Branch 1 taken 31536 times. 
         | 
      31546 | else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P; | 
| 412 | 31536 | else s->format = AV_PIX_FMT_YUV420P; | |
| 413 | 32435 | break; | |
| 414 | ✗ | default: | |
| 415 | ✗ | s->format = AV_PIX_FMT_NONE; | |
| 416 | } | ||
| 417 | |||
| 418 | 32873 | avctx->profile = ff_h264_get_profile(sps); | |
| 419 | 32873 | avctx->level = sps->level_idc; | |
| 420 | |||
| 421 | 
        2/2✓ Branch 0 taken 23425 times. 
          ✓ Branch 1 taken 9448 times. 
         | 
      32873 | if (sps->frame_mbs_only_flag) { | 
| 422 | 23425 | 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 866 times. 
          ✓ Branch 1 taken 32007 times. 
         | 
      32873 | if (nal.type == H264_NAL_IDR_SLICE) | 
| 432 | 866 | get_ue_golomb_long(&nal.gb); /* idr_pic_id */ | |
| 433 | 
        2/2✓ Branch 0 taken 24929 times. 
          ✓ Branch 1 taken 7944 times. 
         | 
      32873 | if (sps->poc_type == 0) { | 
| 434 | 24929 | 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 20704 times. 
         | 
      24929 | 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 29628 times. 
         | 
      32873 | 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 | 32873 | field_poc[0] = field_poc[1] = INT_MAX; | |
| 453 | 32873 | 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 32873 times. 
         | 
      32873 | 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 21548 times. 
          ✓ Branch 1 taken 11325 times. 
          ✓ Branch 2 taken 20682 times. 
          ✓ Branch 3 taken 866 times. 
         | 
      32873 | if (nal.ref_idc && nal.type != H264_NAL_IDR_SLICE) { | 
| 463 | 20682 | got_reset = scan_mmco_reset(s, &nal.gb, avctx); | |
| 464 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 20682 times. 
         | 
      20682 | 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 32823 times. 
          ✓ Branch 1 taken 50 times. 
         | 
      32873 | p->poc.prev_frame_num = got_reset ? 0 : p->poc.frame_num; | 
| 470 | 
        2/2✓ Branch 0 taken 32823 times. 
          ✓ Branch 1 taken 50 times. 
         | 
      32873 | p->poc.prev_frame_num_offset = got_reset ? 0 : p->poc.frame_num_offset; | 
| 471 | 
        2/2✓ Branch 0 taken 21548 times. 
          ✓ Branch 1 taken 11325 times. 
         | 
      32873 | if (nal.ref_idc != 0) { | 
| 472 | 
        2/2✓ Branch 0 taken 21498 times. 
          ✓ Branch 1 taken 50 times. 
         | 
      21548 | if (!got_reset) { | 
| 473 | 21498 | p->poc.prev_poc_msb = p->poc.poc_msb; | |
| 474 | 21498 | 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 29884 times. 
         | 
      32873 | 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 29488 times. 
          ✓ Branch 2 taken 2977 times. 
          ✓ Branch 3 taken 408 times. 
         | 
      32873 | 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 | 29896 | s->repeat_pict = p->picture_structure == PICT_FRAME ? 1 : 0; | |
| 518 | } | ||
| 519 | |||
| 520 | 
        2/2✓ Branch 0 taken 26386 times. 
          ✓ Branch 1 taken 6487 times. 
         | 
      32873 | if (p->picture_structure == PICT_FRAME) { | 
| 521 | 26386 | s->picture_structure = AV_PICTURE_STRUCTURE_FRAME; | |
| 522 | 
        4/4✓ Branch 0 taken 2225 times. 
          ✓ Branch 1 taken 24161 times. 
          ✓ Branch 2 taken 2146 times. 
          ✓ Branch 3 taken 79 times. 
         | 
      26386 | if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { | 
| 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 23199 times. 
         | 
      24240 | 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 23196 times. 
         | 
      23199 | else if (field_poc[0] > field_poc[1]) | 
| 540 | 3 | s->field_order = AV_FIELD_BB; | |
| 541 | else | ||
| 542 | 23196 | 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 9778 times. 
          ✓ Branch 1 taken 23095 times. 
         | 
      32873 | if (sps->timing_info_present_flag) { | 
| 564 | 9778 | int64_t den = sps->time_scale; | |
| 565 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 9778 times. 
         | 
      9778 | if (p->sei.common.unregistered.x264_build < 44U) | 
| 566 | ✗ | den *= 2; | |
| 567 | 9778 | av_reduce(&avctx->framerate.den, &avctx->framerate.num, | |
| 568 | 9778 | sps->num_units_in_tick * 2, den, 1 << 30); | |
| 569 | } | ||
| 570 | |||
| 571 | 32873 | av_freep(&rbsp.rbsp_buffer); | |
| 572 | 32873 | 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 | 193312 | 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 | 193312 | H264ParseContext *p = s->priv_data; | |
| 592 | 193312 | ParseContext *pc = &p->pc; | |
| 593 | 193312 | AVRational time_base = { 0, 1 }; | |
| 594 | int next; | ||
| 595 | |||
| 596 | 
        2/2✓ Branch 0 taken 453 times. 
          ✓ Branch 1 taken 192859 times. 
         | 
      193312 | if (!p->got_first) { | 
| 597 | 453 | p->got_first = 1; | |
| 598 | 
        2/2✓ Branch 0 taken 221 times. 
          ✓ Branch 1 taken 232 times. 
         | 
      453 | if (avctx->extradata_size) { | 
| 599 | 221 | 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 7008 times. 
          ✓ Branch 1 taken 186304 times. 
         | 
      193312 | if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { | 
| 606 | 7008 | next = buf_size; | |
| 607 | } else { | ||
| 608 | 186304 | next = h264_find_frame_end(p, buf, buf_size, avctx); | |
| 609 | |||
| 610 | 
        2/2✓ Branch 1 taken 159207 times. 
          ✓ Branch 2 taken 27097 times. 
         | 
      186304 | if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { | 
| 611 | 159207 | *poutbuf = NULL; | |
| 612 | 159207 | *poutbuf_size = 0; | |
| 613 | 159207 | return buf_size; | |
| 614 | } | ||
| 615 | |||
| 616 | 
        4/4✓ Branch 0 taken 588 times. 
          ✓ Branch 1 taken 26509 times. 
          ✓ Branch 2 taken 120 times. 
          ✓ Branch 3 taken 468 times. 
         | 
      27097 | if (next < 0 && next != END_NOT_FOUND) { | 
| 617 | av_assert1(pc->last_index + next >= 0); | ||
| 618 | 120 | h264_find_frame_end(p, &pc->buffer[pc->last_index + next], -next, avctx); // update state | |
| 619 | } | ||
| 620 | } | ||
| 621 | |||
| 622 | 34105 | parse_nal_units(s, avctx, buf, buf_size); | |
| 623 | |||
| 624 | 
        2/2✓ Branch 0 taken 10218 times. 
          ✓ Branch 1 taken 23887 times. 
         | 
      34105 | if (avctx->framerate.num) | 
| 625 | 10218 | time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){2, 1})); | |
| 626 | 
        2/2✓ Branch 0 taken 1957 times. 
          ✓ Branch 1 taken 32148 times. 
         | 
      34105 | 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 | 32148 | s->dts_sync_point = INT_MIN; | |
| 632 | 32148 | s->dts_ref_dts_delta = INT_MIN; | |
| 633 | 32148 | s->pts_dts_delta = INT_MIN; | |
| 634 | } | ||
| 635 | |||
| 636 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 34105 times. 
         | 
      34105 | 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 32148 times. 
         | 
      34105 | 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 | 34105 | *poutbuf = buf; | |
| 661 | 34105 | *poutbuf_size = buf_size; | |
| 662 | 34105 | return next; | |
| 663 | } | ||
| 664 | |||
| 665 | 456 | static av_cold void h264_close(AVCodecParserContext *s) | |
| 666 | { | ||
| 667 | 456 | H264ParseContext *p = s->priv_data; | |
| 668 | 456 | ParseContext *pc = &p->pc; | |
| 669 | |||
| 670 | 456 | av_freep(&pc->buffer); | |
| 671 | |||
| 672 | 456 | ff_h264_sei_uninit(&p->sei); | |
| 673 | 456 | ff_h264_ps_uninit(&p->ps); | |
| 674 | 456 | } | |
| 675 | |||
| 676 | 456 | static av_cold int init(AVCodecParserContext *s) | |
| 677 | { | ||
| 678 | 456 | H264ParseContext *p = s->priv_data; | |
| 679 | |||
| 680 | 456 | p->reference_dts = AV_NOPTS_VALUE; | |
| 681 | 456 | p->last_frame_num = INT_MAX; | |
| 682 | 456 | ff_h264dsp_init(&p->h264dsp, 8, 1); | |
| 683 | 456 | 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 |