| @@ -460,14 +460,17 @@ static int decode_vps_ext(GetBitContext *gb, AVCodecContext *avctx, HEVCVPS *vps · 459 unmodified lines |
| 460 | 460 | uint64_t layer1_id_included) |
| 461 | 461 | { |
| 462 | 462 | PTL ptl_dummy; |
| 463 | | − uint8_t max_sub_layers[HEVC_MAX_LAYERS]; |
| 463 | + uint8_t max_sub_layers[HEVC_MAX_LAYERS] = {1, 1}; |
| 464 | + uint8_t dimension_id_len[16] = {0}; |
| 465 | + uint8_t dimension_id[16] = {0}; |
| 466 | + unsigned n; |
| 464 | 467 | |
| 465 | | − int splitting_flag, dimension_id_len, view_id_len, num_add_olss, num_scalability_types, |
| 468 | + int splitting_flag, view_id_len, num_add_olss, num_scalability_types, |
| 466 | 469 | default_output_layer_idc, direct_dep_type_len, direct_dep_type, |
| 467 | 470 | sub_layers_max_present, sub_layer_flag_info_present_flag, nb_ptl; |
| 468 | 471 | unsigned non_vui_extension_length; |
| 469 | 472 | |
| 470 | | − if (vps->vps_max_layers == 1 || vps->vps_num_layer_sets == 1) { |
| 473 | + if (vps->vps_max_layers == 1) { |
| 471 | 474 | av_log(avctx, AV_LOG_VERBOSE, "Ignoring VPS extensions with a single layer\n"); |
| 472 | 475 | return 0; |
| 473 | 476 | } |
| @@ -520,6 +523,7 @@ static int decode_vps_ext(GetBitContext *gb, AVCodecContext *avctx, HEVCVPS *vps · 46 unmodified lines |
| 520 | 523 | */ |
| 521 | 524 | vps->nb_layers = 2; |
| 522 | 525 | |
| 526 | + /* vps_base_layer_internal_flag is true has been checked before */ |
| 523 | 527 | if (parse_ptl(gb, avctx, 0, &ptl_dummy, vps->vps_max_sub_layers) < 0) |
| 524 | 528 | return AVERROR_INVALIDDATA; |
| 525 | 529 | |
| @@ -529,20 +533,25 @@ static int decode_vps_ext(GetBitContext *gb, AVCodecContext *avctx, HEVCVPS *vps · 3 unmodified lines |
| 529 | 533 | if (!num_scalability_types) { |
| 530 | 534 | av_log(avctx, AV_LOG_ERROR, "Missing scalability mask\n"); |
| 531 | 535 | return AVERROR_INVALIDDATA; |
| 532 | | − } else if (num_scalability_types > 1) { |
| 533 | | − av_log(avctx, AV_LOG_ERROR, "Scalability number %d not supported\n", |
| 534 | | − num_scalability_types); |
| 535 | | − return AVERROR_PATCHWELCOME; |
| 536 | 536 | } |
| 537 | 537 | |
| 538 | | − if (!(vps->scalability_mask_flag & HEVC_SCALABILITY_MULTIVIEW)) { |
| 538 | + if (!(vps->scalability_mask_flag & |
| 539 | + (HEVC_SCALABILITY_MULTIVIEW | HEVC_SCALABILITY_AUXILIARY))) { |
| 539 | 540 | av_log(avctx, AV_LOG_ERROR, "Scalability type %d not supported\n", |
| 540 | 541 | 15 - ff_ctz(vps->scalability_mask_flag)); |
| 541 | 542 | return AVERROR_PATCHWELCOME; |
| 542 | 543 | } |
| 544 | + // x265 specify MULTIVIEW when the stream really is alpha video only. |
| 545 | + if (num_scalability_types > 1) |
| 546 | + av_log(avctx, AV_LOG_WARNING, "Multiple scalability types presented\n"); |
| 543 | 547 | |
| 544 | | − if (!splitting_flag) |
| 545 | | − dimension_id_len = get_bits(gb, 3) + 1; |
| 548 | + n = 0; |
| 549 | + for (int i = 0; i < num_scalability_types - splitting_flag; i++) { |
| 550 | + dimension_id_len[i] = get_bits(gb, 3) + 1; |
| 551 | + n += dimension_id_len[i]; |
| 552 | + } |
| 553 | + if (splitting_flag) |
| 554 | + dimension_id_len[num_scalability_types - 1] = 5 - n; |
| 546 | 555 | |
| 547 | 556 | if (get_bits1(gb)) { /* vps_nuh_layer_id_present_flag */ |
| 548 | 557 | int layer_id_in_nuh = get_bits(gb, 6); |
| @@ -559,28 +568,57 @@ static int decode_vps_ext(GetBitContext *gb, AVCodecContext *avctx, HEVCVPS *vps · 10 unmodified lines |
| 559 | 568 | } |
| 560 | 569 | |
| 561 | 570 | if (!splitting_flag) { |
| 562 | | − int view_idx = get_bits(gb, dimension_id_len); |
| 563 | | − if (view_idx != 1) { |
| 564 | | − av_log(avctx, AV_LOG_ERROR, "Unexpected ViewOrderIdx: %d\n", view_idx); |
| 571 | + int index = 0; |
| 572 | + |
| 573 | + for (int i = 0; i < num_scalability_types; i++) |
| 574 | + dimension_id[i] = get_bits(gb, dimension_id_len[i]); |
| 575 | + |
| 576 | + if (vps->scalability_mask_flag & HEVC_SCALABILITY_MULTIVIEW) |
| 577 | + index++; |
| 578 | + |
| 579 | + /* AuxId 1 is alpha, 2 is depth. Only support alpha */ |
| 580 | + if (vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY && |
| 581 | + dimension_id[index] != HEVC_AUX_ALPHA) { |
| 582 | + av_log(avctx, AV_LOG_WARNING, |
| 583 | + "Unsupported dimension_id %d for HEVC_SCALABILITY_AUXILIARY\n", |
| 584 | + dimension_id[index]); |
| 565 | 585 | return AVERROR_PATCHWELCOME; |
| 566 | 586 | } |
| 567 | 587 | } |
| 568 | 588 | |
| 569 | 589 | view_id_len = get_bits(gb, 4); |
| 570 | | − if (view_id_len) |
| 571 | | − for (int i = 0; i < 2 /* NumViews */; i++) |
| 590 | + if (view_id_len) { |
| 591 | + n = (vps->scalability_mask_flag & HEVC_SCALABILITY_MULTIVIEW) ? 2 : 1; |
| 592 | + for (int i = 0; i < n; i++) |
| 572 | 593 | vps->view_id[i] = get_bits(gb, view_id_len); |
| 594 | + } |
| 573 | 595 | |
| 574 | | − if (!get_bits1(gb) /* direct_dependency_flag */) { |
| 575 | | − av_log(avctx, AV_LOG_WARNING, "Independent output layers not supported\n"); |
| 576 | | − return AVERROR_PATCHWELCOME; |
| 596 | + /* direct_dependency_flag */ |
| 597 | + vps->num_direct_ref_layers[1] = get_bits1(gb); |
| 598 | + if (!vps->num_direct_ref_layers[1]) { |
| 599 | + vps->num_add_layer_sets = get_ue_golomb(gb); |
| 600 | + if (vps->num_add_layer_sets > 1) { |
| 601 | + av_log(avctx, AV_LOG_WARNING, |
| 602 | + "Unsupported num_add_layer_sets: %d\n", vps->num_add_layer_sets); |
| 603 | + return AVERROR_PATCHWELCOME; |
| 604 | + } |
| 605 | + |
| 606 | + if (vps->num_add_layer_sets) { |
| 607 | + /* highest_layer_idx_plus1 */ |
| 608 | + if (!get_bits1(gb)) |
| 609 | + return AVERROR_PATCHWELCOME; |
| 610 | + } |
| 577 | 611 | } |
| 578 | | − vps->num_direct_ref_layers[1] = 1; |
| 612 | + vps->num_output_layer_sets = vps->vps_num_layer_sets + vps->num_add_layer_sets; |
| 613 | + if (vps->num_output_layer_sets != 2) |
| 614 | + return AVERROR_INVALIDDATA; |
| 579 | 615 | |
| 580 | 616 | sub_layers_max_present = get_bits1(gb); // vps_sub_layers_max_minus1_present_flag |
| 581 | | − for (int i = 0; i < vps->vps_max_layers; i++) |
| 582 | | − max_sub_layers[i] = sub_layers_max_present ? get_bits(gb, 3) + 1 : |
| 583 | | − vps->vps_max_sub_layers; |
| 617 | + if (sub_layers_max_present) { |
| 618 | + for (int i = 0; i < vps->vps_max_layers; i++) |
| 619 | + max_sub_layers[i] = sub_layers_max_present ? get_bits(gb, 3) + 1 : |
| 620 | + vps->vps_max_sub_layers; |
| 621 | + } |
| 584 | 622 | |
| 585 | 623 | if (get_bits1(gb) /* max_tid_ref_present_flag */) |
| 586 | 624 | skip_bits(gb, 3); // max_tid_il_ref_pics_plus1 |
| @@ -613,18 +651,24 @@ static int decode_vps_ext(GetBitContext *gb, AVCodecContext *avctx, HEVCVPS *vps · 26 unmodified lines |
| 613 | 651 | } |
| 614 | 652 | |
| 615 | 653 | /* Consequence of established layer dependencies */ |
| 616 | | − if (layer1_id_included != ((1 << vps->layer_id_in_nuh[0]) | |
| 654 | + if (layer1_id_included && |
| 655 | + layer1_id_included != ((1 << vps->layer_id_in_nuh[0]) | |
| 617 | 656 | (1 << vps->layer_id_in_nuh[1]))) { |
| 618 | | − av_log(avctx, AV_LOG_ERROR, "Dependent layer not included in layer ID?\n"); |
| 619 | | − return AVERROR_PATCHWELCOME; |
| 657 | + av_log(avctx, AV_LOG_ERROR, |
| 658 | + "Dependent layer not included in layer ID?\n"); |
| 659 | + return AVERROR_PATCHWELCOME; |
| 620 | 660 | } |
| 661 | + if (!layer1_id_included) |
| 662 | + vps->ols[1] = 2; |
| 663 | + else |
| 664 | + vps->ols[1] = 3; |
| 621 | 665 | |
| 622 | | − vps->num_output_layer_sets = 2; |
| 623 | | − vps->ols[1] = 3; |
| 666 | + if (vps->vps_num_layer_sets == 1 || default_output_layer_idc == 2) |
| 667 | + skip_bits1(gb); |
| 624 | 668 | |
| 625 | 669 | for (int j = 0; j < av_popcount64(vps->ols[1]); j++) { |
| 626 | 670 | int ptl_idx = get_bits(gb, av_ceil_log2(nb_ptl)); |
| 627 | | − if (ptl_idx < 1 || ptl_idx >= nb_ptl) { |
| 671 | + if (ptl_idx >= nb_ptl) { |
| 628 | 672 | av_log(avctx, AV_LOG_ERROR, "Invalid PTL index: %d\n", ptl_idx); |
| 629 | 673 | return AVERROR_INVALIDDATA; |
| 630 | 674 | } |
| @@ -667,6 +711,8 @@ static int decode_vps_ext(GetBitContext *gb, AVCodecContext *avctx, HEVCVPS *vps · 36 unmodified lines |
| 667 | 711 | |
| 668 | 712 | vps->max_one_active_ref_layer = get_bits1(gb); |
| 669 | 713 | vps->poc_lsb_aligned = get_bits1(gb); |
| 714 | + if (!vps->num_direct_ref_layers[1]) |
| 715 | + vps->poc_lsb_not_present = get_bits1(gb) << 1; |
| 670 | 716 | |
| 671 | 717 | sub_layer_flag_info_present_flag = get_bits1(gb); |
| 672 | 718 | for (int j = 0; j < FFMAX(max_sub_layers[0], max_sub_layers[1]); j++) { |
| @@ -688,12 +734,14 @@ static int decode_vps_ext(GetBitContext *gb, AVCodecContext *avctx, HEVCVPS *vps · 15 unmodified lines |
| 688 | 734 | return AVERROR_INVALIDDATA; |
| 689 | 735 | } |
| 690 | 736 | |
| 691 | | − skip_bits1(gb); /* direct_depenency_all_layers_flag */ |
| 692 | | − direct_dep_type = get_bits_long(gb, direct_dep_type_len); |
| 693 | | − if (direct_dep_type > HEVC_DEP_TYPE_BOTH) { |
| 694 | | − av_log(avctx, AV_LOG_WARNING, "Unsupported direct_dep_type: %d\n", |
| 695 | | − direct_dep_type); |
| 696 | | − return AVERROR_PATCHWELCOME; |
| 737 | + /* direct_depenency_all_layers_flag */ |
| 738 | + if (get_bits1(gb)) { |
| 739 | + direct_dep_type = get_bits_long(gb, direct_dep_type_len); |
| 740 | + if (direct_dep_type > HEVC_DEP_TYPE_BOTH) { |
| 741 | + av_log(avctx, AV_LOG_WARNING, "Unsupported direct_dep_type: %d\n", |
| 742 | + direct_dep_type); |
| 743 | + return AVERROR_PATCHWELCOME; |
| 744 | + } |
| 697 | 745 | } |
| 698 | 746 | |
| 699 | 747 | non_vui_extension_length = get_ue_golomb(gb); |
| @@ -718,6 +766,7 @@ int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, · 18 unmodified lines |
| 718 | 766 | ptrdiff_t nal_size = gb->buffer_end - gb->buffer; |
| 719 | 767 | int ret = AVERROR_INVALIDDATA; |
| 720 | 768 | uint64_t layer1_id_included = 0; |
| 769 | + unsigned vps_base_layer_internal_flag, vps_base_layer_available_flag; |
| 721 | 770 | HEVCVPS *vps; |
| 722 | 771 | |
| 723 | 772 | if (ps->vps_list[vps_id]) { |
| @@ -741,8 +790,12 @@ int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, · 17 unmodified lines |
| 741 | 790 | } |
| 742 | 791 | vps->vps_id = vps_id; |
| 743 | 792 | |
| 744 | | − if (get_bits(gb, 2) != 3) { // vps_reserved_three_2bits |
| 745 | | − av_log(avctx, AV_LOG_ERROR, "vps_reserved_three_2bits is not three\n"); |
| 793 | + vps_base_layer_internal_flag = get_bits1(gb); |
| 794 | + vps_base_layer_available_flag = get_bits1(gb); |
| 795 | + if (!vps_base_layer_internal_flag || !vps_base_layer_available_flag) { |
| 796 | + av_log(avctx, AV_LOG_ERROR, |
| 797 | + "vps_base_layer_internal_flag or vps_base_layer_available_flag not set\n"); |
| 798 | + ret = AVERROR_PATCHWELCOME; |
| 746 | 799 | goto err; |
| 747 | 800 | } |
| 748 | 801 | |