|
61 | 61 |
|
62 | 62 | #include <bitstream/itu/h265.h> |
63 | 63 |
|
| 64 | +#define MIN(A, B) ((A) < (B) ? (A) : (B)) |
| 65 | +#define MAX(A, B) ((A) > (B) ? (A) : (B)) |
| 66 | + |
64 | 67 | /** @internal @This is the private context of an h265f pipe. */ |
65 | 68 | struct upipe_h265f { |
66 | 69 | /** refcount management structure */ |
@@ -802,50 +805,64 @@ static bool upipe_h265f_activate_sps(struct upipe *upipe, uint32_t sps_id) |
802 | 805 | uref_h265_flow_set_level(flow_def, upipe_h265f->level_idc)) |
803 | 806 |
|
804 | 807 | uint64_t max_octetrate, max_bs; |
| 808 | + uint32_t max_luma_ps; |
805 | 809 | switch (upipe_h265f->level_idc) { |
806 | 810 | case H265VPS_LEVEL_1_0: |
807 | 811 | max_octetrate = 128000 / 8; |
808 | 812 | max_bs = 350000 / 8; |
| 813 | + max_luma_ps = 36864; |
809 | 814 | break; |
810 | 815 | case H265VPS_LEVEL_2_0: |
811 | 816 | max_octetrate = max_bs = 1500000 / 8; |
| 817 | + max_luma_ps = 122880; |
812 | 818 | break; |
813 | 819 | case H265VPS_LEVEL_2_1: |
814 | 820 | max_octetrate = max_bs = 3000000 / 8; |
| 821 | + max_luma_ps = 245760; |
815 | 822 | break; |
816 | 823 | case H265VPS_LEVEL_3_0: |
817 | 824 | max_octetrate = max_bs = 6000000 / 8; |
| 825 | + max_luma_ps = 552960; |
818 | 826 | break; |
819 | 827 | case H265VPS_LEVEL_3_1: |
820 | 828 | max_octetrate = max_bs = 10000000 / 8; |
| 829 | + max_luma_ps = 983040; |
821 | 830 | break; |
822 | 831 | case H265VPS_LEVEL_4_0: |
823 | 832 | max_octetrate = max_bs = tier ? (30000000 / 8) : (12000000 / 8); |
| 833 | + max_luma_ps = 2228224; |
824 | 834 | break; |
825 | 835 | case H265VPS_LEVEL_4_1: |
826 | 836 | max_octetrate = max_bs = tier ? (50000000 / 8) : (20000000 / 8); |
| 837 | + max_luma_ps = 2228224; |
827 | 838 | break; |
828 | 839 | case H265VPS_LEVEL_5_0: |
829 | 840 | max_octetrate = max_bs = tier ? (100000000 / 8) : (25000000 / 8); |
| 841 | + max_luma_ps = 8912896; |
830 | 842 | break; |
831 | 843 | case H265VPS_LEVEL_5_1: |
832 | 844 | max_octetrate = max_bs = tier ? (160000000 / 8) : (40000000 / 8); |
| 845 | + max_luma_ps = 8912896; |
833 | 846 | break; |
834 | 847 | case H265VPS_LEVEL_5_2: |
835 | 848 | max_octetrate = max_bs = tier ? (240000000 / 8) : (60000000 / 8); |
| 849 | + max_luma_ps = 8912896; |
836 | 850 | break; |
837 | 851 | case H265VPS_LEVEL_6_0: |
838 | 852 | max_octetrate = max_bs = tier ? (240000000 / 8) : (60000000 / 8); |
| 853 | + max_luma_ps = 35651584; |
839 | 854 | break; |
840 | 855 | case H265VPS_LEVEL_6_1: |
841 | 856 | max_octetrate = max_bs = tier ? (480000000 / 8) : (120000000 / 8); |
| 857 | + max_luma_ps = 35651584; |
842 | 858 | break; |
843 | 859 | default: |
844 | 860 | upipe_warn_va(upipe, "unknown level %"PRIu8, |
845 | 861 | upipe_h265f->level_idc); |
846 | 862 | /* fallthrough */ |
847 | 863 | case H265VPS_LEVEL_6_2: |
848 | 864 | max_octetrate = max_bs = tier ? (800000000 / 8) : (240000000 / 8); |
| 865 | + max_luma_ps = 35651584; |
849 | 866 | break; |
850 | 867 | } |
851 | 868 | UBASE_FATAL(upipe, |
@@ -962,6 +979,21 @@ static bool upipe_h265f_activate_sps(struct upipe *upipe, uint32_t sps_id) |
962 | 979 | upipe_h26xf_stream_ue(s); /* max_latency_increase */ |
963 | 980 | } |
964 | 981 |
|
| 982 | + uint32_t pic_size_y = hsize * vsize; |
| 983 | + uint32_t max_dpb_size; |
| 984 | + uint8_t max_dpb_pic_buf = 8; |
| 985 | + |
| 986 | + if (pic_size_y <= (max_luma_ps >> 2)) |
| 987 | + max_dpb_size = MIN(4 * max_dpb_pic_buf, 16); |
| 988 | + else if (pic_size_y <= (max_luma_ps >> 1)) |
| 989 | + max_dpb_size = MIN(2 * max_dpb_pic_buf, 16); |
| 990 | + else if (pic_size_y <= (3*max_luma_ps) >> 2) |
| 991 | + max_dpb_size = MIN((4 * max_dpb_pic_buf) / 3, 16); |
| 992 | + else |
| 993 | + max_dpb_size = max_dpb_pic_buf; |
| 994 | + |
| 995 | + max_dec_pic_buffering_1 = MIN(max_dec_pic_buffering_1, max_dpb_size - 1); |
| 996 | + |
965 | 997 | upipe_h26xf_stream_ue(s); /* min_luma_coding_block_size */ |
966 | 998 | upipe_h26xf_stream_ue(s); /* diff_max_min_luma_coding_block_size */ |
967 | 999 | upipe_h26xf_stream_ue(s); /* min_transport_block_size */ |
|
0 commit comments