1/* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18/**
19 * @file pvmf_sample_port.cpp
20 * @brief Sample PVMF Port implementation
21 */
22
23#ifndef PVMF_FILEINPUT_PORT_H_INCLUDED
24#include "pvmf_fileinput_port.h"
25#endif
26#ifndef OSCL_MEM_BASIC_FUNCTIONS_H
27#include "oscl_mem_basic_functions.h"
28#endif
29#ifndef OSCL_MIME_STRING_UTILS_H
30#include "pv_mime_string_utils.h"
31#endif
32#ifndef PVMF_DUMMY_FILEINPUT_NODE_H_INCLUDED
33#include "pvmf_dummy_fileinput_node.h"
34#endif
35
36#define LOG_STACK_TRACE(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, m);
37#define LOG_DEBUG(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_DEBUG, m);
38#define LOG_ERR(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iLogger,PVLOGMSG_ERR,m);
39
40
41////////////////////////////////////////////////////////////////////////////
42PVMFFileDummyInputPort::PVMFFileDummyInputPort(int32 aTag, PVMFNodeInterface* aNode)
43        : PvmfPortBaseImpl(aTag, aNode)
44{
45    Construct();
46}
47
48////////////////////////////////////////////////////////////////////////////
49PVMFFileDummyInputPort::PVMFFileDummyInputPort(int32 aTag, PVMFNodeInterface* aNode
50        , uint32 aInCapacity
51        , uint32 aInReserve
52        , uint32 aInThreshold
53        , uint32 aOutCapacity
54        , uint32 aOutReserve
55        , uint32 aOutThreshold)
56        : PvmfPortBaseImpl(aTag, aNode, aInCapacity, aInReserve, aInThreshold, aOutCapacity, aOutReserve, aOutThreshold)
57{
58    Construct();
59}
60
61////////////////////////////////////////////////////////////////////////////
62void PVMFFileDummyInputPort::Construct()
63{
64    iLogger = PVLogger::GetLoggerObject("PVMFFileDummyInputPort");
65    oscl_memset(&iStats, 0, sizeof(PvmfPortBaseImplStats));
66    iNumFramesGenerated = 0;
67    iTrackConfigFI = NULL;
68    iTrackConfigSizeFI = 0;
69}
70
71////////////////////////////////////////////////////////////////////////////
72PVMFFileDummyInputPort::~PVMFFileDummyInputPort()
73{
74    Disconnect();
75    ClearMsgQueues();
76
77    if (iTrackConfigFI)
78    {
79        oscl_free(iTrackConfigFI);
80        iTrackConfigFI = NULL;
81    }
82}
83
84////////////////////////////////////////////////////////////////////////////
85//                  PvmiCapabilityAndConfig
86////////////////////////////////////////////////////////////////////////////
87OSCL_EXPORT_REF void PVMFFileDummyInputPort::setObserver(PvmiConfigAndCapabilityCmdObserver* aObserver)
88{
89    // Not supported
90    OSCL_UNUSED_ARG(aObserver);
91}
92
93////////////////////////////////////////////////////////////////////////////
94OSCL_EXPORT_REF PVMFStatus PVMFFileDummyInputPort::getParametersSync(PvmiMIOSession session,
95        PvmiKeyType identifier,
96        PvmiKvp*& parameters,
97        int& num_parameter_elements,
98        PvmiCapabilityContext context)
99{
100    LOG_STACK_TRACE((0, "PVMFFileDummyInputPort::getParametersSync"));
101    OSCL_UNUSED_ARG(session);
102    OSCL_UNUSED_ARG(context);
103
104
105    num_parameter_elements = 0;
106    PVMFStatus status = PVMFFailure;
107    PVMFDummyFileInputNode* node = (PVMFDummyFileInputNode*)iPortActivityHandler;
108
109
110    if (pv_mime_strcmp(identifier, PVMF_FORMAT_SPECIFIC_INFO_KEY) == 0 && (iFormat == PVMF_MIME_WMV || iFormat == PVMF_MIME_WMA))
111    {
112        if (pvmiGetPortFormatSpecificInfoSync(PVMF_FORMAT_SPECIFIC_INFO_KEY, parameters) == 0)
113        {
114            return PVMFFailure;
115        }
116        else
117        {
118            num_parameter_elements = 1;
119            return PVMFSuccess;
120        }
121
122    }
123
124    parameters = NULL;
125    if (pv_mime_strcmp(identifier, OUTPUT_FORMATS_CAP_QUERY) == 0 ||
126            pv_mime_strcmp(identifier, OUTPUT_FORMATS_CUR_QUERY) == 0)
127    {
128        num_parameter_elements = 1;
129        status = AllocateKvp(parameters, OSCL_STATIC_CAST(PvmiKeyType, OUTPUT_FORMATS_VALTYPE), num_parameter_elements);
130        if (status != PVMFSuccess)
131        {
132            LOG_ERR((0, "PVMFFileDummyInputPort::getParametersSync: Error - AllocateKvp failed. status=%d", status));
133        }
134        else
135        {
136            parameters[0].value.pChar_value = (char*)node->iSettings.iMediaFormat.getMIMEStrPtr();
137        }
138    }
139    else if (pv_mime_strcmp(identifier, VIDEO_OUTPUT_WIDTH_CUR_QUERY) == 0)
140    {
141        num_parameter_elements = 1;
142        status = AllocateKvp(parameters, OSCL_STATIC_CAST(PvmiKeyType, VIDEO_OUTPUT_WIDTH_CUR_VALUE), num_parameter_elements);
143        if (status != PVMFSuccess)
144        {
145            LOG_ERR((0, "PVMFFileDummyInputPort::getParametersSync: Error - AllocateKvp failed. status=%d", status));
146            return status;
147        }
148
149        parameters[0].value.uint32_value = node->iSettings.iFrameWidth;
150    }
151    else if (pv_mime_strcmp(identifier, VIDEO_OUTPUT_HEIGHT_CUR_QUERY) == 0)
152    {
153        num_parameter_elements = 1;
154        status = AllocateKvp(parameters, OSCL_STATIC_CAST(PvmiKeyType, VIDEO_OUTPUT_HEIGHT_CUR_VALUE), num_parameter_elements);
155        if (status != PVMFSuccess)
156        {
157            LOG_ERR((0, "PVMFFileDummyInputPort::getParametersSync: Error - AllocateKvp failed. status=%d", status));
158            return status;
159        }
160
161        parameters[0].value.uint32_value = node->iSettings.iFrameHeight;
162    }
163    else if (pv_mime_strcmp(identifier, VIDEO_OUTPUT_FRAME_RATE_CUR_QUERY) == 0)
164    {
165        num_parameter_elements = 1;
166        status = AllocateKvp(parameters, OSCL_STATIC_CAST(PvmiKeyType, VIDEO_OUTPUT_FRAME_RATE_CUR_VALUE), num_parameter_elements);
167        if (status != PVMFSuccess)
168        {
169            LOG_ERR((0, "PVMFFileDummyInputPort::getParametersSync: Error - AllocateKvp failed. status=%d", status));
170            return status;
171        }
172
173        parameters[0].value.float_value = node->iSettings.iFrameRate;
174    }
175    else if (pv_mime_strcmp(identifier, OUTPUT_TIMESCALE_CUR_QUERY) == 0)
176    {
177        num_parameter_elements = 1;
178        status = AllocateKvp(parameters, OSCL_STATIC_CAST(PvmiKeyType, OUTPUT_TIMESCALE_CUR_VALUE), num_parameter_elements);
179        if (status != PVMFSuccess)
180        {
181            LOG_ERR((0, "PVMFVideoEncPort::getParametersSync: Error - AllocateKvp failed. status=%d", status));
182            return status;
183        }
184        else
185        {
186            if ((node->iSettings.iMediaFormat).isAudio())
187            {
188                parameters[0].value.uint32_value = node->iSettings.iSamplingFrequency;
189            }
190            else
191            {
192                parameters[0].value.uint32_value = node->iSettings.iTimescale;
193            }
194        }
195    }
196
197    return status;
198}
199
200////////////////////////////////////////////////////////////////////////////
201OSCL_EXPORT_REF PVMFStatus PVMFFileDummyInputPort::releaseParameters(PvmiMIOSession session,
202        PvmiKvp* parameters,
203        int num_elements)
204{
205    OSCL_UNUSED_ARG(session);
206    OSCL_UNUSED_ARG(num_elements);
207
208    if (parameters)
209    {
210        iAlloc.deallocate((OsclAny*)parameters->key);
211        return PVMFSuccess;
212    }
213    else
214    {
215        return PVMFFailure;
216    }
217}
218
219////////////////////////////////////////////////////////////////////////////
220OSCL_EXPORT_REF void PVMFFileDummyInputPort::createContext(PvmiMIOSession session, PvmiCapabilityContext& context)
221{
222    OSCL_UNUSED_ARG(session);
223    OSCL_UNUSED_ARG(context);
224}
225
226////////////////////////////////////////////////////////////////////////////
227OSCL_EXPORT_REF void PVMFFileDummyInputPort::setContextParameters(PvmiMIOSession session,
228        PvmiCapabilityContext& context,
229        PvmiKvp* parameters, int num_parameter_elements)
230{
231    OSCL_UNUSED_ARG(session);
232    OSCL_UNUSED_ARG(context);
233    OSCL_UNUSED_ARG(parameters);
234    OSCL_UNUSED_ARG(num_parameter_elements);
235}
236
237////////////////////////////////////////////////////////////////////////////
238OSCL_EXPORT_REF void PVMFFileDummyInputPort::DeleteContext(PvmiMIOSession session, PvmiCapabilityContext& context)
239{
240    OSCL_UNUSED_ARG(session);
241    OSCL_UNUSED_ARG(context);
242}
243
244////////////////////////////////////////////////////////////////////////////
245OSCL_EXPORT_REF void PVMFFileDummyInputPort::setParametersSync(PvmiMIOSession session, PvmiKvp* parameters,
246        int num_elements, PvmiKvp*& ret_kvp)
247{
248    OSCL_UNUSED_ARG(session);
249    PVMFStatus status = PVMFSuccess;
250    ret_kvp = NULL;
251
252    for (int32 i = 0; i < num_elements; i++)
253    {
254        status = VerifyAndSetParameter(&(parameters[i]), true);
255        if (status != PVMFSuccess)
256        {
257            LOG_ERR((0, "PVMFFileDummyInputPort::setParametersSync: Error - VerifiyAndSetParameter failed on parameter #%d", i));
258            ret_kvp = &(parameters[i]);
259            OSCL_LEAVE(OsclErrArgument);
260        }
261    }
262}
263
264////////////////////////////////////////////////////////////////////////////
265OSCL_EXPORT_REF PVMFCommandId PVMFFileDummyInputPort::setParametersAsync(PvmiMIOSession session,
266        PvmiKvp* parameters,
267        int num_elements,
268        PvmiKvp*& ret_kvp,
269        OsclAny* context)
270{
271    OSCL_UNUSED_ARG(session);
272    OSCL_UNUSED_ARG(parameters);
273    OSCL_UNUSED_ARG(num_elements);
274    OSCL_UNUSED_ARG(ret_kvp);
275    OSCL_UNUSED_ARG(context);
276    return -1;
277}
278
279////////////////////////////////////////////////////////////////////////////
280OSCL_EXPORT_REF uint32 PVMFFileDummyInputPort::getCapabilityMetric(PvmiMIOSession session)
281{
282    OSCL_UNUSED_ARG(session);
283    return 0;
284}
285
286////////////////////////////////////////////////////////////////////////////
287OSCL_EXPORT_REF PVMFStatus PVMFFileDummyInputPort::verifyParametersSync(PvmiMIOSession session,
288        PvmiKvp* parameters, int num_elements)
289{
290    OSCL_UNUSED_ARG(session);
291
292    PVMFStatus status = PVMFSuccess;
293    for (int32 i = 0; (i < num_elements) && (status == PVMFSuccess); i++)
294        status = VerifyAndSetParameter(&(parameters[i]));
295
296    return status;
297}
298
299////////////////////////////////////////////////////////////////////////////////////////////////////////
300OSCL_EXPORT_REF PVMFStatus PVMFFileDummyInputPort::Connect(PVMFPortInterface* aPort)
301{
302
303
304    if (!aPort)
305    {
306        LOG_ERR((0, "PVMFFileDummyInputPort::Connect: Error - Connecting to invalid port"));
307        return PVMFErrArgument;
308    }
309
310    if (iConnectedPort)
311    {
312        LOG_ERR((0, "PVMFFileDummyInputPort::Connect: Error - Already connected"));
313        return PVMFFailure;
314    }
315
316    OsclAny* temp = NULL;
317    aPort->QueryInterface(PVMI_CAPABILITY_AND_CONFIG_PVUUID, temp);
318    PvmiCapabilityAndConfig* config = OSCL_STATIC_CAST(PvmiCapabilityAndConfig*, temp);
319
320    if (config != NULL)
321    {
322        if (!(pvmiSetPortFormatSpecificInfoSync(config, PVMF_FORMAT_SPECIFIC_INFO_KEY)))
323        {
324            LOG_ERR((0, "PVMFFileDummyInputPort::Connect: Error - Unable To Send Format Specific Info To Peer"));
325            return PVMFFailure;
326        }
327    }
328
329    /*
330     * Automatically connect the peer.
331     */
332    if (aPort->PeerConnect(this) != PVMFSuccess)
333    {
334        LOG_ERR((0, "PVMFFileDummyInputPort::Connect: Error - Peer Connect failed"));
335        return PVMFFailure;
336    }
337
338    iConnectedPort = aPort;
339
340    PortActivity(PVMF_PORT_ACTIVITY_CONNECT);
341    return PVMFSuccess;
342}
343
344////////////////////////////////////////////////////////////////////////////
345bool PVMFFileDummyInputPort::IsFormatSupported(PVMFFormatType aFmt)
346{
347    return ((aFmt == PVMF_MIME_YUV420)              ||
348            (aFmt == PVMF_MIME_RGB16)               ||
349            (aFmt == PVMF_MIME_M4V)             ||
350            (aFmt == PVMF_MIME_WMV)             ||
351            (aFmt == PVMF_MIME_WMA)             ||
352            (aFmt == PVMF_MIME_H2632000)                ||
353            (aFmt == PVMF_MIME_AMR_IF2)         ||
354            (aFmt == PVMF_MIME_AMR_IETF)            ||
355            (aFmt == PVMF_MIME_PCM16)               ||
356            (aFmt == PVMF_MIME_ADTS)                ||
357            (aFmt == PVMF_MIME_MPEG4_AUDIO)        ||
358            (aFmt == PVMF_MIME_LATM)                ||
359            (aFmt == PVMF_MIME_MP3)             ||
360            (aFmt == PVMF_MIME_ADIF)                ||
361            (aFmt == PVMF_MIME_AAC_SIZEHDR)     ||
362            (aFmt == PVMF_MIME_G726)                ||
363            (aFmt == PVMF_MIME_YUV420)              ||
364            (aFmt == PVMF_MIME_REAL_AUDIO));
365}
366
367////////////////////////////////////////////////////////////////////////////
368void PVMFFileDummyInputPort::FormatUpdated()
369{
370    PVLOGGER_LOGMSG(PVLOGMSG_INST_MLDBG, iLogger, PVLOGMSG_INFO
371                    , (0, "PVMFFileDummyInputPort::FormatUpdated %s", iFormat.getMIMEStrPtr()));
372}
373
374////////////////////////////////////////////////////////////////////////////
375PVMFStatus PVMFFileDummyInputPort::AllocateKvp(PvmiKvp*& aKvp, PvmiKeyType aKey, int32 aNumParams)
376{
377    LOG_STACK_TRACE((0, "PVMFFileDummyInputPort::AllocateKvp"));
378    uint8* buf = NULL;
379    uint32 keyLen = oscl_strlen(aKey) + 1;
380    int32 err = 0;
381
382    OSCL_TRY(err,
383             buf = (uint8*)iAlloc.ALLOCATE(aNumParams * (sizeof(PvmiKvp) + keyLen));
384             if (!buf)
385             OSCL_LEAVE(OsclErrNoMemory);
386            );
387    OSCL_FIRST_CATCH_ANY(err,
388                         LOG_ERR((0, "PVMFFileDummyInputPort::AllocateKvp: Error - kvp allocation failed"));
389                         return PVMFErrNoMemory;
390                        );
391
392    int32 i = 0;
393    PvmiKvp* curKvp = aKvp = OSCL_PLACEMENT_NEW(buf, PvmiKvp);
394    buf += sizeof(PvmiKvp);
395    for (i = 1; i < aNumParams; i++)
396    {
397        curKvp += i;
398        curKvp = OSCL_PLACEMENT_NEW(buf, PvmiKvp);
399        buf += sizeof(PvmiKvp);
400    }
401
402    for (i = 0; i < aNumParams; i++)
403    {
404        aKvp[i].key = (char*)buf;
405        oscl_strncpy(aKvp[i].key, aKey, oscl_strlen(aKvp[i].key));
406        buf += oscl_strlen(aKvp[i].key);
407    }
408
409    return PVMFSuccess;
410}
411
412////////////////////////////////////////////////////////////////////////////
413PVMFStatus PVMFFileDummyInputPort::VerifyAndSetParameter(PvmiKvp* aKvp, bool aSetParam)
414{
415    LOG_STACK_TRACE((0, "PVMFFileDummyInputPort::VerifyAndSetParameter: aKvp=0x%x, aSetParam=%d", aKvp, aSetParam));
416
417    if (!aKvp)
418    {
419        LOG_ERR((0, "PVMFFileDummyInputPort::VerifyAndSetParameter: Error - Invalid key-value pair"));
420        return PVMFFailure;
421    }
422
423    PVMFDummyFileInputNode* node = (PVMFDummyFileInputNode*)iPortActivityHandler;
424
425    if (pv_mime_strcmp(aKvp->key, OUTPUT_FORMATS_VALTYPE) == 0)
426    {
427        if (aKvp->value.pChar_value == node->iSettings.iMediaFormat.getMIMEStrPtr())
428        {
429            if (aSetParam)
430                iFormat = aKvp->value.pChar_value;
431            return PVMFSuccess;
432        }
433        else
434        {
435            LOG_ERR((0, "PVMFFileDummyInputPort::VerifyAndSetParameter: Error - Unsupported format %d",
436                     aKvp->value.uint32_value));
437            return PVMFFailure;
438        }
439    }
440
441    LOG_ERR((0, "PVMFFileDummyInputPort::VerifyAndSetParameter: Error - Unsupported parameter"));
442    return PVMFFailure;
443}
444
445//////////////////////////////////////////////////////////////////////////////////////
446bool PVMFFileDummyInputPort::pvmiGetPortFormatSpecificInfoSync(const char* aFormatValType,
447        PvmiKvp*& aKvp)
448{
449    PVMFDummyFileInputNode* node = (PVMFDummyFileInputNode*)iPortActivityHandler;
450
451    if ((iFormat == PVMF_MIME_WMV) || (iFormat == PVMF_MIME_WMA))
452    {
453        if (node->iFs.Connect() != 0) return false;
454        node->iInputFile.Open(node->iSettings.iFileName.get_cstr(), Oscl_File::MODE_READ | Oscl_File::MODE_BINARY, node->iFs);
455        node->iInputFile.Read((OsclAny*) &iTrackConfigSizeFI, sizeof(uint8), 4);
456
457        iTrackConfigFI = (uint8*) iAlloc.allocate(iTrackConfigSizeFI);
458        node->iInputFile.Read((OsclAny*) iTrackConfigFI, sizeof(uint8), iTrackConfigSizeFI);
459        node->iInputFile.Close();
460
461        if (iTrackConfigSizeFI > 0)
462        {
463            OsclMemAllocator alloc;
464            aKvp->key = NULL;
465            aKvp->length = oscl_strlen(aFormatValType) + 1; // +1 for \0
466            aKvp->key = (PvmiKeyType)alloc.ALLOCATE(aKvp->length);
467            if (aKvp->key == NULL)
468            {
469                return false;
470            }
471            oscl_strncpy(aKvp->key, aFormatValType, aKvp->length);
472
473            aKvp->value.key_specific_value = (OsclAny*)(iTrackConfigFI);
474            aKvp->capacity = iTrackConfigSizeFI;
475        }
476        return true;
477    }
478
479    else
480        return true;
481
482}
483
484////////////////////////////////////////////////////////////////////////////////////////////////////
485bool PVMFFileDummyInputPort::pvmiSetPortFormatSpecificInfoSync(PvmiCapabilityAndConfig *aPort,
486        const char* aFormatValType)
487{
488    PVMFDummyFileInputNode* node = OSCL_STATIC_CAST(PVMFDummyFileInputNode*, iPortActivityHandler);
489    PvmiKvp* retKvp = NULL; // for return value
490    int32 err = 0;
491    PvmiKvp* kvpPtr = NULL;
492    if (iFormat == PVMF_MIME_WMV)
493    {
494        if (node->iFs.Connect() != 0) return false;
495        node->iInputFile.Open(node->iSettings.iFileName.get_cstr(),
496                              Oscl_File::MODE_READ | Oscl_File::MODE_BINARY, node->iFs);
497        node->iInputFile.Read((OsclAny*) &iTrackConfigSizeFI, sizeof(uint8), 4);
498
499        iTrackConfigFI = (uint8*)oscl_malloc(iTrackConfigSizeFI);
500        node->iInputFile.Read((OsclAny*) iTrackConfigFI, sizeof(uint8), iTrackConfigSizeFI);
501        node->iInputFile.Close();
502
503        if (iTrackConfigSizeFI > 0)
504        {
505            OsclMemAllocator alloc;
506            PvmiKvp kvp;
507            kvp.key = NULL;
508            kvp.length = oscl_strlen(aFormatValType) + 1; // +1 for \0
509            kvp.key = (PvmiKeyType)alloc.ALLOCATE(kvp.length);
510            if (kvp.key == NULL)
511            {
512                return false;
513            }
514            oscl_strncpy(kvp.key, aFormatValType, kvp.length);
515
516            kvp.value.key_specific_value = (OsclAny*) iTrackConfigFI;
517            kvp.capacity = iTrackConfigSizeFI;
518            OSCL_TRY(err, aPort->setParametersSync(NULL, &kvp, 1, retKvp););
519            /* ignore the error for now */
520            alloc.deallocate((OsclAny*)(kvp.key));
521        }
522    }
523    else if (iFormat == PVMF_MIME_G726)
524    {
525        // Send a fake G726 format specific info containing number of bits per sample in the
526        // 14th byte of the info buffer.
527        if (AllocateKvp(kvpPtr, OSCL_STATIC_CAST(PvmiKeyType, aFormatValType), 1) != PVMFSuccess)
528        {
529            LOG_ERR((0, "PVMFFileDummyInputPort::pvmiSetPortFormatSpecificInfoSync: Error - AllocateKvp failed"));
530            return false;
531        }
532
533        kvpPtr->value.key_specific_value = OSCL_MALLOC(32);
534        if (kvpPtr->value.key_specific_value == NULL)
535        {
536            LOG_ERR((0, "PVMFFileDummyInputPort::pvmiSetPortFormatSpecificInfoSync: Error - OSCL_MALLOC failed"));
537            return false;
538        }
539        oscl_memset(kvpPtr->value.key_specific_value, 0, 32);
540
541        int16* bitsPerSamplePtr;
542        bitsPerSamplePtr = OSCL_STATIC_CAST(int16*,
543                                            (OSCL_STATIC_CAST(uint8*, kvpPtr->value.key_specific_value) + 14));
544        *bitsPerSamplePtr = (node->iSettings.iBitrate) / (node->iSettings.iSamplingFrequency);
545
546        OSCL_TRY(err, aPort->setParametersSync(NULL, kvpPtr, 1, retKvp););
547        OSCL_FIRST_CATCH_ANY(err,
548                             LOG_ERR((0, "PVMFFileDummyInputPort::pvmiSetPortFormatSpecificInfoSync: Error - setParametersSync failed. err=%d", err));
549                             return false;
550                            );
551
552        OSCL_FREE(kvpPtr->value.key_specific_value);
553        releaseParameters(NULL, kvpPtr, 1);
554    }
555
556    return true;
557}
558