| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * This file is part of FFmpeg. | ||
| 3 | * | ||
| 4 | * FFmpeg is free software; you can redistribute it and/or | ||
| 5 | * modify it under the terms of the GNU Lesser General Public | ||
| 6 | * License as published by the Free Software Foundation; either | ||
| 7 | * version 2.1 of the License, or (at your option) any later version. | ||
| 8 | * | ||
| 9 | * FFmpeg is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 12 | * Lesser General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU Lesser General Public | ||
| 15 | * License along with FFmpeg; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 17 | */ | ||
| 18 | |||
| 19 | #include "libavutil/mem.h" | ||
| 20 | #include "bytestream.h" | ||
| 21 | #include "get_bits.h" | ||
| 22 | #include "golomb.h" | ||
| 23 | #include "h264.h" | ||
| 24 | #include "h264pred.h" | ||
| 25 | #include "h264_parse.h" | ||
| 26 | #include "h264_ps.h" | ||
| 27 | #include "h2645_parse.h" | ||
| 28 | #include "mpegutils.h" | ||
| 29 | |||
| 30 | 7074 | int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps, | |
| 31 | const int *ref_count, int slice_type_nos, | ||
| 32 | H264PredWeightTable *pwt, | ||
| 33 | int picture_structure, void *logctx) | ||
| 34 | { | ||
| 35 | int list, i, j; | ||
| 36 | int luma_def, chroma_def; | ||
| 37 | |||
| 38 | 7074 | pwt->use_weight = 0; | |
| 39 | 7074 | pwt->use_weight_chroma = 0; | |
| 40 | |||
| 41 | 7074 | pwt->luma_log2_weight_denom = get_ue_golomb_31(gb); | |
| 42 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 7074 times.
|
7074 | if (pwt->luma_log2_weight_denom > 7U) { |
| 43 | ✗ | av_log(logctx, AV_LOG_ERROR, "luma_log2_weight_denom %d is out of range\n", pwt->luma_log2_weight_denom); | |
| 44 | ✗ | pwt->luma_log2_weight_denom = 0; | |
| 45 | } | ||
| 46 | 7074 | luma_def = 1 << pwt->luma_log2_weight_denom; | |
| 47 | |||
| 48 |
1/2✓ Branch 0 taken 7074 times.
✗ Branch 1 not taken.
|
7074 | if (sps->chroma_format_idc) { |
| 49 | 7074 | pwt->chroma_log2_weight_denom = get_ue_golomb_31(gb); | |
| 50 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 7074 times.
|
7074 | if (pwt->chroma_log2_weight_denom > 7U) { |
| 51 | ✗ | av_log(logctx, AV_LOG_ERROR, "chroma_log2_weight_denom %d is out of range\n", pwt->chroma_log2_weight_denom); | |
| 52 | ✗ | pwt->chroma_log2_weight_denom = 0; | |
| 53 | } | ||
| 54 | 7074 | chroma_def = 1 << pwt->chroma_log2_weight_denom; | |
| 55 | } | ||
| 56 | |||
| 57 |
2/2✓ Branch 0 taken 7484 times.
✓ Branch 1 taken 410 times.
|
7894 | for (list = 0; list < 2; list++) { |
| 58 | 7484 | pwt->luma_weight_flag[list] = 0; | |
| 59 | 7484 | pwt->chroma_weight_flag[list] = 0; | |
| 60 |
2/2✓ Branch 0 taken 21889 times.
✓ Branch 1 taken 7484 times.
|
29373 | for (i = 0; i < ref_count[list]; i++) { |
| 61 | int luma_weight_flag, chroma_weight_flag; | ||
| 62 | |||
| 63 | 21889 | luma_weight_flag = get_bits1(gb); | |
| 64 |
2/2✓ Branch 0 taken 6842 times.
✓ Branch 1 taken 15047 times.
|
21889 | if (luma_weight_flag) { |
| 65 | 6842 | pwt->luma_weight[i][list][0] = get_se_golomb(gb); | |
| 66 | 6842 | pwt->luma_weight[i][list][1] = get_se_golomb(gb); | |
| 67 |
1/2✓ Branch 0 taken 6842 times.
✗ Branch 1 not taken.
|
6842 | if ((int8_t)pwt->luma_weight[i][list][0] != pwt->luma_weight[i][list][0] || |
| 68 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6842 times.
|
6842 | (int8_t)pwt->luma_weight[i][list][1] != pwt->luma_weight[i][list][1]) |
| 69 | ✗ | goto out_range_weight; | |
| 70 |
2/2✓ Branch 0 taken 2528 times.
✓ Branch 1 taken 4314 times.
|
6842 | if (pwt->luma_weight[i][list][0] != luma_def || |
| 71 |
2/2✓ Branch 0 taken 1748 times.
✓ Branch 1 taken 780 times.
|
2528 | pwt->luma_weight[i][list][1] != 0) { |
| 72 | 6062 | pwt->use_weight = 1; | |
| 73 | 6062 | pwt->luma_weight_flag[list] = 1; | |
| 74 | } | ||
| 75 | } else { | ||
| 76 | 15047 | pwt->luma_weight[i][list][0] = luma_def; | |
| 77 | 15047 | pwt->luma_weight[i][list][1] = 0; | |
| 78 | } | ||
| 79 | |||
| 80 |
1/2✓ Branch 0 taken 21889 times.
✗ Branch 1 not taken.
|
21889 | if (sps->chroma_format_idc) { |
| 81 | 21889 | chroma_weight_flag = get_bits1(gb); | |
| 82 |
2/2✓ Branch 0 taken 2909 times.
✓ Branch 1 taken 18980 times.
|
21889 | if (chroma_weight_flag) { |
| 83 | int j; | ||
| 84 |
2/2✓ Branch 0 taken 5818 times.
✓ Branch 1 taken 2909 times.
|
8727 | for (j = 0; j < 2; j++) { |
| 85 | 5818 | pwt->chroma_weight[i][list][j][0] = get_se_golomb(gb); | |
| 86 | 5818 | pwt->chroma_weight[i][list][j][1] = get_se_golomb(gb); | |
| 87 |
1/2✓ Branch 0 taken 5818 times.
✗ Branch 1 not taken.
|
5818 | if ((int8_t)pwt->chroma_weight[i][list][j][0] != pwt->chroma_weight[i][list][j][0] || |
| 88 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5818 times.
|
5818 | (int8_t)pwt->chroma_weight[i][list][j][1] != pwt->chroma_weight[i][list][j][1]) { |
| 89 | ✗ | pwt->chroma_weight[i][list][j][0] = chroma_def; | |
| 90 | ✗ | pwt->chroma_weight[i][list][j][1] = 0; | |
| 91 | ✗ | goto out_range_weight; | |
| 92 | } | ||
| 93 |
2/2✓ Branch 0 taken 637 times.
✓ Branch 1 taken 5181 times.
|
5818 | if (pwt->chroma_weight[i][list][j][0] != chroma_def || |
| 94 |
2/2✓ Branch 0 taken 582 times.
✓ Branch 1 taken 55 times.
|
637 | pwt->chroma_weight[i][list][j][1] != 0) { |
| 95 | 5763 | pwt->use_weight_chroma = 1; | |
| 96 | 5763 | pwt->chroma_weight_flag[list] = 1; | |
| 97 | } | ||
| 98 | } | ||
| 99 | } else { | ||
| 100 | int j; | ||
| 101 |
2/2✓ Branch 0 taken 37960 times.
✓ Branch 1 taken 18980 times.
|
56940 | for (j = 0; j < 2; j++) { |
| 102 | 37960 | pwt->chroma_weight[i][list][j][0] = chroma_def; | |
| 103 | 37960 | pwt->chroma_weight[i][list][j][1] = 0; | |
| 104 | } | ||
| 105 | } | ||
| 106 | } | ||
| 107 | |||
| 108 | // for MBAFF | ||
| 109 |
2/2✓ Branch 0 taken 19683 times.
✓ Branch 1 taken 2206 times.
|
21889 | if (picture_structure == PICT_FRAME) { |
| 110 | 19683 | pwt->luma_weight[16 + 2 * i][list][0] = pwt->luma_weight[16 + 2 * i + 1][list][0] = pwt->luma_weight[i][list][0]; | |
| 111 | 19683 | pwt->luma_weight[16 + 2 * i][list][1] = pwt->luma_weight[16 + 2 * i + 1][list][1] = pwt->luma_weight[i][list][1]; | |
| 112 |
1/2✓ Branch 0 taken 19683 times.
✗ Branch 1 not taken.
|
19683 | if (sps->chroma_format_idc) { |
| 113 |
2/2✓ Branch 0 taken 39366 times.
✓ Branch 1 taken 19683 times.
|
59049 | for (j = 0; j < 2; j++) { |
| 114 | 39366 | pwt->chroma_weight[16 + 2 * i][list][j][0] = pwt->chroma_weight[16 + 2 * i + 1][list][j][0] = pwt->chroma_weight[i][list][j][0]; | |
| 115 | 39366 | pwt->chroma_weight[16 + 2 * i][list][j][1] = pwt->chroma_weight[16 + 2 * i + 1][list][j][1] = pwt->chroma_weight[i][list][j][1]; | |
| 116 | } | ||
| 117 | } | ||
| 118 | } | ||
| 119 | } | ||
| 120 |
2/2✓ Branch 0 taken 6664 times.
✓ Branch 1 taken 820 times.
|
7484 | if (slice_type_nos != AV_PICTURE_TYPE_B) |
| 121 | 6664 | break; | |
| 122 | } | ||
| 123 |
4/4✓ Branch 0 taken 3890 times.
✓ Branch 1 taken 3184 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 3885 times.
|
7074 | pwt->use_weight = pwt->use_weight || pwt->use_weight_chroma; |
| 124 | 7074 | return 0; | |
| 125 | ✗ | out_range_weight: | |
| 126 | ✗ | avpriv_request_sample(logctx, "Out of range weight"); | |
| 127 | ✗ | return AVERROR_INVALIDDATA; | |
| 128 | } | ||
| 129 | |||
| 130 | /** | ||
| 131 | * Check if the top & left blocks are available if needed and | ||
| 132 | * change the dc mode so it only uses the available blocks. | ||
| 133 | */ | ||
| 134 | 3118825 | int ff_h264_check_intra4x4_pred_mode(int8_t *pred_mode_cache, void *logctx, | |
| 135 | int top_samples_available, int left_samples_available) | ||
| 136 | { | ||
| 137 | static const int8_t top[12] = { | ||
| 138 | -1, 0, LEFT_DC_PRED, -1, -1, -1, -1, -1, 0 | ||
| 139 | }; | ||
| 140 | static const int8_t left[12] = { | ||
| 141 | 0, -1, TOP_DC_PRED, 0, -1, -1, -1, 0, -1, DC_128_PRED | ||
| 142 | }; | ||
| 143 | int i; | ||
| 144 | |||
| 145 |
2/2✓ Branch 0 taken 214919 times.
✓ Branch 1 taken 2903906 times.
|
3118825 | if (!(top_samples_available & 0x8000)) { |
| 146 |
2/2✓ Branch 0 taken 859676 times.
✓ Branch 1 taken 214919 times.
|
1074595 | for (i = 0; i < 4; i++) { |
| 147 | 859676 | int status = top[pred_mode_cache[scan8[0] + i]]; | |
| 148 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 859676 times.
|
859676 | if (status < 0) { |
| 149 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 150 | "top block unavailable for requested intra mode %d\n", | ||
| 151 | status); | ||
| 152 | ✗ | return AVERROR_INVALIDDATA; | |
| 153 |
2/2✓ Branch 0 taken 557100 times.
✓ Branch 1 taken 302576 times.
|
859676 | } else if (status) { |
| 154 | 557100 | pred_mode_cache[scan8[0] + i] = status; | |
| 155 | } | ||
| 156 | } | ||
| 157 | } | ||
| 158 | |||
| 159 |
2/2✓ Branch 0 taken 68509 times.
✓ Branch 1 taken 3050316 times.
|
3118825 | if ((left_samples_available & 0x8888) != 0x8888) { |
| 160 | static const int mask[4] = { 0x8000, 0x2000, 0x80, 0x20 }; | ||
| 161 |
2/2✓ Branch 0 taken 274036 times.
✓ Branch 1 taken 68509 times.
|
342545 | for (i = 0; i < 4; i++) |
| 162 |
2/2✓ Branch 0 taken 273982 times.
✓ Branch 1 taken 54 times.
|
274036 | if (!(left_samples_available & mask[i])) { |
| 163 | 273982 | int status = left[pred_mode_cache[scan8[0] + 8 * i]]; | |
| 164 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 273982 times.
|
273982 | if (status < 0) { |
| 165 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 166 | "left block unavailable for requested intra4x4 mode %d\n", | ||
| 167 | status); | ||
| 168 | ✗ | return AVERROR_INVALIDDATA; | |
| 169 |
2/2✓ Branch 0 taken 101230 times.
✓ Branch 1 taken 172752 times.
|
273982 | } else if (status) { |
| 170 | 101230 | pred_mode_cache[scan8[0] + 8 * i] = status; | |
| 171 | } | ||
| 172 | } | ||
| 173 | } | ||
| 174 | |||
| 175 | 3118825 | return 0; | |
| 176 | } | ||
| 177 | |||
| 178 | /** | ||
| 179 | * Check if the top & left blocks are available if needed and | ||
| 180 | * change the dc mode so it only uses the available blocks. | ||
| 181 | */ | ||
| 182 | 5109615 | int ff_h264_check_intra_pred_mode(void *logctx, int top_samples_available, | |
| 183 | int left_samples_available, | ||
| 184 | int mode, int is_chroma) | ||
| 185 | { | ||
| 186 | static const int8_t top[4] = { LEFT_DC_PRED8x8, 1, -1, -1 }; | ||
| 187 | static const int8_t left[5] = { TOP_DC_PRED8x8, -1, 2, -1, DC_128_PRED8x8 }; | ||
| 188 | |||
| 189 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5109615 times.
|
5109615 | if (mode > 3U) { |
| 190 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 191 | "out of range intra chroma pred mode\n"); | ||
| 192 | ✗ | return AVERROR_INVALIDDATA; | |
| 193 | } | ||
| 194 | |||
| 195 |
2/2✓ Branch 0 taken 390082 times.
✓ Branch 1 taken 4719533 times.
|
5109615 | if (!(top_samples_available & 0x8000)) { |
| 196 | 390082 | mode = top[mode]; | |
| 197 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 390082 times.
|
390082 | if (mode < 0) { |
| 198 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 199 | "top block unavailable for requested intra mode\n"); | ||
| 200 | ✗ | return AVERROR_INVALIDDATA; | |
| 201 | } | ||
| 202 | } | ||
| 203 | |||
| 204 |
2/2✓ Branch 0 taken 107838 times.
✓ Branch 1 taken 5001777 times.
|
5109615 | if ((left_samples_available & 0x8080) != 0x8080) { |
| 205 | 107838 | mode = left[mode]; | |
| 206 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 107838 times.
|
107838 | if (mode < 0) { |
| 207 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 208 | "left block unavailable for requested intra mode\n"); | ||
| 209 | ✗ | return AVERROR_INVALIDDATA; | |
| 210 | } | ||
| 211 |
4/4✓ Branch 0 taken 87019 times.
✓ Branch 1 taken 20819 times.
✓ Branch 2 taken 27 times.
✓ Branch 3 taken 86992 times.
|
107838 | if (is_chroma && (left_samples_available & 0x8080)) { |
| 212 | // mad cow disease mode, aka MBAFF + constrained_intra_pred | ||
| 213 | 54 | mode = ALZHEIMER_DC_L0T_PRED8x8 + | |
| 214 |
2/2✓ Branch 0 taken 11 times.
✓ Branch 1 taken 16 times.
|
27 | (!(left_samples_available & 0x8000)) + |
| 215 |
2/2✓ Branch 0 taken 7 times.
✓ Branch 1 taken 20 times.
|
27 | 2 * (mode == DC_128_PRED8x8); |
| 216 | } | ||
| 217 | } | ||
| 218 | |||
| 219 | 5109615 | return mode; | |
| 220 | } | ||
| 221 | |||
| 222 | 59071 | int ff_h264_parse_ref_count(int *plist_count, int ref_count[2], | |
| 223 | GetBitContext *gb, const PPS *pps, | ||
| 224 | int slice_type_nos, int picture_structure, void *logctx) | ||
| 225 | { | ||
| 226 | int list_count; | ||
| 227 | int num_ref_idx_active_override_flag; | ||
| 228 | |||
| 229 | // set defaults, might be overridden a few lines later | ||
| 230 | 59071 | ref_count[0] = pps->ref_count[0]; | |
| 231 | 59071 | ref_count[1] = pps->ref_count[1]; | |
| 232 | |||
| 233 |
2/2✓ Branch 0 taken 52759 times.
✓ Branch 1 taken 6312 times.
|
59071 | if (slice_type_nos != AV_PICTURE_TYPE_I) { |
| 234 | unsigned max[2]; | ||
| 235 |
2/2✓ Branch 0 taken 41404 times.
✓ Branch 1 taken 11355 times.
|
52759 | max[0] = max[1] = picture_structure == PICT_FRAME ? 15 : 31; |
| 236 | |||
| 237 | 52759 | num_ref_idx_active_override_flag = get_bits1(gb); | |
| 238 | |||
| 239 |
2/2✓ Branch 0 taken 22015 times.
✓ Branch 1 taken 30744 times.
|
52759 | if (num_ref_idx_active_override_flag) { |
| 240 | 22015 | ref_count[0] = get_ue_golomb(gb) + 1; | |
| 241 |
2/2✓ Branch 0 taken 6829 times.
✓ Branch 1 taken 15186 times.
|
22015 | if (slice_type_nos == AV_PICTURE_TYPE_B) { |
| 242 | 6829 | ref_count[1] = get_ue_golomb(gb) + 1; | |
| 243 | } else | ||
| 244 | // full range is spec-ok in this case, even for frames | ||
| 245 | 15186 | ref_count[1] = 1; | |
| 246 | } | ||
| 247 | |||
| 248 |
2/2✓ Branch 0 taken 14650 times.
✓ Branch 1 taken 38109 times.
|
52759 | if (slice_type_nos == AV_PICTURE_TYPE_B) |
| 249 | 14650 | list_count = 2; | |
| 250 | else | ||
| 251 | 38109 | list_count = 1; | |
| 252 | |||
| 253 |
4/6✓ Branch 0 taken 52759 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 14650 times.
✓ Branch 3 taken 38109 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 14650 times.
|
52759 | if (ref_count[0] - 1 > max[0] || (list_count == 2 && (ref_count[1] - 1 > max[1]))) { |
| 254 | ✗ | av_log(logctx, AV_LOG_ERROR, "reference overflow %u > %u or %u > %u\n", | |
| 255 | ✗ | ref_count[0] - 1, max[0], ref_count[1] - 1, max[1]); | |
| 256 | ✗ | ref_count[0] = ref_count[1] = 0; | |
| 257 | ✗ | *plist_count = 0; | |
| 258 | ✗ | goto fail; | |
| 259 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 52759 times.
|
52759 | } else if (ref_count[1] - 1 > max[1]) { |
| 260 | ✗ | av_log(logctx, AV_LOG_DEBUG, "reference overflow %u > %u \n", | |
| 261 | ✗ | ref_count[1] - 1, max[1]); | |
| 262 | ✗ | ref_count[1] = 0; | |
| 263 | } | ||
| 264 | |||
| 265 | } else { | ||
| 266 | 6312 | list_count = 0; | |
| 267 | 6312 | ref_count[0] = ref_count[1] = 0; | |
| 268 | } | ||
| 269 | |||
| 270 | 59071 | *plist_count = list_count; | |
| 271 | |||
| 272 | 59071 | return 0; | |
| 273 | ✗ | fail: | |
| 274 | ✗ | *plist_count = 0; | |
| 275 | ✗ | ref_count[0] = 0; | |
| 276 | ✗ | ref_count[1] = 0; | |
| 277 | ✗ | return AVERROR_INVALIDDATA; | |
| 278 | } | ||
| 279 | |||
| 280 | 62268 | int ff_h264_init_poc(int pic_field_poc[2], int *pic_poc, | |
| 281 | const SPS *sps, H264POCContext *pc, | ||
| 282 | int picture_structure, int nal_ref_idc) | ||
| 283 | { | ||
| 284 | 62268 | const int max_frame_num = 1 << sps->log2_max_frame_num; | |
| 285 | int64_t field_poc[2]; | ||
| 286 | |||
| 287 | 62268 | pc->frame_num_offset = pc->prev_frame_num_offset; | |
| 288 |
2/2✓ Branch 0 taken 504 times.
✓ Branch 1 taken 61764 times.
|
62268 | if (pc->frame_num < pc->prev_frame_num) |
| 289 | 504 | pc->frame_num_offset += max_frame_num; | |
| 290 | |||
| 291 |
2/2✓ Branch 0 taken 47332 times.
✓ Branch 1 taken 14936 times.
|
62268 | if (sps->poc_type == 0) { |
| 292 | 47332 | const int max_poc_lsb = 1 << sps->log2_max_poc_lsb; | |
| 293 |
2/2✓ Branch 0 taken 823 times.
✓ Branch 1 taken 46509 times.
|
47332 | if (pc->prev_poc_lsb < 0) |
| 294 | 823 | pc->prev_poc_lsb = pc->poc_lsb; | |
| 295 | |||
| 296 |
2/2✓ Branch 0 taken 21775 times.
✓ Branch 1 taken 25557 times.
|
47332 | if (pc->poc_lsb < pc->prev_poc_lsb && |
| 297 |
2/2✓ Branch 0 taken 525 times.
✓ Branch 1 taken 21250 times.
|
21775 | pc->prev_poc_lsb - pc->poc_lsb >= max_poc_lsb / 2) |
| 298 | 525 | pc->poc_msb = pc->prev_poc_msb + max_poc_lsb; | |
| 299 |
2/2✓ Branch 0 taken 22852 times.
✓ Branch 1 taken 23955 times.
|
46807 | else if (pc->poc_lsb > pc->prev_poc_lsb && |
| 300 |
2/2✓ Branch 0 taken 363 times.
✓ Branch 1 taken 22489 times.
|
22852 | pc->prev_poc_lsb - pc->poc_lsb < -max_poc_lsb / 2) |
| 301 | 363 | pc->poc_msb = pc->prev_poc_msb - max_poc_lsb; | |
| 302 | else | ||
| 303 | 46444 | pc->poc_msb = pc->prev_poc_msb; | |
| 304 | 47332 | field_poc[0] = | |
| 305 | 47332 | field_poc[1] = pc->poc_msb + pc->poc_lsb; | |
| 306 |
2/2✓ Branch 0 taken 34876 times.
✓ Branch 1 taken 12456 times.
|
47332 | if (picture_structure == PICT_FRAME) |
| 307 | 34876 | field_poc[1] += pc->delta_poc_bottom; | |
| 308 |
2/2✓ Branch 0 taken 6173 times.
✓ Branch 1 taken 8763 times.
|
14936 | } else if (sps->poc_type == 1) { |
| 309 | int abs_frame_num; | ||
| 310 | int64_t expected_delta_per_poc_cycle, expectedpoc; | ||
| 311 | int i; | ||
| 312 | |||
| 313 |
1/2✓ Branch 0 taken 6173 times.
✗ Branch 1 not taken.
|
6173 | if (sps->poc_cycle_length != 0) |
| 314 | 6173 | abs_frame_num = pc->frame_num_offset + pc->frame_num; | |
| 315 | else | ||
| 316 | ✗ | abs_frame_num = 0; | |
| 317 | |||
| 318 |
3/4✓ Branch 0 taken 397 times.
✓ Branch 1 taken 5776 times.
✓ Branch 2 taken 397 times.
✗ Branch 3 not taken.
|
6173 | if (nal_ref_idc == 0 && abs_frame_num > 0) |
| 319 | 397 | abs_frame_num--; | |
| 320 | |||
| 321 | 6173 | expected_delta_per_poc_cycle = 0; | |
| 322 |
2/2✓ Branch 0 taken 10007 times.
✓ Branch 1 taken 6173 times.
|
16180 | for (i = 0; i < sps->poc_cycle_length; i++) |
| 323 | // FIXME integrate during sps parse | ||
| 324 | 10007 | expected_delta_per_poc_cycle += sps->offset_for_ref_frame[i]; | |
| 325 | |||
| 326 |
2/2✓ Branch 0 taken 6091 times.
✓ Branch 1 taken 82 times.
|
6173 | if (abs_frame_num > 0) { |
| 327 | 6091 | int poc_cycle_cnt = (abs_frame_num - 1) / sps->poc_cycle_length; | |
| 328 | 6091 | int frame_num_in_poc_cycle = (abs_frame_num - 1) % sps->poc_cycle_length; | |
| 329 | |||
| 330 | 6091 | expectedpoc = poc_cycle_cnt * expected_delta_per_poc_cycle; | |
| 331 |
2/2✓ Branch 0 taken 7913 times.
✓ Branch 1 taken 6091 times.
|
14004 | for (i = 0; i <= frame_num_in_poc_cycle; i++) |
| 332 | 7913 | expectedpoc = expectedpoc + sps->offset_for_ref_frame[i]; | |
| 333 | } else | ||
| 334 | 82 | expectedpoc = 0; | |
| 335 | |||
| 336 |
2/2✓ Branch 0 taken 397 times.
✓ Branch 1 taken 5776 times.
|
6173 | if (nal_ref_idc == 0) |
| 337 | 397 | expectedpoc = expectedpoc + sps->offset_for_non_ref_pic; | |
| 338 | |||
| 339 | 6173 | field_poc[0] = expectedpoc + pc->delta_poc[0]; | |
| 340 | 6173 | field_poc[1] = field_poc[0] + sps->offset_for_top_to_bottom_field; | |
| 341 | |||
| 342 |
2/2✓ Branch 0 taken 5242 times.
✓ Branch 1 taken 931 times.
|
6173 | if (picture_structure == PICT_FRAME) |
| 343 | 5242 | field_poc[1] += pc->delta_poc[1]; | |
| 344 | } else { | ||
| 345 | 8763 | int poc = 2 * (pc->frame_num_offset + pc->frame_num); | |
| 346 | |||
| 347 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8763 times.
|
8763 | if (!nal_ref_idc) |
| 348 | ✗ | poc--; | |
| 349 | |||
| 350 | 8763 | field_poc[0] = poc; | |
| 351 | 8763 | field_poc[1] = poc; | |
| 352 | } | ||
| 353 | |||
| 354 |
1/2✓ Branch 0 taken 62268 times.
✗ Branch 1 not taken.
|
62268 | if ( field_poc[0] != (int)field_poc[0] |
| 355 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 62268 times.
|
62268 | || field_poc[1] != (int)field_poc[1]) |
| 356 | ✗ | return AVERROR_INVALIDDATA; | |
| 357 | |||
| 358 |
2/2✓ Branch 0 taken 55675 times.
✓ Branch 1 taken 6593 times.
|
62268 | if (picture_structure != PICT_BOTTOM_FIELD) |
| 359 | 55675 | pic_field_poc[0] = field_poc[0]; | |
| 360 |
2/2✓ Branch 0 taken 55474 times.
✓ Branch 1 taken 6794 times.
|
62268 | if (picture_structure != PICT_TOP_FIELD) |
| 361 | 55474 | pic_field_poc[1] = field_poc[1]; | |
| 362 | 62268 | *pic_poc = FFMIN(pic_field_poc[0], pic_field_poc[1]); | |
| 363 | |||
| 364 | 62268 | return 0; | |
| 365 | } | ||
| 366 | |||
| 367 | 974 | static int decode_extradata_ps(const uint8_t *data, int size, H264ParamSets *ps, | |
| 368 | int is_avc, void *logctx) | ||
| 369 | { | ||
| 370 | 974 | H2645Packet pkt = { 0 }; | |
| 371 |
2/2✓ Branch 0 taken 750 times.
✓ Branch 1 taken 224 times.
|
974 | int flags = (H2645_FLAG_IS_NALFF * !!is_avc) | H2645_FLAG_SMALL_PADDING; |
| 372 | 974 | int i, ret = 0; | |
| 373 | |||
| 374 | 974 | ret = ff_h2645_packet_split(&pkt, data, size, logctx, 2, AV_CODEC_ID_H264, flags); | |
| 375 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 974 times.
|
974 | if (ret < 0) { |
| 376 | ✗ | ret = 0; | |
| 377 | ✗ | goto fail; | |
| 378 | } | ||
| 379 | |||
| 380 |
2/2✓ Branch 0 taken 1200 times.
✓ Branch 1 taken 974 times.
|
2174 | for (i = 0; i < pkt.nb_nals; i++) { |
| 381 | 1200 | H2645NAL *nal = &pkt.nals[i]; | |
| 382 |
2/3✓ Branch 0 taken 599 times.
✓ Branch 1 taken 601 times.
✗ Branch 2 not taken.
|
1200 | switch (nal->type) { |
| 383 | 599 | case H264_NAL_SPS: { | |
| 384 | 599 | GetBitContext tmp_gb = nal->gb; | |
| 385 | 599 | ret = ff_h264_decode_seq_parameter_set(&tmp_gb, logctx, ps, 0); | |
| 386 |
2/2✓ Branch 0 taken 596 times.
✓ Branch 1 taken 3 times.
|
599 | if (ret >= 0) |
| 387 | 599 | break; | |
| 388 | 3 | av_log(logctx, AV_LOG_DEBUG, | |
| 389 | "SPS decoding failure, trying again with the complete NAL\n"); | ||
| 390 | 3 | init_get_bits8(&tmp_gb, nal->raw_data + 1, nal->raw_size - 1); | |
| 391 | 3 | ret = ff_h264_decode_seq_parameter_set(&tmp_gb, logctx, ps, 0); | |
| 392 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | if (ret >= 0) |
| 393 | 3 | break; | |
| 394 | ✗ | ret = ff_h264_decode_seq_parameter_set(&nal->gb, logctx, ps, 1); | |
| 395 | ✗ | if (ret < 0) | |
| 396 | ✗ | goto fail; | |
| 397 | ✗ | break; | |
| 398 | } | ||
| 399 | 601 | case H264_NAL_PPS: | |
| 400 | 601 | ret = ff_h264_decode_picture_parameter_set(&nal->gb, logctx, ps, | |
| 401 | nal->size_bits); | ||
| 402 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 601 times.
|
601 | if (ret < 0) |
| 403 | ✗ | goto fail; | |
| 404 | 601 | break; | |
| 405 | ✗ | default: | |
| 406 | ✗ | av_log(logctx, AV_LOG_VERBOSE, "Ignoring NAL type %d in extradata\n", | |
| 407 | nal->type); | ||
| 408 | ✗ | break; | |
| 409 | } | ||
| 410 | } | ||
| 411 | |||
| 412 | 974 | fail: | |
| 413 | 974 | ff_h2645_packet_uninit(&pkt); | |
| 414 | 974 | return ret; | |
| 415 | } | ||
| 416 | |||
| 417 | /* There are (invalid) samples in the wild with mp4-style extradata, where the | ||
| 418 | * parameter sets are stored unescaped (i.e. as RBSP). | ||
| 419 | * This function catches the parameter set decoding failure and tries again | ||
| 420 | * after escaping it */ | ||
| 421 | 750 | static int decode_extradata_ps_mp4(const uint8_t *buf, int buf_size, H264ParamSets *ps, | |
| 422 | int err_recognition, void *logctx) | ||
| 423 | { | ||
| 424 | int ret; | ||
| 425 | |||
| 426 | 750 | ret = decode_extradata_ps(buf, buf_size, ps, 1, logctx); | |
| 427 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 750 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
750 | if (ret < 0 && !(err_recognition & AV_EF_EXPLODE)) { |
| 428 | GetByteContext gbc; | ||
| 429 | PutByteContext pbc; | ||
| 430 | uint8_t *escaped_buf; | ||
| 431 | int escaped_buf_size; | ||
| 432 | |||
| 433 | ✗ | av_log(logctx, AV_LOG_WARNING, | |
| 434 | "SPS decoding failure, trying again after escaping the NAL\n"); | ||
| 435 | |||
| 436 | ✗ | if (buf_size / 2 >= (INT16_MAX - AV_INPUT_BUFFER_PADDING_SIZE) / 3) | |
| 437 | ✗ | return AVERROR(ERANGE); | |
| 438 | ✗ | escaped_buf_size = buf_size * 3 / 2 + AV_INPUT_BUFFER_PADDING_SIZE; | |
| 439 | ✗ | escaped_buf = av_mallocz(escaped_buf_size); | |
| 440 | ✗ | if (!escaped_buf) | |
| 441 | ✗ | return AVERROR(ENOMEM); | |
| 442 | |||
| 443 | ✗ | bytestream2_init(&gbc, buf, buf_size); | |
| 444 | ✗ | bytestream2_init_writer(&pbc, escaped_buf, escaped_buf_size); | |
| 445 | |||
| 446 | ✗ | while (bytestream2_get_bytes_left(&gbc)) { | |
| 447 | ✗ | if (bytestream2_get_bytes_left(&gbc) >= 3 && | |
| 448 | ✗ | bytestream2_peek_be24(&gbc) <= 3) { | |
| 449 | ✗ | bytestream2_put_be24(&pbc, 3); | |
| 450 | ✗ | bytestream2_skip(&gbc, 2); | |
| 451 | } else | ||
| 452 | ✗ | bytestream2_put_byte(&pbc, bytestream2_get_byte(&gbc)); | |
| 453 | } | ||
| 454 | |||
| 455 | ✗ | escaped_buf_size = bytestream2_tell_p(&pbc); | |
| 456 | ✗ | AV_WB16(escaped_buf, escaped_buf_size - 2); | |
| 457 | |||
| 458 | ✗ | (void)decode_extradata_ps(escaped_buf, escaped_buf_size, ps, 1, logctx); | |
| 459 | // lorex.mp4 decodes ok even with extradata decoding failing | ||
| 460 | ✗ | av_freep(&escaped_buf); | |
| 461 | } | ||
| 462 | |||
| 463 | 750 | return 0; | |
| 464 | } | ||
| 465 | |||
| 466 | 604 | int ff_h264_decode_extradata(const uint8_t *data, int size, H264ParamSets *ps, | |
| 467 | int *is_avc, int *nal_length_size, | ||
| 468 | int err_recognition, void *logctx) | ||
| 469 | { | ||
| 470 | int ret; | ||
| 471 | |||
| 472 |
2/4✓ Branch 0 taken 604 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 604 times.
|
604 | if (!data || size <= 0) |
| 473 | ✗ | return AVERROR(EINVAL); | |
| 474 | |||
| 475 |
2/2✓ Branch 0 taken 380 times.
✓ Branch 1 taken 224 times.
|
604 | if (data[0] == 1) { |
| 476 | int i, cnt, nalsize; | ||
| 477 | 380 | const uint8_t *p = data; | |
| 478 | |||
| 479 | 380 | *is_avc = 1; | |
| 480 | |||
| 481 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 380 times.
|
380 | if (size < 7) { |
| 482 | ✗ | av_log(logctx, AV_LOG_ERROR, "avcC %d too short\n", size); | |
| 483 | ✗ | return AVERROR_INVALIDDATA; | |
| 484 | } | ||
| 485 | |||
| 486 | // Decode sps from avcC | ||
| 487 | 380 | cnt = *(p + 5) & 0x1f; // Number of sps | |
| 488 | 380 | p += 6; | |
| 489 |
2/2✓ Branch 0 taken 375 times.
✓ Branch 1 taken 380 times.
|
755 | for (i = 0; i < cnt; i++) { |
| 490 | 375 | nalsize = AV_RB16(p) + 2; | |
| 491 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 375 times.
|
375 | if (nalsize > size - (p - data)) |
| 492 | ✗ | return AVERROR_INVALIDDATA; | |
| 493 | 375 | ret = decode_extradata_ps_mp4(p, nalsize, ps, err_recognition, logctx); | |
| 494 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 375 times.
|
375 | if (ret < 0) { |
| 495 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 496 | "Decoding sps %d from avcC failed\n", i); | ||
| 497 | ✗ | return ret; | |
| 498 | } | ||
| 499 | 375 | p += nalsize; | |
| 500 | } | ||
| 501 | // Decode pps from avcC | ||
| 502 | 380 | cnt = *(p++); // Number of pps | |
| 503 |
2/2✓ Branch 0 taken 375 times.
✓ Branch 1 taken 380 times.
|
755 | for (i = 0; i < cnt; i++) { |
| 504 | 375 | nalsize = AV_RB16(p) + 2; | |
| 505 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 375 times.
|
375 | if (nalsize > size - (p - data)) |
| 506 | ✗ | return AVERROR_INVALIDDATA; | |
| 507 | 375 | ret = decode_extradata_ps_mp4(p, nalsize, ps, err_recognition, logctx); | |
| 508 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 375 times.
|
375 | if (ret < 0) { |
| 509 | ✗ | av_log(logctx, AV_LOG_ERROR, | |
| 510 | "Decoding pps %d from avcC failed\n", i); | ||
| 511 | ✗ | return ret; | |
| 512 | } | ||
| 513 | 375 | p += nalsize; | |
| 514 | } | ||
| 515 | // Store right nal length size that will be used to parse all other nals | ||
| 516 | 380 | *nal_length_size = (data[4] & 0x03) + 1; | |
| 517 | } else { | ||
| 518 | 224 | *is_avc = 0; | |
| 519 | 224 | ret = decode_extradata_ps(data, size, ps, 0, logctx); | |
| 520 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 224 times.
|
224 | if (ret < 0) |
| 521 | ✗ | return ret; | |
| 522 | } | ||
| 523 | 604 | return size; | |
| 524 | } | ||
| 525 | |||
| 526 | /** | ||
| 527 | * Compute profile from profile_idc and constraint_set?_flags. | ||
| 528 | * | ||
| 529 | * @param sps SPS | ||
| 530 | * | ||
| 531 | * @return profile as defined by AV_PROFILE_H264_* | ||
| 532 | */ | ||
| 533 | 62189 | int ff_h264_get_profile(const SPS *sps) | |
| 534 | { | ||
| 535 | 62189 | int profile = sps->profile_idc; | |
| 536 | |||
| 537 |
3/3✓ Branch 0 taken 14387 times.
✓ Branch 1 taken 2364 times.
✓ Branch 2 taken 45438 times.
|
62189 | switch (sps->profile_idc) { |
| 538 | 14387 | case AV_PROFILE_H264_BASELINE: | |
| 539 | // constraint_set1_flag set to 1 | ||
| 540 | 14387 | profile |= (sps->constraint_set_flags & 1 << 1) ? AV_PROFILE_H264_CONSTRAINED : 0; | |
| 541 | 14387 | break; | |
| 542 | 2364 | case AV_PROFILE_H264_HIGH_10: | |
| 543 | case AV_PROFILE_H264_HIGH_422: | ||
| 544 | case AV_PROFILE_H264_HIGH_444_PREDICTIVE: | ||
| 545 | // constraint_set3_flag set to 1 | ||
| 546 | 2364 | profile |= (sps->constraint_set_flags & 1 << 3) ? AV_PROFILE_H264_INTRA : 0; | |
| 547 | 2364 | break; | |
| 548 | } | ||
| 549 | |||
| 550 | 62189 | return profile; | |
| 551 | } | ||
| 552 |