Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: allegro: nal-hevc: implement generator for vui

The NAL unit generator for HEVC does not support the generation of vui
parameters. Implement it to allow drivers to set the vui parameters in
the coded video stream.

Signed-off-by: Michael Tretter <m.tretter@pengutronix.de>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>

authored by

Michael Tretter and committed by
Mauro Carvalho Chehab
42fd2806 0317c05f

+131 -1
+131 -1
drivers/media/platform/allegro-dvt/nal-hevc.c
··· 207 207 rbsp_unsupported(rbsp); 208 208 } 209 209 210 + static void nal_hevc_rbsp_sub_layer_hrd_parameters(struct rbsp *rbsp, 211 + struct nal_hevc_sub_layer_hrd_parameters *hrd) 212 + { 213 + unsigned int i; 214 + unsigned int cpb_cnt = 1; 215 + 216 + for (i = 0; i < cpb_cnt; i++) { 217 + rbsp_uev(rbsp, &hrd->bit_rate_value_minus1[i]); 218 + rbsp_uev(rbsp, &hrd->cpb_size_value_minus1[i]); 219 + rbsp_bit(rbsp, &hrd->cbr_flag[i]); 220 + } 221 + } 222 + 223 + static void nal_hevc_rbsp_hrd_parameters(struct rbsp *rbsp, 224 + struct nal_hevc_hrd_parameters *hrd) 225 + { 226 + unsigned int i; 227 + unsigned int max_num_sub_layers_minus_1 = 0; 228 + 229 + rbsp_bit(rbsp, &hrd->nal_hrd_parameters_present_flag); 230 + rbsp_bit(rbsp, &hrd->vcl_hrd_parameters_present_flag); 231 + if (hrd->nal_hrd_parameters_present_flag || hrd->vcl_hrd_parameters_present_flag) { 232 + rbsp_bit(rbsp, &hrd->sub_pic_hrd_params_present_flag); 233 + if (hrd->sub_pic_hrd_params_present_flag) { 234 + rbsp_bits(rbsp, 8, &hrd->tick_divisor_minus2); 235 + rbsp_bits(rbsp, 5, &hrd->du_cpb_removal_delay_increment_length_minus1); 236 + rbsp_bit(rbsp, &hrd->sub_pic_cpb_params_in_pic_timing_sei_flag); 237 + rbsp_bits(rbsp, 5, &hrd->dpb_output_delay_du_length_minus1); 238 + } 239 + rbsp_bits(rbsp, 4, &hrd->bit_rate_scale); 240 + rbsp_bits(rbsp, 4, &hrd->cpb_size_scale); 241 + if (hrd->sub_pic_hrd_params_present_flag) 242 + rbsp_bits(rbsp, 4, &hrd->cpb_size_du_scale); 243 + rbsp_bits(rbsp, 5, &hrd->initial_cpb_removal_delay_length_minus1); 244 + rbsp_bits(rbsp, 5, &hrd->au_cpb_removal_delay_length_minus1); 245 + rbsp_bits(rbsp, 5, &hrd->dpb_output_delay_length_minus1); 246 + } 247 + for (i = 0; i <= max_num_sub_layers_minus_1; i++) { 248 + rbsp_bit(rbsp, &hrd->fixed_pic_rate_general_flag[i]); 249 + if (!hrd->fixed_pic_rate_general_flag[i]) 250 + rbsp_bit(rbsp, &hrd->fixed_pic_rate_within_cvs_flag[i]); 251 + if (hrd->fixed_pic_rate_within_cvs_flag[i]) 252 + rbsp_uev(rbsp, &hrd->elemental_duration_in_tc_minus1[i]); 253 + else 254 + rbsp_bit(rbsp, &hrd->low_delay_hrd_flag[i]); 255 + if (!hrd->low_delay_hrd_flag[i]) 256 + rbsp_uev(rbsp, &hrd->cpb_cnt_minus1[i]); 257 + if (hrd->nal_hrd_parameters_present_flag) 258 + nal_hevc_rbsp_sub_layer_hrd_parameters(rbsp, &hrd->vcl_hrd[i]); 259 + if (hrd->vcl_hrd_parameters_present_flag) 260 + nal_hevc_rbsp_sub_layer_hrd_parameters(rbsp, &hrd->vcl_hrd[i]); 261 + } 262 + } 263 + 264 + static void nal_hevc_rbsp_vui_parameters(struct rbsp *rbsp, 265 + struct nal_hevc_vui_parameters *vui) 266 + { 267 + if (!vui) { 268 + rbsp->error = -EINVAL; 269 + return; 270 + } 271 + 272 + rbsp_bit(rbsp, &vui->aspect_ratio_info_present_flag); 273 + if (vui->aspect_ratio_info_present_flag) { 274 + rbsp_bits(rbsp, 8, &vui->aspect_ratio_idc); 275 + if (vui->aspect_ratio_idc == 255) { 276 + rbsp_bits(rbsp, 16, &vui->sar_width); 277 + rbsp_bits(rbsp, 16, &vui->sar_height); 278 + } 279 + } 280 + 281 + rbsp_bit(rbsp, &vui->overscan_info_present_flag); 282 + if (vui->overscan_info_present_flag) 283 + rbsp_bit(rbsp, &vui->overscan_appropriate_flag); 284 + 285 + rbsp_bit(rbsp, &vui->video_signal_type_present_flag); 286 + if (vui->video_signal_type_present_flag) { 287 + rbsp_bits(rbsp, 3, &vui->video_format); 288 + rbsp_bit(rbsp, &vui->video_full_range_flag); 289 + 290 + rbsp_bit(rbsp, &vui->colour_description_present_flag); 291 + if (vui->colour_description_present_flag) { 292 + rbsp_bits(rbsp, 8, &vui->colour_primaries); 293 + rbsp_bits(rbsp, 8, &vui->transfer_characteristics); 294 + rbsp_bits(rbsp, 8, &vui->matrix_coeffs); 295 + } 296 + } 297 + 298 + rbsp_bit(rbsp, &vui->chroma_loc_info_present_flag); 299 + if (vui->chroma_loc_info_present_flag) { 300 + rbsp_uev(rbsp, &vui->chroma_sample_loc_type_top_field); 301 + rbsp_uev(rbsp, &vui->chroma_sample_loc_type_bottom_field); 302 + } 303 + 304 + rbsp_bit(rbsp, &vui->neutral_chroma_indication_flag); 305 + rbsp_bit(rbsp, &vui->field_seq_flag); 306 + rbsp_bit(rbsp, &vui->frame_field_info_present_flag); 307 + rbsp_bit(rbsp, &vui->default_display_window_flag); 308 + if (vui->default_display_window_flag) { 309 + rbsp_uev(rbsp, &vui->def_disp_win_left_offset); 310 + rbsp_uev(rbsp, &vui->def_disp_win_right_offset); 311 + rbsp_uev(rbsp, &vui->def_disp_win_top_offset); 312 + rbsp_uev(rbsp, &vui->def_disp_win_bottom_offset); 313 + } 314 + 315 + rbsp_bit(rbsp, &vui->vui_timing_info_present_flag); 316 + if (vui->vui_timing_info_present_flag) { 317 + rbsp_bits(rbsp, 32, &vui->vui_num_units_in_tick); 318 + rbsp_bits(rbsp, 32, &vui->vui_time_scale); 319 + rbsp_bit(rbsp, &vui->vui_poc_proportional_to_timing_flag); 320 + if (vui->vui_poc_proportional_to_timing_flag) 321 + rbsp_uev(rbsp, &vui->vui_num_ticks_poc_diff_one_minus1); 322 + rbsp_bit(rbsp, &vui->vui_hrd_parameters_present_flag); 323 + if (vui->vui_hrd_parameters_present_flag) 324 + nal_hevc_rbsp_hrd_parameters(rbsp, &vui->nal_hrd_parameters); 325 + } 326 + 327 + rbsp_bit(rbsp, &vui->bitstream_restriction_flag); 328 + if (vui->bitstream_restriction_flag) { 329 + rbsp_bit(rbsp, &vui->tiles_fixed_structure_flag); 330 + rbsp_bit(rbsp, &vui->motion_vectors_over_pic_boundaries_flag); 331 + rbsp_bit(rbsp, &vui->restricted_ref_pic_lists_flag); 332 + rbsp_uev(rbsp, &vui->min_spatial_segmentation_idc); 333 + rbsp_uev(rbsp, &vui->max_bytes_per_pic_denom); 334 + rbsp_uev(rbsp, &vui->max_bits_per_min_cu_denom); 335 + rbsp_uev(rbsp, &vui->log2_max_mv_length_horizontal); 336 + rbsp_uev(rbsp, &vui->log2_max_mv_length_vertical); 337 + } 338 + } 339 + 210 340 static void nal_hevc_rbsp_sps(struct rbsp *rbsp, struct nal_hevc_sps *sps) 211 341 { 212 342 unsigned int i; ··· 405 275 rbsp_bit(rbsp, &sps->strong_intra_smoothing_enabled_flag); 406 276 rbsp_bit(rbsp, &sps->vui_parameters_present_flag); 407 277 if (sps->vui_parameters_present_flag) 408 - rbsp_unsupported(rbsp); 278 + nal_hevc_rbsp_vui_parameters(rbsp, &sps->vui); 409 279 410 280 rbsp_bit(rbsp, &sps->extension_present_flag); 411 281 if (sps->extension_present_flag) {