summaryrefslogtreecommitdiff
path: root/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp')
-rw-r--r--[-rwxr-xr-x]mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp296
1 files changed, 261 insertions, 35 deletions
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 63deeeb..ce9ea69 100755..100644
--- a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
+++ b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
@@ -27,7 +27,6 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------*/
#include "omx_video_encoder.h"
#include <string.h>
-#include "video_encoder_device.h"
#include <stdio.h>
#ifdef _ANDROID_ICS_
#include <media/hardware/HardwareAPI.h>
@@ -50,9 +49,10 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
(_s_)->nVersion.nVersion = OMX_SPEC_VERSION
extern int m_pipe;
-int debug_level = PRIO_ERROR;
static int bframes;
static int entropy;
+static int perfmode;
+static int hybrid_hp;
// factory function executed by the core to create instances
void *get_omx_component_factory_fn(void)
{
@@ -82,6 +82,13 @@ omx_venc::omx_venc()
property_get("vidc.debug.entropy", property_value, "1");
entropy = !!atoi(property_value);
property_value[0] = '\0';
+ property_get("vidc.debug.perf.mode", property_value, "0");
+ perfmode = atoi(property_value);
+ property_value[0] = '\0';
+ property_get("vidc.debug.hybrid.hierp", property_value, "0");
+ hybrid_hp = atoi(property_value);
+ property_value[0] = '\0';
+ handle = NULL;
}
omx_venc::~omx_venc()
@@ -149,7 +156,16 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
codec_type = OMX_VIDEO_CodingVP8;
}
#endif
- else {
+ else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.hevc", \
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_encoder.hevc", OMX_MAX_STRINGNAME_SIZE);
+ codec_type = OMX_VIDEO_CodingHEVC;
+ } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.hevc.secure", \
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_encoder.hevc", OMX_MAX_STRINGNAME_SIZE);
+ codec_type = OMX_VIDEO_CodingHEVC;
+ secure_session = true;
+ } else {
DEBUG_PRINT_ERROR("ERROR: Unknown Component");
eRet = OMX_ErrorInvalidComponentName;
}
@@ -172,7 +188,8 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
if (handle->venc_open(codec_type) != true) {
DEBUG_PRINT_ERROR("ERROR: venc_open failed");
- return OMX_ErrorInsufficientResources;
+ eRet = OMX_ErrorInsufficientResources;
+ goto init_error;
}
//Intialise the OMX layer variables
@@ -208,7 +225,7 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
m_sConfigIntraRefreshVOP.IntraRefreshVOP = OMX_FALSE;
OMX_INIT_STRUCT(&m_sConfigFrameRotation, OMX_CONFIG_ROTATIONTYPE);
- m_sConfigFrameRotation.nPortIndex = (OMX_U32) PORT_INDEX_IN;
+ m_sConfigFrameRotation.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
m_sConfigFrameRotation.nRotation = 0;
OMX_INIT_STRUCT(&m_sSessionQuantization, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
@@ -261,6 +278,9 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
} else if (codec_type == OMX_VIDEO_CodingVP8) {
m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_VP8ProfileMain;
m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_VP8Level_Version0;
+ } else if (codec_type == OMX_VIDEO_CodingHEVC) {
+ m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_HEVCProfileMain;
+ m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_HEVCMainTierLevel1;
}
// Initialize the video parameters for input port
@@ -286,7 +306,7 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
&m_sInPortDef.nBufferSize,
m_sInPortDef.nPortIndex) != true) {
eRet = OMX_ErrorUndefined;
-
+ goto init_error;
}
// Initialize the video parameters for output port
@@ -309,6 +329,8 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
m_sOutPortDef.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
} else if (codec_type == OMX_VIDEO_CodingVP8) {
m_sOutPortDef.format.video.eCompressionFormat = OMX_VIDEO_CodingVP8;
+ } else if (codec_type == OMX_VIDEO_CodingHEVC) {
+ m_sOutPortDef.format.video.eCompressionFormat = OMX_VIDEO_CodingHEVC;
}
if (dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
@@ -340,6 +362,8 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
m_sOutPortFormat.eCompressionFormat = OMX_VIDEO_CodingAVC;
} else if (codec_type == OMX_VIDEO_CodingVP8) {
m_sOutPortFormat.eCompressionFormat = OMX_VIDEO_CodingVP8;
+ } else if (codec_type == OMX_VIDEO_CodingHEVC) {
+ m_sOutPortFormat.eCompressionFormat = OMX_VIDEO_CodingHEVC;
}
@@ -419,10 +443,20 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
m_sParamVP8.nDCTPartitions = 0;
m_sParamVP8.bErrorResilientMode = OMX_FALSE;
+ // HEVC specific init
+ OMX_INIT_STRUCT(&m_sParamHEVC, OMX_VIDEO_PARAM_HEVCTYPE);
+ m_sParamHEVC.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+ m_sParamHEVC.eProfile = OMX_VIDEO_HEVCProfileMain;
+ m_sParamHEVC.eLevel = OMX_VIDEO_HEVCMainTierLevel1;
+
OMX_INIT_STRUCT(&m_sParamLTRMode, QOMX_VIDEO_PARAM_LTRMODE_TYPE);
m_sParamLTRMode.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
m_sParamLTRMode.eLTRMode = QOMX_VIDEO_LTRMode_Disable;
+ OMX_INIT_STRUCT(&m_sParamLTRCount, QOMX_VIDEO_PARAM_LTRCOUNT_TYPE);
+ m_sParamLTRCount.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+ m_sParamLTRCount.nCount = 0;
+
OMX_INIT_STRUCT(&m_sConfigDeinterlace, OMX_VIDEO_CONFIG_DEINTERLACE);
m_sConfigDeinterlace.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
m_sConfigDeinterlace.nEnable = OMX_FALSE;
@@ -467,8 +501,34 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
}
}
+ if (perfmode) {
+ QOMX_EXTNINDEX_VIDEO_PERFMODE pParam;
+ pParam.nPerfMode = perfmode;
+ DEBUG_PRINT_LOW("Perfmode = 0x%x", pParam.nPerfMode);
+ if (!handle->venc_set_config(&pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencPerfMode))
+ DEBUG_PRINT_ERROR("Failed setting PerfMode to %d", pParam.nPerfMode);
+ }
+
+ if (hybrid_hp)
+ {
+ if (hybrid_hp <= MAX_HYB_HIERP_LAYERS) {
+ QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE hyb_hp;
+ hyb_hp.nHpLayers = hybrid_hp;
+ DEBUG_PRINT_LOW("hybrid_hp = 0x%x", hyb_hp.nHpLayers);
+ if (!handle->venc_set_param(&hyb_hp, (OMX_INDEXTYPE)OMX_QcomIndexParamVideoHybridHierpMode)) {
+ DEBUG_PRINT_ERROR("Failed setting hybrid_hp to %d", hyb_hp.nHpLayers);
+ }
+ } else {
+ DEBUG_PRINT_ERROR("Max hybrid_hp layers supported is %d", hybrid_hp);
+ }
+ }
DEBUG_PRINT_INFO("Component_init : %s : return = 0x%x", m_nkind, eRet);
return eRet;
+init_error:
+ handle->venc_close();
+ delete handle;
+ handle = NULL;
+ return eRet;
}
@@ -517,6 +577,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
switch ((int)paramIndex) {
case OMX_IndexParamPortDefinition:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
@@ -533,6 +594,17 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("i/p actual cnt requested = %u", (unsigned int)portDefn->nBufferCountActual);
DEBUG_PRINT_LOW("i/p min cnt requested = %u", (unsigned int)portDefn->nBufferCountMin);
DEBUG_PRINT_LOW("i/p buffersize requested = %u", (unsigned int)portDefn->nBufferSize);
+ if (portDefn->nBufferCountActual > MAX_NUM_INPUT_BUFFERS) {
+ DEBUG_PRINT_ERROR("ERROR: (In_PORT) actual count (%u) exceeds max(%u)",
+ (unsigned int)portDefn->nBufferCountActual, (unsigned int)MAX_NUM_INPUT_BUFFERS);
+ return OMX_ErrorUnsupportedSetting;
+ }
+ if (m_inp_mem_ptr &&
+ (portDefn->nBufferCountActual != m_sInPortDef.nBufferCountActual ||
+ portDefn->nBufferSize != m_sInPortDef.nBufferSize)) {
+ DEBUG_PRINT_ERROR("ERROR: (In_PORT) buffer count/size can change only if port is unallocated !");
+ return OMX_ErrorInvalidState;
+ }
if (portDefn->nBufferCountMin > portDefn->nBufferCountActual) {
DEBUG_PRINT_ERROR("ERROR: (In_PORT) Min buffers (%u) > actual count (%u)",
(unsigned int)portDefn->nBufferCountMin, (unsigned int)portDefn->nBufferCountActual);
@@ -540,7 +612,8 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
if (handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true) {
DEBUG_PRINT_ERROR("ERROR: venc_set_param input failed");
- return OMX_ErrorUnsupportedSetting;
+ return handle->hw_overload ? OMX_ErrorInsufficientResources :
+ OMX_ErrorUnsupportedSetting;
}
DEBUG_PRINT_LOW("i/p previous actual cnt = %u", (unsigned int)m_sInPortDef.nBufferCountActual);
@@ -580,6 +653,18 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("o/p actual cnt requested = %u", (unsigned int)portDefn->nBufferCountActual);
DEBUG_PRINT_LOW("o/p min cnt requested = %u", (unsigned int)portDefn->nBufferCountMin);
DEBUG_PRINT_LOW("o/p buffersize requested = %u", (unsigned int)portDefn->nBufferSize);
+ if (portDefn->nBufferCountActual > MAX_NUM_OUTPUT_BUFFERS) {
+ DEBUG_PRINT_ERROR("ERROR: (Out_PORT) actual count (%u) exceeds max(%u)",
+ (unsigned int)portDefn->nBufferCountActual, (unsigned int)MAX_NUM_OUTPUT_BUFFERS);
+ return OMX_ErrorUnsupportedSetting;
+ }
+ if (m_out_mem_ptr &&
+ (portDefn->nBufferCountActual != m_sOutPortDef.nBufferCountActual ||
+ portDefn->nBufferSize != m_sOutPortDef.nBufferSize)) {
+ DEBUG_PRINT_ERROR("ERROR: (Out_PORT) buffer count/size can change only if port is unallocated !");
+ return OMX_ErrorInvalidState;
+ }
+
if (portDefn->nBufferCountMin > portDefn->nBufferCountActual) {
DEBUG_PRINT_ERROR("ERROR: (Out_PORT) Min buffers (%u) > actual count (%u)",
(unsigned int)portDefn->nBufferCountMin, (unsigned int)portDefn->nBufferCountActual);
@@ -615,6 +700,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
case OMX_IndexParamVideoPortFormat:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
@@ -658,6 +744,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
break;
case OMX_IndexParamVideoInit:
{ //TODO, do we need this index set param
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
OMX_PORT_PARAM_TYPE* pParam = (OMX_PORT_PARAM_TYPE*)(paramData);
DEBUG_PRINT_LOW("Set OMX_IndexParamVideoInit called");
break;
@@ -665,6 +752,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
case OMX_IndexParamVideoBitrate:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_BITRATETYPE);
OMX_VIDEO_PARAM_BITRATETYPE* pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoBitrate");
if (handle->venc_set_param(paramData,OMX_IndexParamVideoBitrate) != true) {
@@ -681,6 +769,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_IndexParamVideoMpeg4:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_MPEG4TYPE);
OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
OMX_VIDEO_PARAM_MPEG4TYPE mp4_param;
memcpy(&mp4_param, pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
@@ -700,8 +789,6 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
#ifdef _MSM8974_
if (pParam->nBFrames || bframes)
mp4_param.nBFrames = (pParam->nBFrames > (unsigned int) bframes)? pParam->nBFrames : bframes;
- if (mp4_param.nBFrames > 3)
- mp4_param.nBFrames = 3;
DEBUG_PRINT_HIGH("MPEG4: %u BFrames are being set", (unsigned int)mp4_param.nBFrames);
#endif
@@ -736,6 +823,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_IndexParamVideoAvc:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_AVCTYPE);
OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
OMX_VIDEO_PARAM_AVCTYPE avc_param;
memcpy(&avc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_AVCTYPE));
@@ -758,18 +846,14 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
avc_param.nBFrames = 0;
}
if (pParam->nRefFrames != 1) {
- DEBUG_PRINT_ERROR("Warning: Only 1 RefFrame is supported, changing RefFrame from %lu to 1)", pParam->nRefFrames);
+ DEBUG_PRINT_ERROR("Warning: Only 1 RefFrame is supported, changing RefFrame from %u to 1)", (unsigned int)pParam->nRefFrames);
avc_param.nRefFrames = 1;
}
#endif
#ifdef _MSM8974_
if (pParam->nBFrames || bframes) {
avc_param.nBFrames = (pParam->nBFrames > (unsigned int) bframes)? pParam->nBFrames : bframes;
- avc_param.nRefFrames = avc_param.nBFrames + 1;
- }
- if (avc_param.nBFrames > 3) {
- avc_param.nBFrames = 3;
- avc_param.nRefFrames = avc_param.nBFrames + 1;
+ avc_param.nRefFrames = (avc_param.nBFrames < 4)? avc_param.nBFrames + 1 : 4;
}
DEBUG_PRINT_HIGH("AVC: RefFrames: %u, BFrames: %u", (unsigned int)avc_param.nRefFrames, (unsigned int)avc_param.nBFrames);
@@ -799,6 +883,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case (OMX_INDEXTYPE)OMX_IndexParamVideoVp8:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_VP8TYPE);
OMX_VIDEO_PARAM_VP8TYPE* pParam = (OMX_VIDEO_PARAM_VP8TYPE*)paramData;
OMX_VIDEO_PARAM_VP8TYPE vp8_param;
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoVp8");
@@ -813,8 +898,23 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
memcpy(&m_sParamVP8,pParam, sizeof(struct OMX_VIDEO_PARAM_VP8TYPE));
break;
}
+ case (OMX_INDEXTYPE)OMX_IndexParamVideoHevc:
+ {
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_HEVCTYPE);
+ OMX_VIDEO_PARAM_HEVCTYPE* pParam = (OMX_VIDEO_PARAM_HEVCTYPE*)paramData;
+ OMX_VIDEO_PARAM_HEVCTYPE hevc_param;
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoHevc");
+ memcpy(&hevc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_HEVCTYPE));
+ if (handle->venc_set_param(&hevc_param, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc) != true) {
+ DEBUG_PRINT_ERROR("Failed : set_parameter: OMX_IndexParamVideoHevc");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ memcpy(&m_sParamHEVC, pParam, sizeof(struct OMX_VIDEO_PARAM_HEVCTYPE));
+ break;
+ }
case OMX_IndexParamVideoProfileLevelCurrent:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoProfileLevelCurrent");
if (handle->venc_set_param(pParam,OMX_IndexParamVideoProfileLevelCurrent) != true) {
@@ -857,10 +957,19 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("VP8 profile = %d, level = %d", m_sParamVP8.eProfile,
m_sParamVP8.eLevel);
}
+ else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.hevc",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ m_sParamHEVC.eProfile = (OMX_VIDEO_HEVCPROFILETYPE)m_sParamProfileLevel.eProfile;
+ m_sParamHEVC.eLevel = (OMX_VIDEO_HEVCLEVELTYPE)m_sParamProfileLevel.eLevel;
+ DEBUG_PRINT_LOW("HEVC profile = %d, level = %d", m_sParamHEVC.eProfile,
+ m_sParamHEVC.eLevel);
+ }
+
break;
}
case OMX_IndexParamStandardComponentRole:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
OMX_PARAM_COMPONENTROLETYPE *comp_role;
comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
@@ -913,6 +1022,15 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
}
#endif
+ else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
+ if (!strncmp((const char*)comp_role->cRole,"video_encoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char*)m_cRole,"video_encoder.hevc",OMX_MAX_STRINGNAME_SIZE);
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ }
+
else {
DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %s", m_nkind);
eRet = OMX_ErrorInvalidComponentName;
@@ -922,6 +1040,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
case OMX_IndexParamPriorityMgmt:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt");
if (m_state != OMX_StateLoaded) {
DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State");
@@ -942,6 +1061,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
case OMX_IndexParamCompBufferSupplier:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier");
OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
@@ -958,6 +1078,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_IndexParamVideoQuantization:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoQuantization");
OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*) paramData;
if (session_qp->nPortIndex == PORT_INDEX_OUT) {
@@ -976,6 +1097,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
case OMX_QcomIndexParamVideoQPRange:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE);
DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoQPRange");
OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE*) paramData;
if (qp_range->nPortIndex == PORT_INDEX_OUT) {
@@ -994,6 +1116,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
case OMX_QcomIndexPortDefn:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
OMX_QCOM_PARAM_PORTDEFINITIONTYPE* pParam =
(OMX_QCOM_PARAM_PORTDEFINITIONTYPE*)paramData;
DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexPortDefn");
@@ -1020,6 +1143,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
case OMX_IndexParamVideoErrorCorrection:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection");
OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* pParam =
(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData;
@@ -1032,6 +1156,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_IndexParamVideoIntraRefresh:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_INTRAREFRESHTYPE);
DEBUG_PRINT_LOW("set_param:OMX_IndexParamVideoIntraRefresh");
OMX_VIDEO_PARAM_INTRAREFRESHTYPE* pParam =
(OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData;
@@ -1045,6 +1170,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
#ifdef _ANDROID_ICS_
case OMX_QcomIndexParamVideoMetaBufferMode:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams);
StoreMetaDataInBuffersParams *pParam =
(StoreMetaDataInBuffersParams*)paramData;
DEBUG_PRINT_HIGH("set_parameter:OMX_QcomIndexParamVideoMetaBufferMode: "
@@ -1091,6 +1217,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
#if !defined(MAX_RES_720P) || defined(_MSM8974_)
case OMX_QcomIndexParamIndexExtraDataType:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE);
DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType");
QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData;
bool enable = false;
@@ -1171,6 +1298,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case QOMX_IndexParamVideoLTRMode:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_PARAM_LTRMODE_TYPE);
QOMX_VIDEO_PARAM_LTRMODE_TYPE* pParam =
(QOMX_VIDEO_PARAM_LTRMODE_TYPE*)paramData;
if (!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRMode)) {
@@ -1182,6 +1310,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case QOMX_IndexParamVideoLTRCount:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_PARAM_LTRCOUNT_TYPE);
QOMX_VIDEO_PARAM_LTRCOUNT_TYPE* pParam =
(QOMX_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData;
if (!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRCount)) {
@@ -1194,6 +1323,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
#endif
case OMX_QcomIndexParamVideoMaxAllowedBitrateCheck:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE);
QOMX_EXTNINDEX_PARAMTYPE* pParam =
(QOMX_EXTNINDEX_PARAMTYPE*)paramData;
if (pParam->nPortIndex == PORT_INDEX_OUT) {
@@ -1211,6 +1341,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
#ifdef MAX_RES_1080P
case OMX_QcomIndexEnableSliceDeliveryMode:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE);
QOMX_EXTNINDEX_PARAMTYPE* pParam =
(QOMX_EXTNINDEX_PARAMTYPE*)paramData;
if (pParam->nPortIndex == PORT_INDEX_OUT) {
@@ -1229,6 +1360,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
#endif
case OMX_QcomIndexEnableH263PlusPType:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE);
QOMX_EXTNINDEX_PARAMTYPE* pParam =
(QOMX_EXTNINDEX_PARAMTYPE*)paramData;
DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
@@ -1247,6 +1379,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_QcomIndexParamSequenceHeaderWithIDR:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, PrependSPSPPSToIDRFramesParams);
if(!handle->venc_set_param(paramData,
(OMX_INDEXTYPE)OMX_QcomIndexParamSequenceHeaderWithIDR)) {
DEBUG_PRINT_ERROR("%s: %s",
@@ -1258,6 +1391,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_QcomIndexParamH264AUDelimiter:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_CONFIG_H264_AUD);
if(!handle->venc_set_param(paramData,
(OMX_INDEXTYPE)OMX_QcomIndexParamH264AUDelimiter)) {
DEBUG_PRINT_ERROR("%s: %s",
@@ -1269,6 +1403,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_QcomIndexHierarchicalStructure:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_HIERARCHICALLAYERS);
QOMX_VIDEO_HIERARCHICALLAYERS* pParam =
(QOMX_VIDEO_HIERARCHICALLAYERS*)paramData;
DEBUG_PRINT_LOW("OMX_QcomIndexHierarchicalStructure");
@@ -1278,6 +1413,8 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed");
return OMX_ErrorUnsupportedSetting;
}
+ if((pParam->eHierarchicalCodingType == QOMX_HIERARCHICALCODING_B) && pParam->nNumLayers)
+ hier_b_enabled = true;
m_sHierLayers.nNumLayers = pParam->nNumLayers;
m_sHierLayers.eHierarchicalCodingType = pParam->eHierarchicalCodingType;
} else {
@@ -1290,6 +1427,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_QcomIndexParamPerfLevel:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_PERF_LEVEL);
if (!handle->venc_set_param(paramData,
(OMX_INDEXTYPE) OMX_QcomIndexParamPerfLevel)) {
DEBUG_PRINT_ERROR("ERROR: Setting performance level");
@@ -1299,6 +1437,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_QcomIndexParamH264VUITimingInfo:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO);
if (!handle->venc_set_param(paramData,
(OMX_INDEXTYPE) OMX_QcomIndexParamH264VUITimingInfo)) {
DEBUG_PRINT_ERROR("ERROR: Setting VUI timing info");
@@ -1308,6 +1447,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_QcomIndexParamPeakBitrate:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE);
if (!handle->venc_set_param(paramData,
(OMX_INDEXTYPE) OMX_QcomIndexParamPeakBitrate)) {
DEBUG_PRINT_ERROR("ERROR: Setting peak bitrate");
@@ -1317,6 +1457,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case QOMX_IndexParamVideoInitialQp:
{
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_INITIALQP);
if(!handle->venc_set_param(paramData,
(OMX_INDEXTYPE)QOMX_IndexParamVideoInitialQp)) {
DEBUG_PRINT_ERROR("Request to Enable initial QP failed");
@@ -1334,6 +1475,16 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
break;
}
+ case OMX_QcomIndexParamVideoHybridHierpMode:
+ {
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE);
+ if(!handle->venc_set_param(paramData,
+ (OMX_INDEXTYPE)OMX_QcomIndexParamVideoHybridHierpMode)) {
+ DEBUG_PRINT_ERROR("Request to Enable Hybrid Hier-P failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ }
case OMX_IndexParamVideoSliceFMO:
default:
{
@@ -1389,6 +1540,14 @@ bool omx_venc::update_profile_level()
DEBUG_PRINT_LOW("VP8 profile = %d, level = %d", m_sParamVP8.eProfile,
m_sParamVP8.eLevel);
}
+ else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.hevc",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ m_sParamHEVC.eProfile = (OMX_VIDEO_HEVCPROFILETYPE)eProfile;
+ m_sParamHEVC.eLevel = (OMX_VIDEO_HEVCLEVELTYPE)eLevel;
+ DEBUG_PRINT_LOW("HEVC profile = %d, level = %d", m_sParamHEVC.eProfile,
+ m_sParamHEVC.eLevel);
+ }
+
return true;
}
/* ======================================================================
@@ -1423,6 +1582,7 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
switch ((int)configIndex) {
case OMX_IndexConfigVideoBitrate:
{
+ VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_BITRATETYPE);
OMX_VIDEO_CONFIG_BITRATETYPE* pParam =
reinterpret_cast<OMX_VIDEO_CONFIG_BITRATETYPE*>(configData);
DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoBitrate (%u)", (unsigned int)pParam->nEncodeBitrate);
@@ -1444,6 +1604,7 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_IndexConfigVideoFramerate:
{
+ VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_FRAMERATETYPE);
OMX_CONFIG_FRAMERATETYPE* pParam =
reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData);
DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoFramerate (0x%x)", (unsigned int)pParam->xEncodeFramerate);
@@ -1466,6 +1627,7 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
}
case QOMX_IndexConfigVideoIntraperiod:
{
+ VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_INTRAPERIODTYPE);
QOMX_VIDEO_INTRAPERIODTYPE* pParam =
reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);
@@ -1481,9 +1643,14 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
(unsigned int)m_sIntraperiod.nPFrames, (unsigned int)m_sIntraperiod.nBFrames,
(unsigned int)pParam->nPFrames, (unsigned int)pParam->nBFrames);
if (m_sIntraperiod.nBFrames != pParam->nBFrames) {
+ if(hier_b_enabled && m_state == OMX_StateLoaded) {
+ DEBUG_PRINT_INFO("B-frames setting is supported if HierB is enabled");
+ }
+ else {
DEBUG_PRINT_HIGH("Dynamically changing B-frames not supported");
return OMX_ErrorUnsupportedSetting;
}
+ }
if (handle->venc_set_config(configData, (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod) != true) {
DEBUG_PRINT_ERROR("ERROR: Setting QOMX_IndexConfigVideoIntraperiod failed");
return OMX_ErrorUnsupportedSetting;
@@ -1518,6 +1685,7 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
case OMX_IndexConfigVideoIntraVOPRefresh:
{
+ VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_INTRAREFRESHVOPTYPE);
OMX_CONFIG_INTRAREFRESHVOPTYPE* pParam =
reinterpret_cast<OMX_CONFIG_INTRAREFRESHVOPTYPE*>(configData);
@@ -1539,11 +1707,12 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_IndexConfigCommonRotate:
{
+ VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ROTATIONTYPE);
OMX_CONFIG_ROTATIONTYPE *pParam =
reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
OMX_S32 nRotation;
- if (pParam->nPortIndex != PORT_INDEX_IN) {
+ if (pParam->nPortIndex != PORT_INDEX_OUT) {
DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
return OMX_ErrorBadPortIndex;
}
@@ -1567,18 +1736,14 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
return OMX_ErrorUnsupportedSetting;
} else {
OMX_U32 nFrameWidth;
+ OMX_U32 nFrameHeight;
DEBUG_PRINT_HIGH("set_config: updating port Dims");
- nFrameWidth = m_sInPortDef.format.video.nFrameWidth;
- m_sInPortDef.format.video.nFrameWidth =
- m_sInPortDef.format.video.nFrameHeight;
- m_sInPortDef.format.video.nFrameHeight = nFrameWidth;
-
- m_sOutPortDef.format.video.nFrameWidth =
- m_sInPortDef.format.video.nFrameWidth;
- m_sOutPortDef.format.video.nFrameHeight =
- m_sInPortDef.format.video.nFrameHeight;
+ nFrameWidth = m_sOutPortDef.format.video.nFrameWidth;
+ nFrameHeight = m_sOutPortDef.format.video.nFrameHeight;
+ m_sOutPortDef.format.video.nFrameWidth = nFrameHeight;
+ m_sOutPortDef.format.video.nFrameHeight = nFrameWidth;
m_sConfigFrameRotation.nRotation = pParam->nRotation;
}
} else {
@@ -1590,6 +1755,7 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
{
DEBUG_PRINT_HIGH("set_config(): OMX_QcomIndexConfigVideoFramePackingArrangement");
if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingAVC) {
+ VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT);
OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
(OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
extra_data_handle.set_frame_pack_data(configFmt);
@@ -1600,6 +1766,7 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
}
case QOMX_IndexConfigVideoLTRPeriod:
{
+ VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE);
QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE*)configData;
if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRPeriod)) {
DEBUG_PRINT_ERROR("ERROR: Setting LTR period failed");
@@ -1611,6 +1778,7 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
case OMX_IndexConfigVideoVp8ReferenceFrame:
{
+ VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_VP8REFERENCEFRAMETYPE);
OMX_VIDEO_VP8REFERENCEFRAMETYPE* pParam = (OMX_VIDEO_VP8REFERENCEFRAMETYPE*) configData;
if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE) OMX_IndexConfigVideoVp8ReferenceFrame)) {
DEBUG_PRINT_ERROR("ERROR: Setting VP8 reference frame");
@@ -1622,8 +1790,9 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
case QOMX_IndexConfigVideoLTRUse:
{
+ VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRUSE_TYPE);
QOMX_VIDEO_CONFIG_LTRUSE_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRUSE_TYPE*)configData;
- if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRUse)) {
+ if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRUse)) {
DEBUG_PRINT_ERROR("ERROR: Setting LTR use failed");
return OMX_ErrorUnsupportedSetting;
}
@@ -1632,13 +1801,17 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
}
case QOMX_IndexConfigVideoLTRMark:
{
+ VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRMARK_TYPE);
QOMX_VIDEO_CONFIG_LTRMARK_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRMARK_TYPE*)configData;
- DEBUG_PRINT_ERROR("Setting ltr mark is not supported");
+ if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRMark)) {
+ DEBUG_PRINT_ERROR("ERROR: Setting LTR mark failed");
return OMX_ErrorUnsupportedSetting;
+ }
break;
}
case OMX_IndexConfigVideoAVCIntraPeriod:
{
+ VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_AVCINTRAPERIOD);
OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pParam = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData;
DEBUG_PRINT_LOW("set_config: OMX_IndexConfigVideoAVCIntraPeriod");
if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_IndexConfigVideoAVCIntraPeriod)) {
@@ -1650,6 +1823,7 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_IndexConfigCommonDeinterlace:
{
+ VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_DEINTERLACE);
OMX_VIDEO_CONFIG_DEINTERLACE *pParam = (OMX_VIDEO_CONFIG_DEINTERLACE*) configData;
DEBUG_PRINT_LOW("set_config: OMX_IndexConfigCommonDeinterlace");
if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_IndexConfigCommonDeinterlace)) {
@@ -1659,6 +1833,35 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
memcpy(&m_sConfigDeinterlace, pParam, sizeof(m_sConfigDeinterlace));
break;
}
+ case OMX_QcomIndexConfigVideoVencPerfMode:
+ {
+ VALIDATE_OMX_PARAM_DATA(configData, QOMX_EXTNINDEX_VIDEO_PERFMODE);
+ QOMX_EXTNINDEX_VIDEO_PERFMODE* pParam = (QOMX_EXTNINDEX_VIDEO_PERFMODE*)configData;
+ if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencPerfMode)) {
+ DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigVideoVencPerfMode failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ }
+ case OMX_IndexConfigPriority:
+ {
+ VALIDATE_OMX_PARAM_DATA(configData, OMX_PARAM_U32TYPE);
+ if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigPriority)) {
+ DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigPriority");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ }
+ case OMX_IndexConfigOperatingRate:
+ {
+ VALIDATE_OMX_PARAM_DATA(configData, OMX_PARAM_U32TYPE);
+ if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigOperatingRate)) {
+ DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigOperatingRate");
+ return handle->hw_overload ? OMX_ErrorInsufficientResources :
+ OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ }
default:
DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);
break;
@@ -1693,7 +1896,14 @@ OMX_ERRORTYPE omx_venc::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
if (m_out_mem_ptr) {
DEBUG_PRINT_LOW("Freeing the Output Memory");
for (i=0; i< m_sOutPortDef.nBufferCountActual; i++ ) {
- free_output_buffer (&m_out_mem_ptr[i]);
+ if (BITMASK_PRESENT(&m_out_bm_count, i)) {
+ BITMASK_CLEAR(&m_out_bm_count, i);
+ free_output_buffer (&m_out_mem_ptr[i]);
+ }
+
+ if (release_output_done()) {
+ break;
+ }
}
free(m_out_mem_ptr);
m_out_mem_ptr = NULL;
@@ -1707,7 +1917,14 @@ OMX_ERRORTYPE omx_venc::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
) {
DEBUG_PRINT_LOW("Freeing the Input Memory");
for (i=0; i<m_sInPortDef.nBufferCountActual; i++ ) {
- free_input_buffer (&m_inp_mem_ptr[i]);
+ if (BITMASK_PRESENT(&m_inp_bm_count, i)) {
+ BITMASK_CLEAR(&m_inp_bm_count, i);
+ free_input_buffer (&m_inp_mem_ptr[i]);
+ }
+
+ if (release_input_done()) {
+ break;
+ }
}
@@ -1729,9 +1946,12 @@ OMX_ERRORTYPE omx_venc::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
m_heap_ptr.clear();
#endif // _ANDROID_
DEBUG_PRINT_HIGH("Calling venc_close()");
- handle->venc_close();
- DEBUG_PRINT_HIGH("Deleting HANDLE[%p]", handle);
- delete (handle);
+ if (handle) {
+ handle->venc_close();
+ DEBUG_PRINT_HIGH("Deleting HANDLE[%p]", handle);
+ delete (handle);
+ handle = NULL;
+ }
DEBUG_PRINT_INFO("Component Deinit");
return OMX_ErrorNone;
}
@@ -1784,7 +2004,10 @@ bool omx_venc::dev_free_buf(void *buf_addr,unsigned port)
bool omx_venc::dev_empty_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
{
- return handle->venc_empty_buf(buffer, pmem_data_buf,index,fd);
+ bool bret = false;
+ bret = handle->venc_empty_buf(buffer, pmem_data_buf,index,fd);
+ hw_overload = handle->hw_overload;
+ return bret;
}
bool omx_venc::dev_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
@@ -1792,7 +2015,7 @@ bool omx_venc::dev_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,uns
return handle->venc_fill_buf(buffer, pmem_data_buf,index,fd);
}
-bool omx_venc::dev_get_seq_hdr(void *buffer, unsigned size, OMX_U32 *hdrlen)
+bool omx_venc::dev_get_seq_hdr(void *buffer, unsigned size, unsigned *hdrlen)
{
return handle->venc_get_seq_hdr(buffer, size, hdrlen);
}
@@ -1924,6 +2147,9 @@ int omx_venc::async_message_process (void *context, void* message)
if (m_sVenc_msg->statuscode != VEN_S_SUCCESS) {
DEBUG_PRINT_ERROR("ERROR: async_msg_process() - Error statuscode = %lu",
m_sVenc_msg->statuscode);
+ if(m_sVenc_msg->msgcode == VEN_MSG_HW_OVERLOAD) {
+ omx->omx_report_hw_overload();
+ } else
omx->omx_report_error();
}
@@ -1985,7 +2211,7 @@ int omx_venc::async_message_process (void *context, void* message)
omxhdr->nFlags = m_sVenc_msg->buf.flags;
/*Use buffer case*/
- if (omx->output_use_buffer && !omx->m_use_output_pmem) {
+ if (omx->output_use_buffer && !omx->m_use_output_pmem && !omx->is_secure_session()) {
DEBUG_PRINT_LOW("memcpy() for o/p Heap UseBuffer");
memcpy(omxhdr->pBuffer,
(m_sVenc_msg->buf.ptrbuffer),