[PATCH v2 1/3] media: venus: Reorder encoder property setting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Configure the generic controls before the codec specific ones.
Some codec specific controls can override the generic ones.

Signed-off-by: Fritz Koenig <frkoenig@xxxxxxxxxxxx>
---
v2:
- requested testing methodology added to cover letter

 drivers/media/platform/qcom/venus/venc.c | 183 +++++++++++------------
 1 file changed, 91 insertions(+), 92 deletions(-)

diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
index 3ec2fb8d9fab..ae24de125c56 100644
--- a/drivers/media/platform/qcom/venus/venc.c
+++ b/drivers/media/platform/qcom/venus/venc.c
@@ -688,98 +688,6 @@ static int venc_set_properties(struct venus_inst *inst)
 	if (ret)
 		return ret;
 
-	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H264) {
-		struct hfi_h264_vui_timing_info info;
-		struct hfi_h264_entropy_control entropy;
-		struct hfi_h264_db_control deblock;
-		struct hfi_h264_8x8_transform h264_transform;
-
-		ptype = HFI_PROPERTY_PARAM_VENC_H264_VUI_TIMING_INFO;
-		info.enable = 1;
-		info.fixed_framerate = 1;
-		info.time_scale = NSEC_PER_SEC;
-
-		ret = hfi_session_set_property(inst, ptype, &info);
-		if (ret)
-			return ret;
-
-		ptype = HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL;
-		entropy.entropy_mode = venc_v4l2_to_hfi(
-					  V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE,
-					  ctr->h264_entropy_mode);
-		entropy.cabac_model = HFI_H264_CABAC_MODEL_0;
-
-		ret = hfi_session_set_property(inst, ptype, &entropy);
-		if (ret)
-			return ret;
-
-		ptype = HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL;
-		deblock.mode = venc_v4l2_to_hfi(
-				      V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
-				      ctr->h264_loop_filter_mode);
-		deblock.slice_alpha_offset = ctr->h264_loop_filter_alpha;
-		deblock.slice_beta_offset = ctr->h264_loop_filter_beta;
-
-		ret = hfi_session_set_property(inst, ptype, &deblock);
-		if (ret)
-			return ret;
-
-		ptype = HFI_PROPERTY_PARAM_VENC_H264_TRANSFORM_8X8;
-		h264_transform.enable_type = 0;
-		if (ctr->profile.h264 == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH ||
-		    ctr->profile.h264 == V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH)
-			h264_transform.enable_type = ctr->h264_8x8_transform;
-
-		ret = hfi_session_set_property(inst, ptype, &h264_transform);
-		if (ret)
-			return ret;
-
-	}
-
-	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H264 ||
-	    inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
-		/* IDR periodicity, n:
-		 * n = 0 - only the first I-frame is IDR frame
-		 * n = 1 - all I-frames will be IDR frames
-		 * n > 1 - every n-th I-frame will be IDR frame
-		 */
-		ptype = HFI_PROPERTY_CONFIG_VENC_IDR_PERIOD;
-		idrp.idr_period = 0;
-		ret = hfi_session_set_property(inst, ptype, &idrp);
-		if (ret)
-			return ret;
-	}
-
-	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC &&
-	    ctr->profile.hevc == V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10) {
-		struct hfi_hdr10_pq_sei hdr10;
-		unsigned int c;
-
-		ptype = HFI_PROPERTY_PARAM_VENC_HDR10_PQ_SEI;
-
-		for (c = 0; c < 3; c++) {
-			hdr10.mastering.display_primaries_x[c] =
-				ctr->mastering.display_primaries_x[c];
-			hdr10.mastering.display_primaries_y[c] =
-				ctr->mastering.display_primaries_y[c];
-		}
-
-		hdr10.mastering.white_point_x = ctr->mastering.white_point_x;
-		hdr10.mastering.white_point_y = ctr->mastering.white_point_y;
-		hdr10.mastering.max_display_mastering_luminance =
-			ctr->mastering.max_display_mastering_luminance;
-		hdr10.mastering.min_display_mastering_luminance =
-			ctr->mastering.min_display_mastering_luminance;
-
-		hdr10.cll.max_content_light = ctr->cll.max_content_light_level;
-		hdr10.cll.max_pic_average_light =
-			ctr->cll.max_pic_average_light_level;
-
-		ret = hfi_session_set_property(inst, ptype, &hdr10);
-		if (ret)
-			return ret;
-	}
-
 	if (ctr->num_b_frames) {
 		u32 max_num_b_frames = NUM_B_FRAMES_MAX;
 
@@ -922,6 +830,97 @@ static int venc_set_properties(struct venus_inst *inst)
 	if (ret)
 		return ret;
 
+	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H264) {
+		struct hfi_h264_vui_timing_info info;
+		struct hfi_h264_entropy_control entropy;
+		struct hfi_h264_db_control deblock;
+		struct hfi_h264_8x8_transform h264_transform;
+
+		ptype = HFI_PROPERTY_PARAM_VENC_H264_VUI_TIMING_INFO;
+		info.enable = 1;
+		info.fixed_framerate = 1;
+		info.time_scale = NSEC_PER_SEC;
+
+		ret = hfi_session_set_property(inst, ptype, &info);
+		if (ret)
+			return ret;
+
+		ptype = HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL;
+		entropy.entropy_mode = venc_v4l2_to_hfi(
+					  V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE,
+					  ctr->h264_entropy_mode);
+		entropy.cabac_model = HFI_H264_CABAC_MODEL_0;
+
+		ret = hfi_session_set_property(inst, ptype, &entropy);
+		if (ret)
+			return ret;
+
+		ptype = HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL;
+		deblock.mode = venc_v4l2_to_hfi(
+				      V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
+				      ctr->h264_loop_filter_mode);
+		deblock.slice_alpha_offset = ctr->h264_loop_filter_alpha;
+		deblock.slice_beta_offset = ctr->h264_loop_filter_beta;
+
+		ret = hfi_session_set_property(inst, ptype, &deblock);
+		if (ret)
+			return ret;
+
+		ptype = HFI_PROPERTY_PARAM_VENC_H264_TRANSFORM_8X8;
+		h264_transform.enable_type = 0;
+		if (ctr->profile.h264 == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH ||
+		    ctr->profile.h264 == V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH)
+			h264_transform.enable_type = ctr->h264_8x8_transform;
+
+		ret = hfi_session_set_property(inst, ptype, &h264_transform);
+		if (ret)
+			return ret;
+	}
+
+	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H264 ||
+	    inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
+		/* IDR periodicity, n:
+		 * n = 0 - only the first I-frame is IDR frame
+		 * n = 1 - all I-frames will be IDR frames
+		 * n > 1 - every n-th I-frame will be IDR frame
+		 */
+		ptype = HFI_PROPERTY_CONFIG_VENC_IDR_PERIOD;
+		idrp.idr_period = 0;
+		ret = hfi_session_set_property(inst, ptype, &idrp);
+		if (ret)
+			return ret;
+	}
+
+	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC &&
+	    ctr->profile.hevc == V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10) {
+		struct hfi_hdr10_pq_sei hdr10;
+		unsigned int c;
+
+		ptype = HFI_PROPERTY_PARAM_VENC_HDR10_PQ_SEI;
+
+		for (c = 0; c < 3; c++) {
+			hdr10.mastering.display_primaries_x[c] =
+				ctr->mastering.display_primaries_x[c];
+			hdr10.mastering.display_primaries_y[c] =
+				ctr->mastering.display_primaries_y[c];
+		}
+
+		hdr10.mastering.white_point_x = ctr->mastering.white_point_x;
+		hdr10.mastering.white_point_y = ctr->mastering.white_point_y;
+		hdr10.mastering.max_display_mastering_luminance =
+			ctr->mastering.max_display_mastering_luminance;
+		hdr10.mastering.min_display_mastering_luminance =
+			ctr->mastering.min_display_mastering_luminance;
+
+		hdr10.cll.max_content_light = ctr->cll.max_content_light_level;
+		hdr10.cll.max_pic_average_light =
+			ctr->cll.max_pic_average_light_level;
+
+		ret = hfi_session_set_property(inst, ptype, &hdr10);
+		if (ret)
+			return ret;
+	}
+
 	switch (inst->hfi_codec) {
 	case HFI_VIDEO_CODEC_H264:
 		profile = ctr->profile.h264;
-- 
2.46.0.rc1.232.g9752f9e123-goog





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux