Lines Matching +full:max +full:- +full:bitrate

1 // SPDX-License-Identifier: GPL-2.0
9 #include "hva-hw.h"
15 /* video max size*/
32 /* source buffer copy in YUV 420 MB-tiled format with size=16*256*3/2 */
41 /* factor for bitrate and cpb buffer size max values if profile >= high */
44 /* factor for bitrate and cpb buffer size max values if profile < high */
200 * @brc_type: selects the bit-rate control algorithm
205 * @non_VCL_NALU_Size: size of non-VCL NALUs (SPS, PPS, filler),
208 * @bit_rate: target bitrate, for BRC
210 * @qp_max: max QP threshold
213 * @delay: End-to-End Initial Delay
251 * Bit 0-6 used for qp offset (value -64 to 63).
277 * @brc_no_skip: Disable skipping in the Bitrate Controller
435 u32 frame_order = frame_num % ctrls->gop_size; in hva_h264_fill_slice_header()
437 if (!(frame_num % ctrls->gop_size)) in hva_h264_fill_slice_header()
454 if ((frame_num / ctrls->gop_size) % 2) { in hva_h264_fill_slice_header()
467 if (ctrls->entropy_mode == cabac) { in hva_h264_fill_slice_header()
482 pctx->name, __func__, frame_order, idr_pic_id, *header_size); in hva_h264_fill_slice_header()
493 dev_dbg(dev, "%s %s stuffing bytes %d\n", pctx->name, __func__, in hva_h264_fill_data_nal()
498 pctx->name, __func__, stuffing_bytes); in hva_h264_fill_data_nal()
554 msg = info.field_views_flag << offset--; in hva_h264_fill_sei_nal()
558 offset--; in hva_h264_fill_sei_nal()
561 offset--; in hva_h264_fill_sei_nal()
563 offset--; in hva_h264_fill_sei_nal()
565 msg |= info.left_view_self_contained_flag << offset--; in hva_h264_fill_sei_nal()
566 msg |= info.right_view_self_contained_flag << offset--; in hva_h264_fill_sei_nal()
580 pctx->name, type); in hva_h264_fill_sei_nal()
581 return -EINVAL; in hva_h264_fill_sei_nal()
592 struct hva_h264_ctx *ctx = (struct hva_h264_ctx *)pctx->priv; in hva_h264_prepare_task()
593 struct hva_buffer *seq_info = ctx->seq_info; in hva_h264_prepare_task()
594 struct hva_buffer *fwd_ref_frame = ctx->ref_frame; in hva_h264_prepare_task()
595 struct hva_buffer *loc_rec_frame = ctx->rec_frame; in hva_h264_prepare_task()
596 struct hva_h264_td *td = &task->td; in hva_h264_prepare_task()
597 struct hva_controls *ctrls = &pctx->ctrls; in hva_h264_prepare_task()
598 struct v4l2_fract *time_per_frame = &pctx->ctrls.time_per_frame; in hva_h264_prepare_task()
600 u32 frame_num = pctx->stream_num; in hva_h264_prepare_task()
601 u32 addr_esram = hva->esram_addr; in hva_h264_prepare_task()
605 u32 frame_width = frame->info.aligned_width; in hva_h264_prepare_task()
606 u32 frame_height = frame->info.aligned_height; in hva_h264_prepare_task()
608 unsigned int payload = stream->bytesused; in hva_h264_prepare_task()
612 if ((frame_width > max(H264_MAX_SIZE_W, H264_MAX_SIZE_H)) || in hva_h264_prepare_task()
613 (frame_height > max(H264_MAX_SIZE_W, H264_MAX_SIZE_H))) { in hva_h264_prepare_task()
616 pctx->name, frame_width, frame_height, in hva_h264_prepare_task()
618 pctx->frame_errors++; in hva_h264_prepare_task()
619 return -EINVAL; in hva_h264_prepare_task()
622 level = ctrls->level; in hva_h264_prepare_task()
626 td->frame_width = frame_width; in hva_h264_prepare_task()
627 td->frame_height = frame_height; in hva_h264_prepare_task()
630 td->window_width = frame_width; in hva_h264_prepare_task()
631 td->window_height = frame_height; in hva_h264_prepare_task()
632 td->window_horizontal_offset = 0; in hva_h264_prepare_task()
633 td->window_vertical_offset = 0; in hva_h264_prepare_task()
635 td->first_picture_in_sequence = (!frame_num) ? 1 : 0; in hva_h264_prepare_task()
638 td->pic_order_cnt_type = 2; in hva_h264_prepare_task()
641 td->use_constrained_intra_flag = false; in hva_h264_prepare_task()
642 td->brc_type = (ctrls->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) in hva_h264_prepare_task()
645 td->entropy_coding_mode = (ctrls->entropy_mode == cavlc) ? CAVLC : in hva_h264_prepare_task()
648 td->bit_rate = ctrls->bitrate; in hva_h264_prepare_task()
651 if (time_per_frame->numerator >= 536) { in hva_h264_prepare_task()
656 td->framerate_den = 1; in hva_h264_prepare_task()
657 td->framerate_num = (time_per_frame->denominator + in hva_h264_prepare_task()
658 (time_per_frame->numerator >> 1) - 1) / in hva_h264_prepare_task()
659 time_per_frame->numerator; in hva_h264_prepare_task()
662 * update bitrate to introduce a correction due to in hva_h264_prepare_task()
664 * new bitrate = (old bitrate * new framerate) / old framerate in hva_h264_prepare_task()
666 td->bit_rate /= time_per_frame->numerator; in hva_h264_prepare_task()
667 td->bit_rate *= time_per_frame->denominator; in hva_h264_prepare_task()
668 td->bit_rate /= td->framerate_num; in hva_h264_prepare_task()
670 td->framerate_den = time_per_frame->numerator; in hva_h264_prepare_task()
671 td->framerate_num = time_per_frame->denominator; in hva_h264_prepare_task()
674 /* compute maximum bitrate depending on profile */ in hva_h264_prepare_task()
675 if (ctrls->profile >= V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) in hva_h264_prepare_task()
682 /* check if bitrate doesn't exceed max size */ in hva_h264_prepare_task()
683 if (td->bit_rate > max_bitrate) { in hva_h264_prepare_task()
685 "%s bitrate (%d) larger than level and profile allow, clip to %d\n", in hva_h264_prepare_task()
686 pctx->name, td->bit_rate, max_bitrate); in hva_h264_prepare_task()
687 td->bit_rate = max_bitrate; in hva_h264_prepare_task()
691 td->cpb_buffer_size = ctrls->cpb_size * 8000; in hva_h264_prepare_task()
694 if (ctrls->profile >= V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) in hva_h264_prepare_task()
701 /* check if cpb buffer size doesn't exceed max size */ in hva_h264_prepare_task()
702 if (td->cpb_buffer_size > max_cpb_buffer_size) { in hva_h264_prepare_task()
705 pctx->name, td->cpb_buffer_size, max_cpb_buffer_size); in hva_h264_prepare_task()
706 td->cpb_buffer_size = max_cpb_buffer_size; in hva_h264_prepare_task()
709 /* enable skipping in the Bitrate Controller */ in hva_h264_prepare_task()
710 td->brc_no_skip = 0; in hva_h264_prepare_task()
713 if ((ctrls->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) && in hva_h264_prepare_task()
714 td->bit_rate) in hva_h264_prepare_task()
715 td->delay = 1000 * (td->cpb_buffer_size / td->bit_rate); in hva_h264_prepare_task()
717 td->delay = 0; in hva_h264_prepare_task()
719 switch (frame->info.pixelformat) { in hva_h264_prepare_task()
721 td->sampling_mode = SAMPLING_MODE_NV12; in hva_h264_prepare_task()
724 td->sampling_mode = SAMPLING_MODE_NV21; in hva_h264_prepare_task()
728 pctx->name); in hva_h264_prepare_task()
729 pctx->frame_errors++; in hva_h264_prepare_task()
730 return -EINVAL; in hva_h264_prepare_task()
736 * Cb = -0,1687 R -0,3313 G + 0,5 B + 128 in hva_h264_prepare_task()
737 * Cr = 0,5 R - 0,4187 G - 0,0813 B + 128 in hva_h264_prepare_task()
739 td->rgb2_yuv_y_coeff = 0x12031008; in hva_h264_prepare_task()
740 td->rgb2_yuv_u_coeff = 0x800EF7FB; in hva_h264_prepare_task()
741 td->rgb2_yuv_v_coeff = 0x80FEF40E; in hva_h264_prepare_task()
744 td->transform_mode = ctrls->dct8x8; in hva_h264_prepare_task()
747 td->encoder_complexity = 2; in hva_h264_prepare_task()
750 td->quant = 28; in hva_h264_prepare_task()
752 if (td->framerate_den == 0) { in hva_h264_prepare_task()
753 dev_err(dev, "%s invalid framerate\n", pctx->name); in hva_h264_prepare_task()
754 pctx->frame_errors++; in hva_h264_prepare_task()
755 return -EINVAL; in hva_h264_prepare_task()
758 /* if automatic framerate, deactivate bitrate controller */ in hva_h264_prepare_task()
759 if (td->framerate_num == 0) in hva_h264_prepare_task()
760 td->brc_type = 0; in hva_h264_prepare_task()
763 td->strict_hrd_compliancy = 1; in hva_h264_prepare_task()
766 td->qp_min = clamp_val(ctrls->qpmin, 0, 51); in hva_h264_prepare_task()
767 td->qp_max = clamp_val(ctrls->qpmax, 0, 51); in hva_h264_prepare_task()
769 td->addr_source_buffer = frame->paddr; in hva_h264_prepare_task()
770 td->addr_fwd_ref_buffer = fwd_ref_frame->paddr; in hva_h264_prepare_task()
771 td->addr_rec_buffer = loc_rec_frame->paddr; in hva_h264_prepare_task()
773 td->addr_output_bitstream_end = (u32)stream->paddr + stream->size; in hva_h264_prepare_task()
775 td->addr_output_bitstream_start = (u32)stream->paddr; in hva_h264_prepare_task()
776 td->bitstream_offset = (((u32)stream->paddr & 0xF) << 3) & in hva_h264_prepare_task()
779 td->addr_param_out = (u32)ctx->task->paddr + in hva_h264_prepare_task()
784 paddr = seq_info->paddr; in hva_h264_prepare_task()
785 td->addr_spatial_context = ALIGN(paddr, 0x100); in hva_h264_prepare_task()
786 paddr = seq_info->paddr + DATA_SIZE(frame_width, in hva_h264_prepare_task()
788 td->addr_temporal_context = ALIGN(paddr, 0x100); in hva_h264_prepare_task()
790 paddr = seq_info->paddr; in hva_h264_prepare_task()
791 td->addr_temporal_context = ALIGN(paddr, 0x100); in hva_h264_prepare_task()
792 paddr = seq_info->paddr + DATA_SIZE(frame_width, in hva_h264_prepare_task()
794 td->addr_spatial_context = ALIGN(paddr, 0x100); in hva_h264_prepare_task()
797 paddr = seq_info->paddr + 2 * DATA_SIZE(frame_width, frame_height); in hva_h264_prepare_task()
799 td->addr_brc_in_out_parameter = ALIGN(paddr, 0x100); in hva_h264_prepare_task()
801 paddr = td->addr_brc_in_out_parameter + BRC_DATA_SIZE; in hva_h264_prepare_task()
802 td->addr_slice_header = ALIGN(paddr, 0x100); in hva_h264_prepare_task()
803 td->addr_external_sw = ALIGN(addr_esram, 0x100); in hva_h264_prepare_task()
806 td->addr_local_rec_buffer = ALIGN(addr_esram, 0x100); in hva_h264_prepare_task()
809 td->addr_lctx = ALIGN(addr_esram, 0x100); in hva_h264_prepare_task()
811 addr_esram += CTX_MB_BUFFER_MAX_SIZE(max(frame_width, frame_height)); in hva_h264_prepare_task()
812 td->addr_cabac_context_buffer = ALIGN(addr_esram, 0x100); in hva_h264_prepare_task()
814 if (!(frame_num % ctrls->gop_size)) { in hva_h264_prepare_task()
815 td->picture_coding_type = PICTURE_CODING_TYPE_I; in hva_h264_prepare_task()
816 stream->vbuf.flags |= V4L2_BUF_FLAG_KEYFRAME; in hva_h264_prepare_task()
818 td->picture_coding_type = PICTURE_CODING_TYPE_P; in hva_h264_prepare_task()
819 stream->vbuf.flags &= ~V4L2_BUF_FLAG_KEYFRAME; in hva_h264_prepare_task()
823 slice_header_vaddr = seq_info->vaddr + (td->addr_slice_header - in hva_h264_prepare_task()
824 seq_info->paddr); in hva_h264_prepare_task()
827 &td->slice_header_size_in_bits, in hva_h264_prepare_task()
828 &td->slice_header_offset0, in hva_h264_prepare_task()
829 &td->slice_header_offset1, in hva_h264_prepare_task()
830 &td->slice_header_offset2); in hva_h264_prepare_task()
832 td->chroma_qp_index_offset = 2; in hva_h264_prepare_task()
833 td->slice_synchro_enable = 0; in hva_h264_prepare_task()
834 td->max_slice_number = 1; in hva_h264_prepare_task()
841 if ((stream->vbuf.flags == V4L2_BUF_FLAG_KEYFRAME) && in hva_h264_prepare_task()
843 dev_err(dev, "%s invalid sps/pps size %d\n", pctx->name, in hva_h264_prepare_task()
845 pctx->frame_errors++; in hva_h264_prepare_task()
846 return -EINVAL; in hva_h264_prepare_task()
849 if (stream->vbuf.flags != V4L2_BUF_FLAG_KEYFRAME) in hva_h264_prepare_task()
853 if (ctrls->sei_fp && hva_h264_fill_sei_nal(pctx, SEI_STEREO_VIDEO_INFO, in hva_h264_prepare_task()
854 (u8 *)stream->vaddr, in hva_h264_prepare_task()
856 dev_err(dev, "%s fail to get SEI nal\n", pctx->name); in hva_h264_prepare_task()
857 pctx->frame_errors++; in hva_h264_prepare_task()
858 return -EINVAL; in hva_h264_prepare_task()
861 /* fill size of non-VCL NAL units (SPS, PPS, filler and SEI) */ in hva_h264_prepare_task()
862 td->non_vcl_nalu_size = payload * 8; in hva_h264_prepare_task()
865 td->addr_output_bitstream_start += ((payload >> 4) << 4); in hva_h264_prepare_task()
866 td->bitstream_offset += (payload - ((payload >> 4) << 4)) * 8; in hva_h264_prepare_task()
868 stream->bytesused = payload; in hva_h264_prepare_task()
875 struct hva_h264_po *po = &task->po; in hva_h264_get_stream_size()
877 return po->bitstream_size; in hva_h264_get_stream_size()
882 struct hva_h264_po *po = &task->po; in hva_h264_get_stuffing_bytes()
884 return po->stuffing_bits >> 3; in hva_h264_get_stuffing_bytes()
892 u32 frame_width = pctx->frameinfo.aligned_width; in hva_h264_open()
893 u32 frame_height = pctx->frameinfo.aligned_height; in hva_h264_open()
900 CTX_MB_BUFFER_MAX_SIZE(max(frame_width, frame_height)) + in hva_h264_open()
903 if (hva->esram_size < size) { in hva_h264_open()
904 dev_err(dev, "%s not enough esram (max:%d request:%d)\n", in hva_h264_open()
905 pctx->name, hva->esram_size, size); in hva_h264_open()
906 ret = -EINVAL; in hva_h264_open()
913 ret = -ENOMEM; in hva_h264_open()
923 &ctx->seq_info); in hva_h264_open()
927 pctx->name); in hva_h264_open()
935 &ctx->ref_frame); in hva_h264_open()
938 pctx->name); in hva_h264_open()
946 &ctx->rec_frame); in hva_h264_open()
950 pctx->name); in hva_h264_open()
958 &ctx->task); in hva_h264_open()
962 pctx->name); in hva_h264_open()
966 pctx->priv = (void *)ctx; in hva_h264_open()
971 hva_mem_free(pctx, ctx->rec_frame); in hva_h264_open()
973 hva_mem_free(pctx, ctx->ref_frame); in hva_h264_open()
975 hva_mem_free(pctx, ctx->seq_info); in hva_h264_open()
979 pctx->sys_errors++; in hva_h264_open()
985 struct hva_h264_ctx *ctx = (struct hva_h264_ctx *)pctx->priv; in hva_h264_close()
988 if (ctx->seq_info) in hva_h264_close()
989 hva_mem_free(pctx, ctx->seq_info); in hva_h264_close()
991 if (ctx->ref_frame) in hva_h264_close()
992 hva_mem_free(pctx, ctx->ref_frame); in hva_h264_close()
994 if (ctx->rec_frame) in hva_h264_close()
995 hva_mem_free(pctx, ctx->rec_frame); in hva_h264_close()
997 if (ctx->task) in hva_h264_close()
998 hva_mem_free(pctx, ctx->task); in hva_h264_close()
1008 struct hva_h264_ctx *ctx = (struct hva_h264_ctx *)pctx->priv; in hva_h264_encode()
1009 struct hva_h264_task *task = (struct hva_h264_task *)ctx->task->vaddr; in hva_h264_encode()
1017 ret = hva_hw_execute_task(pctx, H264_ENC, ctx->task); in hva_h264_encode()
1021 pctx->stream_num++; in hva_h264_encode()
1022 stream->bytesused += hva_h264_get_stream_size(task); in hva_h264_encode()
1028 (u8 *)stream->vaddr, in hva_h264_encode()
1029 stream->size, in hva_h264_encode()
1030 &stream->bytesused); in hva_h264_encode()
1033 swap(ctx->ref_frame, ctx->rec_frame); in hva_h264_encode()
1037 stream->bytesused = 0; in hva_h264_encode()