summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeva Ramasubramanian <dramasub@codeaurora.org>2013-01-28 20:15:29 -0800
committerArne Coucheron <arco68@gmail.com>2015-12-17 06:55:10 +0100
commitbeb3f68bcef45fc63f4c0bc21cc2a655a2cf8c88 (patch)
treee04f566291323101bfa6730a41ced6e135c19386
parent799cd1d99314a3717f68c75f2bb6f0e785aace8d (diff)
downloadandroid_hardware_qcom_media-stable/cm-13.0-caf-8960-ZNH0E.tar.gz
android_hardware_qcom_media-stable/cm-13.0-caf-8960-ZNH0E.tar.bz2
android_hardware_qcom_media-stable/cm-13.0-caf-8960-ZNH0E.zip
mm-video: vidc: Add support for picture order countstable/cm-13.0-caf-8960-ZNH0E
Add support for picture order count. By default PicOrderType is set to 2 for H264 encode. Setting this parameter in the sps/pps to 2 causes the decoder to return the first I-frame immediately after decode, as opposed to holding onto it until the next frame. Apps can configure it via OMX Get/Set API. Change-Id: I57c6287603747ef7e838e7017e2378a6c9e736af
-rw-r--r--mm-core/inc/OMX_QCOMExtns.h7
-rw-r--r--mm-video/vidc/venc/inc/omx_video_base.h1
-rw-r--r--mm-video/vidc/venc/inc/video_encoder_device.h3
-rw-r--r--mm-video/vidc/venc/src/omx_video_base.cpp8
-rw-r--r--mm-video/vidc/venc/src/omx_video_encoder.cpp55
-rw-r--r--mm-video/vidc/venc/src/video_encoder_device.cpp26
6 files changed, 85 insertions, 15 deletions
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h
index 3532fd4e..9017a6a0 100644
--- a/mm-core/inc/OMX_QCOMExtns.h
+++ b/mm-core/inc/OMX_QCOMExtns.h
@@ -433,6 +433,7 @@ enum OMX_QCOM_EXTN_INDEXTYPE
/* Enable VQZIP SEI NAL type */
OMX_QTIIndexParamVQZIPSEIType = 0x7F000053,
+ OMX_QcomIndexParamPictureOrderCountType = 0x7F000054,
};
/**
@@ -1596,6 +1597,12 @@ typedef struct QOMX_VPP_ENABLE {
OMX_BOOL enable_vpp;
} QOMX_VPP_ENABLE;
+typedef struct QOMX_PICTURE_ORDER_COUNT_TYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nType;
+} QOMX_PICTURE_ORDER_COUNT_TYPE;
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/mm-video/vidc/venc/inc/omx_video_base.h b/mm-video/vidc/venc/inc/omx_video_base.h
index 71b30e5d..bb8d7c3b 100644
--- a/mm-video/vidc/venc/inc/omx_video_base.h
+++ b/mm-video/vidc/venc/inc/omx_video_base.h
@@ -542,6 +542,7 @@ public:
QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount;
QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod;
QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse;
+ QOMX_PICTURE_ORDER_COUNT_TYPE m_sPicureOrderCount;
// fill this buffer queue
omx_cmd_queue m_ftb_q;
// Command Q for rest of the events
diff --git a/mm-video/vidc/venc/inc/video_encoder_device.h b/mm-video/vidc/venc/inc/video_encoder_device.h
index 3f8e3007..7d71732a 100644
--- a/mm-video/vidc/venc/inc/video_encoder_device.h
+++ b/mm-video/vidc/venc/inc/video_encoder_device.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
+Copyright (c) 2010-2013, 2015, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -161,6 +161,7 @@ private:
bool venc_set_ltrcount(OMX_U32 count);
bool venc_set_ltrperiod(OMX_U32 period);
bool venc_set_ltruse(OMX_U32 id, OMX_U32 frames);
+ bool venc_set_picture_order_count_type(OMX_U32 type);
#ifdef MAX_RES_1080P
OMX_U32 pmem_free();
diff --git a/mm-video/vidc/venc/src/omx_video_base.cpp b/mm-video/vidc/venc/src/omx_video_base.cpp
index 10f80de3..257ccb79 100644
--- a/mm-video/vidc/venc/src/omx_video_base.cpp
+++ b/mm-video/vidc/venc/src/omx_video_base.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
+Copyright (c) 2010-2013, 2015, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -1944,6 +1944,12 @@ OMX_ERRORTYPE omx_video::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
break;
}
+ case OMX_QcomIndexParamPictureOrderCountType:
+ {
+ QOMX_PICTURE_ORDER_COUNT_TYPE *pParam = (QOMX_PICTURE_ORDER_COUNT_TYPE *)paramData;
+ memcpy(pParam, &m_sPicureOrderCount, sizeof(m_sPicureOrderCount));
+ break;
+ }
case OMX_IndexParamVideoSliceFMO:
default:
{
diff --git a/mm-video/vidc/venc/src/omx_video_encoder.cpp b/mm-video/vidc/venc/src/omx_video_encoder.cpp
index 3a215bf0..6d7a34de 100644
--- a/mm-video/vidc/venc/src/omx_video_encoder.cpp
+++ b/mm-video/vidc/venc/src/omx_video_encoder.cpp
@@ -256,6 +256,10 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_AVCLevel1;
}
+ OMX_INIT_STRUCT(&m_sPicureOrderCount, QOMX_PICTURE_ORDER_COUNT_TYPE);
+ if(codec_type == OMX_VIDEO_CodingAVC)
+ m_sPicureOrderCount.nType = 2;
+
// Initialize the video parameters for input port
OMX_INIT_STRUCT(&m_sInPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
m_sInPortDef.nPortIndex= (OMX_U32) PORT_INDEX_IN;
@@ -415,19 +419,6 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
m_state = OMX_StateLoaded;
m_sExtraData = 0;
- // For H264 enable some parameters in VUI by default
- if (codec_type == OMX_VIDEO_CodingAVC)
- {
- QOMX_VUI_BITSTREAM_RESTRICT parm;
- OMX_INIT_STRUCT(&parm, QOMX_VUI_BITSTREAM_RESTRICT);
- parm.bEnable = OMX_TRUE;
- if (set_parameter(NULL, (OMX_INDEXTYPE)OMX_QcomIndexParamEnableVUIStreamRestrictFlag,
- (OMX_PTR)&parm)) {
- // Don't treat this as a fatal error
- DEBUG_PRINT_ERROR("Unable to set EnableVUIStreamRestrictFlag as default");
- }
- }
-
if(eRet == OMX_ErrorNone)
{
if(pipe(fds))
@@ -776,7 +767,33 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
avc_param.nBFrames = 0;
}
+
+#ifdef MAX_RES_1080P
+ // These settings are geared toward the WFD usecase
+ if (pParam->eProfile == OMX_VIDEO_AVCProfileBaseline)
+ {
+ //set the BITSTREAM_RESTRICT flag in the vui
+ QOMX_VUI_BITSTREAM_RESTRICT br;
+ OMX_INIT_STRUCT(&br, QOMX_VUI_BITSTREAM_RESTRICT);
+ br.bEnable = OMX_TRUE;
+ if (!handle->venc_set_param((OMX_PTR)&br,
+ (OMX_INDEXTYPE)OMX_QcomIndexParamEnableVUIStreamRestrictFlag)) {
+ DEBUG_PRINT_ERROR("Unable to set EnableVUIStreamRestrictFlag as default");
+ return OMX_ErrorHardware;
+ }
+ }
+ if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingAVC)
+ {
+ //set the PIC_ORDER_CNT_TYPE flag in the sps
+ if (!handle->venc_set_param((OMX_PTR)&m_sPicureOrderCount,
+ (OMX_INDEXTYPE)OMX_QcomIndexParamPictureOrderCountType)) {
+ DEBUG_PRINT_ERROR("Unable to set PictureOrderCountType as default");
+ return OMX_ErrorHardware;
+ }
+ }
+#endif
}
+
if(handle->venc_set_param(&avc_param,OMX_IndexParamVideoAvc) != true)
{
return OMX_ErrorUnsupportedSetting;
@@ -1235,6 +1252,18 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
break;
}
+ case OMX_QcomIndexParamPictureOrderCountType:
+ {
+ if(!handle->venc_set_param(paramData,
+ (OMX_INDEXTYPE)OMX_QcomIndexParamPictureOrderCountType))
+ {
+ DEBUG_PRINT_ERROR("ERROR: Request for setting poc failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ memcpy(&m_sPicureOrderCount, (QOMX_PICTURE_ORDER_COUNT_TYPE *)paramData,
+ sizeof(m_sPicureOrderCount));
+ break;
+ }
case OMX_IndexParamVideoSliceFMO:
default:
{
diff --git a/mm-video/vidc/venc/src/video_encoder_device.cpp b/mm-video/vidc/venc/src/video_encoder_device.cpp
index d8f6f942..1c3c7956 100644
--- a/mm-video/vidc/venc/src/video_encoder_device.cpp
+++ b/mm-video/vidc/venc/src/video_encoder_device.cpp
@@ -1150,6 +1150,18 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
}
break;
}
+ case OMX_QcomIndexParamPictureOrderCountType:
+ {
+ QOMX_PICTURE_ORDER_COUNT_TYPE *pParam =
+ (QOMX_PICTURE_ORDER_COUNT_TYPE *)paramData;
+
+ if(venc_set_picture_order_count_type(pParam->nType) == false)
+ {
+ DEBUG_PRINT_ERROR("Setting poc type failed");
+ return false;
+ }
+ break;
+ }
case OMX_IndexParamVideoSliceFMO:
default:
DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u",
@@ -3303,3 +3315,17 @@ bool venc_dev::venc_get_uncache_flag()
return m_use_uncache_buffers;
}
+bool venc_dev::venc_set_picture_order_count_type(OMX_U32 type)
+{
+ venc_poctype temp;
+ venc_ioctl_msg ioctl_msg = {&temp, NULL};
+
+ temp.poc_type = type;
+ DEBUG_PRINT_HIGH("Setting poc type: %d", type);
+ if(ioctl(m_nDriver_fd, VEN_IOCTL_SET_PIC_ORDER_CNT_TYPE, (void *)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("Request for setting poc type failed");
+ return false;
+ }
+ return true;
+}