1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) STMicroelectronics SA 2015
4 * Authors: Yannick Fertre <yannick.fertre@st.com>
5 * Hugues Fruchet <hugues.fruchet@st.com>
11 #define MAX_SPS_PPS_SIZE 128
13 #define BITSTREAM_OFFSET_MASK 0x7F
16 #define H264_MAX_SIZE_W 1920
17 #define H264_MAX_SIZE_H 1920
19 /* macroBlocs number (width & height) */
20 #define MB_W(w) ((w + 0xF) / 0x10)
21 #define MB_H(h) ((h + 0xF) / 0x10)
23 /* formula to get temporal or spatial data size */
24 #define DATA_SIZE(w, h) (MB_W(w) * MB_H(h) * 16)
26 #define SEARCH_WINDOW_BUFFER_MAX_SIZE(w) ((4 * MB_W(w) + 42) * 256 * 3 / 2)
27 #define CABAC_CONTEXT_BUFFER_MAX_SIZE(w) (MB_W(w) * 16)
28 #define CTX_MB_BUFFER_MAX_SIZE(w) (MB_W(w) * 16 * 8)
29 #define SLICE_HEADER_SIZE (4 * 16)
30 #define BRC_DATA_SIZE (5 * 16)
32 /* source buffer copy in YUV 420 MB-tiled format with size=16*256*3/2 */
33 #define CURRENT_WINDOW_BUFFER_MAX_SIZE (16 * 256 * 3 / 2)
36 * 4 lines of pixels (in Luma, Chroma blue and Chroma red) of top MB
37 * for deblocking with size=4*16*MBx*2
39 #define LOCAL_RECONSTRUCTED_BUFFER_MAX_SIZE(w) (4 * 16 * MB_W(w) * 2)
41 /* factor for bitrate and cpb buffer size max values if profile >= high */
42 #define H264_FACTOR_HIGH 1200
44 /* factor for bitrate and cpb buffer size max values if profile < high */
45 #define H264_FACTOR_BASELINE 1000
47 /* number of bytes for NALU_TYPE_FILLER_DATA header and footer */
48 #define H264_FILLER_DATA_SIZE 6
51 enum v4l2_mpeg_video_h264_level level
;
52 u32 max_mb_per_seconds
;
59 static const struct h264_profile h264_infos_list
[] = {
60 {V4L2_MPEG_VIDEO_H264_LEVEL_1_0
, 1485, 99, 64, 175, 2},
61 {V4L2_MPEG_VIDEO_H264_LEVEL_1B
, 1485, 99, 128, 350, 2},
62 {V4L2_MPEG_VIDEO_H264_LEVEL_1_1
, 3000, 396, 192, 500, 2},
63 {V4L2_MPEG_VIDEO_H264_LEVEL_1_2
, 6000, 396, 384, 1000, 2},
64 {V4L2_MPEG_VIDEO_H264_LEVEL_1_3
, 11880, 396, 768, 2000, 2},
65 {V4L2_MPEG_VIDEO_H264_LEVEL_2_0
, 11880, 396, 2000, 2000, 2},
66 {V4L2_MPEG_VIDEO_H264_LEVEL_2_1
, 19800, 792, 4000, 4000, 2},
67 {V4L2_MPEG_VIDEO_H264_LEVEL_2_2
, 20250, 1620, 4000, 4000, 2},
68 {V4L2_MPEG_VIDEO_H264_LEVEL_3_0
, 40500, 1620, 10000, 10000, 2},
69 {V4L2_MPEG_VIDEO_H264_LEVEL_3_1
, 108000, 3600, 14000, 14000, 4},
70 {V4L2_MPEG_VIDEO_H264_LEVEL_3_2
, 216000, 5120, 20000, 20000, 4},
71 {V4L2_MPEG_VIDEO_H264_LEVEL_4_0
, 245760, 8192, 20000, 25000, 4},
72 {V4L2_MPEG_VIDEO_H264_LEVEL_4_1
, 245760, 8192, 50000, 62500, 2},
73 {V4L2_MPEG_VIDEO_H264_LEVEL_4_2
, 522240, 8704, 50000, 62500, 2},
74 {V4L2_MPEG_VIDEO_H264_LEVEL_5_0
, 589824, 22080, 135000, 135000, 2},
75 {V4L2_MPEG_VIDEO_H264_LEVEL_5_1
, 983040, 36864, 240000, 240000, 2}
82 BRC_TYPE_VBR_LOW_DELAY
= 3
85 enum hva_entropy_coding_mode
{
90 enum hva_picture_coding_type
{
91 PICTURE_CODING_TYPE_I
= 0,
92 PICTURE_CODING_TYPE_P
= 1,
93 PICTURE_CODING_TYPE_B
= 2
96 enum hva_h264_sampling_mode
{
97 SAMPLING_MODE_NV12
= 0,
98 SAMPLING_MODE_UYVY
= 1,
99 SAMPLING_MODE_RGB3
= 3,
100 SAMPLING_MODE_XRGB4
= 4,
101 SAMPLING_MODE_NV21
= 8,
102 SAMPLING_MODE_VYUY
= 9,
103 SAMPLING_MODE_BGR3
= 11,
104 SAMPLING_MODE_XBGR4
= 12,
105 SAMPLING_MODE_RGBX4
= 20,
106 SAMPLING_MODE_BGRX4
= 28
109 enum hva_h264_nalu_type
{
110 NALU_TYPE_UNKNOWN
= 0,
112 NALU_TYPE_SLICE_DPA
= 2,
113 NALU_TYPE_SLICE_DPB
= 3,
114 NALU_TYPE_SLICE_DPC
= 4,
115 NALU_TYPE_SLICE_IDR
= 5,
119 NALU_TYPE_AU_DELIMITER
= 9,
120 NALU_TYPE_SEQ_END
= 10,
121 NALU_TYPE_STREAM_END
= 11,
122 NALU_TYPE_FILLER_DATA
= 12,
123 NALU_TYPE_SPS_EXT
= 13,
124 NALU_TYPE_PREFIX_UNIT
= 14,
125 NALU_TYPE_SUBSET_SPS
= 15,
126 NALU_TYPE_SLICE_AUX
= 19,
127 NALU_TYPE_SLICE_EXT
= 20
130 enum hva_h264_sei_payload_type
{
131 SEI_BUFFERING_PERIOD
= 0,
132 SEI_PICTURE_TIMING
= 1,
133 SEI_STEREO_VIDEO_INFO
= 21,
134 SEI_FRAME_PACKING_ARRANGEMENT
= 45
138 * stereo Video Info struct
140 struct hva_h264_stereo_video_sei
{
142 u8 top_field_is_left_view_flag
;
143 u8 current_frame_is_left_view_flag
;
144 u8 next_frame_is_second_view_flag
;
145 u8 left_view_self_contained_flag
;
146 u8 right_view_self_contained_flag
;
152 * @frame_width: width in pixels of the buffer containing the input frame
153 * @frame_height: height in pixels of the buffer containing the input frame
154 * @frame_num: the parameter to be written in the slice header
155 * @picture_coding_type: type I, P or B
156 * @pic_order_cnt_type: POC mode, as defined in H264 std : can be 0,1,2
157 * @first_picture_in_sequence: flag telling to encoder that this is the
158 * first picture in a video sequence.
160 * @slice_size_type: 0 = no constraint to close the slice
161 * 1= a slice is closed as soon as the slice_mb_size limit
163 * 2= a slice is closed as soon as the slice_byte_size limit
165 * 3= a slice is closed as soon as either the slice_byte_size
166 * limit or the slice_mb_size limit is reached
167 * @slice_mb_size: defines the slice size in number of macroblocks
168 * (used when slice_size_type=1 or slice_size_type=3)
169 * @ir_param_option: defines the number of macroblocks per frame to be
170 * refreshed by AIR algorithm OR the refresh period
172 * @intra_refresh_type: enables the adaptive intra refresh algorithm.
173 * Disable=0 / Adaptative=1 and Cycle=2 as intra refresh
174 * @use_constrained_intra_flag: constrained_intra_pred_flag from PPS
175 * @transform_mode: controls the use of 4x4/8x8 transform mode
176 * @disable_deblocking_filter_idc:
177 * 0: specifies that all luma and chroma block edges of
178 * the slice are filtered.
179 * 1: specifies that deblocking is disabled for all block
180 * edges of the slice.
181 * 2: specifies that all luma and chroma block edges of
182 * the slice are filtered with exception of the block edges
183 * that coincide with slice boundaries
184 * @slice_alpha_c0_offset_div2: to be written in slice header,
185 * controls deblocking
186 * @slice_beta_offset_div2: to be written in slice header,
187 * controls deblocking
188 * @encoder_complexity: encoder complexity control (IME).
189 * 0 = I_16x16, P_16x16, Full ME Complexity
190 * 1 = I_16x16, I_NxN, P_16x16, Full ME Complexity
191 * 2 = I_16x16, I_NXN, P_16x16, P_WxH, Full ME Complexity
192 * 4 = I_16x16, P_16x16, Reduced ME Complexity
193 * 5 = I_16x16, I_NxN, P_16x16, Reduced ME Complexity
194 * 6 = I_16x16, I_NXN, P_16x16, P_WxH, Reduced ME Complexity
195 * @chroma_qp_index_offset: coming from picture parameter set
196 * (PPS see [H.264 STD] 7.4.2.2)
197 * @entropy_coding_mode: entropy coding mode.
200 * @brc_type: selects the bit-rate control algorithm
201 * 0 = constant Qp, (no BRC)
204 * @quant: Quantization param used in case of fix QP encoding (no BRC)
205 * @non_VCL_NALU_Size: size of non-VCL NALUs (SPS, PPS, filler),
207 * @cpb_buffer_size: size of Coded Picture Buffer, used by BRC
208 * @bit_rate: target bitrate, for BRC
209 * @qp_min: min QP threshold
210 * @qp_max: max QP threshold
211 * @framerate_num: target framerate numerator , used by BRC
212 * @framerate_den: target framerate denomurator , used by BRC
213 * @delay: End-to-End Initial Delay
214 * @strict_HRD_compliancy: flag for HDR compliancy (1)
215 * May impact quality encoding
216 * @addr_source_buffer: address of input frame buffer for current frame
217 * @addr_fwd_Ref_Buffer: address of reference frame buffer
218 * @addr_rec_buffer: address of reconstructed frame buffer
219 * @addr_output_bitstream_start: output bitstream start address
220 * @addr_output_bitstream_end: output bitstream end address
221 * @addr_external_sw : address of external search window
222 * @addr_lctx : address of context picture buffer
223 * @addr_local_rec_buffer: address of local reconstructed buffer
224 * @addr_spatial_context: address of spatial context buffer
225 * @bitstream_offset: offset in bits between aligned bitstream start
226 * address and first bit to be written by HVA.
227 * Range value is [0..63]
228 * @sampling_mode: Input picture format .
229 * 0: YUV420 semi_planar Interleaved
230 * 1: YUV422 raster Interleaved
231 * @addr_param_out: address of output parameters structure
232 * @addr_scaling_matrix: address to the coefficient of
233 * the inverse scaling matrix
234 * @addr_scaling_matrix_dir: address to the coefficient of
235 * the direct scaling matrix
236 * @addr_cabac_context_buffer: address of cabac context buffer
237 * @GmvX: Input information about the horizontal global displacement of
238 * the encoded frame versus the previous one
239 * @GmvY: Input information about the vertical global displacement of
240 * the encoded frame versus the previous one
241 * @window_width: width in pixels of the window to be encoded inside
243 * @window_height: width in pixels of the window to be encoded inside
245 * @window_horizontal_offset: horizontal offset in pels for input window
247 * @window_vertical_offset: vertical offset in pels for input window
249 * @addr_roi: Map of QP offset for the Region of Interest algorithm and
250 * also used for Error map.
251 * Bit 0-6 used for qp offset (value -64 to 63).
252 * Bit 7 used to force intra
253 * @addr_slice_header: address to slice header
254 * @slice_header_size_in_bits: size in bits of the Slice header
255 * @slice_header_offset0: Slice header offset where to insert
257 * @slice_header_offset1: Slice header offset where to insert
259 * @slice_header_offset2: Slice header offset where to insert
261 * @slice_synchro_enable: enable "slice ready" interrupt after each slice
262 * @max_slice_number: Maximum number of slice in a frame
263 * (0 is strictly forbidden)
264 * @rgb2_yuv_y_coeff: Four coefficients (C0C1C2C3) to convert from RGB to
265 * YUV for the Y component.
266 * Y = C0*R + C1*G + C2*B + C3 (C0 is on byte 0)
267 * @rgb2_yuv_u_coeff: four coefficients (C0C1C2C3) to convert from RGB to
268 * YUV for the Y component.
269 * Y = C0*R + C1*G + C2*B + C3 (C0 is on byte 0)
270 * @rgb2_yuv_v_coeff: Four coefficients (C0C1C2C3) to convert from RGB to
271 * YUV for the U (Cb) component.
272 * U = C0*R + C1*G + C2*B + C3 (C0 is on byte 0)
273 * @slice_byte_size: maximum slice size in bytes
274 * (used when slice_size_type=2 or slice_size_type=3)
275 * @max_air_intra_mb_nb: Maximum number of intra macroblock in a frame
276 * for the AIR algorithm
277 * @brc_no_skip: Disable skipping in the Bitrate Controller
278 * @addr_brc_in_out_parameter: address of static buffer for BRC parameters
284 u16 picture_coding_type
;
286 u16 pic_order_cnt_type
;
287 u16 first_picture_in_sequence
;
292 u16 intra_refresh_type
;
293 u16 use_constrained_intra_flag
;
295 u16 disable_deblocking_filter_idc
;
296 s16 slice_alpha_c0_offset_div2
;
297 s16 slice_beta_offset_div2
;
298 u16 encoder_complexity
;
299 s16 chroma_qp_index_offset
;
300 u16 entropy_coding_mode
;
303 u32 non_vcl_nalu_size
;
311 u16 strict_hrd_compliancy
;
312 u32 addr_source_buffer
;
313 u32 addr_fwd_ref_buffer
;
315 u32 addr_output_bitstream_start
;
316 u32 addr_output_bitstream_end
;
317 u32 addr_external_sw
;
319 u32 addr_local_rec_buffer
;
320 u32 addr_spatial_context
;
321 u16 bitstream_offset
;
324 u32 addr_scaling_matrix
;
325 u32 addr_scaling_matrix_dir
;
326 u32 addr_cabac_context_buffer
;
333 u16 window_horizontal_offset
;
334 u16 window_vertical_offset
;
336 u32 addr_slice_header
;
337 u16 slice_header_size_in_bits
;
338 u16 slice_header_offset0
;
339 u16 slice_header_offset1
;
340 u16 slice_header_offset2
;
345 u16 slice_synchro_enable
;
346 u16 max_slice_number
;
347 u32 rgb2_yuv_y_coeff
;
348 u32 rgb2_yuv_u_coeff
;
349 u32 rgb2_yuv_v_coeff
;
351 u16 max_air_intra_mb_nb
;
353 u32 addr_temporal_context
;
354 u32 addr_brc_in_out_parameter
;
358 * struct hva_h264_slice_po
360 * @ slice_size: slice size
361 * @ slice_start_time: start time
362 * @ slice_stop_time: stop time
363 * @ slice_num: slice number
365 struct hva_h264_slice_po
{
367 u32 slice_start_time
;
375 * @ bitstream_size: bitstream size
376 * @ dct_bitstream_size: dtc bitstream size
377 * @ stuffing_bits: number of stuffing bits inserted by the encoder
378 * @ removal_time: removal time of current frame (nb of ticks 1/framerate)
379 * @ hvc_start_time: hvc start time
380 * @ hvc_stop_time: hvc stop time
381 * @ slice_count: slice count
385 u32 dct_bitstream_size
;
392 struct hva_h264_slice_po slice_params
[16];
395 struct hva_h264_task
{
396 struct hva_h264_td td
;
397 struct hva_h264_po po
;
401 * struct hva_h264_ctx
403 * @seq_info: sequence information buffer
404 * @ref_frame: reference frame buffer
405 * @rec_frame: reconstructed frame buffer
406 * @task: task descriptor
408 struct hva_h264_ctx
{
409 struct hva_buffer
*seq_info
;
410 struct hva_buffer
*ref_frame
;
411 struct hva_buffer
*rec_frame
;
412 struct hva_buffer
*task
;
415 static int hva_h264_fill_slice_header(struct hva_ctx
*pctx
,
416 u8
*slice_header_addr
,
417 struct hva_controls
*ctrls
,
425 * with this HVA hardware version, part of the slice header is computed
426 * on host and part by hardware.
427 * The part of host is precomputed and available through this array.
429 struct device
*dev
= ctx_to_dev(pctx
);
430 int cabac
= V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC
;
431 const unsigned char slice_header
[] = { 0x00, 0x00, 0x00, 0x01,
432 0x41, 0x34, 0x07, 0x00};
433 int idr_pic_id
= frame_num
% 2;
434 enum hva_picture_coding_type type
;
435 u32 frame_order
= frame_num
% ctrls
->gop_size
;
437 if (!(frame_num
% ctrls
->gop_size
))
438 type
= PICTURE_CODING_TYPE_I
;
440 type
= PICTURE_CODING_TYPE_P
;
442 memcpy(slice_header_addr
, slice_header
, sizeof(slice_header
));
445 *header_offset0
= 40;
446 *header_offset1
= 13;
449 if (type
== PICTURE_CODING_TYPE_I
) {
450 slice_header_addr
[4] = 0x65;
451 slice_header_addr
[5] = 0x11;
453 /* toggle the I frame */
454 if ((frame_num
/ ctrls
->gop_size
) % 2) {
456 *header_offset1
+= 4;
457 slice_header_addr
[6] = 0x04;
458 slice_header_addr
[7] = 0x70;
462 *header_offset1
+= 2;
463 slice_header_addr
[6] = 0x09;
464 slice_header_addr
[7] = 0xC0;
467 if (ctrls
->entropy_mode
== cabac
) {
469 *header_offset1
+= 1;
470 slice_header_addr
[7] = 0x80;
473 * update slice header with P frame order
474 * frame order is limited to 16 (coded on 4bits only)
476 slice_header_addr
[5] += ((frame_order
& 0x0C) >> 2);
477 slice_header_addr
[6] += ((frame_order
& 0x03) << 6);
481 "%s %s slice header order %d idrPicId %d header size %d\n",
482 pctx
->name
, __func__
, frame_order
, idr_pic_id
, *header_size
);
486 static int hva_h264_fill_data_nal(struct hva_ctx
*pctx
,
487 unsigned int stuffing_bytes
, u8
*addr
,
488 unsigned int stream_size
, unsigned int *size
)
490 struct device
*dev
= ctx_to_dev(pctx
);
491 const u8 start
[] = { 0x00, 0x00, 0x00, 0x01 };
493 dev_dbg(dev
, "%s %s stuffing bytes %d\n", pctx
->name
, __func__
,
496 if ((*size
+ stuffing_bytes
+ H264_FILLER_DATA_SIZE
) > stream_size
) {
497 dev_dbg(dev
, "%s %s too many stuffing bytes %d\n",
498 pctx
->name
, __func__
, stuffing_bytes
);
503 memcpy(addr
+ *size
, start
, sizeof(start
));
504 *size
+= sizeof(start
);
507 addr
[*size
] = NALU_TYPE_FILLER_DATA
;
510 memset(addr
+ *size
, 0xff, stuffing_bytes
);
511 *size
+= stuffing_bytes
;
519 static int hva_h264_fill_sei_nal(struct hva_ctx
*pctx
,
520 enum hva_h264_sei_payload_type type
,
523 struct device
*dev
= ctx_to_dev(pctx
);
524 const u8 start
[] = { 0x00, 0x00, 0x00, 0x01 };
525 struct hva_h264_stereo_video_sei info
;
530 memcpy(addr
+ *size
, start
, sizeof(start
));
531 *size
+= sizeof(start
);
534 addr
[*size
] = NALU_TYPE_SEI
;
542 case SEI_STEREO_VIDEO_INFO
:
543 memset(&info
, 0, sizeof(info
));
545 /* set to top/bottom frame packing arrangement */
546 info
.field_views_flag
= 1;
547 info
.top_field_is_left_view_flag
= 1;
554 msg
= info
.field_views_flag
<< offset
--;
556 if (info
.field_views_flag
) {
557 msg
|= info
.top_field_is_left_view_flag
<<
560 msg
|= info
.current_frame_is_left_view_flag
<<
562 msg
|= info
.next_frame_is_second_view_flag
<<
565 msg
|= info
.left_view_self_contained_flag
<< offset
--;
566 msg
|= info
.right_view_self_contained_flag
<< offset
--;
575 case SEI_BUFFERING_PERIOD
:
576 case SEI_PICTURE_TIMING
:
577 case SEI_FRAME_PACKING_ARRANGEMENT
:
579 dev_err(dev
, "%s sei nal type not supported %d\n",
585 static int hva_h264_prepare_task(struct hva_ctx
*pctx
,
586 struct hva_h264_task
*task
,
587 struct hva_frame
*frame
,
588 struct hva_stream
*stream
)
590 struct hva_dev
*hva
= ctx_to_hdev(pctx
);
591 struct device
*dev
= ctx_to_dev(pctx
);
592 struct hva_h264_ctx
*ctx
= (struct hva_h264_ctx
*)pctx
->priv
;
593 struct hva_buffer
*seq_info
= ctx
->seq_info
;
594 struct hva_buffer
*fwd_ref_frame
= ctx
->ref_frame
;
595 struct hva_buffer
*loc_rec_frame
= ctx
->rec_frame
;
596 struct hva_h264_td
*td
= &task
->td
;
597 struct hva_controls
*ctrls
= &pctx
->ctrls
;
598 struct v4l2_fract
*time_per_frame
= &pctx
->ctrls
.time_per_frame
;
599 int cavlc
= V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC
;
600 u32 frame_num
= pctx
->stream_num
;
601 u32 addr_esram
= hva
->esram_addr
;
602 enum v4l2_mpeg_video_h264_level level
;
603 dma_addr_t paddr
= 0;
604 u8
*slice_header_vaddr
;
605 u32 frame_width
= frame
->info
.aligned_width
;
606 u32 frame_height
= frame
->info
.aligned_height
;
607 u32 max_cpb_buffer_size
;
608 unsigned int payload
= stream
->bytesused
;
611 /* check width and height parameters */
612 if ((frame_width
> max(H264_MAX_SIZE_W
, H264_MAX_SIZE_H
)) ||
613 (frame_height
> max(H264_MAX_SIZE_W
, H264_MAX_SIZE_H
))) {
615 "%s width(%d) or height(%d) exceeds limits (%dx%d)\n",
616 pctx
->name
, frame_width
, frame_height
,
617 H264_MAX_SIZE_W
, H264_MAX_SIZE_H
);
618 pctx
->frame_errors
++;
622 level
= ctrls
->level
;
624 memset(td
, 0, sizeof(struct hva_h264_td
));
626 td
->frame_width
= frame_width
;
627 td
->frame_height
= frame_height
;
629 /* set frame alignement */
630 td
->window_width
= frame_width
;
631 td
->window_height
= frame_height
;
632 td
->window_horizontal_offset
= 0;
633 td
->window_vertical_offset
= 0;
635 td
->first_picture_in_sequence
= (!frame_num
) ? 1 : 0;
637 /* pic_order_cnt_type hard coded to '2' as only I & P frames */
638 td
->pic_order_cnt_type
= 2;
640 /* useConstrainedIntraFlag set to false for better coding efficiency */
641 td
->use_constrained_intra_flag
= false;
642 td
->brc_type
= (ctrls
->bitrate_mode
== V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
)
643 ? BRC_TYPE_CBR
: BRC_TYPE_VBR
;
645 td
->entropy_coding_mode
= (ctrls
->entropy_mode
== cavlc
) ? CAVLC
:
648 td
->bit_rate
= ctrls
->bitrate
;
650 /* set framerate, framerate = 1 n/ time per frame */
651 if (time_per_frame
->numerator
>= 536) {
653 * due to a hardware bug, framerate denominator can't exceed
654 * 536 (BRC overflow). Compute nearest framerate
656 td
->framerate_den
= 1;
657 td
->framerate_num
= (time_per_frame
->denominator
+
658 (time_per_frame
->numerator
>> 1) - 1) /
659 time_per_frame
->numerator
;
662 * update bitrate to introduce a correction due to
664 * new bitrate = (old bitrate * new framerate) / old framerate
666 td
->bit_rate
/= time_per_frame
->numerator
;
667 td
->bit_rate
*= time_per_frame
->denominator
;
668 td
->bit_rate
/= td
->framerate_num
;
670 td
->framerate_den
= time_per_frame
->numerator
;
671 td
->framerate_num
= time_per_frame
->denominator
;
674 /* compute maximum bitrate depending on profile */
675 if (ctrls
->profile
>= V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
)
676 max_bitrate
= h264_infos_list
[level
].max_bitrate
*
679 max_bitrate
= h264_infos_list
[level
].max_bitrate
*
680 H264_FACTOR_BASELINE
;
682 /* check if bitrate doesn't exceed max size */
683 if (td
->bit_rate
> max_bitrate
) {
685 "%s bitrate (%d) larger than level and profile allow, clip to %d\n",
686 pctx
->name
, td
->bit_rate
, max_bitrate
);
687 td
->bit_rate
= max_bitrate
;
690 /* convert cpb_buffer_size in bits */
691 td
->cpb_buffer_size
= ctrls
->cpb_size
* 8000;
693 /* compute maximum cpb buffer size depending on profile */
694 if (ctrls
->profile
>= V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
)
695 max_cpb_buffer_size
=
696 h264_infos_list
[level
].max_cpb_size
* H264_FACTOR_HIGH
;
698 max_cpb_buffer_size
=
699 h264_infos_list
[level
].max_cpb_size
* H264_FACTOR_BASELINE
;
701 /* check if cpb buffer size doesn't exceed max size */
702 if (td
->cpb_buffer_size
> max_cpb_buffer_size
) {
704 "%s cpb size larger than level %d allows, clip to %d\n",
705 pctx
->name
, td
->cpb_buffer_size
, max_cpb_buffer_size
);
706 td
->cpb_buffer_size
= max_cpb_buffer_size
;
709 /* enable skipping in the Bitrate Controller */
713 if ((ctrls
->bitrate_mode
== V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
) &&
715 td
->delay
= 1000 * (td
->cpb_buffer_size
/ td
->bit_rate
);
719 switch (frame
->info
.pixelformat
) {
720 case V4L2_PIX_FMT_NV12
:
721 td
->sampling_mode
= SAMPLING_MODE_NV12
;
723 case V4L2_PIX_FMT_NV21
:
724 td
->sampling_mode
= SAMPLING_MODE_NV21
;
727 dev_err(dev
, "%s invalid source pixel format\n",
729 pctx
->frame_errors
++;
734 * fill matrix color converter (RGB to YUV)
735 * Y = 0,299 R + 0,587 G + 0,114 B
736 * Cb = -0,1687 R -0,3313 G + 0,5 B + 128
737 * Cr = 0,5 R - 0,4187 G - 0,0813 B + 128
739 td
->rgb2_yuv_y_coeff
= 0x12031008;
740 td
->rgb2_yuv_u_coeff
= 0x800EF7FB;
741 td
->rgb2_yuv_v_coeff
= 0x80FEF40E;
743 /* enable/disable transform mode */
744 td
->transform_mode
= ctrls
->dct8x8
;
746 /* encoder complexity fix to 2, ENCODE_I_16x16_I_NxN_P_16x16_P_WxH */
747 td
->encoder_complexity
= 2;
749 /* quant fix to 28, default VBR value */
752 if (td
->framerate_den
== 0) {
753 dev_err(dev
, "%s invalid framerate\n", pctx
->name
);
754 pctx
->frame_errors
++;
758 /* if automatic framerate, deactivate bitrate controller */
759 if (td
->framerate_num
== 0)
762 /* compliancy fix to true */
763 td
->strict_hrd_compliancy
= 1;
765 /* set minimum & maximum quantizers */
766 td
->qp_min
= clamp_val(ctrls
->qpmin
, 0, 51);
767 td
->qp_max
= clamp_val(ctrls
->qpmax
, 0, 51);
769 td
->addr_source_buffer
= frame
->paddr
;
770 td
->addr_fwd_ref_buffer
= fwd_ref_frame
->paddr
;
771 td
->addr_rec_buffer
= loc_rec_frame
->paddr
;
773 td
->addr_output_bitstream_end
= (u32
)stream
->paddr
+ stream
->size
;
775 td
->addr_output_bitstream_start
= (u32
)stream
->paddr
;
776 td
->bitstream_offset
= (((u32
)stream
->paddr
& 0xF) << 3) &
777 BITSTREAM_OFFSET_MASK
;
779 td
->addr_param_out
= (u32
)ctx
->task
->paddr
+
780 offsetof(struct hva_h264_task
, po
);
782 /* swap spatial and temporal context */
784 paddr
= seq_info
->paddr
;
785 td
->addr_spatial_context
= ALIGN(paddr
, 0x100);
786 paddr
= seq_info
->paddr
+ DATA_SIZE(frame_width
,
788 td
->addr_temporal_context
= ALIGN(paddr
, 0x100);
790 paddr
= seq_info
->paddr
;
791 td
->addr_temporal_context
= ALIGN(paddr
, 0x100);
792 paddr
= seq_info
->paddr
+ DATA_SIZE(frame_width
,
794 td
->addr_spatial_context
= ALIGN(paddr
, 0x100);
797 paddr
= seq_info
->paddr
+ 2 * DATA_SIZE(frame_width
, frame_height
);
799 td
->addr_brc_in_out_parameter
= ALIGN(paddr
, 0x100);
801 paddr
= td
->addr_brc_in_out_parameter
+ BRC_DATA_SIZE
;
802 td
->addr_slice_header
= ALIGN(paddr
, 0x100);
803 td
->addr_external_sw
= ALIGN(addr_esram
, 0x100);
805 addr_esram
+= SEARCH_WINDOW_BUFFER_MAX_SIZE(frame_width
);
806 td
->addr_local_rec_buffer
= ALIGN(addr_esram
, 0x100);
808 addr_esram
+= LOCAL_RECONSTRUCTED_BUFFER_MAX_SIZE(frame_width
);
809 td
->addr_lctx
= ALIGN(addr_esram
, 0x100);
811 addr_esram
+= CTX_MB_BUFFER_MAX_SIZE(max(frame_width
, frame_height
));
812 td
->addr_cabac_context_buffer
= ALIGN(addr_esram
, 0x100);
814 if (!(frame_num
% ctrls
->gop_size
)) {
815 td
->picture_coding_type
= PICTURE_CODING_TYPE_I
;
816 stream
->vbuf
.flags
|= V4L2_BUF_FLAG_KEYFRAME
;
818 td
->picture_coding_type
= PICTURE_CODING_TYPE_P
;
819 stream
->vbuf
.flags
&= ~V4L2_BUF_FLAG_KEYFRAME
;
822 /* fill the slice header part */
823 slice_header_vaddr
= seq_info
->vaddr
+ (td
->addr_slice_header
-
826 hva_h264_fill_slice_header(pctx
, slice_header_vaddr
, ctrls
, frame_num
,
827 &td
->slice_header_size_in_bits
,
828 &td
->slice_header_offset0
,
829 &td
->slice_header_offset1
,
830 &td
->slice_header_offset2
);
832 td
->chroma_qp_index_offset
= 2;
833 td
->slice_synchro_enable
= 0;
834 td
->max_slice_number
= 1;
837 * check the sps/pps header size for key frame only
838 * sps/pps header was previously fill by libv4l
839 * during qbuf of stream buffer
841 if ((stream
->vbuf
.flags
== V4L2_BUF_FLAG_KEYFRAME
) &&
842 (payload
> MAX_SPS_PPS_SIZE
)) {
843 dev_err(dev
, "%s invalid sps/pps size %d\n", pctx
->name
,
845 pctx
->frame_errors
++;
849 if (stream
->vbuf
.flags
!= V4L2_BUF_FLAG_KEYFRAME
)
852 /* add SEI nal (video stereo info) */
853 if (ctrls
->sei_fp
&& hva_h264_fill_sei_nal(pctx
, SEI_STEREO_VIDEO_INFO
,
856 dev_err(dev
, "%s fail to get SEI nal\n", pctx
->name
);
857 pctx
->frame_errors
++;
861 /* fill size of non-VCL NAL units (SPS, PPS, filler and SEI) */
862 td
->non_vcl_nalu_size
= payload
* 8;
864 /* compute bitstream offset & new start address of bitstream */
865 td
->addr_output_bitstream_start
+= ((payload
>> 4) << 4);
866 td
->bitstream_offset
+= (payload
- ((payload
>> 4) << 4)) * 8;
868 stream
->bytesused
= payload
;
873 static unsigned int hva_h264_get_stream_size(struct hva_h264_task
*task
)
875 struct hva_h264_po
*po
= &task
->po
;
877 return po
->bitstream_size
;
880 static u32
hva_h264_get_stuffing_bytes(struct hva_h264_task
*task
)
882 struct hva_h264_po
*po
= &task
->po
;
884 return po
->stuffing_bits
>> 3;
887 static int hva_h264_open(struct hva_ctx
*pctx
)
889 struct device
*dev
= ctx_to_dev(pctx
);
890 struct hva_h264_ctx
*ctx
;
891 struct hva_dev
*hva
= ctx_to_hdev(pctx
);
892 u32 frame_width
= pctx
->frameinfo
.aligned_width
;
893 u32 frame_height
= pctx
->frameinfo
.aligned_height
;
897 /* check esram size necessary to encode a frame */
898 size
= SEARCH_WINDOW_BUFFER_MAX_SIZE(frame_width
) +
899 LOCAL_RECONSTRUCTED_BUFFER_MAX_SIZE(frame_width
) +
900 CTX_MB_BUFFER_MAX_SIZE(max(frame_width
, frame_height
)) +
901 CABAC_CONTEXT_BUFFER_MAX_SIZE(frame_width
);
903 if (hva
->esram_size
< size
) {
904 dev_err(dev
, "%s not enough esram (max:%d request:%d)\n",
905 pctx
->name
, hva
->esram_size
, size
);
910 /* allocate context for codec */
911 ctx
= devm_kzalloc(dev
, sizeof(*ctx
), GFP_KERNEL
);
917 /* allocate sequence info buffer */
918 ret
= hva_mem_alloc(pctx
,
919 2 * DATA_SIZE(frame_width
, frame_height
) +
926 "%s failed to allocate sequence info buffer\n",
931 /* allocate reference frame buffer */
932 ret
= hva_mem_alloc(pctx
,
933 frame_width
* frame_height
* 3 / 2,
934 "hva reference frame",
937 dev_err(dev
, "%s failed to allocate reference frame buffer\n",
942 /* allocate reconstructed frame buffer */
943 ret
= hva_mem_alloc(pctx
,
944 frame_width
* frame_height
* 3 / 2,
945 "hva reconstructed frame",
949 "%s failed to allocate reconstructed frame buffer\n",
954 /* allocate task descriptor */
955 ret
= hva_mem_alloc(pctx
,
956 sizeof(struct hva_h264_task
),
957 "hva task descriptor",
961 "%s failed to allocate task descriptor\n",
966 pctx
->priv
= (void *)ctx
;
971 hva_mem_free(pctx
, ctx
->rec_frame
);
973 hva_mem_free(pctx
, ctx
->ref_frame
);
975 hva_mem_free(pctx
, ctx
->seq_info
);
977 devm_kfree(dev
, ctx
);
983 static int hva_h264_close(struct hva_ctx
*pctx
)
985 struct hva_h264_ctx
*ctx
= (struct hva_h264_ctx
*)pctx
->priv
;
986 struct device
*dev
= ctx_to_dev(pctx
);
989 hva_mem_free(pctx
, ctx
->seq_info
);
992 hva_mem_free(pctx
, ctx
->ref_frame
);
995 hva_mem_free(pctx
, ctx
->rec_frame
);
998 hva_mem_free(pctx
, ctx
->task
);
1000 devm_kfree(dev
, ctx
);
1005 static int hva_h264_encode(struct hva_ctx
*pctx
, struct hva_frame
*frame
,
1006 struct hva_stream
*stream
)
1008 struct hva_h264_ctx
*ctx
= (struct hva_h264_ctx
*)pctx
->priv
;
1009 struct hva_h264_task
*task
= (struct hva_h264_task
*)ctx
->task
->vaddr
;
1010 u32 stuffing_bytes
= 0;
1013 ret
= hva_h264_prepare_task(pctx
, task
, frame
, stream
);
1017 ret
= hva_hw_execute_task(pctx
, H264_ENC
, ctx
->task
);
1022 stream
->bytesused
+= hva_h264_get_stream_size(task
);
1024 stuffing_bytes
= hva_h264_get_stuffing_bytes(task
);
1027 hva_h264_fill_data_nal(pctx
, stuffing_bytes
,
1028 (u8
*)stream
->vaddr
,
1030 &stream
->bytesused
);
1032 /* switch reference & reconstructed frame */
1033 swap(ctx
->ref_frame
, ctx
->rec_frame
);
1037 stream
->bytesused
= 0;
1041 const struct hva_enc nv12h264enc
= {
1042 .name
= "H264(NV12)",
1043 .pixelformat
= V4L2_PIX_FMT_NV12
,
1044 .streamformat
= V4L2_PIX_FMT_H264
,
1045 .max_width
= H264_MAX_SIZE_W
,
1046 .max_height
= H264_MAX_SIZE_H
,
1047 .open
= hva_h264_open
,
1048 .close
= hva_h264_close
,
1049 .encode
= hva_h264_encode
,
1052 const struct hva_enc nv21h264enc
= {
1053 .name
= "H264(NV21)",
1054 .pixelformat
= V4L2_PIX_FMT_NV21
,
1055 .streamformat
= V4L2_PIX_FMT_H264
,
1056 .max_width
= H264_MAX_SIZE_W
,
1057 .max_height
= H264_MAX_SIZE_H
,
1058 .open
= hva_h264_open
,
1059 .close
= hva_h264_close
,
1060 .encode
= hva_h264_encode
,