summaryrefslogtreecommitdiff
path: root/mm-video-v4l2
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2017-07-03 13:53:14 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-07-03 13:53:14 -0700
commitfba5c282b55771453f073291cf67f66c627e36ee (patch)
treeca1e95892ec240356b606ef106af9be39d54a1b7 /mm-video-v4l2
parentbccb98d6ab953a50e02b953db9f7960660b597db (diff)
parent7e5ceb67cfb6a15cad0590e265a4d0dba5b9c530 (diff)
downloadmedia-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.h2
-rw-r--r--mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp37
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;