1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2019-2020 Pengutronix, Michael Tretter <kernel@pengutronix.de>
4 *
5 * Convert NAL units between raw byte sequence payloads (RBSP) and C structs.
6 *
7 * The conversion is defined in "ITU-T Rec. H.265 (02/2018) high efficiency
8 * video coding". Decoder drivers may use the parser to parse RBSP from
9 * encoded streams and configure the hardware, if the hardware is not able to
10 * parse RBSP itself. Encoder drivers may use the generator to generate the
11 * RBSP for VPS/SPS/PPS nal units and add them to the encoded stream if the
12 * hardware does not generate the units.
13 */
14
15#include <linux/kernel.h>
16#include <linux/types.h>
17#include <linux/string.h>
18#include <linux/v4l2-controls.h>
19
20#include <linux/device.h>
21#include <linux/export.h>
22#include <linux/log2.h>
23
24#include "nal-hevc.h"
25#include "nal-rbsp.h"
26
27/*
28 * See Rec. ITU-T H.265 (02/2018) Table 7-1 - NAL unit type codes and NAL unit
29 * type classes
30 */
31enum nal_unit_type {
32	VPS_NUT = 32,
33	SPS_NUT = 33,
34	PPS_NUT = 34,
35	FD_NUT = 38,
36};
37
38static void nal_hevc_write_start_code_prefix(struct rbsp *rbsp)
39{
40	u8 *p = rbsp->data + DIV_ROUND_UP(rbsp->pos, 8);
41	int i = 4;
42
43	if (DIV_ROUND_UP(rbsp->pos, 8) + i > rbsp->size) {
44		rbsp->error = -EINVAL;
45		return;
46	}
47
48	p[0] = 0x00;
49	p[1] = 0x00;
50	p[2] = 0x00;
51	p[3] = 0x01;
52
53	rbsp->pos += i * 8;
54}
55
56static void nal_hevc_read_start_code_prefix(struct rbsp *rbsp)
57{
58	u8 *p = rbsp->data + DIV_ROUND_UP(rbsp->pos, 8);
59	int i = 4;
60
61	if (DIV_ROUND_UP(rbsp->pos, 8) + i > rbsp->size) {
62		rbsp->error = -EINVAL;
63		return;
64	}
65
66	if (p[0] != 0x00 || p[1] != 0x00 || p[2] != 0x00 || p[3] != 0x01) {
67		rbsp->error = -EINVAL;
68		return;
69	}
70
71	rbsp->pos += i * 8;
72}
73
74static void nal_hevc_write_filler_data(struct rbsp *rbsp)
75{
76	u8 *p = rbsp->data + DIV_ROUND_UP(rbsp->pos, 8);
77	int i;
78
79	/* Keep 1 byte extra for terminating the NAL unit */
80	i = rbsp->size - DIV_ROUND_UP(rbsp->pos, 8) - 1;
81	memset(p, 0xff, i);
82	rbsp->pos += i * 8;
83}
84
85static void nal_hevc_read_filler_data(struct rbsp *rbsp)
86{
87	u8 *p = rbsp->data + DIV_ROUND_UP(rbsp->pos, 8);
88
89	while (*p == 0xff) {
90		if (DIV_ROUND_UP(rbsp->pos, 8) > rbsp->size) {
91			rbsp->error = -EINVAL;
92			return;
93		}
94
95		p++;
96		rbsp->pos += 8;
97	}
98}
99
100static void nal_hevc_rbsp_profile_tier_level(struct rbsp *rbsp,
101					     struct nal_hevc_profile_tier_level *ptl)
102{
103	unsigned int i;
104	unsigned int max_num_sub_layers_minus_1 = 0;
105
106	rbsp_bits(rbsp, 2, &ptl->general_profile_space);
107	rbsp_bit(rbsp, &ptl->general_tier_flag);
108	rbsp_bits(rbsp, 5, &ptl->general_profile_idc);
109	for (i = 0; i < 32; i++)
110		rbsp_bit(rbsp, &ptl->general_profile_compatibility_flag[i]);
111	rbsp_bit(rbsp, &ptl->general_progressive_source_flag);
112	rbsp_bit(rbsp, &ptl->general_interlaced_source_flag);
113	rbsp_bit(rbsp, &ptl->general_non_packed_constraint_flag);
114	rbsp_bit(rbsp, &ptl->general_frame_only_constraint_flag);
115	if (ptl->general_profile_idc == 4 ||
116	    ptl->general_profile_compatibility_flag[4] ||
117	    ptl->general_profile_idc == 5 ||
118	    ptl->general_profile_compatibility_flag[5] ||
119	    ptl->general_profile_idc == 6 ||
120	    ptl->general_profile_compatibility_flag[6] ||
121	    ptl->general_profile_idc == 7 ||
122	    ptl->general_profile_compatibility_flag[7] ||
123	    ptl->general_profile_idc == 8 ||
124	    ptl->general_profile_compatibility_flag[8] ||
125	    ptl->general_profile_idc == 9 ||
126	    ptl->general_profile_compatibility_flag[9] ||
127	    ptl->general_profile_idc == 10 ||
128	    ptl->general_profile_compatibility_flag[10]) {
129		rbsp_bit(rbsp, &ptl->general_max_12bit_constraint_flag);
130		rbsp_bit(rbsp, &ptl->general_max_10bit_constraint_flag);
131		rbsp_bit(rbsp, &ptl->general_max_8bit_constraint_flag);
132		rbsp_bit(rbsp, &ptl->general_max_422chroma_constraint_flag);
133		rbsp_bit(rbsp, &ptl->general_max_420chroma_constraint_flag);
134		rbsp_bit(rbsp, &ptl->general_max_monochrome_constraint_flag);
135		rbsp_bit(rbsp, &ptl->general_intra_constraint_flag);
136		rbsp_bit(rbsp, &ptl->general_one_picture_only_constraint_flag);
137		rbsp_bit(rbsp, &ptl->general_lower_bit_rate_constraint_flag);
138		if (ptl->general_profile_idc == 5 ||
139		    ptl->general_profile_compatibility_flag[5] ||
140		    ptl->general_profile_idc == 9 ||
141		    ptl->general_profile_compatibility_flag[9] ||
142		    ptl->general_profile_idc == 10 ||
143		    ptl->general_profile_compatibility_flag[10]) {
144			rbsp_bit(rbsp, &ptl->general_max_14bit_constraint_flag);
145			rbsp_bits(rbsp, 32, &ptl->general_reserved_zero_33bits);
146			rbsp_bits(rbsp, 33 - 32, &ptl->general_reserved_zero_33bits);
147		} else {
148			rbsp_bits(rbsp, 32, &ptl->general_reserved_zero_34bits);
149			rbsp_bits(rbsp, 34 - 2, &ptl->general_reserved_zero_34bits);
150		}
151	} else if (ptl->general_profile_idc == 2 ||
152		   ptl->general_profile_compatibility_flag[2]) {
153		rbsp_bits(rbsp, 7, &ptl->general_reserved_zero_7bits);
154		rbsp_bit(rbsp, &ptl->general_one_picture_only_constraint_flag);
155		rbsp_bits(rbsp, 32, &ptl->general_reserved_zero_35bits);
156		rbsp_bits(rbsp, 35 - 32, &ptl->general_reserved_zero_35bits);
157	} else {
158		rbsp_bits(rbsp, 32, &ptl->general_reserved_zero_43bits);
159		rbsp_bits(rbsp, 43 - 32, &ptl->general_reserved_zero_43bits);
160	}
161	if ((ptl->general_profile_idc >= 1 && ptl->general_profile_idc <= 5) ||
162	    ptl->general_profile_idc == 9 ||
163	    ptl->general_profile_compatibility_flag[1] ||
164	    ptl->general_profile_compatibility_flag[2] ||
165	    ptl->general_profile_compatibility_flag[3] ||
166	    ptl->general_profile_compatibility_flag[4] ||
167	    ptl->general_profile_compatibility_flag[5] ||
168	    ptl->general_profile_compatibility_flag[9])
169		rbsp_bit(rbsp, &ptl->general_inbld_flag);
170	else
171		rbsp_bit(rbsp, &ptl->general_reserved_zero_bit);
172	rbsp_bits(rbsp, 8, &ptl->general_level_idc);
173	if (max_num_sub_layers_minus_1 > 0)
174		rbsp_unsupported(rbsp);
175}
176
177static void nal_hevc_rbsp_vps(struct rbsp *rbsp, struct nal_hevc_vps *vps)
178{
179	unsigned int i, j;
180	unsigned int reserved_0xffff_16bits = 0xffff;
181
182	rbsp_bits(rbsp, 4, &vps->video_parameter_set_id);
183	rbsp_bit(rbsp, &vps->base_layer_internal_flag);
184	rbsp_bit(rbsp, &vps->base_layer_available_flag);
185	rbsp_bits(rbsp, 6, &vps->max_layers_minus1);
186	rbsp_bits(rbsp, 3, &vps->max_sub_layers_minus1);
187	rbsp_bits(rbsp, 1, &vps->temporal_id_nesting_flag);
188	rbsp_bits(rbsp, 16, &reserved_0xffff_16bits);
189	nal_hevc_rbsp_profile_tier_level(rbsp, &vps->profile_tier_level);
190	rbsp_bit(rbsp, &vps->sub_layer_ordering_info_present_flag);
191	for (i = vps->sub_layer_ordering_info_present_flag ? 0 : vps->max_sub_layers_minus1;
192	     i <= vps->max_sub_layers_minus1; i++) {
193		rbsp_uev(rbsp, &vps->max_dec_pic_buffering_minus1[i]);
194		rbsp_uev(rbsp, &vps->max_num_reorder_pics[i]);
195		rbsp_uev(rbsp, &vps->max_latency_increase_plus1[i]);
196	}
197	rbsp_bits(rbsp, 6, &vps->max_layer_id);
198	rbsp_uev(rbsp, &vps->num_layer_sets_minus1);
199	for (i = 0; i <= vps->num_layer_sets_minus1; i++)
200		for (j = 0; j <= vps->max_layer_id; j++)
201			rbsp_bit(rbsp, &vps->layer_id_included_flag[i][j]);
202	rbsp_bit(rbsp, &vps->timing_info_present_flag);
203	if (vps->timing_info_present_flag)
204		rbsp_unsupported(rbsp);
205	rbsp_bit(rbsp, &vps->extension_flag);
206	if (vps->extension_flag)
207		rbsp_unsupported(rbsp);
208}
209
210static 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
223static 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
264static 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
340static void nal_hevc_rbsp_sps(struct rbsp *rbsp, struct nal_hevc_sps *sps)
341{
342	unsigned int i;
343
344	rbsp_bits(rbsp, 4, &sps->video_parameter_set_id);
345	rbsp_bits(rbsp, 3, &sps->max_sub_layers_minus1);
346	rbsp_bit(rbsp, &sps->temporal_id_nesting_flag);
347	nal_hevc_rbsp_profile_tier_level(rbsp, &sps->profile_tier_level);
348	rbsp_uev(rbsp, &sps->seq_parameter_set_id);
349
350	rbsp_uev(rbsp, &sps->chroma_format_idc);
351	if (sps->chroma_format_idc == 3)
352		rbsp_bit(rbsp, &sps->separate_colour_plane_flag);
353	rbsp_uev(rbsp, &sps->pic_width_in_luma_samples);
354	rbsp_uev(rbsp, &sps->pic_height_in_luma_samples);
355	rbsp_bit(rbsp, &sps->conformance_window_flag);
356	if (sps->conformance_window_flag) {
357		rbsp_uev(rbsp, &sps->conf_win_left_offset);
358		rbsp_uev(rbsp, &sps->conf_win_right_offset);
359		rbsp_uev(rbsp, &sps->conf_win_top_offset);
360		rbsp_uev(rbsp, &sps->conf_win_bottom_offset);
361	}
362	rbsp_uev(rbsp, &sps->bit_depth_luma_minus8);
363	rbsp_uev(rbsp, &sps->bit_depth_chroma_minus8);
364
365	rbsp_uev(rbsp, &sps->log2_max_pic_order_cnt_lsb_minus4);
366
367	rbsp_bit(rbsp, &sps->sub_layer_ordering_info_present_flag);
368	for (i = (sps->sub_layer_ordering_info_present_flag ? 0 : sps->max_sub_layers_minus1);
369	     i <= sps->max_sub_layers_minus1; i++) {
370		rbsp_uev(rbsp, &sps->max_dec_pic_buffering_minus1[i]);
371		rbsp_uev(rbsp, &sps->max_num_reorder_pics[i]);
372		rbsp_uev(rbsp, &sps->max_latency_increase_plus1[i]);
373	}
374	rbsp_uev(rbsp, &sps->log2_min_luma_coding_block_size_minus3);
375	rbsp_uev(rbsp, &sps->log2_diff_max_min_luma_coding_block_size);
376	rbsp_uev(rbsp, &sps->log2_min_luma_transform_block_size_minus2);
377	rbsp_uev(rbsp, &sps->log2_diff_max_min_luma_transform_block_size);
378	rbsp_uev(rbsp, &sps->max_transform_hierarchy_depth_inter);
379	rbsp_uev(rbsp, &sps->max_transform_hierarchy_depth_intra);
380
381	rbsp_bit(rbsp, &sps->scaling_list_enabled_flag);
382	if (sps->scaling_list_enabled_flag)
383		rbsp_unsupported(rbsp);
384
385	rbsp_bit(rbsp, &sps->amp_enabled_flag);
386	rbsp_bit(rbsp, &sps->sample_adaptive_offset_enabled_flag);
387	rbsp_bit(rbsp, &sps->pcm_enabled_flag);
388	if (sps->pcm_enabled_flag) {
389		rbsp_bits(rbsp, 4, &sps->pcm_sample_bit_depth_luma_minus1);
390		rbsp_bits(rbsp, 4, &sps->pcm_sample_bit_depth_chroma_minus1);
391		rbsp_uev(rbsp, &sps->log2_min_pcm_luma_coding_block_size_minus3);
392		rbsp_uev(rbsp, &sps->log2_diff_max_min_pcm_luma_coding_block_size);
393		rbsp_bit(rbsp, &sps->pcm_loop_filter_disabled_flag);
394	}
395
396	rbsp_uev(rbsp, &sps->num_short_term_ref_pic_sets);
397	if (sps->num_short_term_ref_pic_sets > 0)
398		rbsp_unsupported(rbsp);
399
400	rbsp_bit(rbsp, &sps->long_term_ref_pics_present_flag);
401	if (sps->long_term_ref_pics_present_flag)
402		rbsp_unsupported(rbsp);
403
404	rbsp_bit(rbsp, &sps->sps_temporal_mvp_enabled_flag);
405	rbsp_bit(rbsp, &sps->strong_intra_smoothing_enabled_flag);
406	rbsp_bit(rbsp, &sps->vui_parameters_present_flag);
407	if (sps->vui_parameters_present_flag)
408		nal_hevc_rbsp_vui_parameters(rbsp, &sps->vui);
409
410	rbsp_bit(rbsp, &sps->extension_present_flag);
411	if (sps->extension_present_flag) {
412		rbsp_bit(rbsp, &sps->sps_range_extension_flag);
413		rbsp_bit(rbsp, &sps->sps_multilayer_extension_flag);
414		rbsp_bit(rbsp, &sps->sps_3d_extension_flag);
415		rbsp_bit(rbsp, &sps->sps_scc_extension_flag);
416		rbsp_bits(rbsp, 5, &sps->sps_extension_4bits);
417	}
418	if (sps->sps_range_extension_flag)
419		rbsp_unsupported(rbsp);
420	if (sps->sps_multilayer_extension_flag)
421		rbsp_unsupported(rbsp);
422	if (sps->sps_3d_extension_flag)
423		rbsp_unsupported(rbsp);
424	if (sps->sps_scc_extension_flag)
425		rbsp_unsupported(rbsp);
426	if (sps->sps_extension_4bits)
427		rbsp_unsupported(rbsp);
428}
429
430static void nal_hevc_rbsp_pps(struct rbsp *rbsp, struct nal_hevc_pps *pps)
431{
432	unsigned int i;
433
434	rbsp_uev(rbsp, &pps->pps_pic_parameter_set_id);
435	rbsp_uev(rbsp, &pps->pps_seq_parameter_set_id);
436	rbsp_bit(rbsp, &pps->dependent_slice_segments_enabled_flag);
437	rbsp_bit(rbsp, &pps->output_flag_present_flag);
438	rbsp_bits(rbsp, 3, &pps->num_extra_slice_header_bits);
439	rbsp_bit(rbsp, &pps->sign_data_hiding_enabled_flag);
440	rbsp_bit(rbsp, &pps->cabac_init_present_flag);
441	rbsp_uev(rbsp, &pps->num_ref_idx_l0_default_active_minus1);
442	rbsp_uev(rbsp, &pps->num_ref_idx_l1_default_active_minus1);
443	rbsp_sev(rbsp, &pps->init_qp_minus26);
444	rbsp_bit(rbsp, &pps->constrained_intra_pred_flag);
445	rbsp_bit(rbsp, &pps->transform_skip_enabled_flag);
446	rbsp_bit(rbsp, &pps->cu_qp_delta_enabled_flag);
447	if (pps->cu_qp_delta_enabled_flag)
448		rbsp_uev(rbsp, &pps->diff_cu_qp_delta_depth);
449	rbsp_sev(rbsp, &pps->pps_cb_qp_offset);
450	rbsp_sev(rbsp, &pps->pps_cr_qp_offset);
451	rbsp_bit(rbsp, &pps->pps_slice_chroma_qp_offsets_present_flag);
452	rbsp_bit(rbsp, &pps->weighted_pred_flag);
453	rbsp_bit(rbsp, &pps->weighted_bipred_flag);
454	rbsp_bit(rbsp, &pps->transquant_bypass_enabled_flag);
455	rbsp_bit(rbsp, &pps->tiles_enabled_flag);
456	rbsp_bit(rbsp, &pps->entropy_coding_sync_enabled_flag);
457	if (pps->tiles_enabled_flag) {
458		rbsp_uev(rbsp, &pps->num_tile_columns_minus1);
459		rbsp_uev(rbsp, &pps->num_tile_rows_minus1);
460		rbsp_bit(rbsp, &pps->uniform_spacing_flag);
461		if (!pps->uniform_spacing_flag) {
462			for (i = 0; i < pps->num_tile_columns_minus1; i++)
463				rbsp_uev(rbsp, &pps->column_width_minus1[i]);
464			for (i = 0; i < pps->num_tile_rows_minus1; i++)
465				rbsp_uev(rbsp, &pps->row_height_minus1[i]);
466		}
467		rbsp_bit(rbsp, &pps->loop_filter_across_tiles_enabled_flag);
468	}
469	rbsp_bit(rbsp, &pps->pps_loop_filter_across_slices_enabled_flag);
470	rbsp_bit(rbsp, &pps->deblocking_filter_control_present_flag);
471	if (pps->deblocking_filter_control_present_flag) {
472		rbsp_bit(rbsp, &pps->deblocking_filter_override_enabled_flag);
473		rbsp_bit(rbsp, &pps->pps_deblocking_filter_disabled_flag);
474		if (!pps->pps_deblocking_filter_disabled_flag) {
475			rbsp_sev(rbsp, &pps->pps_beta_offset_div2);
476			rbsp_sev(rbsp, &pps->pps_tc_offset_div2);
477		}
478	}
479	rbsp_bit(rbsp, &pps->pps_scaling_list_data_present_flag);
480	if (pps->pps_scaling_list_data_present_flag)
481		rbsp_unsupported(rbsp);
482	rbsp_bit(rbsp, &pps->lists_modification_present_flag);
483	rbsp_uev(rbsp, &pps->log2_parallel_merge_level_minus2);
484	rbsp_bit(rbsp, &pps->slice_segment_header_extension_present_flag);
485	rbsp_bit(rbsp, &pps->pps_extension_present_flag);
486	if (pps->pps_extension_present_flag) {
487		rbsp_bit(rbsp, &pps->pps_range_extension_flag);
488		rbsp_bit(rbsp, &pps->pps_multilayer_extension_flag);
489		rbsp_bit(rbsp, &pps->pps_3d_extension_flag);
490		rbsp_bit(rbsp, &pps->pps_scc_extension_flag);
491		rbsp_bits(rbsp, 4, &pps->pps_extension_4bits);
492	}
493	if (pps->pps_range_extension_flag)
494		rbsp_unsupported(rbsp);
495	if (pps->pps_multilayer_extension_flag)
496		rbsp_unsupported(rbsp);
497	if (pps->pps_3d_extension_flag)
498		rbsp_unsupported(rbsp);
499	if (pps->pps_scc_extension_flag)
500		rbsp_unsupported(rbsp);
501	if (pps->pps_extension_4bits)
502		rbsp_unsupported(rbsp);
503}
504
505/**
506 * nal_hevc_write_vps() - Write PPS NAL unit into RBSP format
507 * @dev: device pointer
508 * @dest: the buffer that is filled with RBSP data
509 * @n: maximum size of @dest in bytes
510 * @vps: &struct nal_hevc_vps to convert to RBSP
511 *
512 * Convert @vps to RBSP data and write it into @dest.
513 *
514 * The size of the VPS NAL unit is not known in advance and this function will
515 * fail, if @dest does not hold sufficient space for the VPS NAL unit.
516 *
517 * Return: number of bytes written to @dest or negative error code
518 */
519ssize_t nal_hevc_write_vps(const struct device *dev,
520			   void *dest, size_t n, struct nal_hevc_vps *vps)
521{
522	struct rbsp rbsp;
523	unsigned int forbidden_zero_bit = 0;
524	unsigned int nal_unit_type = VPS_NUT;
525	unsigned int nuh_layer_id = 0;
526	unsigned int nuh_temporal_id_plus1 = 1;
527
528	if (!dest)
529		return -EINVAL;
530
531	rbsp_init(&rbsp, dest, n, &write);
532
533	nal_hevc_write_start_code_prefix(&rbsp);
534
535	/* NAL unit header */
536	rbsp_bit(&rbsp, &forbidden_zero_bit);
537	rbsp_bits(&rbsp, 6, &nal_unit_type);
538	rbsp_bits(&rbsp, 6, &nuh_layer_id);
539	rbsp_bits(&rbsp, 3, &nuh_temporal_id_plus1);
540
541	nal_hevc_rbsp_vps(&rbsp, vps);
542
543	rbsp_trailing_bits(&rbsp);
544
545	if (rbsp.error)
546		return rbsp.error;
547
548	return DIV_ROUND_UP(rbsp.pos, 8);
549}
550EXPORT_SYMBOL_GPL(nal_hevc_write_vps);
551
552/**
553 * nal_hevc_read_vps() - Read VPS NAL unit from RBSP format
554 * @dev: device pointer
555 * @vps: the &struct nal_hevc_vps to fill from the RBSP data
556 * @src: the buffer that contains the RBSP data
557 * @n: size of @src in bytes
558 *
559 * Read RBSP data from @src and use it to fill @vps.
560 *
561 * Return: number of bytes read from @src or negative error code
562 */
563ssize_t nal_hevc_read_vps(const struct device *dev,
564			  struct nal_hevc_vps *vps, void *src, size_t n)
565{
566	struct rbsp rbsp;
567	unsigned int forbidden_zero_bit;
568	unsigned int nal_unit_type;
569	unsigned int nuh_layer_id;
570	unsigned int nuh_temporal_id_plus1;
571
572	if (!src)
573		return -EINVAL;
574
575	rbsp_init(&rbsp, src, n, &read);
576
577	nal_hevc_read_start_code_prefix(&rbsp);
578
579	rbsp_bit(&rbsp, &forbidden_zero_bit);
580	rbsp_bits(&rbsp, 6, &nal_unit_type);
581	rbsp_bits(&rbsp, 6, &nuh_layer_id);
582	rbsp_bits(&rbsp, 3, &nuh_temporal_id_plus1);
583
584	if (rbsp.error ||
585	    forbidden_zero_bit != 0 ||
586	    nal_unit_type != VPS_NUT)
587		return -EINVAL;
588
589	nal_hevc_rbsp_vps(&rbsp, vps);
590
591	rbsp_trailing_bits(&rbsp);
592
593	if (rbsp.error)
594		return rbsp.error;
595
596	return DIV_ROUND_UP(rbsp.pos, 8);
597}
598EXPORT_SYMBOL_GPL(nal_hevc_read_vps);
599
600/**
601 * nal_hevc_write_sps() - Write SPS NAL unit into RBSP format
602 * @dev: device pointer
603 * @dest: the buffer that is filled with RBSP data
604 * @n: maximum size of @dest in bytes
605 * @sps: &struct nal_hevc_sps to convert to RBSP
606 *
607 * Convert @sps to RBSP data and write it into @dest.
608 *
609 * The size of the SPS NAL unit is not known in advance and this function will
610 * fail, if @dest does not hold sufficient space for the SPS NAL unit.
611 *
612 * Return: number of bytes written to @dest or negative error code
613 */
614ssize_t nal_hevc_write_sps(const struct device *dev,
615			   void *dest, size_t n, struct nal_hevc_sps *sps)
616{
617	struct rbsp rbsp;
618	unsigned int forbidden_zero_bit = 0;
619	unsigned int nal_unit_type = SPS_NUT;
620	unsigned int nuh_layer_id = 0;
621	unsigned int nuh_temporal_id_plus1 = 1;
622
623	if (!dest)
624		return -EINVAL;
625
626	rbsp_init(&rbsp, dest, n, &write);
627
628	nal_hevc_write_start_code_prefix(&rbsp);
629
630	/* NAL unit header */
631	rbsp_bit(&rbsp, &forbidden_zero_bit);
632	rbsp_bits(&rbsp, 6, &nal_unit_type);
633	rbsp_bits(&rbsp, 6, &nuh_layer_id);
634	rbsp_bits(&rbsp, 3, &nuh_temporal_id_plus1);
635
636	nal_hevc_rbsp_sps(&rbsp, sps);
637
638	rbsp_trailing_bits(&rbsp);
639
640	if (rbsp.error)
641		return rbsp.error;
642
643	return DIV_ROUND_UP(rbsp.pos, 8);
644}
645EXPORT_SYMBOL_GPL(nal_hevc_write_sps);
646
647/**
648 * nal_hevc_read_sps() - Read SPS NAL unit from RBSP format
649 * @dev: device pointer
650 * @sps: the &struct nal_hevc_sps to fill from the RBSP data
651 * @src: the buffer that contains the RBSP data
652 * @n: size of @src in bytes
653 *
654 * Read RBSP data from @src and use it to fill @sps.
655 *
656 * Return: number of bytes read from @src or negative error code
657 */
658ssize_t nal_hevc_read_sps(const struct device *dev,
659			  struct nal_hevc_sps *sps, void *src, size_t n)
660{
661	struct rbsp rbsp;
662	unsigned int forbidden_zero_bit;
663	unsigned int nal_unit_type;
664	unsigned int nuh_layer_id;
665	unsigned int nuh_temporal_id_plus1;
666
667	if (!src)
668		return -EINVAL;
669
670	rbsp_init(&rbsp, src, n, &read);
671
672	nal_hevc_read_start_code_prefix(&rbsp);
673
674	rbsp_bit(&rbsp, &forbidden_zero_bit);
675	rbsp_bits(&rbsp, 6, &nal_unit_type);
676	rbsp_bits(&rbsp, 6, &nuh_layer_id);
677	rbsp_bits(&rbsp, 3, &nuh_temporal_id_plus1);
678
679	if (rbsp.error ||
680	    forbidden_zero_bit != 0 ||
681	    nal_unit_type != SPS_NUT)
682		return -EINVAL;
683
684	nal_hevc_rbsp_sps(&rbsp, sps);
685
686	rbsp_trailing_bits(&rbsp);
687
688	if (rbsp.error)
689		return rbsp.error;
690
691	return DIV_ROUND_UP(rbsp.pos, 8);
692}
693EXPORT_SYMBOL_GPL(nal_hevc_read_sps);
694
695/**
696 * nal_hevc_write_pps() - Write PPS NAL unit into RBSP format
697 * @dev: device pointer
698 * @dest: the buffer that is filled with RBSP data
699 * @n: maximum size of @dest in bytes
700 * @pps: &struct nal_hevc_pps to convert to RBSP
701 *
702 * Convert @pps to RBSP data and write it into @dest.
703 *
704 * The size of the PPS NAL unit is not known in advance and this function will
705 * fail, if @dest does not hold sufficient space for the PPS NAL unit.
706 *
707 * Return: number of bytes written to @dest or negative error code
708 */
709ssize_t nal_hevc_write_pps(const struct device *dev,
710			   void *dest, size_t n, struct nal_hevc_pps *pps)
711{
712	struct rbsp rbsp;
713	unsigned int forbidden_zero_bit = 0;
714	unsigned int nal_unit_type = PPS_NUT;
715	unsigned int nuh_layer_id = 0;
716	unsigned int nuh_temporal_id_plus1 = 1;
717
718	if (!dest)
719		return -EINVAL;
720
721	rbsp_init(&rbsp, dest, n, &write);
722
723	nal_hevc_write_start_code_prefix(&rbsp);
724
725	/* NAL unit header */
726	rbsp_bit(&rbsp, &forbidden_zero_bit);
727	rbsp_bits(&rbsp, 6, &nal_unit_type);
728	rbsp_bits(&rbsp, 6, &nuh_layer_id);
729	rbsp_bits(&rbsp, 3, &nuh_temporal_id_plus1);
730
731	nal_hevc_rbsp_pps(&rbsp, pps);
732
733	rbsp_trailing_bits(&rbsp);
734
735	if (rbsp.error)
736		return rbsp.error;
737
738	return DIV_ROUND_UP(rbsp.pos, 8);
739}
740EXPORT_SYMBOL_GPL(nal_hevc_write_pps);
741
742/**
743 * nal_hevc_read_pps() - Read PPS NAL unit from RBSP format
744 * @dev: device pointer
745 * @pps: the &struct nal_hevc_pps to fill from the RBSP data
746 * @src: the buffer that contains the RBSP data
747 * @n: size of @src in bytes
748 *
749 * Read RBSP data from @src and use it to fill @pps.
750 *
751 * Return: number of bytes read from @src or negative error code
752 */
753ssize_t nal_hevc_read_pps(const struct device *dev,
754			  struct nal_hevc_pps *pps, void *src, size_t n)
755{
756	struct rbsp rbsp;
757	unsigned int forbidden_zero_bit;
758	unsigned int nal_unit_type;
759	unsigned int nuh_layer_id;
760	unsigned int nuh_temporal_id_plus1;
761
762	if (!src)
763		return -EINVAL;
764
765	rbsp_init(&rbsp, src, n, &read);
766
767	nal_hevc_read_start_code_prefix(&rbsp);
768
769	/* NAL unit header */
770	rbsp_bit(&rbsp, &forbidden_zero_bit);
771	rbsp_bits(&rbsp, 6, &nal_unit_type);
772	rbsp_bits(&rbsp, 6, &nuh_layer_id);
773	rbsp_bits(&rbsp, 3, &nuh_temporal_id_plus1);
774
775	nal_hevc_rbsp_pps(&rbsp, pps);
776
777	rbsp_trailing_bits(&rbsp);
778
779	if (rbsp.error)
780		return rbsp.error;
781
782	return DIV_ROUND_UP(rbsp.pos, 8);
783}
784EXPORT_SYMBOL_GPL(nal_hevc_read_pps);
785
786/**
787 * nal_hevc_write_filler() - Write filler data RBSP
788 * @dev: device pointer
789 * @dest: buffer to fill with filler data
790 * @n: size of the buffer to fill with filler data
791 *
792 * Write a filler data RBSP to @dest with a size of @n bytes and return the
793 * number of written filler data bytes.
794 *
795 * Use this function to generate dummy data in an RBSP data stream that can be
796 * safely ignored by hevc decoders.
797 *
798 * The RBSP format of the filler data is specified in Rec. ITU-T H.265
799 * (02/2018) 7.3.2.8 Filler data RBSP syntax.
800 *
801 * Return: number of filler data bytes (including marker) or negative error
802 */
803ssize_t nal_hevc_write_filler(const struct device *dev, void *dest, size_t n)
804{
805	struct rbsp rbsp;
806	unsigned int forbidden_zero_bit = 0;
807	unsigned int nal_unit_type = FD_NUT;
808	unsigned int nuh_layer_id = 0;
809	unsigned int nuh_temporal_id_plus1 = 1;
810
811	if (!dest)
812		return -EINVAL;
813
814	rbsp_init(&rbsp, dest, n, &write);
815
816	nal_hevc_write_start_code_prefix(&rbsp);
817
818	rbsp_bit(&rbsp, &forbidden_zero_bit);
819	rbsp_bits(&rbsp, 6, &nal_unit_type);
820	rbsp_bits(&rbsp, 6, &nuh_layer_id);
821	rbsp_bits(&rbsp, 3, &nuh_temporal_id_plus1);
822
823	nal_hevc_write_filler_data(&rbsp);
824	rbsp_trailing_bits(&rbsp);
825
826	if (rbsp.error)
827		return rbsp.error;
828
829	return DIV_ROUND_UP(rbsp.pos, 8);
830}
831EXPORT_SYMBOL_GPL(nal_hevc_write_filler);
832
833/**
834 * nal_hevc_read_filler() - Read filler data RBSP
835 * @dev: device pointer
836 * @src: buffer with RBSP data that is read
837 * @n: maximum size of src that shall be read
838 *
839 * Read a filler data RBSP from @src up to a maximum size of @n bytes and
840 * return the size of the filler data in bytes including the marker.
841 *
842 * This function is used to parse filler data and skip the respective bytes in
843 * the RBSP data.
844 *
845 * The RBSP format of the filler data is specified in Rec. ITU-T H.265
846 * (02/2018) 7.3.2.8 Filler data RBSP syntax.
847 *
848 * Return: number of filler data bytes (including marker) or negative error
849 */
850ssize_t nal_hevc_read_filler(const struct device *dev, void *src, size_t n)
851{
852	struct rbsp rbsp;
853	unsigned int forbidden_zero_bit;
854	unsigned int nal_unit_type;
855	unsigned int nuh_layer_id;
856	unsigned int nuh_temporal_id_plus1;
857
858	if (!src)
859		return -EINVAL;
860
861	rbsp_init(&rbsp, src, n, &read);
862
863	nal_hevc_read_start_code_prefix(&rbsp);
864
865	rbsp_bit(&rbsp, &forbidden_zero_bit);
866	rbsp_bits(&rbsp, 6, &nal_unit_type);
867	rbsp_bits(&rbsp, 6, &nuh_layer_id);
868	rbsp_bits(&rbsp, 3, &nuh_temporal_id_plus1);
869
870	if (rbsp.error)
871		return rbsp.error;
872	if (forbidden_zero_bit != 0 ||
873	    nal_unit_type != FD_NUT)
874		return -EINVAL;
875
876	nal_hevc_read_filler_data(&rbsp);
877	rbsp_trailing_bits(&rbsp);
878
879	if (rbsp.error)
880		return rbsp.error;
881
882	return DIV_ROUND_UP(rbsp.pos, 8);
883}
884EXPORT_SYMBOL_GPL(nal_hevc_read_filler);
885