diff options
author | Arun Menon <avmenon@codeaurora.org> | 2016-03-29 17:41:06 -0700 |
---|---|---|
committer | Hangyu Kuang <hkuang@google.com> | 2016-04-08 10:24:57 -0700 |
commit | f1b15e15b61a610b6d0a78797e9a5a3f2cfdd56c (patch) | |
tree | e283aa267f675d8066d18c83cd06e01f85fdaa6c /msm8974 | |
parent | ff8f9f29b46df8de6dba9bda31eab4beb67146b8 (diff) | |
download | media-f1b15e15b61a610b6d0a78797e9a5a3f2cfdd56c.tar.gz |
mm-video-v4l2: vidc: Add support for OMX_IndexConfigAndroidIntraRefresh
OMX Component will support OMX_IndexConfigAndroidIntraRefresh only
in loaded state.
Bug: 27108817
Change-Id: I213fed57842b94c333843871d6c555e1fb8784e5
Diffstat (limited to 'msm8974')
-rw-r--r-- | msm8974/mm-core/inc/OMX_IndexExt.h | 1 | ||||
-rw-r--r-- | msm8974/mm-core/inc/OMX_VideoExt.h | 15 | ||||
-rw-r--r-- | msm8974/mm-video-v4l2/vidc/venc/inc/omx_video_base.h | 1 | ||||
-rw-r--r-- | msm8974/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp | 9 | ||||
-rw-r--r-- | msm8974/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp | 23 | ||||
-rw-r--r-- | msm8974/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 18 |
6 files changed, 67 insertions, 0 deletions
diff --git a/msm8974/mm-core/inc/OMX_IndexExt.h b/msm8974/mm-core/inc/OMX_IndexExt.h index feddcb1..3f278ba 100644 --- a/msm8974/mm-core/inc/OMX_IndexExt.h +++ b/msm8974/mm-core/inc/OMX_IndexExt.h @@ -72,6 +72,7 @@ typedef enum OMX_INDEXEXTTYPE { OMX_IndexParamVideoAndroidVp8Encoder, /**< reference: OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE */ OMX_IndexParamVideoHevc, /**< reference: OMX_VIDEO_PARAM_HEVCTYPE */ OMX_IndexParamSliceSegments, /**< reference: OMX_VIDEO_SLICESEGMENTSTYPE */ + OMX_IndexConfigAndroidIntraRefresh, /**< reference: OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE */ /* Image & Video common configurations */ OMX_IndexExtCommonStartUnused = OMX_IndexKhronosExtensions + 0x00700000, diff --git a/msm8974/mm-core/inc/OMX_VideoExt.h b/msm8974/mm-core/inc/OMX_VideoExt.h index 5bf6fd4..92d360a 100644 --- a/msm8974/mm-core/inc/OMX_VideoExt.h +++ b/msm8974/mm-core/inc/OMX_VideoExt.h @@ -157,6 +157,21 @@ typedef struct OMX_VIDEO_PARAM_HEVCTYPE { OMX_VIDEO_HEVCLEVELTYPE eLevel; } OMX_VIDEO_PARAM_HEVCTYPE; +/** + * Structure for configuring video compression intra refresh period + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nRefreshPeriod : Intra refreh period in frames. Value 0 means disable intra refresh +*/ +typedef struct OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nRefreshPeriod; +} OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE; #ifdef __cplusplus } diff --git a/msm8974/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/msm8974/mm-video-v4l2/vidc/venc/inc/omx_video_base.h index 5db0613..5916582 100644 --- a/msm8974/mm-video-v4l2/vidc/venc/inc/omx_video_base.h +++ b/msm8974/mm-video-v4l2/vidc/venc/inc/omx_video_base.h @@ -618,6 +618,7 @@ class omx_video: public qc_omx_component QOMX_EXTNINDEX_VIDEO_INITIALQP m_sParamInitqp; OMX_U32 m_sExtraData; OMX_U32 m_input_msg_id; + OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE m_sConfigIntraRefresh; // fill this buffer queue omx_cmd_queue m_ftb_q; diff --git a/msm8974/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/msm8974/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp index 3627678..c4142d2 100644 --- a/msm8974/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp +++ b/msm8974/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp @@ -2034,6 +2034,15 @@ OMX_ERRORTYPE omx_video::get_config(OMX_IN OMX_HANDLETYPE hComp, } break; } + case OMX_IndexConfigAndroidIntraRefresh: + { + VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE); + OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE* pParam = + reinterpret_cast<OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE*>(configData); + DEBUG_PRINT_LOW("get_config: OMX_IndexConfigAndroidIntraRefresh"); + memcpy(pParam, &m_sConfigIntraRefresh, sizeof(m_sConfigIntraRefresh)); + break; + } default: DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex); return OMX_ErrorUnsupportedIndex; diff --git a/msm8974/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp b/msm8974/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp index 2b6674b..effa433 100644 --- a/msm8974/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp +++ b/msm8974/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp @@ -266,6 +266,10 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role) m_sIntraRefresh.nPortIndex = (OMX_U32) PORT_INDEX_OUT; m_sIntraRefresh.eRefreshMode = OMX_VIDEO_IntraRefreshMax; + OMX_INIT_STRUCT(&m_sConfigIntraRefresh, OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE); + m_sConfigIntraRefresh.nPortIndex = (OMX_U32) PORT_INDEX_OUT; + m_sConfigIntraRefresh.nRefreshPeriod = 0; + if (codec_type == OMX_VIDEO_CodingMPEG4) { m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple; m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_MPEG4Level0; @@ -1850,6 +1854,25 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp, } break; } + case OMX_IndexConfigAndroidIntraRefresh: + { + VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE); + OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE* pParam = + (OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE*) configData; + if (m_state == OMX_StateLoaded + || m_sInPortDef.bEnabled == OMX_FALSE + || m_sOutPortDef.bEnabled == OMX_FALSE) { + if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigAndroidIntraRefresh)) { + DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigVideoIntraRefreshType"); + return OMX_ErrorUnsupportedSetting; + } + m_sConfigIntraRefresh.nRefreshPeriod = pParam->nRefreshPeriod; + } else { + DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigAndroidIntraRefresh supported only at start of session"); + return OMX_ErrorUnsupportedSetting; + } + break; + } default: DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex); break; diff --git a/msm8974/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/msm8974/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp index 32d73b5..6319eab 100644 --- a/msm8974/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp +++ b/msm8974/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp @@ -2129,6 +2129,24 @@ bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index) } break; } + case OMX_IndexConfigAndroidIntraRefresh: + { + OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *intra_refresh = (OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *)configData; + DEBUG_PRINT_LOW("OMX_IndexConfigAndroidIntraRefresh : num frames = %d", intra_refresh->nRefreshPeriod); + + if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { + OMX_U32 num_mbs_per_frame = (ALIGN(m_sVenc_cfg.dvs_height, 16)/16) * (ALIGN(m_sVenc_cfg.dvs_width, 16)/16); + OMX_U32 num_intra_refresh_mbs = num_mbs_per_frame / intra_refresh->nRefreshPeriod; + + if (venc_set_intra_refresh(OMX_VIDEO_IntraRefreshRandom, num_intra_refresh_mbs) == false) { + DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed"); + return false; + } + } else { + DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoIntraRefreshType"); + } + break; + } default: DEBUG_PRINT_ERROR("Unsupported config index = %u", index); break; |