diff options
author | Michael Bestas <mkbestas@lineageos.org> | 2018-04-12 18:26:15 +0300 |
---|---|---|
committer | Michael Bestas <mkbestas@lineageos.org> | 2018-04-12 18:26:15 +0300 |
commit | 3159153cd0100ad3891316372bc321dfc60039f5 (patch) | |
tree | 97a4e84198da0844be0b45b461787021086a235c | |
parent | 91db4db97088ca2a83a49204ee0ff21df35780c7 (diff) | |
parent | 9e49c2396fa82049daa93ae3f50575684e83602b (diff) | |
download | android_hardware_qcom_media-3159153cd0100ad3891316372bc321dfc60039f5.tar.gz android_hardware_qcom_media-3159153cd0100ad3891316372bc321dfc60039f5.tar.bz2 android_hardware_qcom_media-3159153cd0100ad3891316372bc321dfc60039f5.zip |
Merge tag 'LA.UM.6.4.r1-07600-8x98.0' of https://source.codeaurora.org/quic/la/platform/hardware/qcom/media into HEAD
"LA.UM.6.4.r1-07600-8x98.0"
20 files changed, 236 insertions, 73 deletions
diff --git a/mm-core/Android.mk b/mm-core/Android.mk index faaa6494..6e35c2da 100644 --- a/mm-core/Android.mk +++ b/mm-core/Android.mk @@ -58,6 +58,15 @@ else MM_CORE_TARGET = default endif + +ifeq ($(call is-platform-sdk-version-at-least,27),true) # O-MR1 +OMXCORE_CFLAGS += -D_ANDROID_O_MR1_DIVX_CHANGES +endif + +ifeq ($(call is-platform-sdk-version-at-least,27),true) # O-MR1 +OMXCORE_CFLAGS += -D_ANDROID_O_MR1_DIVX_CHANGES +endif + #=============================================================================== # Deploy the headers that can be exposed #=============================================================================== diff --git a/mm-core/src/8909/registry_table.c b/mm-core/src/8909/registry_table.c index 1b26a778..54e11fb0 100644 --- a/mm-core/src/8909/registry_table.c +++ b/mm-core/src/8909/registry_table.c @@ -154,7 +154,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxSwVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { diff --git a/mm-core/src/8909/registry_table_android.c b/mm-core/src/8909/registry_table_android.c index c2dacf79..e575ba38 100644 --- a/mm-core/src/8909/registry_table_android.c +++ b/mm-core/src/8909/registry_table_android.c @@ -141,7 +141,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxSwVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { @@ -236,19 +240,6 @@ omx_core_cb_type core[] = } }, { - "AIV.play", - NULL, // Create instance function - // Unique instance handle - { - NULL - }, - NULL, // Shared object library handle - "libAivPlay.so", - { - "AIV.play.101" - } - }, - { "OMX.qcom.audio.decoder.multiaac", NULL, // Create instance function // Unique instance handle @@ -291,6 +282,19 @@ omx_core_cb_type core[] = } }, { + "AIV.play", + NULL, // Create instance function + // Unique instance handle + { + NULL + }, + NULL, // Shared object library handle + "libAivPlay.so", + { + "AIV.play.101" + } + }, + { "OMX.qcom.audio.decoder.aac", NULL, // Create instance function // Unique instance handle diff --git a/mm-core/src/8937/registry_table.c b/mm-core/src/8937/registry_table.c index 3722631a..ff2e3e36 100755..100644 --- a/mm-core/src/8937/registry_table.c +++ b/mm-core/src/8937/registry_table.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2014-16, The Linux Foundation. All rights reserved. +Copyright (c) 2014-18, 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 @@ -206,7 +206,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxSwVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { diff --git a/mm-core/src/8937/registry_table_android.c b/mm-core/src/8937/registry_table_android.c index c445db3d..946cc4a1 100755..100644 --- a/mm-core/src/8937/registry_table_android.c +++ b/mm-core/src/8937/registry_table_android.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2014-2018, 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 @@ -54,19 +54,6 @@ omx_core_cb_type core[] = } }, { - "OMX.qcom.video.decoder.avc.secure", - NULL, // Create instance function - // Unique instance handle - { - NULL - }, - NULL, // Shared object library handle - "libOmxVdec.so", - { - "video_decoder.avc" - } - }, - { "OMX.qcom.video.decoder.hevc", NULL, // Create instance function // Unique instance handle @@ -106,19 +93,6 @@ omx_core_cb_type core[] = } }, { - "OMX.qcom.video.encoder.avc.secure", - NULL, // Create instance function - // Unique instance handle - { - NULL - }, - NULL, // Shared object library handle - "libOmxVenc.so", - { - "video_encoder.avc" - } - }, - { "OMX.qti.video.decoder.mpeg4sw", NULL, // Create instance function // Unique instance handle @@ -167,7 +141,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxSwVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { diff --git a/mm-core/src/msm8953/registry_table.c b/mm-core/src/msm8953/registry_table.c index a2fa23ca..563e14f2 100755..100644 --- a/mm-core/src/msm8953/registry_table.c +++ b/mm-core/src/msm8953/registry_table.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +Copyright (c) 2015-2018, 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 @@ -193,7 +193,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { @@ -219,7 +223,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx311" +#else "video_decoder.divx" +#endif } }, { diff --git a/mm-core/src/msm8953/registry_table_android.c b/mm-core/src/msm8953/registry_table_android.c index fe8a6a29..5c563772 100644 --- a/mm-core/src/msm8953/registry_table_android.c +++ b/mm-core/src/msm8953/registry_table_android.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2015-2018, 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 @@ -76,7 +76,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { @@ -102,7 +106,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx311" +#else "video_decoder.divx" +#endif } }, { @@ -327,6 +335,19 @@ omx_core_cb_type core[] = } }, { + "OMX.qcom.video.encoder.avc.secure", + NULL, // Create instance function + // Unique instance handle + { + NULL + }, + NULL, // Shared object library handle + "libOmxVenc.so", + { + "video_encoder.avc" + } + }, + { "OMX.qcom.video.encoder.vp8", NULL, // Create instance function // Unique instance handle @@ -696,19 +717,6 @@ omx_core_cb_type core[] = } }, { - "OMX.qcom.video.encoder.avc.secure", - NULL, // Create instance function - // Unique instance handle - { - NULL - }, - NULL, // Shared object library handle - "libOmxVenc.so", - { - "video_encoder.avc" - } - }, - { "OMX.qcom.audio.decoder.aac", NULL, // Create instance function // Unique instance handle diff --git a/mm-core/src/msm8996/registry_table.c b/mm-core/src/msm8996/registry_table.c index 914ea3c7..a5721875 100644 --- a/mm-core/src/msm8996/registry_table.c +++ b/mm-core/src/msm8996/registry_table.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +Copyright (c) 2014-2018, 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 @@ -149,7 +149,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { @@ -181,7 +185,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx311" +#else "video_decoder.divx" +#endif } }, { diff --git a/mm-core/src/msm8996/registry_table_android.c b/mm-core/src/msm8996/registry_table_android.c index 9ee77327..1c720601 100644 --- a/mm-core/src/msm8996/registry_table_android.c +++ b/mm-core/src/msm8996/registry_table_android.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2014-2018, 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 @@ -84,7 +84,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { @@ -116,7 +120,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx311" +#else "video_decoder.divx" +#endif } }, { diff --git a/mm-core/src/msm8998/registry_table.c b/mm-core/src/msm8998/registry_table.c index ab06c607..be1e2260 100644 --- a/mm-core/src/msm8998/registry_table.c +++ b/mm-core/src/msm8998/registry_table.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2016-2018, 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 @@ -149,7 +149,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { @@ -181,7 +185,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx311" +#else "video_decoder.divx" +#endif } }, { diff --git a/mm-core/src/msm8998/registry_table_android.c b/mm-core/src/msm8998/registry_table_android.c index e7af7958..341b252a 100644 --- a/mm-core/src/msm8998/registry_table_android.c +++ b/mm-core/src/msm8998/registry_table_android.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2016-2018, 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 @@ -85,7 +85,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { @@ -117,7 +121,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx311" +#else "video_decoder.divx" +#endif } }, { diff --git a/mm-core/src/sdm660/registry_table.c b/mm-core/src/sdm660/registry_table.c index c35ac9b7..5e002681 100644 --- a/mm-core/src/sdm660/registry_table.c +++ b/mm-core/src/sdm660/registry_table.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2016, The Linux Foundation. All rights reserved. +Copyright (c) 2018, 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 @@ -149,7 +149,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { @@ -181,7 +185,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx311" +#else "video_decoder.divx" +#endif } }, { diff --git a/mm-core/src/sdm660/registry_table_android.c b/mm-core/src/sdm660/registry_table_android.c index 12e762cf..e6c8d24e 100644 --- a/mm-core/src/sdm660/registry_table_android.c +++ b/mm-core/src/sdm660/registry_table_android.c @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2016-2018, 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 @@ -85,7 +85,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx4" +#else "video_decoder.divx" +#endif } }, { @@ -117,7 +121,11 @@ omx_core_cb_type core[] = NULL, // Shared object library handle "libOmxVdec.so", { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + "video_decoder.divx311" +#else "video_decoder.divx" +#endif } }, { diff --git a/mm-video-v4l2/vidc/vdec/Android.mk b/mm-video-v4l2/vidc/vdec/Android.mk index 27b8142c..4abb8368 100644 --- a/mm-video-v4l2/vidc/vdec/Android.mk +++ b/mm-video-v4l2/vidc/vdec/Android.mk @@ -63,6 +63,10 @@ ifeq ($(call is-board-platform-in-list, $(MASTER_SIDE_CP_TARGET_LIST)),true) libmm-vdec-def += -DMASTER_SIDE_CP endif +ifeq ($(call is-platform-sdk-version-at-least,27),true) # O-MR1 +libmm-vdec-def += -D_ANDROID_O_MR1_DIVX_CHANGES +endif + include $(CLEAR_VARS) # Common Includes diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h index 3965b4f0..e32d79a8 100644 --- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h +++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2010 - 2017, The Linux Foundation. All rights reserved. +Copyright (c) 2010 - 2018, 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 @@ -1288,6 +1288,7 @@ class omx_vdec: public qc_omx_component } }; client_extradata_info m_client_out_extradata_info; + bool m_buffer_error; OMX_ERRORTYPE get_vendor_extension_config( OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext); diff --git a/mm-video-v4l2/vidc/vdec/src/omx_swvdec.cpp b/mm-video-v4l2/vidc/vdec/src/omx_swvdec.cpp index f7d90589..8f3e456d 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_swvdec.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_swvdec.cpp @@ -1,7 +1,7 @@ /** * @copyright * - * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2018, 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: @@ -191,6 +191,25 @@ OMX_ERRORTYPE omx_swvdec::component_init(OMX_STRING cmp_name) m_swvdec_codec = SWVDEC_CODEC_H263; m_omx_video_codingtype = OMX_VIDEO_CodingH263; } +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + else if (!strncmp(cmp_name,"OMX.qti.video.decoder.divxsw",OMX_MAX_STRINGNAME_SIZE)){ + OMX_SWVDEC_LOG_LOW("video_decoder.divx"); + + strlcpy(m_cmp_name, cmp_name, OMX_MAX_STRINGNAME_SIZE); + strlcpy(m_role_name, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE); + + m_swvdec_codec = SWVDEC_CODEC_MPEG4; + m_omx_video_codingtype = ((OMX_VIDEO_CODINGTYPE) QOMX_VIDEO_CodingDivx); + }else if (!strncmp(cmp_name,"OMX.qti.video.decoder.divx4sw",OMX_MAX_STRINGNAME_SIZE)){ + OMX_SWVDEC_LOG_LOW("video_decoder.divx4"); + + strlcpy(m_cmp_name, cmp_name, OMX_MAX_STRINGNAME_SIZE); + strlcpy(m_role_name, "video_decoder.divx4", OMX_MAX_STRINGNAME_SIZE); + + m_swvdec_codec = SWVDEC_CODEC_MPEG4; + m_omx_video_codingtype = ((OMX_VIDEO_CODINGTYPE) QOMX_VIDEO_CodingDivx); + } +#else else if (((!strncmp(cmp_name, "OMX.qti.video.decoder.divxsw", OMX_MAX_STRINGNAME_SIZE))) || @@ -206,6 +225,7 @@ OMX_ERRORTYPE omx_swvdec::component_init(OMX_STRING cmp_name) m_swvdec_codec = SWVDEC_CODEC_MPEG4; m_omx_video_codingtype = ((OMX_VIDEO_CODINGTYPE) QOMX_VIDEO_CodingDivx); } +#endif else { OMX_SWVDEC_LOG_ERROR("'%s': invalid component name", cmp_name); diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp index 5fd3879d..2ac3144b 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2010 - 2017, The Linux Foundation. All rights reserved. +Copyright (c) 2010 - 2018, 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: @@ -676,7 +676,8 @@ omx_vdec::omx_vdec(): m_error_propogated(false), current_perf_level(V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL), secure_scaling_to_non_secure_opb(false), m_force_compressed_for_dpb(true), - m_is_display_session(false) + m_is_display_session(false), + m_buffer_error(false) { m_pipe_in = -1; m_pipe_out = -1; @@ -2401,7 +2402,11 @@ OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) m_frame_parser.init_start_codes(codec_type_parse); } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\ OMX_MAX_STRINGNAME_SIZE)) { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + strlcpy((char *)m_cRole, "video_decoder.divx311",OMX_MAX_STRINGNAME_SIZE); +#else strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); +#endif DEBUG_PRINT_LOW ("DIVX 311 Decoder selected"); drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3; output_capability = V4L2_PIX_FMT_DIVX_311; @@ -2411,7 +2416,11 @@ OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ OMX_MAX_STRINGNAME_SIZE)) { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + strlcpy((char *)m_cRole, "video_decoder.divx4",OMX_MAX_STRINGNAME_SIZE); +#else strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); +#endif DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected"); drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4; output_capability = V4L2_PIX_FMT_DIVX; @@ -4727,12 +4736,25 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) || (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4", OMX_MAX_STRINGNAME_SIZE)) ) { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx4", OMX_MAX_STRINGNAME_SIZE)) { + strlcpy((char*)m_cRole, "video_decoder.divx4", OMX_MAX_STRINGNAME_SIZE); + } else if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) { + strlcpy((char*)m_cRole, "video_decoder.divx311", OMX_MAX_STRINGNAME_SIZE); + } else if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE)) { + strlcpy((char*)m_cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE); + } else { + DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); + eRet =OMX_ErrorUnsupportedSetting; + } +#else if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE)) { strlcpy((char*)m_cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE); } else { DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); eRet =OMX_ErrorUnsupportedSetting; } +#endif } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) || (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) ) { @@ -6018,6 +6040,7 @@ OMX_ERRORTYPE omx_vdec::use_output_buffer( eRet = allocate_output_headers(); if (eRet == OMX_ErrorNone) eRet = allocate_extradata(); + output_use_buffer = true; } if (eRet == OMX_ErrorNone) { @@ -6527,7 +6550,6 @@ OMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) index = bufferHdr - m_inp_mem_ptr; DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); - auto_lock l(buf_lock); bufferHdr->pInputPortPrivate = NULL; if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) { @@ -6770,6 +6792,7 @@ OMX_ERRORTYPE omx_vdec::allocate_input_buffer( unsigned i = 0; unsigned char *buf_addr = NULL; int pmem_fd = -1; + unsigned int align_size = 0; (void) hComp; (void) port; @@ -6829,8 +6852,10 @@ OMX_ERRORTYPE omx_vdec::allocate_input_buffer( int rc; DEBUG_PRINT_LOW("Allocate input Buffer"); #ifdef USE_ION + align_size = drv_ctx.ip_buf.buffer_size + 512; + align_size = (align_size + drv_ctx.ip_buf.alignment - 1)&(~(drv_ctx.ip_buf.alignment - 1)); drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( - drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, + align_size, drv_ctx.op_buf.alignment, &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? SECURE_FLAGS_INPUT_BUFFER : ION_FLAG_CACHED); @@ -7387,6 +7412,10 @@ OMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hC eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); } } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { + if (output_use_buffer) { + DEBUG_PRINT_ERROR("Allocate output buffer not allowed after use buffer"); + return OMX_ErrorBadParameter; + } eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port, appData,bytes); } else { @@ -7447,6 +7476,7 @@ OMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, (void) hComp; DEBUG_PRINT_LOW("In for decoder free_buffer"); + auto_lock l(buf_lock); if (m_state == OMX_StateIdle && (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { DEBUG_PRINT_LOW(" free buffer while Component in Loading pending"); @@ -7463,7 +7493,7 @@ OMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, post_event(OMX_EventError, OMX_ErrorPortUnpopulated, OMX_COMPONENT_GENERATE_EVENT); - + m_buffer_error = true; return OMX_ErrorIncorrectStateOperation; } else if (m_state != OMX_StateInvalid) { DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers"); @@ -7584,6 +7614,7 @@ OMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); post_event(OMX_CommandStateSet, OMX_StateLoaded, OMX_COMPONENT_GENERATE_EVENT); + m_buffer_error = false; } } return eRet; @@ -7755,6 +7786,11 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, if (!temp_buffer || (temp_buffer - drv_ctx.ptr_inputbuffer) > (int)drv_ctx.ip_buf.actualcount) { return OMX_ErrorBadParameter; } + + if (BITMASK_ABSENT(&m_inp_bm_count, nPortIndex) || m_buffer_error) { + DEBUG_PRINT_ERROR("ETBProxy: ERROR: invalid buffer, nPortIndex %u", nPortIndex); + return OMX_ErrorBadParameter; + } /* If its first frame, H264 codec and reject is true, then parse the nal and get the profile. Based on this, reject the clip playback */ if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 && @@ -8056,6 +8092,7 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( struct vdec_bufferpayload *ptr_outputbuffer = NULL; struct vdec_output_frameinfo *ptr_respbuffer = NULL; + auto_lock l(buf_lock); nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); if (bufferAdd == NULL || nPortIndex >= drv_ctx.op_buf.actualcount) { @@ -8064,6 +8101,10 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( return OMX_ErrorBadParameter; } + if (BITMASK_ABSENT(&m_out_bm_count, nPortIndex) || m_buffer_error) { + DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer, nPortIndex %u", nPortIndex); + return OMX_ErrorBadParameter; + } DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", bufferAdd, bufferAdd->pBuffer); /*Return back the output buffer to client*/ @@ -8438,7 +8479,15 @@ OMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))) { if ((0 == index) && role) { +#ifdef _ANDROID_O_MR1_DIVX_CHANGES + if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) { + strlcpy((char *)role, "video_decoder.divx311",OMX_MAX_STRINGNAME_SIZE); + } else { + strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); + } +#else strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); +#endif DEBUG_PRINT_LOW("component_role_enum: role %s",role); } else { DEBUG_PRINT_LOW("No more roles"); @@ -9456,7 +9505,7 @@ int omx_vdec::async_message_process (void *context, void* message) if (omxhdr && omxhdr->nFilledLen && !omx->m_need_turbo) { omx->request_perf_level(VIDC_NOMINAL); } - if (omx->output_use_buffer && omxhdr->pBuffer && + if (!omx->m_enable_android_native_buffers && omx->output_use_buffer && omxhdr->pBuffer && vdec_msg->msgdata.output_frame.bufferaddr) memcpy ( omxhdr->pBuffer, (void *) ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr + diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h index f325678e..bb3cffe0 100644 --- a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h +++ b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h @@ -707,6 +707,7 @@ class omx_video: public qc_omx_component uint64_t m_out_bm_count; uint64_t m_client_out_bm_count; + uint64_t m_client_in_bm_count; uint64_t m_inp_bm_count; uint64_t m_flags; uint64_t m_etb_count; @@ -719,6 +720,7 @@ class omx_video: public qc_omx_component bool hw_overload; size_t m_graphicbuffer_size; char m_platform[OMX_MAX_STRINGNAME_SIZE]; + bool m_buffer_freed; }; #endif // __OMX_VIDEO_BASE_H__ diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp index c0c697a1..df0178a9 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp @@ -290,13 +290,15 @@ omx_video::omx_video(): allocate_native_handle(false), m_out_bm_count(0), m_client_out_bm_count(0), + m_client_in_bm_count(0), m_inp_bm_count(0), m_flags(0), m_etb_count(0), m_fbd_count(0), m_event_port_settings_sent(false), hw_overload(false), - m_graphicbuffer_size(0) + m_graphicbuffer_size(0), + m_buffer_freed(0) { DEBUG_PRINT_HIGH("omx_video(): Inside Constructor()"); memset(&m_cmp,0,sizeof(m_cmp)); @@ -439,6 +441,9 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id) case OMX_CommandStateSet: pThis->m_state = (OMX_STATETYPE) p2; DEBUG_PRINT_LOW("Process -> state set to %d", pThis->m_state); + if (pThis->m_state == OMX_StateLoaded) { + m_buffer_freed = false; + } pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventCmdComplete, p1, p2, NULL); break; @@ -2645,6 +2650,7 @@ OMX_ERRORTYPE omx_video::use_input_buffer( *bufferHdr = (m_inp_mem_ptr + i); BITMASK_SET(&m_inp_bm_count,i); + BITMASK_SET(&m_client_in_bm_count,i); (*bufferHdr)->pBuffer = (OMX_U8 *)buffer; (*bufferHdr)->nSize = sizeof(OMX_BUFFERHEADERTYPE); @@ -3661,6 +3667,10 @@ OMX_ERRORTYPE omx_video::free_buffer(OMX_IN OMX_HANDLETYPE hComp, nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr; if(BITMASK_PRESENT(&m_client_out_bm_count, nPortIndex)) BITMASK_CLEAR(&m_client_out_bm_count,nPortIndex); + } else if (port == PORT_INDEX_IN) { + nPortIndex = buffer - (meta_mode_enable?meta_buffer_hdr:m_inp_mem_ptr); + if(BITMASK_PRESENT(&m_client_in_bm_count, nPortIndex)) + BITMASK_CLEAR(&m_client_in_bm_count,nPortIndex); } if (m_state == OMX_StateIdle && (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { @@ -3670,12 +3680,14 @@ OMX_ERRORTYPE omx_video::free_buffer(OMX_IN OMX_HANDLETYPE hComp, DEBUG_PRINT_LOW("Free Buffer while port %u disabled", (unsigned int)port); } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) { DEBUG_PRINT_ERROR("ERROR: Invalid state to free buffer,ports need to be disabled"); + m_buffer_freed = true; post_event(OMX_EventError, OMX_ErrorPortUnpopulated, OMX_COMPONENT_GENERATE_EVENT); return eRet; } else { DEBUG_PRINT_ERROR("ERROR: Invalid state to free buffer,port lost Buffers"); + m_buffer_freed = true; post_event(OMX_EventError, OMX_ErrorPortUnpopulated, OMX_COMPONENT_GENERATE_EVENT); @@ -3797,6 +3809,9 @@ OMX_ERRORTYPE omx_video::free_buffer(OMX_IN OMX_HANDLETYPE hComp, m_out_bm_count, m_inp_bm_count); } } + if (eRet != OMX_ErrorNone) { + m_buffer_freed = true; + } return eRet; } @@ -4032,7 +4047,7 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, auto_lock l(m_buf_lock); pmem_data_buf = (OMX_U8 *)m_pInput_pmem[nBufIndex].buffer; - if (pmem_data_buf && BITMASK_PRESENT(&m_inp_bm_count, nBufIndex)) { + if (pmem_data_buf && BITMASK_PRESENT(&m_client_in_bm_count, nBufIndex)) { memcpy (pmem_data_buf, (buffer->pBuffer + buffer->nOffset), buffer->nFilledLen); } @@ -4149,8 +4164,15 @@ OMX_ERRORTYPE omx_video::fill_this_buffer_proxy( (void)hComp; OMX_U8 *pmem_data_buf = NULL; OMX_ERRORTYPE nRet = OMX_ErrorNone; + auto_lock l(m_buf_lock); + if (m_buffer_freed == true) { + DEBUG_PRINT_ERROR("ERROR: FTBProxy: Invalid call. Called after freebuffer"); + return OMX_ErrorBadParameter; + } - DEBUG_PRINT_LOW("FTBProxy: bufferAdd->pBuffer[%p]", bufferAdd->pBuffer); + if (bufferAdd != NULL) { + DEBUG_PRINT_LOW("FTBProxy: bufferAdd->pBuffer[%p]", bufferAdd->pBuffer); + } if (bufferAdd == NULL || ((bufferAdd - m_out_mem_ptr) >= (int)m_sOutPortDef.nBufferCountActual) ) { DEBUG_PRINT_ERROR("ERROR: FTBProxy: Invalid i/p params"); 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 ac5bfff8..8841fc1f 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp @@ -2431,6 +2431,8 @@ OMX_ERRORTYPE omx_venc::component_deinit(OMX_IN OMX_HANDLETYPE hComp) for (i=0; i<m_sInPortDef.nBufferCountActual; i++ ) { if (BITMASK_PRESENT(&m_inp_bm_count, i)) { BITMASK_CLEAR(&m_inp_bm_count, i); + if (BITMASK_PRESENT(&m_client_in_bm_count, i)) + BITMASK_CLEAR(&m_client_in_bm_count, i); free_input_buffer (&m_inp_mem_ptr[i]); } |