cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

nal-h264.h (11785B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright (C) 2019 Pengutronix, Michael Tretter <kernel@pengutronix.de>
      4 *
      5 * Convert NAL units between raw byte sequence payloads (RBSP) and C structs.
      6 */
      7
      8#ifndef __NAL_H264_H__
      9#define __NAL_H264_H__
     10
     11#include <linux/errno.h>
     12#include <linux/kernel.h>
     13#include <linux/types.h>
     14#include <linux/v4l2-controls.h>
     15#include <linux/videodev2.h>
     16
     17/*
     18 * struct nal_h264_hrd_parameters - HRD parameters
     19 *
     20 * C struct representation of the sequence parameter set NAL unit as defined by
     21 * Rec. ITU-T H.264 (04/2017) E.1.2 HRD parameters syntax.
     22 */
     23struct nal_h264_hrd_parameters {
     24	unsigned int cpb_cnt_minus1;
     25	unsigned int bit_rate_scale;
     26	unsigned int cpb_size_scale;
     27	struct {
     28		int bit_rate_value_minus1[16];
     29		int cpb_size_value_minus1[16];
     30		unsigned int cbr_flag[16];
     31	};
     32	unsigned int initial_cpb_removal_delay_length_minus1;
     33	unsigned int cpb_removal_delay_length_minus1;
     34	unsigned int dpb_output_delay_length_minus1;
     35	unsigned int time_offset_length;
     36};
     37
     38/*
     39 * struct nal_h264_vui_parameters - VUI parameters
     40 *
     41 * C struct representation of the VUI parameters as defined by Rec. ITU-T
     42 * H.264 (04/2017) E.1.1 VUI parameters syntax.
     43 */
     44struct nal_h264_vui_parameters {
     45	unsigned int aspect_ratio_info_present_flag;
     46	struct {
     47		unsigned int aspect_ratio_idc;
     48		unsigned int sar_width;
     49		unsigned int sar_height;
     50	};
     51	unsigned int overscan_info_present_flag;
     52	unsigned int overscan_appropriate_flag;
     53	unsigned int video_signal_type_present_flag;
     54	struct {
     55		unsigned int video_format;
     56		unsigned int video_full_range_flag;
     57		unsigned int colour_description_present_flag;
     58		struct {
     59			unsigned int colour_primaries;
     60			unsigned int transfer_characteristics;
     61			unsigned int matrix_coefficients;
     62		};
     63	};
     64	unsigned int chroma_loc_info_present_flag;
     65	struct {
     66		unsigned int chroma_sample_loc_type_top_field;
     67		unsigned int chroma_sample_loc_type_bottom_field;
     68	};
     69	unsigned int timing_info_present_flag;
     70	struct {
     71		unsigned int num_units_in_tick;
     72		unsigned int time_scale;
     73		unsigned int fixed_frame_rate_flag;
     74	};
     75	unsigned int nal_hrd_parameters_present_flag;
     76	struct nal_h264_hrd_parameters nal_hrd_parameters;
     77	unsigned int vcl_hrd_parameters_present_flag;
     78	struct nal_h264_hrd_parameters vcl_hrd_parameters;
     79	unsigned int low_delay_hrd_flag;
     80	unsigned int pic_struct_present_flag;
     81	unsigned int bitstream_restriction_flag;
     82	struct {
     83		unsigned int motion_vectors_over_pic_boundaries_flag;
     84		unsigned int max_bytes_per_pic_denom;
     85		unsigned int max_bits_per_mb_denom;
     86		unsigned int log2_max_mv_length_horizontal;
     87		unsigned int log21_max_mv_length_vertical;
     88		unsigned int max_num_reorder_frames;
     89		unsigned int max_dec_frame_buffering;
     90	};
     91};
     92
     93/*
     94 * struct nal_h264_sps - Sequence parameter set
     95 *
     96 * C struct representation of the sequence parameter set NAL unit as defined by
     97 * Rec. ITU-T H.264 (04/2017) 7.3.2.1.1 Sequence parameter set data syntax.
     98 */
     99struct nal_h264_sps {
    100	unsigned int profile_idc;
    101	unsigned int constraint_set0_flag;
    102	unsigned int constraint_set1_flag;
    103	unsigned int constraint_set2_flag;
    104	unsigned int constraint_set3_flag;
    105	unsigned int constraint_set4_flag;
    106	unsigned int constraint_set5_flag;
    107	unsigned int reserved_zero_2bits;
    108	unsigned int level_idc;
    109	unsigned int seq_parameter_set_id;
    110	struct {
    111		unsigned int chroma_format_idc;
    112		unsigned int separate_colour_plane_flag;
    113		unsigned int bit_depth_luma_minus8;
    114		unsigned int bit_depth_chroma_minus8;
    115		unsigned int qpprime_y_zero_transform_bypass_flag;
    116		unsigned int seq_scaling_matrix_present_flag;
    117	};
    118	unsigned int log2_max_frame_num_minus4;
    119	unsigned int pic_order_cnt_type;
    120	union {
    121		unsigned int log2_max_pic_order_cnt_lsb_minus4;
    122		struct {
    123			unsigned int delta_pic_order_always_zero_flag;
    124			int offset_for_non_ref_pic;
    125			int offset_for_top_to_bottom_field;
    126			unsigned int num_ref_frames_in_pic_order_cnt_cycle;
    127			int offset_for_ref_frame[255];
    128		};
    129	};
    130	unsigned int max_num_ref_frames;
    131	unsigned int gaps_in_frame_num_value_allowed_flag;
    132	unsigned int pic_width_in_mbs_minus1;
    133	unsigned int pic_height_in_map_units_minus1;
    134	unsigned int frame_mbs_only_flag;
    135	unsigned int mb_adaptive_frame_field_flag;
    136	unsigned int direct_8x8_inference_flag;
    137	unsigned int frame_cropping_flag;
    138	struct {
    139		unsigned int crop_left;
    140		unsigned int crop_right;
    141		unsigned int crop_top;
    142		unsigned int crop_bottom;
    143	};
    144	unsigned int vui_parameters_present_flag;
    145	struct nal_h264_vui_parameters vui;
    146};
    147
    148/*
    149 * struct nal_h264_pps - Picture parameter set
    150 *
    151 * C struct representation of the picture parameter set NAL unit as defined by
    152 * Rec. ITU-T H.264 (04/2017) 7.3.2.2 Picture parameter set RBSP syntax.
    153 */
    154struct nal_h264_pps {
    155	unsigned int pic_parameter_set_id;
    156	unsigned int seq_parameter_set_id;
    157	unsigned int entropy_coding_mode_flag;
    158	unsigned int bottom_field_pic_order_in_frame_present_flag;
    159	unsigned int num_slice_groups_minus1;
    160	unsigned int slice_group_map_type;
    161	union {
    162		unsigned int run_length_minus1[8];
    163		struct {
    164			unsigned int top_left[8];
    165			unsigned int bottom_right[8];
    166		};
    167		struct {
    168			unsigned int slice_group_change_direction_flag;
    169			unsigned int slice_group_change_rate_minus1;
    170		};
    171		struct {
    172			unsigned int pic_size_in_map_units_minus1;
    173			unsigned int slice_group_id[8];
    174		};
    175	};
    176	unsigned int num_ref_idx_l0_default_active_minus1;
    177	unsigned int num_ref_idx_l1_default_active_minus1;
    178	unsigned int weighted_pred_flag;
    179	unsigned int weighted_bipred_idc;
    180	int pic_init_qp_minus26;
    181	int pic_init_qs_minus26;
    182	int chroma_qp_index_offset;
    183	unsigned int deblocking_filter_control_present_flag;
    184	unsigned int constrained_intra_pred_flag;
    185	unsigned int redundant_pic_cnt_present_flag;
    186	struct {
    187		unsigned int transform_8x8_mode_flag;
    188		unsigned int pic_scaling_matrix_present_flag;
    189		int second_chroma_qp_index_offset;
    190	};
    191};
    192
    193/**
    194 * nal_h264_profile() - Get profile_idc for v4l2 h264 profile
    195 * @profile: the profile as &enum v4l2_mpeg_video_h264_profile
    196 *
    197 * Convert the &enum v4l2_mpeg_video_h264_profile to profile_idc as specified
    198 * in Rec. ITU-T H.264 (04/2017) A.2.
    199 *
    200 * Return: the profile_idc for the passed level
    201 */
    202static inline int nal_h264_profile(enum v4l2_mpeg_video_h264_profile profile)
    203{
    204	switch (profile) {
    205	case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
    206		return 66;
    207	case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
    208		return 77;
    209	case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
    210		return 88;
    211	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
    212		return 100;
    213	default:
    214		return -EINVAL;
    215	}
    216}
    217
    218/**
    219 * nal_h264_level() - Get level_idc for v4l2 h264 level
    220 * @level: the level as &enum v4l2_mpeg_video_h264_level
    221 *
    222 * Convert the &enum v4l2_mpeg_video_h264_level to level_idc as specified in
    223 * Rec. ITU-T H.264 (04/2017) A.3.2.
    224 *
    225 * Return: the level_idc for the passed level
    226 */
    227static inline int nal_h264_level(enum v4l2_mpeg_video_h264_level level)
    228{
    229	switch (level) {
    230	case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
    231		return 10;
    232	case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
    233		return 9;
    234	case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
    235		return 11;
    236	case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
    237		return 12;
    238	case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
    239		return 13;
    240	case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
    241		return 20;
    242	case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
    243		return 21;
    244	case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
    245		return 22;
    246	case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
    247		return 30;
    248	case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
    249		return 31;
    250	case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
    251		return 32;
    252	case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
    253		return 40;
    254	case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
    255		return 41;
    256	case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
    257		return 42;
    258	case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
    259		return 50;
    260	case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
    261		return 51;
    262	default:
    263		return -EINVAL;
    264	}
    265}
    266
    267/**
    268 * nal_h264_full_range() - Get video_full_range_flag for v4l2 quantization
    269 * @quantization: the quantization type as &enum v4l2_quantization
    270 *
    271 * Convert the &enum v4l2_quantization to video_full_range_flag as specified in
    272 * Rec. ITU-T H.264 (04/2017) E.2.1.
    273 *
    274 * Return: the video_full_range_flag value for the passed quantization
    275 */
    276static inline int nal_h264_full_range(enum v4l2_quantization quantization)
    277{
    278	switch (quantization) {
    279	case V4L2_QUANTIZATION_FULL_RANGE:
    280		return 1;
    281	case V4L2_QUANTIZATION_LIM_RANGE:
    282		return 0;
    283	default:
    284		break;
    285	}
    286
    287	return 0;
    288}
    289
    290/**
    291 * nal_h264_color_primaries() - Get color_primaries for v4l2 colorspace
    292 * @colorspace: the color space as &enum v4l2_colorspace
    293 *
    294 * Convert the &enum v4l2_colorspace to color_primaries as specified in
    295 * Rec. ITU-T H.264 (04/2017) E.2.1.
    296 *
    297 * Return: the color_primaries value for the passed colorspace
    298 */
    299static inline int nal_h264_color_primaries(enum v4l2_colorspace colorspace)
    300{
    301	switch (colorspace) {
    302	case V4L2_COLORSPACE_SMPTE170M:
    303		return 6;
    304	case V4L2_COLORSPACE_SMPTE240M:
    305		return 7;
    306	case V4L2_COLORSPACE_REC709:
    307		return 1;
    308	case V4L2_COLORSPACE_470_SYSTEM_M:
    309		return 4;
    310	case V4L2_COLORSPACE_JPEG:
    311	case V4L2_COLORSPACE_SRGB:
    312	case V4L2_COLORSPACE_470_SYSTEM_BG:
    313		return 5;
    314	case V4L2_COLORSPACE_BT2020:
    315		return 9;
    316	case V4L2_COLORSPACE_DEFAULT:
    317	case V4L2_COLORSPACE_OPRGB:
    318	case V4L2_COLORSPACE_RAW:
    319	case V4L2_COLORSPACE_DCI_P3:
    320	default:
    321		return 2;
    322	}
    323}
    324
    325/**
    326 * nal_h264_transfer_characteristics() - Get transfer_characteristics for v4l2 xfer_func
    327 * @colorspace: the color space as &enum v4l2_colorspace
    328 * @xfer_func: the transfer function as &enum v4l2_xfer_func
    329 *
    330 * Convert the &enum v4l2_xfer_func to transfer_characteristics as specified in
    331 * Rec. ITU-T H.264 (04/2017) E.2.1.
    332 *
    333 * Return: the transfer_characteristics value for the passed transfer function
    334 */
    335static inline int nal_h264_transfer_characteristics(enum v4l2_colorspace colorspace,
    336						    enum v4l2_xfer_func xfer_func)
    337{
    338	if (xfer_func == V4L2_XFER_FUNC_DEFAULT)
    339		xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(colorspace);
    340
    341	switch (xfer_func) {
    342	case V4L2_XFER_FUNC_709:
    343		return 6;
    344	case V4L2_XFER_FUNC_SMPTE2084:
    345		return 16;
    346	case V4L2_XFER_FUNC_SRGB:
    347	case V4L2_XFER_FUNC_OPRGB:
    348	case V4L2_XFER_FUNC_NONE:
    349	case V4L2_XFER_FUNC_DCI_P3:
    350	case V4L2_XFER_FUNC_SMPTE240M:
    351	default:
    352		return 2;
    353	}
    354}
    355
    356/**
    357 * nal_h264_matrix_coeffs() - Get matrix_coefficients for v4l2 v4l2_ycbcr_encoding
    358 * @colorspace: the color space as &enum v4l2_colorspace
    359 * @ycbcr_encoding: the ycbcr encoding as &enum v4l2_ycbcr_encoding
    360 *
    361 * Convert the &enum v4l2_ycbcr_encoding to matrix_coefficients as specified in
    362 * Rec. ITU-T H.264 (04/2017) E.2.1.
    363 *
    364 * Return: the matrix_coefficients value for the passed encoding
    365 */
    366static inline int nal_h264_matrix_coeffs(enum v4l2_colorspace colorspace,
    367					 enum v4l2_ycbcr_encoding ycbcr_encoding)
    368{
    369	if (ycbcr_encoding == V4L2_YCBCR_ENC_DEFAULT)
    370		ycbcr_encoding = V4L2_MAP_YCBCR_ENC_DEFAULT(colorspace);
    371
    372	switch (ycbcr_encoding) {
    373	case V4L2_YCBCR_ENC_601:
    374	case V4L2_YCBCR_ENC_XV601:
    375		return 5;
    376	case V4L2_YCBCR_ENC_709:
    377	case V4L2_YCBCR_ENC_XV709:
    378		return 1;
    379	case V4L2_YCBCR_ENC_BT2020:
    380		return 9;
    381	case V4L2_YCBCR_ENC_BT2020_CONST_LUM:
    382		return 10;
    383	case V4L2_YCBCR_ENC_SMPTE240M:
    384	default:
    385		return 2;
    386	}
    387}
    388
    389ssize_t nal_h264_write_sps(const struct device *dev,
    390			   void *dest, size_t n, struct nal_h264_sps *sps);
    391ssize_t nal_h264_read_sps(const struct device *dev,
    392			  struct nal_h264_sps *sps, void *src, size_t n);
    393void nal_h264_print_sps(const struct device *dev, struct nal_h264_sps *sps);
    394
    395ssize_t nal_h264_write_pps(const struct device *dev,
    396			   void *dest, size_t n, struct nal_h264_pps *pps);
    397ssize_t nal_h264_read_pps(const struct device *dev,
    398			  struct nal_h264_pps *pps, void *src, size_t n);
    399void nal_h264_print_pps(const struct device *dev, struct nal_h264_pps *pps);
    400
    401ssize_t nal_h264_write_filler(const struct device *dev, void *dest, size_t n);
    402ssize_t nal_h264_read_filler(const struct device *dev, void *src, size_t n);
    403
    404#endif /* __NAL_H264_H__ */