diff options
author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-09-28 14:31:00 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-09-28 14:30:59 -0700 |
commit | d246bcfd7592838976381c2fdcfbd98018bf14e1 (patch) | |
tree | 2cb96974c70f90bf9b1f51e85eade9599384e2a1 /mm-video-v4l2 | |
parent | b251817df0ebabd636b4fed34e7a8855a509eaa7 (diff) | |
parent | d355137dd7eb70072fc378e76c91867f82526f9a (diff) | |
download | media-d246bcfd7592838976381c2fdcfbd98018bf14e1.tar.gz |
Merge "mm-video-v4l2: Implement Mirror control"
Diffstat (limited to 'mm-video-v4l2')
5 files changed, 61 insertions, 1 deletions
diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h index 9e090257..a474a825 100644 --- a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h +++ b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h @@ -686,6 +686,7 @@ class omx_video: public qc_omx_component OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier; OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier; OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation; + OMX_CONFIG_MIRRORTYPE m_sConfigFrameMirror; OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP; OMX_U32 m_QPSet; OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization; diff --git a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h index 9315fd00..16dd5e7c 100644 --- a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h +++ b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h @@ -490,6 +490,7 @@ class venc_dev bool venc_reconfigure_intra_refresh_period(); bool venc_reconfig_reqbufs(); bool venc_set_vpe_rotation(OMX_S32 rotation_angle); + bool venc_set_mirror(OMX_U32 mirror); bool venc_set_ltrmode(OMX_U32 enable, OMX_U32 count); bool venc_set_useltr(OMX_U32 frameIdx); bool venc_set_markltr(OMX_U32 frameIdx); diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp index 64bfabc9..958b71ce 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp @@ -2211,6 +2211,13 @@ OMX_ERRORTYPE omx_video::get_config(OMX_IN OMX_HANDLETYPE hComp, memcpy(pParam, &m_sConfigFrameRotation, sizeof(m_sConfigFrameRotation)); break; } + case OMX_IndexConfigCommonMirror: + { + VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_MIRRORTYPE); + OMX_CONFIG_MIRRORTYPE* pParam = reinterpret_cast<OMX_CONFIG_MIRRORTYPE*>(configData); + memcpy(pParam, &m_sConfigFrameMirror, sizeof(m_sConfigFrameMirror)); + break; + } case QOMX_IndexConfigVideoIntraperiod: { DEBUG_PRINT_LOW("get_config:QOMX_IndexConfigVideoIntraperiod"); diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp index 9c0f9fd2..1dcb4c3d 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp @@ -195,6 +195,10 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role) m_sConfigFrameRotation.nPortIndex = (OMX_U32) PORT_INDEX_OUT; m_sConfigFrameRotation.nRotation = 0; + OMX_INIT_STRUCT(&m_sConfigFrameMirror, OMX_CONFIG_MIRRORTYPE); + m_sConfigFrameMirror.nPortIndex = (OMX_U32) PORT_INDEX_OUT; + m_sConfigFrameMirror.eMirror = OMX_MirrorNone; + OMX_INIT_STRUCT(&m_sConfigAVCIDRPeriod, OMX_VIDEO_CONFIG_AVCINTRAPERIOD); m_sConfigAVCIDRPeriod.nPortIndex = (OMX_U32) PORT_INDEX_OUT; @@ -1739,7 +1743,23 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp, break; } - case OMX_IndexConfigCommonRotate: + case OMX_IndexConfigCommonMirror: + { + VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_MIRRORTYPE); + OMX_CONFIG_MIRRORTYPE *pParam = reinterpret_cast<OMX_CONFIG_MIRRORTYPE*>(configData); + + if (pParam->nPortIndex != PORT_INDEX_OUT) { + DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex); + return OMX_ErrorBadPortIndex; + } + if (handle->venc_set_config(configData,OMX_IndexConfigCommonMirror) != true) { + DEBUG_PRINT_ERROR("ERROR: Set OMX_IndexConfigCommonMirror failed"); + return OMX_ErrorUnsupportedSetting; + } + m_sConfigFrameMirror.eMirror = pParam->eMirror; + break; + } + case OMX_IndexConfigCommonRotate: { VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ROTATIONTYPE); OMX_CONFIG_ROTATIONTYPE *pParam = diff --git a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp index 4c0442d9..03de1b95 100644 --- a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp +++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp @@ -2712,6 +2712,17 @@ bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index) break; } + case OMX_IndexConfigCommonMirror: + { + OMX_CONFIG_MIRRORTYPE *mirror = (OMX_CONFIG_MIRRORTYPE*) configData; + DEBUG_PRINT_LOW("venc_set_param: OMX_IndexConfigCommonMirror"); + + if (venc_set_mirror(mirror->eMirror) == false) { + DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigCommonMirror failed"); + return false; + } + break; + } case OMX_IndexConfigCommonRotate: { OMX_CONFIG_ROTATIONTYPE *config_rotation = @@ -5722,6 +5733,26 @@ bool venc_dev::venc_set_markltr(OMX_U32 frameIdx) return true; } +bool venc_dev::venc_set_mirror(OMX_U32 mirror) +{ + DEBUG_PRINT_LOW("venc_set_mirror"); + int rc = true; + struct v4l2_control control; + + control.id = V4L2_CID_MPEG_VIDC_VIDEO_FLIP; + control.value = mirror; + + rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); + if (rc) { + DEBUG_PRINT_ERROR("Failed to set mirror %d", rc); + return false; + } + + DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, val=%d", + control.id, control.value); + return true; +} + bool venc_dev::venc_set_vpe_rotation(OMX_S32 rotation_angle) { DEBUG_PRINT_LOW("venc_set_vpe_rotation: rotation angle = %d", (int)rotation_angle); |