Home | History | Annotate | Download | only in src
      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 ////////////////////////////////////////////////////////////////////////////
     42 PVMFFileDummyInputPort::PVMFFileDummyInputPort(int32 aTag, PVMFNodeInterface* aNode)
     43         : PvmfPortBaseImpl(aTag, aNode)
     44 {
     45     Construct();
     46 }
     47 
     48 ////////////////////////////////////////////////////////////////////////////
     49 PVMFFileDummyInputPort::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 ////////////////////////////////////////////////////////////////////////////
     62 void 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 ////////////////////////////////////////////////////////////////////////////
     72 PVMFFileDummyInputPort::~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 ////////////////////////////////////////////////////////////////////////////
     87 OSCL_EXPORT_REF void PVMFFileDummyInputPort::setObserver(PvmiConfigAndCapabilityCmdObserver* aObserver)
     88 {
     89     // Not supported
     90     OSCL_UNUSED_ARG(aObserver);
     91 }
     92 
     93 ////////////////////////////////////////////////////////////////////////////
     94 OSCL_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 ////////////////////////////////////////////////////////////////////////////
    201 OSCL_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 ////////////////////////////////////////////////////////////////////////////
    220 OSCL_EXPORT_REF void PVMFFileDummyInputPort::createContext(PvmiMIOSession session, PvmiCapabilityContext& context)
    221 {
    222     OSCL_UNUSED_ARG(session);
    223     OSCL_UNUSED_ARG(context);
    224 }
    225 
    226 ////////////////////////////////////////////////////////////////////////////
    227 OSCL_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 ////////////////////////////////////////////////////////////////////////////
    238 OSCL_EXPORT_REF void PVMFFileDummyInputPort::DeleteContext(PvmiMIOSession session, PvmiCapabilityContext& context)
    239 {
    240     OSCL_UNUSED_ARG(session);
    241     OSCL_UNUSED_ARG(context);
    242 }
    243 
    244 ////////////////////////////////////////////////////////////////////////////
    245 OSCL_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 ////////////////////////////////////////////////////////////////////////////
    265 OSCL_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 ////////////////////////////////////////////////////////////////////////////
    280 OSCL_EXPORT_REF uint32 PVMFFileDummyInputPort::getCapabilityMetric(PvmiMIOSession session)
    281 {
    282     OSCL_UNUSED_ARG(session);
    283     return 0;
    284 }
    285 
    286 ////////////////////////////////////////////////////////////////////////////
    287 OSCL_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 ////////////////////////////////////////////////////////////////////////////////////////////////////////
    300 OSCL_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 ////////////////////////////////////////////////////////////////////////////
    345 bool 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 ////////////////////////////////////////////////////////////////////////////
    368 void PVMFFileDummyInputPort::FormatUpdated()
    369 {
    370     PVLOGGER_LOGMSG(PVLOGMSG_INST_MLDBG, iLogger, PVLOGMSG_INFO
    371                     , (0, "PVMFFileDummyInputPort::FormatUpdated %s", iFormat.getMIMEStrPtr()));
    372 }
    373 
    374 ////////////////////////////////////////////////////////////////////////////
    375 PVMFStatus 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 ////////////////////////////////////////////////////////////////////////////
    413 PVMFStatus 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 //////////////////////////////////////////////////////////////////////////////////////
    446 bool 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 ////////////////////////////////////////////////////////////////////////////////////////////////////
    485 bool 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