1aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel/*-------------------------------------------------------------------------- 2aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelCopyright (c) 2017, The Linux Foundation. All rights reserved. 3aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 4aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelRedistribution and use in source and binary forms, with or without 5aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudelmodification, are permitted provided that the following conditions are 6aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudelmet: 7aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel * Redistributions of source code must retain the above copyright 8aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel notice, this list of conditions and the following disclaimer. 9aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel * Redistributions in binary form must reproduce the above 10aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel copyright notice, this list of conditions and the following 11aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel disclaimer in the documentation and/or other materials provided 12aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel with the distribution. 13aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel * Neither the name of The Linux Foundation nor the names of its 14aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel contributors may be used to endorse or promote products derived 15aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel from this software without specific prior written permission. 16aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 17aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel--------------------------------------------------------------------------*/ 29aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 30aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudelvoid omx_video::init_vendor_extensions(VendorExtensionStore &store) { 31aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 32aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel //TODO: add extensions based on Codec, m_platform and/or other capability queries 33aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 34aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_EXTENSION("qti-ext-enc-preprocess-rotate", OMX_IndexConfigCommonRotate, OMX_DirOutput) 35aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_PARAM_END("angle", OMX_AndroidVendorValueInt32) 36aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 37aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_EXTENSION("qti-ext-enc-avc-intra-period", OMX_IndexConfigVideoAVCIntraPeriod, OMX_DirOutput) 38aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_PARAM ("n-pframes", OMX_AndroidVendorValueInt32) 39aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_PARAM_END("n-idr-period", OMX_AndroidVendorValueInt32) 40aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 41aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_EXTENSION("qti-ext-enc-error-correction", OMX_IndexParamVideoErrorCorrection, OMX_DirOutput) 42aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_PARAM_END("resync-marker-spacing-bits", OMX_AndroidVendorValueInt32) 43aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 44aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_EXTENSION("qti-ext-enc-custom-profile-level", OMX_IndexParamVideoProfileLevelCurrent, OMX_DirOutput) 45aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_PARAM ("profile", OMX_AndroidVendorValueInt32) 46aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_PARAM_END("level", OMX_AndroidVendorValueInt32) 47aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 48aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_EXTENSION("qti-ext-enc-timestamp-source-avtimer", OMX_QTIIndexParamEnableAVTimerTimestamps, OMX_DirInput) 49aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ADD_PARAM_END("enable", OMX_AndroidVendorValueInt32) 50aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel} 51aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 52aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelOMX_ERRORTYPE omx_video::get_vendor_extension_config( 53aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext) { 54aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (ext->nIndex >= mVendorExtensionStore.size()) { 55aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel return OMX_ErrorNoMore; 56aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 57aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 58aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel const VendorExtension& vExt = mVendorExtensionStore[ext->nIndex]; 59aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_LOW("VendorExt: getConfig: index=%u (%s)", ext->nIndex, vExt.name()); 60aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 61aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel vExt.copyInfoTo(ext); 62aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (ext->nParamSizeUsed < vExt.paramCount()) { 63aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel // this happens during initial getConfig to query only extension-name and param-count 64aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel return OMX_ErrorNone; 65aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 66aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 67aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel // We now have sufficient params allocated in extension data passed. 68aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel // Following code is to set the extension-specific data 69aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 70aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel bool setStatus = true; 71aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 72aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel switch ((OMX_U32)vExt.extensionIndex()) { 73aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_IndexConfigCommonRotate: 74aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 75aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel setStatus &= vExt.setParamInt32(ext, "angle", m_sConfigFrameRotation.nRotation); 76aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 77aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 78aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_IndexConfigVideoAVCIntraPeriod: 79aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 80aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel setStatus &= vExt.setParamInt32(ext, "n-pframes", m_sConfigAVCIDRPeriod.nPFrames); 81aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel setStatus &= vExt.setParamInt32(ext, "n-idr-period", m_sConfigAVCIDRPeriod.nIDRPeriod); 82aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 83aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 84aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_IndexParamVideoErrorCorrection: 85aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 86aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel // "bits" @0 87aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel setStatus &= vExt.setParamInt32(ext, 88aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel "resync-marker-spacing-bits", m_sErrorCorrection.nResynchMarkerSpacing); 89aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 90aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 91aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_IndexParamVideoProfileLevelCurrent: 92aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 93aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel setStatus &= vExt.setParamInt32(ext, "profile", m_sParamProfileLevel.eProfile); 94aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel setStatus &= vExt.setParamInt32(ext, "level", m_sParamProfileLevel.eLevel); 95aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 96aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 97aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 98aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_QTIIndexParamEnableAVTimerTimestamps: 99aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 100aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel setStatus &= vExt.setParamInt32(ext, "enable", m_sParamAVTimerTimestampMode.bEnable); 101aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 102aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 103aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel default: 104aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 105aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel return OMX_ErrorNotImplemented; 106aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 107aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 108e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel return setStatus ? OMX_ErrorNone : OMX_ErrorUnsupportedSetting; 109aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel} 110aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 111aec695787aa19f0f77459fe206562c7f98d9c7ceThierry StrudelOMX_ERRORTYPE omx_video::set_vendor_extension_config( 112aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext) { 113aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 114aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ALOGI("set_vendor_extension_config"); 115aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (ext->nIndex >= mVendorExtensionStore.size()) { 116aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_ERROR("unrecognized vendor extension index (%u) max(%u)", 117aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ext->nIndex, mVendorExtensionStore.size()); 118aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel return OMX_ErrorBadParameter; 119aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 120aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 121aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel const VendorExtension& vExt = mVendorExtensionStore[ext->nIndex]; 122aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_LOW("VendorExt: setConfig: index=%u (%s)", ext->nIndex, vExt.name()); 123aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 124aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel OMX_ERRORTYPE err = OMX_ErrorNone; 125aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel err = vExt.isConfigValid(ext); 126aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (err != OMX_ErrorNone) { 127e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel return OMX_ErrorUnsupportedSetting; 128aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 129aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 130aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel // mark this as set, regardless of set_config succeeding/failing. 131aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel // App will know by inconsistent values in output-format 132aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel vExt.set(); 133aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 134aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel bool valueSet = false; 135aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel switch ((OMX_U32)vExt.extensionIndex()) { 136aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_IndexConfigCommonRotate: 137aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 138aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel OMX_CONFIG_ROTATIONTYPE rotationParam; 139aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel memcpy(&rotationParam, &m_sConfigFrameRotation, sizeof(OMX_CONFIG_ROTATIONTYPE)); 140aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel valueSet |= vExt.readParamInt32(ext, "angle", &rotationParam.nRotation); 141aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (!valueSet) { 142aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 143aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 144aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 145aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_HIGH("VENDOR-EXT: set_config: OMX_IndexConfigCommonRotate : %d", 146aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel rotationParam.nRotation); 147aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 148aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel err = set_config( 149aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel NULL, OMX_IndexConfigCommonRotate, &rotationParam); 150aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (err != OMX_ErrorNone) { 151aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_ERROR("set_config: OMX_IndexConfigCommonRotate failed !"); 152aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 153aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 154aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 155aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_IndexConfigVideoAVCIntraPeriod: 156aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 157aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel OMX_VIDEO_CONFIG_AVCINTRAPERIOD idrConfig; 158aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel memcpy(&idrConfig, &m_sConfigAVCIDRPeriod, sizeof(OMX_VIDEO_CONFIG_AVCINTRAPERIOD)); 159aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel valueSet |= vExt.readParamInt32(ext, "n-pframes", (OMX_S32 *)&(idrConfig.nPFrames)); 160aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel valueSet |= vExt.readParamInt32(ext, "n-idr-period", (OMX_S32 *)&(idrConfig.nIDRPeriod)); 161aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (!valueSet) { 162aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 163aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 164aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 165aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_HIGH("VENDOR-EXT: set_config: AVC-intra-period : nP=%d, nIDR=%d", 166aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel idrConfig.nPFrames, idrConfig.nIDRPeriod); 167aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 168aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel err = set_config( 169aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel NULL, OMX_IndexConfigVideoAVCIntraPeriod, &idrConfig); 170aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (err != OMX_ErrorNone) { 171aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_ERROR("set_config: OMX_IndexConfigVideoAVCIntraPeriod failed !"); 172aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 173aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 174aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 175aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_IndexParamVideoErrorCorrection: 176aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 177aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE ecParam; 178aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel memcpy(&ecParam, &m_sErrorCorrection, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE)); 179aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel valueSet |= vExt.readParamInt32(ext, 180aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel "resync-marker-spacing-bits", (OMX_S32 *)&(ecParam.nResynchMarkerSpacing)); 181aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (!valueSet) { 182aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 183aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 184aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 185aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_HIGH("VENDOR-EXT: set_config: resync-marker-spacing : %d bits", 186aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel ecParam.nResynchMarkerSpacing); 187aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 188aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel err = set_parameter( 189aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel NULL, OMX_IndexParamVideoErrorCorrection, &ecParam); 190aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (err != OMX_ErrorNone) { 191aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_ERROR("set_config: OMX_IndexParamVideoErrorCorrection failed !"); 192aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 193aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 194aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 195aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_IndexParamVideoProfileLevelCurrent: 196aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 197aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE profileParam; 198aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel memcpy(&profileParam, &m_sParamProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE)); 199aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel valueSet |= vExt.readParamInt32(ext, "profile", (OMX_S32 *)&(profileParam.eProfile)); 200aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel valueSet |= vExt.readParamInt32(ext, "level", (OMX_S32 *)&(profileParam.eLevel)); 201aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (!valueSet) { 202aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 203aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 204aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 205aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_HIGH("VENDOR-EXT: set_config: custom-profile/level : profile=%u level=%u", 206aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel (OMX_U32)profileParam.eProfile, (OMX_U32)profileParam.eLevel); 207aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 208aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel err = set_parameter( 209aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel NULL, OMX_IndexParamVideoProfileLevelCurrent, &profileParam); 210aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (err != OMX_ErrorNone) { 211aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_ERROR("set_config: OMX_IndexParamVideoProfileLevelCurrent failed !"); 212aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 213aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 214aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 215aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 216aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_QTIIndexParamEnableAVTimerTimestamps: 217aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 218aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel QOMX_ENABLETYPE avTimerEnableParam; 219aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel memcpy(&avTimerEnableParam, &m_sParamAVTimerTimestampMode, sizeof(QOMX_ENABLETYPE)); 220aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel valueSet |= vExt.readParamInt32(ext, "enable", (OMX_S32 *)&(avTimerEnableParam.bEnable)); 221aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (!valueSet) { 222aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 223aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 224aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 225aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_HIGH("VENDOR-EXT: AV-timer timestamp mode enable=%u", avTimerEnableParam.bEnable); 226aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 227aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel err = set_parameter( 228aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel NULL, (OMX_INDEXTYPE)OMX_QTIIndexParamEnableAVTimerTimestamps, &avTimerEnableParam); 229aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (err != OMX_ErrorNone) { 230aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_ERROR("set_param: OMX_QTIIndexParamEnableAVTimerTimestamps failed !"); 231aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 232aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 233aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel break; 234aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 235aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel default: 236aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 237aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel return OMX_ErrorNotImplemented; 238aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 239aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 240aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel return err; 241aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel} 242