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