Skip to content

Commit 2b2c37b

Browse files
committed
upipe_h265_framer: Constrain max_dec_pic_buffering_1
1 parent 01fcbd4 commit 2b2c37b

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

lib/upipe-framers/upipe_h265_framer.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@
6161

6262
#include <bitstream/itu/h265.h>
6363

64+
#define MIN(A, B) ((A) < (B) ? (A) : (B))
65+
#define MAX(A, B) ((A) > (B) ? (A) : (B))
66+
6467
/** @internal @This is the private context of an h265f pipe. */
6568
struct upipe_h265f {
6669
/** refcount management structure */
@@ -802,50 +805,64 @@ static bool upipe_h265f_activate_sps(struct upipe *upipe, uint32_t sps_id)
802805
uref_h265_flow_set_level(flow_def, upipe_h265f->level_idc))
803806

804807
uint64_t max_octetrate, max_bs;
808+
uint32_t max_luma_ps;
805809
switch (upipe_h265f->level_idc) {
806810
case H265VPS_LEVEL_1_0:
807811
max_octetrate = 128000 / 8;
808812
max_bs = 350000 / 8;
813+
max_luma_ps = 36864;
809814
break;
810815
case H265VPS_LEVEL_2_0:
811816
max_octetrate = max_bs = 1500000 / 8;
817+
max_luma_ps = 122880;
812818
break;
813819
case H265VPS_LEVEL_2_1:
814820
max_octetrate = max_bs = 3000000 / 8;
821+
max_luma_ps = 245760;
815822
break;
816823
case H265VPS_LEVEL_3_0:
817824
max_octetrate = max_bs = 6000000 / 8;
825+
max_luma_ps = 552960;
818826
break;
819827
case H265VPS_LEVEL_3_1:
820828
max_octetrate = max_bs = 10000000 / 8;
829+
max_luma_ps = 983040;
821830
break;
822831
case H265VPS_LEVEL_4_0:
823832
max_octetrate = max_bs = tier ? (30000000 / 8) : (12000000 / 8);
833+
max_luma_ps = 2228224;
824834
break;
825835
case H265VPS_LEVEL_4_1:
826836
max_octetrate = max_bs = tier ? (50000000 / 8) : (20000000 / 8);
837+
max_luma_ps = 2228224;
827838
break;
828839
case H265VPS_LEVEL_5_0:
829840
max_octetrate = max_bs = tier ? (100000000 / 8) : (25000000 / 8);
841+
max_luma_ps = 8912896;
830842
break;
831843
case H265VPS_LEVEL_5_1:
832844
max_octetrate = max_bs = tier ? (160000000 / 8) : (40000000 / 8);
845+
max_luma_ps = 8912896;
833846
break;
834847
case H265VPS_LEVEL_5_2:
835848
max_octetrate = max_bs = tier ? (240000000 / 8) : (60000000 / 8);
849+
max_luma_ps = 8912896;
836850
break;
837851
case H265VPS_LEVEL_6_0:
838852
max_octetrate = max_bs = tier ? (240000000 / 8) : (60000000 / 8);
853+
max_luma_ps = 35651584;
839854
break;
840855
case H265VPS_LEVEL_6_1:
841856
max_octetrate = max_bs = tier ? (480000000 / 8) : (120000000 / 8);
857+
max_luma_ps = 35651584;
842858
break;
843859
default:
844860
upipe_warn_va(upipe, "unknown level %"PRIu8,
845861
upipe_h265f->level_idc);
846862
/* fallthrough */
847863
case H265VPS_LEVEL_6_2:
848864
max_octetrate = max_bs = tier ? (800000000 / 8) : (240000000 / 8);
865+
max_luma_ps = 35651584;
849866
break;
850867
}
851868
UBASE_FATAL(upipe,
@@ -962,6 +979,21 @@ static bool upipe_h265f_activate_sps(struct upipe *upipe, uint32_t sps_id)
962979
upipe_h26xf_stream_ue(s); /* max_latency_increase */
963980
}
964981

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+
965997
upipe_h26xf_stream_ue(s); /* min_luma_coding_block_size */
966998
upipe_h26xf_stream_ue(s); /* diff_max_min_luma_coding_block_size */
967999
upipe_h26xf_stream_ue(s); /* min_transport_block_size */

0 commit comments

Comments
 (0)