162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2019 Pengutronix, Michael Tretter <kernel@pengutronix.de> 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Convert NAL units between raw byte sequence payloads (RBSP) and C structs. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __NAL_H264_H__ 962306a36Sopenharmony_ci#define __NAL_H264_H__ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/errno.h> 1262306a36Sopenharmony_ci#include <linux/kernel.h> 1362306a36Sopenharmony_ci#include <linux/types.h> 1462306a36Sopenharmony_ci#include <linux/v4l2-controls.h> 1562306a36Sopenharmony_ci#include <linux/videodev2.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* 1862306a36Sopenharmony_ci * struct nal_h264_hrd_parameters - HRD parameters 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci * C struct representation of the sequence parameter set NAL unit as defined by 2162306a36Sopenharmony_ci * Rec. ITU-T H.264 (04/2017) E.1.2 HRD parameters syntax. 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_cistruct nal_h264_hrd_parameters { 2462306a36Sopenharmony_ci unsigned int cpb_cnt_minus1; 2562306a36Sopenharmony_ci unsigned int bit_rate_scale; 2662306a36Sopenharmony_ci unsigned int cpb_size_scale; 2762306a36Sopenharmony_ci struct { 2862306a36Sopenharmony_ci int bit_rate_value_minus1[16]; 2962306a36Sopenharmony_ci int cpb_size_value_minus1[16]; 3062306a36Sopenharmony_ci unsigned int cbr_flag[16]; 3162306a36Sopenharmony_ci }; 3262306a36Sopenharmony_ci unsigned int initial_cpb_removal_delay_length_minus1; 3362306a36Sopenharmony_ci unsigned int cpb_removal_delay_length_minus1; 3462306a36Sopenharmony_ci unsigned int dpb_output_delay_length_minus1; 3562306a36Sopenharmony_ci unsigned int time_offset_length; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* 3962306a36Sopenharmony_ci * struct nal_h264_vui_parameters - VUI parameters 4062306a36Sopenharmony_ci * 4162306a36Sopenharmony_ci * C struct representation of the VUI parameters as defined by Rec. ITU-T 4262306a36Sopenharmony_ci * H.264 (04/2017) E.1.1 VUI parameters syntax. 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_cistruct nal_h264_vui_parameters { 4562306a36Sopenharmony_ci unsigned int aspect_ratio_info_present_flag; 4662306a36Sopenharmony_ci struct { 4762306a36Sopenharmony_ci unsigned int aspect_ratio_idc; 4862306a36Sopenharmony_ci unsigned int sar_width; 4962306a36Sopenharmony_ci unsigned int sar_height; 5062306a36Sopenharmony_ci }; 5162306a36Sopenharmony_ci unsigned int overscan_info_present_flag; 5262306a36Sopenharmony_ci unsigned int overscan_appropriate_flag; 5362306a36Sopenharmony_ci unsigned int video_signal_type_present_flag; 5462306a36Sopenharmony_ci struct { 5562306a36Sopenharmony_ci unsigned int video_format; 5662306a36Sopenharmony_ci unsigned int video_full_range_flag; 5762306a36Sopenharmony_ci unsigned int colour_description_present_flag; 5862306a36Sopenharmony_ci struct { 5962306a36Sopenharmony_ci unsigned int colour_primaries; 6062306a36Sopenharmony_ci unsigned int transfer_characteristics; 6162306a36Sopenharmony_ci unsigned int matrix_coefficients; 6262306a36Sopenharmony_ci }; 6362306a36Sopenharmony_ci }; 6462306a36Sopenharmony_ci unsigned int chroma_loc_info_present_flag; 6562306a36Sopenharmony_ci struct { 6662306a36Sopenharmony_ci unsigned int chroma_sample_loc_type_top_field; 6762306a36Sopenharmony_ci unsigned int chroma_sample_loc_type_bottom_field; 6862306a36Sopenharmony_ci }; 6962306a36Sopenharmony_ci unsigned int timing_info_present_flag; 7062306a36Sopenharmony_ci struct { 7162306a36Sopenharmony_ci unsigned int num_units_in_tick; 7262306a36Sopenharmony_ci unsigned int time_scale; 7362306a36Sopenharmony_ci unsigned int fixed_frame_rate_flag; 7462306a36Sopenharmony_ci }; 7562306a36Sopenharmony_ci unsigned int nal_hrd_parameters_present_flag; 7662306a36Sopenharmony_ci struct nal_h264_hrd_parameters nal_hrd_parameters; 7762306a36Sopenharmony_ci unsigned int vcl_hrd_parameters_present_flag; 7862306a36Sopenharmony_ci struct nal_h264_hrd_parameters vcl_hrd_parameters; 7962306a36Sopenharmony_ci unsigned int low_delay_hrd_flag; 8062306a36Sopenharmony_ci unsigned int pic_struct_present_flag; 8162306a36Sopenharmony_ci unsigned int bitstream_restriction_flag; 8262306a36Sopenharmony_ci struct { 8362306a36Sopenharmony_ci unsigned int motion_vectors_over_pic_boundaries_flag; 8462306a36Sopenharmony_ci unsigned int max_bytes_per_pic_denom; 8562306a36Sopenharmony_ci unsigned int max_bits_per_mb_denom; 8662306a36Sopenharmony_ci unsigned int log2_max_mv_length_horizontal; 8762306a36Sopenharmony_ci unsigned int log21_max_mv_length_vertical; 8862306a36Sopenharmony_ci unsigned int max_num_reorder_frames; 8962306a36Sopenharmony_ci unsigned int max_dec_frame_buffering; 9062306a36Sopenharmony_ci }; 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci/* 9462306a36Sopenharmony_ci * struct nal_h264_sps - Sequence parameter set 9562306a36Sopenharmony_ci * 9662306a36Sopenharmony_ci * C struct representation of the sequence parameter set NAL unit as defined by 9762306a36Sopenharmony_ci * Rec. ITU-T H.264 (04/2017) 7.3.2.1.1 Sequence parameter set data syntax. 9862306a36Sopenharmony_ci */ 9962306a36Sopenharmony_cistruct nal_h264_sps { 10062306a36Sopenharmony_ci unsigned int profile_idc; 10162306a36Sopenharmony_ci unsigned int constraint_set0_flag; 10262306a36Sopenharmony_ci unsigned int constraint_set1_flag; 10362306a36Sopenharmony_ci unsigned int constraint_set2_flag; 10462306a36Sopenharmony_ci unsigned int constraint_set3_flag; 10562306a36Sopenharmony_ci unsigned int constraint_set4_flag; 10662306a36Sopenharmony_ci unsigned int constraint_set5_flag; 10762306a36Sopenharmony_ci unsigned int reserved_zero_2bits; 10862306a36Sopenharmony_ci unsigned int level_idc; 10962306a36Sopenharmony_ci unsigned int seq_parameter_set_id; 11062306a36Sopenharmony_ci struct { 11162306a36Sopenharmony_ci unsigned int chroma_format_idc; 11262306a36Sopenharmony_ci unsigned int separate_colour_plane_flag; 11362306a36Sopenharmony_ci unsigned int bit_depth_luma_minus8; 11462306a36Sopenharmony_ci unsigned int bit_depth_chroma_minus8; 11562306a36Sopenharmony_ci unsigned int qpprime_y_zero_transform_bypass_flag; 11662306a36Sopenharmony_ci unsigned int seq_scaling_matrix_present_flag; 11762306a36Sopenharmony_ci }; 11862306a36Sopenharmony_ci unsigned int log2_max_frame_num_minus4; 11962306a36Sopenharmony_ci unsigned int pic_order_cnt_type; 12062306a36Sopenharmony_ci union { 12162306a36Sopenharmony_ci unsigned int log2_max_pic_order_cnt_lsb_minus4; 12262306a36Sopenharmony_ci struct { 12362306a36Sopenharmony_ci unsigned int delta_pic_order_always_zero_flag; 12462306a36Sopenharmony_ci int offset_for_non_ref_pic; 12562306a36Sopenharmony_ci int offset_for_top_to_bottom_field; 12662306a36Sopenharmony_ci unsigned int num_ref_frames_in_pic_order_cnt_cycle; 12762306a36Sopenharmony_ci int offset_for_ref_frame[255]; 12862306a36Sopenharmony_ci }; 12962306a36Sopenharmony_ci }; 13062306a36Sopenharmony_ci unsigned int max_num_ref_frames; 13162306a36Sopenharmony_ci unsigned int gaps_in_frame_num_value_allowed_flag; 13262306a36Sopenharmony_ci unsigned int pic_width_in_mbs_minus1; 13362306a36Sopenharmony_ci unsigned int pic_height_in_map_units_minus1; 13462306a36Sopenharmony_ci unsigned int frame_mbs_only_flag; 13562306a36Sopenharmony_ci unsigned int mb_adaptive_frame_field_flag; 13662306a36Sopenharmony_ci unsigned int direct_8x8_inference_flag; 13762306a36Sopenharmony_ci unsigned int frame_cropping_flag; 13862306a36Sopenharmony_ci struct { 13962306a36Sopenharmony_ci unsigned int crop_left; 14062306a36Sopenharmony_ci unsigned int crop_right; 14162306a36Sopenharmony_ci unsigned int crop_top; 14262306a36Sopenharmony_ci unsigned int crop_bottom; 14362306a36Sopenharmony_ci }; 14462306a36Sopenharmony_ci unsigned int vui_parameters_present_flag; 14562306a36Sopenharmony_ci struct nal_h264_vui_parameters vui; 14662306a36Sopenharmony_ci}; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci/* 14962306a36Sopenharmony_ci * struct nal_h264_pps - Picture parameter set 15062306a36Sopenharmony_ci * 15162306a36Sopenharmony_ci * C struct representation of the picture parameter set NAL unit as defined by 15262306a36Sopenharmony_ci * Rec. ITU-T H.264 (04/2017) 7.3.2.2 Picture parameter set RBSP syntax. 15362306a36Sopenharmony_ci */ 15462306a36Sopenharmony_cistruct nal_h264_pps { 15562306a36Sopenharmony_ci unsigned int pic_parameter_set_id; 15662306a36Sopenharmony_ci unsigned int seq_parameter_set_id; 15762306a36Sopenharmony_ci unsigned int entropy_coding_mode_flag; 15862306a36Sopenharmony_ci unsigned int bottom_field_pic_order_in_frame_present_flag; 15962306a36Sopenharmony_ci unsigned int num_slice_groups_minus1; 16062306a36Sopenharmony_ci unsigned int slice_group_map_type; 16162306a36Sopenharmony_ci union { 16262306a36Sopenharmony_ci unsigned int run_length_minus1[8]; 16362306a36Sopenharmony_ci struct { 16462306a36Sopenharmony_ci unsigned int top_left[8]; 16562306a36Sopenharmony_ci unsigned int bottom_right[8]; 16662306a36Sopenharmony_ci }; 16762306a36Sopenharmony_ci struct { 16862306a36Sopenharmony_ci unsigned int slice_group_change_direction_flag; 16962306a36Sopenharmony_ci unsigned int slice_group_change_rate_minus1; 17062306a36Sopenharmony_ci }; 17162306a36Sopenharmony_ci struct { 17262306a36Sopenharmony_ci unsigned int pic_size_in_map_units_minus1; 17362306a36Sopenharmony_ci unsigned int slice_group_id[8]; 17462306a36Sopenharmony_ci }; 17562306a36Sopenharmony_ci }; 17662306a36Sopenharmony_ci unsigned int num_ref_idx_l0_default_active_minus1; 17762306a36Sopenharmony_ci unsigned int num_ref_idx_l1_default_active_minus1; 17862306a36Sopenharmony_ci unsigned int weighted_pred_flag; 17962306a36Sopenharmony_ci unsigned int weighted_bipred_idc; 18062306a36Sopenharmony_ci int pic_init_qp_minus26; 18162306a36Sopenharmony_ci int pic_init_qs_minus26; 18262306a36Sopenharmony_ci int chroma_qp_index_offset; 18362306a36Sopenharmony_ci unsigned int deblocking_filter_control_present_flag; 18462306a36Sopenharmony_ci unsigned int constrained_intra_pred_flag; 18562306a36Sopenharmony_ci unsigned int redundant_pic_cnt_present_flag; 18662306a36Sopenharmony_ci struct { 18762306a36Sopenharmony_ci unsigned int transform_8x8_mode_flag; 18862306a36Sopenharmony_ci unsigned int pic_scaling_matrix_present_flag; 18962306a36Sopenharmony_ci int second_chroma_qp_index_offset; 19062306a36Sopenharmony_ci }; 19162306a36Sopenharmony_ci}; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci/** 19462306a36Sopenharmony_ci * nal_h264_profile() - Get profile_idc for v4l2 h264 profile 19562306a36Sopenharmony_ci * @profile: the profile as &enum v4l2_mpeg_video_h264_profile 19662306a36Sopenharmony_ci * 19762306a36Sopenharmony_ci * Convert the &enum v4l2_mpeg_video_h264_profile to profile_idc as specified 19862306a36Sopenharmony_ci * in Rec. ITU-T H.264 (04/2017) A.2. 19962306a36Sopenharmony_ci * 20062306a36Sopenharmony_ci * Return: the profile_idc for the passed level 20162306a36Sopenharmony_ci */ 20262306a36Sopenharmony_cistatic inline int nal_h264_profile(enum v4l2_mpeg_video_h264_profile profile) 20362306a36Sopenharmony_ci{ 20462306a36Sopenharmony_ci switch (profile) { 20562306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE: 20662306a36Sopenharmony_ci return 66; 20762306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: 20862306a36Sopenharmony_ci return 77; 20962306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED: 21062306a36Sopenharmony_ci return 88; 21162306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: 21262306a36Sopenharmony_ci return 100; 21362306a36Sopenharmony_ci default: 21462306a36Sopenharmony_ci return -EINVAL; 21562306a36Sopenharmony_ci } 21662306a36Sopenharmony_ci} 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci/** 21962306a36Sopenharmony_ci * nal_h264_level() - Get level_idc for v4l2 h264 level 22062306a36Sopenharmony_ci * @level: the level as &enum v4l2_mpeg_video_h264_level 22162306a36Sopenharmony_ci * 22262306a36Sopenharmony_ci * Convert the &enum v4l2_mpeg_video_h264_level to level_idc as specified in 22362306a36Sopenharmony_ci * Rec. ITU-T H.264 (04/2017) A.3.2. 22462306a36Sopenharmony_ci * 22562306a36Sopenharmony_ci * Return: the level_idc for the passed level 22662306a36Sopenharmony_ci */ 22762306a36Sopenharmony_cistatic inline int nal_h264_level(enum v4l2_mpeg_video_h264_level level) 22862306a36Sopenharmony_ci{ 22962306a36Sopenharmony_ci switch (level) { 23062306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: 23162306a36Sopenharmony_ci return 10; 23262306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_1B: 23362306a36Sopenharmony_ci return 9; 23462306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: 23562306a36Sopenharmony_ci return 11; 23662306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: 23762306a36Sopenharmony_ci return 12; 23862306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: 23962306a36Sopenharmony_ci return 13; 24062306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: 24162306a36Sopenharmony_ci return 20; 24262306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: 24362306a36Sopenharmony_ci return 21; 24462306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: 24562306a36Sopenharmony_ci return 22; 24662306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: 24762306a36Sopenharmony_ci return 30; 24862306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: 24962306a36Sopenharmony_ci return 31; 25062306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: 25162306a36Sopenharmony_ci return 32; 25262306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: 25362306a36Sopenharmony_ci return 40; 25462306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_4_1: 25562306a36Sopenharmony_ci return 41; 25662306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_4_2: 25762306a36Sopenharmony_ci return 42; 25862306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_5_0: 25962306a36Sopenharmony_ci return 50; 26062306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_H264_LEVEL_5_1: 26162306a36Sopenharmony_ci return 51; 26262306a36Sopenharmony_ci default: 26362306a36Sopenharmony_ci return -EINVAL; 26462306a36Sopenharmony_ci } 26562306a36Sopenharmony_ci} 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci/** 26862306a36Sopenharmony_ci * nal_h264_full_range() - Get video_full_range_flag for v4l2 quantization 26962306a36Sopenharmony_ci * @quantization: the quantization type as &enum v4l2_quantization 27062306a36Sopenharmony_ci * 27162306a36Sopenharmony_ci * Convert the &enum v4l2_quantization to video_full_range_flag as specified in 27262306a36Sopenharmony_ci * Rec. ITU-T H.264 (04/2017) E.2.1. 27362306a36Sopenharmony_ci * 27462306a36Sopenharmony_ci * Return: the video_full_range_flag value for the passed quantization 27562306a36Sopenharmony_ci */ 27662306a36Sopenharmony_cistatic inline int nal_h264_full_range(enum v4l2_quantization quantization) 27762306a36Sopenharmony_ci{ 27862306a36Sopenharmony_ci switch (quantization) { 27962306a36Sopenharmony_ci case V4L2_QUANTIZATION_FULL_RANGE: 28062306a36Sopenharmony_ci return 1; 28162306a36Sopenharmony_ci case V4L2_QUANTIZATION_LIM_RANGE: 28262306a36Sopenharmony_ci return 0; 28362306a36Sopenharmony_ci default: 28462306a36Sopenharmony_ci break; 28562306a36Sopenharmony_ci } 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci return 0; 28862306a36Sopenharmony_ci} 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci/** 29162306a36Sopenharmony_ci * nal_h264_color_primaries() - Get color_primaries for v4l2 colorspace 29262306a36Sopenharmony_ci * @colorspace: the color space as &enum v4l2_colorspace 29362306a36Sopenharmony_ci * 29462306a36Sopenharmony_ci * Convert the &enum v4l2_colorspace to color_primaries as specified in 29562306a36Sopenharmony_ci * Rec. ITU-T H.264 (04/2017) E.2.1. 29662306a36Sopenharmony_ci * 29762306a36Sopenharmony_ci * Return: the color_primaries value for the passed colorspace 29862306a36Sopenharmony_ci */ 29962306a36Sopenharmony_cistatic inline int nal_h264_color_primaries(enum v4l2_colorspace colorspace) 30062306a36Sopenharmony_ci{ 30162306a36Sopenharmony_ci switch (colorspace) { 30262306a36Sopenharmony_ci case V4L2_COLORSPACE_SMPTE170M: 30362306a36Sopenharmony_ci return 6; 30462306a36Sopenharmony_ci case V4L2_COLORSPACE_SMPTE240M: 30562306a36Sopenharmony_ci return 7; 30662306a36Sopenharmony_ci case V4L2_COLORSPACE_REC709: 30762306a36Sopenharmony_ci return 1; 30862306a36Sopenharmony_ci case V4L2_COLORSPACE_470_SYSTEM_M: 30962306a36Sopenharmony_ci return 4; 31062306a36Sopenharmony_ci case V4L2_COLORSPACE_JPEG: 31162306a36Sopenharmony_ci case V4L2_COLORSPACE_SRGB: 31262306a36Sopenharmony_ci case V4L2_COLORSPACE_470_SYSTEM_BG: 31362306a36Sopenharmony_ci return 5; 31462306a36Sopenharmony_ci case V4L2_COLORSPACE_BT2020: 31562306a36Sopenharmony_ci return 9; 31662306a36Sopenharmony_ci case V4L2_COLORSPACE_DEFAULT: 31762306a36Sopenharmony_ci case V4L2_COLORSPACE_OPRGB: 31862306a36Sopenharmony_ci case V4L2_COLORSPACE_RAW: 31962306a36Sopenharmony_ci case V4L2_COLORSPACE_DCI_P3: 32062306a36Sopenharmony_ci default: 32162306a36Sopenharmony_ci return 2; 32262306a36Sopenharmony_ci } 32362306a36Sopenharmony_ci} 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci/** 32662306a36Sopenharmony_ci * nal_h264_transfer_characteristics() - Get transfer_characteristics for v4l2 xfer_func 32762306a36Sopenharmony_ci * @colorspace: the color space as &enum v4l2_colorspace 32862306a36Sopenharmony_ci * @xfer_func: the transfer function as &enum v4l2_xfer_func 32962306a36Sopenharmony_ci * 33062306a36Sopenharmony_ci * Convert the &enum v4l2_xfer_func to transfer_characteristics as specified in 33162306a36Sopenharmony_ci * Rec. ITU-T H.264 (04/2017) E.2.1. 33262306a36Sopenharmony_ci * 33362306a36Sopenharmony_ci * Return: the transfer_characteristics value for the passed transfer function 33462306a36Sopenharmony_ci */ 33562306a36Sopenharmony_cistatic inline int nal_h264_transfer_characteristics(enum v4l2_colorspace colorspace, 33662306a36Sopenharmony_ci enum v4l2_xfer_func xfer_func) 33762306a36Sopenharmony_ci{ 33862306a36Sopenharmony_ci if (xfer_func == V4L2_XFER_FUNC_DEFAULT) 33962306a36Sopenharmony_ci xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(colorspace); 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci switch (xfer_func) { 34262306a36Sopenharmony_ci case V4L2_XFER_FUNC_709: 34362306a36Sopenharmony_ci return 6; 34462306a36Sopenharmony_ci case V4L2_XFER_FUNC_SMPTE2084: 34562306a36Sopenharmony_ci return 16; 34662306a36Sopenharmony_ci case V4L2_XFER_FUNC_SRGB: 34762306a36Sopenharmony_ci case V4L2_XFER_FUNC_OPRGB: 34862306a36Sopenharmony_ci case V4L2_XFER_FUNC_NONE: 34962306a36Sopenharmony_ci case V4L2_XFER_FUNC_DCI_P3: 35062306a36Sopenharmony_ci case V4L2_XFER_FUNC_SMPTE240M: 35162306a36Sopenharmony_ci default: 35262306a36Sopenharmony_ci return 2; 35362306a36Sopenharmony_ci } 35462306a36Sopenharmony_ci} 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci/** 35762306a36Sopenharmony_ci * nal_h264_matrix_coeffs() - Get matrix_coefficients for v4l2 v4l2_ycbcr_encoding 35862306a36Sopenharmony_ci * @colorspace: the color space as &enum v4l2_colorspace 35962306a36Sopenharmony_ci * @ycbcr_encoding: the ycbcr encoding as &enum v4l2_ycbcr_encoding 36062306a36Sopenharmony_ci * 36162306a36Sopenharmony_ci * Convert the &enum v4l2_ycbcr_encoding to matrix_coefficients as specified in 36262306a36Sopenharmony_ci * Rec. ITU-T H.264 (04/2017) E.2.1. 36362306a36Sopenharmony_ci * 36462306a36Sopenharmony_ci * Return: the matrix_coefficients value for the passed encoding 36562306a36Sopenharmony_ci */ 36662306a36Sopenharmony_cistatic inline int nal_h264_matrix_coeffs(enum v4l2_colorspace colorspace, 36762306a36Sopenharmony_ci enum v4l2_ycbcr_encoding ycbcr_encoding) 36862306a36Sopenharmony_ci{ 36962306a36Sopenharmony_ci if (ycbcr_encoding == V4L2_YCBCR_ENC_DEFAULT) 37062306a36Sopenharmony_ci ycbcr_encoding = V4L2_MAP_YCBCR_ENC_DEFAULT(colorspace); 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci switch (ycbcr_encoding) { 37362306a36Sopenharmony_ci case V4L2_YCBCR_ENC_601: 37462306a36Sopenharmony_ci case V4L2_YCBCR_ENC_XV601: 37562306a36Sopenharmony_ci return 5; 37662306a36Sopenharmony_ci case V4L2_YCBCR_ENC_709: 37762306a36Sopenharmony_ci case V4L2_YCBCR_ENC_XV709: 37862306a36Sopenharmony_ci return 1; 37962306a36Sopenharmony_ci case V4L2_YCBCR_ENC_BT2020: 38062306a36Sopenharmony_ci return 9; 38162306a36Sopenharmony_ci case V4L2_YCBCR_ENC_BT2020_CONST_LUM: 38262306a36Sopenharmony_ci return 10; 38362306a36Sopenharmony_ci case V4L2_YCBCR_ENC_SMPTE240M: 38462306a36Sopenharmony_ci default: 38562306a36Sopenharmony_ci return 2; 38662306a36Sopenharmony_ci } 38762306a36Sopenharmony_ci} 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cissize_t nal_h264_write_sps(const struct device *dev, 39062306a36Sopenharmony_ci void *dest, size_t n, struct nal_h264_sps *sps); 39162306a36Sopenharmony_cissize_t nal_h264_read_sps(const struct device *dev, 39262306a36Sopenharmony_ci struct nal_h264_sps *sps, void *src, size_t n); 39362306a36Sopenharmony_civoid nal_h264_print_sps(const struct device *dev, struct nal_h264_sps *sps); 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cissize_t nal_h264_write_pps(const struct device *dev, 39662306a36Sopenharmony_ci void *dest, size_t n, struct nal_h264_pps *pps); 39762306a36Sopenharmony_cissize_t nal_h264_read_pps(const struct device *dev, 39862306a36Sopenharmony_ci struct nal_h264_pps *pps, void *src, size_t n); 39962306a36Sopenharmony_civoid nal_h264_print_pps(const struct device *dev, struct nal_h264_pps *pps); 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_cissize_t nal_h264_write_filler(const struct device *dev, void *dest, size_t n); 40262306a36Sopenharmony_cissize_t nal_h264_read_filler(const struct device *dev, void *src, size_t n); 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci#endif /* __NAL_H264_H__ */ 405