diff --git a/drivers/media/platform/msm/vidc/hfi_packetization.c b/drivers/media/platform/msm/vidc/hfi_packetization.c index 037c6f3b12ab..53de11d7abf1 100644 --- a/drivers/media/platform/msm/vidc/hfi_packetization.c +++ b/drivers/media/platform/msm/vidc/hfi_packetization.c @@ -2180,6 +2180,15 @@ int create_pkt_cmd_session_set_property( pkt->size += sizeof(u32) + sizeof(struct hfi_iframe_size); break; } + case HAL_PARAM_VENC_SEND_OUTPUT_FOR_SKIPPED_FRAME: + { + create_pkt_enable(pkt->rg_property_data, + HFI_PROPERTY_PARAM_VENC_SEND_OUTPUT_FOR_SKIPPED_FRAMES, + ((struct hal_enable *)pdata)->enable); + pkt->size += sizeof(u32) + sizeof(struct hfi_enable); + break; + } + /* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */ case HAL_CONFIG_BUFFER_REQUIREMENTS: case HAL_CONFIG_PRIORITY: diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c index 947ade9c99ed..ec6695a670b0 100644 --- a/drivers/media/platform/msm/vidc/msm_venc.c +++ b/drivers/media/platform/msm/vidc/msm_venc.c @@ -1423,7 +1423,16 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED)), .qmenu = iframe_sizes, }, - + { + .id = V4L2_CID_MPEG_VIDC_VIDEO_SEND_SKIPPED_FRAME, + .name = "Send encoder output buffer for skipped frames", + .type = V4L2_CTRL_TYPE_BOOLEAN, + .minimum = V4L2_MPEG_VIDC_VIDEO_SEND_SKIPPED_FRAME_DISABLE, + .maximum = V4L2_MPEG_VIDC_VIDEO_SEND_SKIPPED_FRAME_ENABLE, + .default_value = + V4L2_MPEG_VIDC_VIDEO_SEND_SKIPPED_FRAME_DISABLE, + .step = 1, + } }; #define NUM_CTRLS ARRAY_SIZE(msm_venc_ctrls) @@ -3712,6 +3721,25 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) ctrl->val); pdata = &iframesize_type; break; + case V4L2_CID_MPEG_VIDC_VIDEO_SEND_SKIPPED_FRAME: + property_id = HAL_PARAM_VENC_SEND_OUTPUT_FOR_SKIPPED_FRAME; + switch (ctrl->val) { + case V4L2_MPEG_VIDC_VIDEO_SEND_SKIPPED_FRAME_ENABLE: + enable.enable = 1; + break; + case V4L2_MPEG_VIDC_VIDEO_SEND_SKIPPED_FRAME_DISABLE: + enable.enable = 0; + break; + default: + dprintk(VIDC_ERR, + "Invalid send skipped frames control value %d\n", + ctrl->val); + rc = -ENOTSUPP; + break; + } + pdata = &enable; + break; + default: dprintk(VIDC_ERR, "Unsupported index: %x\n", ctrl->id); rc = -ENOTSUPP; diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_api.h b/drivers/media/platform/msm/vidc/vidc_hfi_api.h index 6cc5f9f50ba1..d946b035b284 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_api.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_api.h @@ -243,6 +243,7 @@ enum hal_property { HAL_PARAM_VENC_H264_TRANSFORM_8x8, HAL_PARAM_VENC_VIDEO_SIGNAL_INFO, HAL_PARAM_VENC_IFRAMESIZE_TYPE, + HAL_PARAM_VENC_SEND_OUTPUT_FOR_SKIPPED_FRAME }; enum hal_domain { diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h index 31af06cd88ef..1218f0a86bc4 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h @@ -388,6 +388,8 @@ struct hfi_buffer_info { (HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x033) #define HFI_PROPERTY_PARAM_VENC_IFRAMESIZE \ (HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x034) +#define HFI_PROPERTY_PARAM_VENC_SEND_OUTPUT_FOR_SKIPPED_FRAMES \ + (HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x035) #define HFI_PROPERTY_CONFIG_VENC_COMMON_START \ (HFI_DOMAIN_BASE_VENC + HFI_ARCH_COMMON_OFFSET + 0x6000) diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h index 0d87fa1e253c..25cb17ca6bf3 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -1225,6 +1225,13 @@ enum v4l2_mpeg_vidc_video_au_delimiter { V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_ENABLED = 1 }; +#define V4L2_CID_MPEG_VIDC_VIDEO_SEND_SKIPPED_FRAME \ + (V4L2_CID_MPEG_MSM_VIDC_BASE + 103) +enum v4l2_mpeg_vidc_video_venc_send_skipped_frame { + V4L2_MPEG_VIDC_VIDEO_SEND_SKIPPED_FRAME_DISABLE = 0, + V4L2_MPEG_VIDC_VIDEO_SEND_SKIPPED_FRAME_ENABLE = 1 +}; + /* Camera class control IDs */