diff options
author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-07-03 13:53:14 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-07-03 13:53:14 -0700 |
commit | fba5c282b55771453f073291cf67f66c627e36ee (patch) | |
tree | ca1e95892ec240356b606ef106af9be39d54a1b7 /mm-video-v4l2 | |
parent | bccb98d6ab953a50e02b953db9f7960660b597db (diff) | |
parent | 7e5ceb67cfb6a15cad0590e265a4d0dba5b9c530 (diff) | |
download | media-fba5c282b55771453f073291cf67f66c627e36ee.tar.gz |
Merge "mm-video-v4l2: vidc: venc: Reconfigure Intra refresh"
Diffstat (limited to 'mm-video-v4l2')
-rw-r--r-- | mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h | 2 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 37 |
2 files changed, 34 insertions, 5 deletions
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 0fe242c8..29ebe85e 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 @@ -148,6 +148,7 @@ struct msm_venc_dbcfg { struct msm_venc_intrarefresh { unsigned long irmode; unsigned long mbcount; + unsigned long framecount; }; struct msm_venc_multiclicecfg { @@ -509,6 +510,7 @@ class venc_dev bool venc_set_extradata(OMX_U32 extra_data, OMX_BOOL enable); bool venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod); bool venc_reconfigure_intra_period(); + bool venc_reconfigure_intra_refresh_period(); bool venc_reconfig_reqbufs(); bool venc_set_vpe_rotation(OMX_S32 rotation_angle); bool venc_set_ltrmode(OMX_U32 enable, OMX_U32 count); 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 4d661c22..2f8a0d84 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 @@ -2772,15 +2772,16 @@ bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index) } 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); + OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *intra_refresh_period = (OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *)configData; + DEBUG_PRINT_LOW("OMX_IndexConfigAndroidIntraRefresh : num frames = %d", intra_refresh_period->nRefreshPeriod); - if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { + if (intra_refresh_period->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { + intra_refresh.framecount = intra_refresh_period->nRefreshPeriod; OMX_U32 mb_size = 16; OMX_U32 num_mbs_per_frame = (ALIGN(m_sVenc_cfg.dvs_height, mb_size)/mb_size) * (ALIGN(m_sVenc_cfg.dvs_width, mb_size)/mb_size); OMX_U32 num_intra_refresh_mbs = 0; - if (intra_refresh->nRefreshPeriod) { - num_intra_refresh_mbs = ceil(num_mbs_per_frame / intra_refresh->nRefreshPeriod); + if (intra_refresh_period->nRefreshPeriod) { + num_intra_refresh_mbs = ceil(num_mbs_per_frame / intra_refresh_period->nRefreshPeriod); } if (venc_set_intra_refresh(OMX_VIDEO_IntraRefreshRandom, num_intra_refresh_mbs) == false) { @@ -3120,6 +3121,14 @@ unsigned venc_dev::venc_start(void) if (vqzip_sei_info.enabled && !venc_set_vqzip_defaults()) return 1; + // Client can set intra refresh period in terms of frames. + // This requires reconfiguration on port redefinition as + // mbcount for IR depends on encode resolution. + if (!venc_reconfigure_intra_refresh_period()) { + DEBUG_PRINT_ERROR("Reconfiguring intra refresh period failed"); + return 0; + } + if (!venc_reconfigure_intra_period()) { DEBUG_PRINT_ERROR("Reconfiguring intra period failed"); return 0; @@ -4770,6 +4779,24 @@ bool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes) return true; } +bool venc_dev::venc_reconfigure_intra_refresh_period() { + + DEBUG_PRINT_LOW("venc_reconfigure_intra_refresh_period"); + if (intra_refresh.framecount) { + OMX_U32 mb_size = 16; + // Firmware will re-calculate mbcount if codec is HEVC. + OMX_U32 num_mbs_per_frame = (ALIGN(m_sVenc_cfg.dvs_height, mb_size)/mb_size) * (ALIGN(m_sVenc_cfg.dvs_width, mb_size)/mb_size); + OMX_U32 num_intra_refresh_mbs = 0; + num_intra_refresh_mbs = ceil(num_mbs_per_frame / intra_refresh.framecount); + + if (venc_set_intra_refresh(OMX_VIDEO_IntraRefreshRandom, num_intra_refresh_mbs) == false) { + DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed"); + return false; + } + } + return true; +} + bool venc_dev::venc_reconfigure_intra_period() { int rc; |