History

lavc/vvc: Validate explicit subpic locations

Implement the missing requirements from H.266 (V3) p. 106 on the position and size of subpictures whose dimensions are provided explicitly.

Frank Plowman committed 2 years ago

Commit 93281631 parent 01701bd1 file · +38 −11Browse files

Showing the changes to libavcodec (1 of 1 file). Show all

Unified · Split

libavcodec/cbs_h266_syntax_template.c+38−11
@@ -1061,7 +1061,7 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw, · 1060 unmodified lines
10611061 unsigned int ctb_log2_size_y, min_cb_log2_size_y,
10621062 min_qt_log2_size_intra_y, min_qt_log2_size_inter_y,
10631063 ctb_size_y, max_num_merge_cand, tmp_width_val, tmp_height_val;
1064− uint8_t qp_bd_offset;
1064+ uint8_t qp_bd_offset, sub_width_c, sub_height_c;
10651065
10661066 static const uint8_t h266_sub_width_c[] = {
10671067 1, 2, 2, 1
@@ -1089,6 +1089,9 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw, · 21 unmodified lines
10891089
10901090 u(3, sps_max_sublayers_minus1, 0, VVC_MAX_SUBLAYERS - 1);
10911091 u(2, sps_chroma_format_idc, 0, 3);
1092+ sub_width_c = h266_sub_width_c[current->sps_chroma_format_idc];
1093+ sub_height_c = h266_sub_height_c[current->sps_chroma_format_idc];
1094+
10921095 u(2, sps_log2_ctu_size_minus5, 0, 3);
10931096 ctb_log2_size_y = current->sps_log2_ctu_size_minus5 + 5;
10941097 ctb_size_y = 1 << ctb_log2_size_y;
@@ -1110,8 +1113,6 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw, · 15 unmodified lines
11101113
11111114 flag(sps_conformance_window_flag);
11121115 if (current->sps_conformance_window_flag) {
1113− uint8_t sub_width_c = h266_sub_width_c[current->sps_chroma_format_idc];
1114− uint8_t sub_height_c = h266_sub_height_c[current->sps_chroma_format_idc];
11151116 uint16_t width = current->sps_pic_width_max_in_luma_samples / sub_width_c;
11161117 uint16_t height = current->sps_pic_height_max_in_luma_samples / sub_height_c;
11171118 ue(sps_conf_win_left_offset, 0, width);
@@ -1160,19 +1161,37 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw, · 42 unmodified lines
11601161 }
11611162 for (i = 1; i <= current->sps_num_subpics_minus1; i++) {
11621163 if (!current->sps_subpic_same_size_flag) {
1163− if (current->sps_pic_width_max_in_luma_samples > ctb_size_y)
1164− ubs(wlen, sps_subpic_ctu_top_left_x[i], 1, i);
1165− else
1164+ if (current->sps_pic_width_max_in_luma_samples > ctb_size_y) {
1165+ const unsigned int win_right_edge =
1166+ current->sps_pic_width_max_in_luma_samples
1167+ - current->sps_conf_win_right_offset * sub_width_c;
1168+ us(wlen, sps_subpic_ctu_top_left_x[i], 0,
1169+ AV_CEIL_RSHIFT(win_right_edge, ctb_log2_size_y) - 1,
1170+ 1, i);
1171+ } else
11661172 infer(sps_subpic_ctu_top_left_x[i], 0);
11671173 if (current->sps_pic_height_max_in_luma_samples >
1168− ctb_size_y)
1169− ubs(hlen, sps_subpic_ctu_top_left_y[i], 1, i);
1170− else
1174+ ctb_size_y) {
1175+ const unsigned int win_bottom_edge =
1176+ current->sps_pic_height_max_in_luma_samples
1177+ - current->sps_conf_win_bottom_offset * sub_height_c;
1178+ us(hlen, sps_subpic_ctu_top_left_y[i], 0,
1179+ AV_CEIL_RSHIFT(win_bottom_edge, ctb_log2_size_y) - 1,
1180+ 1, i);
1181+ } else
11711182 infer(sps_subpic_ctu_top_left_y[i], 0);
11721183 if (i < current->sps_num_subpics_minus1 &&
11731184 current->sps_pic_width_max_in_luma_samples >
11741185 ctb_size_y) {
1175− ubs(wlen, sps_subpic_width_minus1[i], 1, i);
1186+ const unsigned int win_left_edge =
1187+ current->sps_conf_win_left_offset * sub_width_c;
1188+ const unsigned int win_left_edge_ctus =
1189+ AV_CEIL_RSHIFT(win_left_edge, ctb_log2_size_y);
1190+ us(wlen, sps_subpic_width_minus1[i],
1191+ win_left_edge_ctus > current->sps_subpic_ctu_top_left_x[i]
1192+ ? win_left_edge_ctus - current->sps_subpic_ctu_top_left_x[i]
1193+ : 0,
1194+ MAX_UINT_BITS(wlen), 1, i);
11761195 } else {
11771196 infer(sps_subpic_width_minus1[i],
11781197 tmp_width_val -
@@ -1181,7 +1200,15 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw, · 2 unmodified lines
11811200 if (i < current->sps_num_subpics_minus1 &&
11821201 current->sps_pic_height_max_in_luma_samples >
11831202 ctb_size_y) {
1184− ubs(hlen, sps_subpic_height_minus1[i], 1, i);
1203+ const unsigned int win_top_edge =
1204+ current->sps_conf_win_top_offset * sub_height_c;
1205+ const unsigned int win_top_edge_ctus =
1206+ AV_CEIL_RSHIFT(win_top_edge, ctb_log2_size_y);
1207+ us(hlen, sps_subpic_height_minus1[i],
1208+ win_top_edge_ctus > current->sps_subpic_ctu_top_left_y[i]
1209+ ? win_top_edge_ctus - current->sps_subpic_ctu_top_left_y[i]
1210+ : 0,
1211+ MAX_UINT_BITS(wlen), 1, i);
11851212 } else {
11861213 infer(sps_subpic_height_minus1[i],
11871214 tmp_height_val -

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t