PVMFStatus PVMFFileOutputNode::verifyParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements) { PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMFFileOutputNode::verifyParametersSync()")); OSCL_UNUSED_ARG(aSession); if (NULL == aParameters || aNumElements < 1) { PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::verifyParametersSync() Passed in parameter invalid")); return PVMFErrArgument; } // Go through each parameter for (int32 paramind = 0; paramind < aNumElements; ++paramind) { // Count the number of components and parameters in the key int compcount = pv_mime_string_compcnt(aParameters[paramind].key); // Retrieve the first component from the key string char* compstr = NULL; pv_mime_string_extract_type(0, aParameters[paramind].key, compstr); if ((pv_mime_strcmp(compstr, _STRLIT_CHAR("x-pvmf/file/output")) < 0) || compcount < 4) { // First 4 components should be "x-pvmf/file/output" and there must // be at least four components PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::verifyParametersSync() Unsupported key")); return PVMFErrNotSupported; } if (4 == compcount) { // Verify and set the passed-in file output node setting PVMFStatus retval = VerifyAndSetConfigParameter(aParameters[paramind], false); if (retval != PVMFSuccess) { PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::verifyParametersSync() Setting parameter %d failed", paramind)); return retval; } } else { // Do not support more than 4 components right now PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::verifyParametersSync() Unsupported key")); return PVMFErrNotSupported; } } PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMFFileOutputNode::verifyParametersSync() Out")); return PVMFSuccess; }
void ShoutcastControl::setProtocolInfo() { if (iSetProtocolInfo) return; if (!iProgDownloadSI || !iProtocol) return; // get all protocol info uint32 aMediaDataLength = iProtocol->getMediaDataLength(); if (aMediaDataLength == 0) return; uint32 aClipBitrate = iProtocol->getContenBitrate(); iInfoKvpVec.clear(); // media data length PvmiKvp mediaDataLengthKVP; OSCL_StackString<256> mediaDataLengthKVPString = _STRLIT_CHAR("x-pvmf/net/shoutcast-media-data-length;valtype=uint32"); mediaDataLengthKVP.key = mediaDataLengthKVPString.get_str(); mediaDataLengthKVP.value.uint32_value = aMediaDataLength; iInfoKvpVec.push_back(&mediaDataLengthKVP); // server rate PvmiKvp clipBitrateKVP; OSCL_StackString<256> clipBitrateKVPString = _STRLIT_CHAR("x-pvmf/net/shoutcast-clip-bitrate;valtype=uint32"); clipBitrateKVP.key = clipBitrateKVPString.get_str(); clipBitrateKVP.value.uint32_value = aClipBitrate; iInfoKvpVec.push_back(&clipBitrateKVP); iPlaybackByteRate = aClipBitrate >> 3; // is shoutcast session PvmiKvp shoutcastSessionKVP; OSCL_StackString<256> shoutcastSessionKVPString = _STRLIT_CHAR("x-pvmf/net/is-shoutcast-session;valtype=bool"); shoutcastSessionKVP.key = shoutcastSessionKVPString.get_str(); shoutcastSessionKVP.value.bool_value = true; iInfoKvpVec.push_back(&shoutcastSessionKVP); iProgDownloadSI->setProtocolInfo(iInfoKvpVec); iSetProtocolInfo = true; }
PVMFStatus PVMFFileOutputNode::GetConfigParameter(PvmiKvp*& aParameters, int& aNumParamElements, int32 aIndex, PvmiKvpAttr aReqattr) { PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMFFileOutputNode::GetConfigParameter() In")); aNumParamElements = 0; // Allocate memory for the KVP aParameters = (PvmiKvp*)oscl_malloc(sizeof(PvmiKvp)); if (aParameters == NULL) { PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::GetConfigParameter() Memory allocation for KVP failed")); return PVMFErrNoMemory; } oscl_memset(aParameters, 0, sizeof(PvmiKvp)); // Allocate memory for the key string in KVP PvmiKeyType memblock = (PvmiKeyType)oscl_malloc(FILEOUTPUTCONFIG_KEYSTRING_SIZE * sizeof(char)); if (NULL == memblock) { oscl_free(aParameters); PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::GetConfigParameter() Memory allocation for key string failed")); return PVMFErrNoMemory; } oscl_strset(memblock, 0, FILEOUTPUTCONFIG_KEYSTRING_SIZE * sizeof(char)); // Assign the key string buffer to KVP aParameters[0].key = memblock; // Copy the key string oscl_strncat(aParameters[0].key, _STRLIT_CHAR("x-pvmf/file/output/"), 21); oscl_strncat(aParameters[0].key, FileOutputNodeConfig_BaseKeys[aIndex].iString, oscl_strlen(FileOutputNodeConfig_BaseKeys[aIndex].iString)); oscl_strncat(aParameters[0].key, _STRLIT_CHAR(";type=value;valtype="), 20); switch (FileOutputNodeConfig_BaseKeys[aIndex].iValueType) { case PVMI_KVPVALTYPE_BITARRAY32: oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_BITARRAY32_STRING), oscl_strlen(PVMI_KVPVALTYPE_BITARRAY32_STRING)); break; case PVMI_KVPVALTYPE_KSV: oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_KSV_STRING), oscl_strlen(PVMI_KVPVALTYPE_KSV_STRING)); break; case PVMI_KVPVALTYPE_BOOL: oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_BOOL_STRING), oscl_strlen(PVMI_KVPVALTYPE_BOOL_STRING)); break; case PVMI_KVPVALTYPE_INT32: if (aReqattr == PVMI_KVPATTR_CUR) { oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_INT32_STRING), oscl_strlen(PVMI_KVPVALTYPE_RANGE_UINT32_STRING)); } break; case PVMI_KVPVALTYPE_UINT32: default: if (PVMI_KVPATTR_CAP == aReqattr) { oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_RANGE_UINT32_STRING), oscl_strlen(PVMI_KVPVALTYPE_RANGE_UINT32_STRING)); } else { oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_UINT32_STRING), oscl_strlen(PVMI_KVPVALTYPE_UINT32_STRING)); } break; } aParameters[0].key[FILEOUTPUTCONFIG_KEYSTRING_SIZE-1] = 0; // Copy the requested info switch (aIndex) { case PARAMETER1: // "parameter1" if (PVMI_KVPATTR_CUR == aReqattr) { // Return current value // get the parameter value here } else if (PVMI_KVPATTR_DEF == aReqattr) { // return default } else { // Return capability } break; case PARAMETER2: // "parameter2" if (PVMI_KVPATTR_CUR == aReqattr) { // Return current value // get the parameter value here } else if (PVMI_KVPATTR_DEF == aReqattr) { // return default } else { // Return capability } break; default: // Invalid index oscl_free(aParameters[0].key); oscl_free(aParameters); PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::GetConfigParameter() Invalid index to file output node parameter")); return PVMFErrNotSupported; } aNumParamElements = 1; PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMFFileOutputNode::GetConfigParameter() Out")); return PVMFSuccess; }
PVMFStatus PVMFFileOutputNode::getParametersSync(PvmiMIOSession aSession, PvmiKeyType aIdentifier, PvmiKvp*& aParameters, int& aNumParamElements, PvmiCapabilityContext aContext) { PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMFFileOutputNode::getParametersSync()")); OSCL_UNUSED_ARG(aSession); OSCL_UNUSED_ARG(aContext); // Initialize the output parameters aNumParamElements = 0; aParameters = NULL; // Count the number of components and parameters in the key int compcount = pv_mime_string_compcnt(aIdentifier); // Retrieve the first component from the key string char* compstr = NULL; pv_mime_string_extract_type(0, aIdentifier, compstr); if ((pv_mime_strcmp(compstr, _STRLIT_CHAR("x-pvmf/file/output")) < 0) || compcount < 4) { // First 4 components should be "x-pvmf/file/output" and there must // be at least 4 components PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::getParametersSync() Invalid key string")); return PVMFErrNotSupported; } // Retrieve the fourth component from the key string pv_mime_string_extract_type(3, aIdentifier, compstr); for (int32 fileoutput4ind = 0; fileoutput4ind < FILEOUTPUTNODECONFIG_BASE_NUMKEYS; ++fileoutput4ind) { // Go through each file output component string at 4th level if (pv_mime_strcmp(compstr, (char*)(FileOutputNodeConfig_BaseKeys[fileoutput4ind].iString)) >= 0) { if (4 == compcount) { // Determine what is requested PvmiKvpAttr reqattr = GetAttrTypeFromKeyString(aIdentifier); if (reqattr == PVMI_KVPATTR_UNKNOWN) { reqattr = PVMI_KVPATTR_CUR; } // Return the requested info PVMFStatus retval = GetConfigParameter(aParameters, aNumParamElements, fileoutput4ind, reqattr); if (retval != PVMFSuccess) { PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::getParametersSync() Retrieving file output node parameter failed")); return retval; } } else { // Right now file output node doesn't support more than 4 components // for this sub-key string so error out PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::getParametersSync() Unsupported key")); return PVMFErrNotSupported; } } } PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMFFileOutputNode::getParametersSync() Out")); if (0 == aNumParamElements) { // If no one could get the parameter, return error PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::getParametersSync() Unsupported key")); return PVMFFailure; } else { return PVMFSuccess; } }
PVMFStatus PVMFFileOutputNode::releaseParameters(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements) { PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMFFileOutputNode::releaseParameters()")); OSCL_UNUSED_ARG(aSession); if (aParameters == NULL || aNumElements < 1) { PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::releaseParameters() KVP list is NULL or number of elements is 0")); return PVMFErrArgument; } // Count the number of components and parameters in the key int compcount = pv_mime_string_compcnt(aParameters[0].key); // Retrieve the first component from the key string char* compstr = NULL; pv_mime_string_extract_type(0, aParameters[0].key, compstr); if ((pv_mime_strcmp(compstr, _STRLIT_CHAR("x-pvmf/file/output")) < 0) || compcount < 3) { // First 3 component should be "x-pvmf/file/output" and there must // be at least four components PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::releaseParameters() Unsupported key")); return PVMFErrNotSupported; } // Retrieve the third component from the key string pv_mime_string_extract_type(3, aParameters[0].key, compstr); // Go through each KVP and release memory for value if allocated from heap for (int32 ii = 0; ii < aNumElements; ++ii) { // Next check if it is a value type that allocated memory PvmiKvpType kvptype = GetTypeFromKeyString(aParameters[ii].key); if (kvptype == PVMI_KVPTYPE_VALUE || kvptype == PVMI_KVPTYPE_UNKNOWN) { PvmiKvpValueType keyvaltype = GetValTypeFromKeyString(aParameters[ii].key); if (PVMI_KVPVALTYPE_UNKNOWN == keyvaltype) { PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMFFileOutputNode::releaseParameters() Valtype not specified in key string")); return PVMFErrNotSupported; } if (((PVMI_KVPVALTYPE_CHARPTR == keyvaltype) && NULL != (aParameters[ii].value.pChar_value))) { oscl_free(aParameters[ii].value.pChar_value); aParameters[ii].value.pChar_value = NULL; } else if (PVMI_KVPVALTYPE_KSV == keyvaltype && NULL != aParameters[ii].value.key_specific_value) { oscl_free(aParameters[ii].value.key_specific_value); aParameters[ii].value.key_specific_value = NULL; } else if (PVMI_KVPVALTYPE_RANGE_UINT32 == keyvaltype && NULL != aParameters[ii].value.key_specific_value) { range_uint32* rui32 = (range_uint32*)aParameters[ii].value.key_specific_value; aParameters[ii].value.key_specific_value = NULL; oscl_free(rui32); } // @TODO Add more types if file output node starts returning more types } } // file output node allocated its key strings in one chunk so just free the first key string ptr oscl_free(aParameters[0].key); // Free memory for the parameter list oscl_free(aParameters); aParameters = NULL; PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMFFileOutputNode::releaseParameters() Out")); return PVMFSuccess; }
void PvmfMediaInputNode::setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements, PvmiKvp* &aRetKVP) { PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PvmfMediaInputNode::setParametersSync()")); OSCL_UNUSED_ARG(aSession); // Complete the request synchronously if (NULL == aParameters || aNumElements < 1) { if (aParameters) { aRetKVP = aParameters; } PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PvmfMediaInputNode::setParametersSync() Passed in parameter invalid")); return; } // Go through each parameter for (int32 paramind = 0; paramind < aNumElements; ++paramind) { // Count the number of components and parameters in the key int compcount = pv_mime_string_compcnt(aParameters[paramind].key); // Retrieve the first component from the key string char* compstr = NULL; pv_mime_string_extract_type(0, aParameters[paramind].key, compstr); if ((compcount == 3) && (pv_mime_strcmp(compstr, _STRLIT_CHAR("x-pvmf/datasource")) == 0)) { // There must be exactly 3 components and // First 2 components should be "x-pvmf/datasource". // Verify and set the passed-in media input setting PVMFStatus retval = VerifyAndSetConfigParameter(aParameters[paramind], true); if (PVMFSuccess != retval) { aRetKVP = &aParameters[paramind]; PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PvmfMediaInputNode::setParametersSync() Setting parameter %d failed", paramind)); return; } } else if ((compcount == 2) && (pv_mime_strcmp(compstr, PVMF_AUTHORING_CLOCK_KEY) == 0)) { //pass the clock to media input comp if (iMediaIOConfig != NULL) { iMediaIOConfig->setParametersSync(NULL, aParameters, aNumElements, aRetKVP); } } else { //pass it on to port to be sent upstream //assume just one output port for now if (iOutPortVector.size() == 1) { PvmfMediaInputNodeOutPort* outPort = iOutPortVector[0]; if (outPort != NULL) { PVMFPortInterface* connectedPort = outPort->getConnectedPort(); if (connectedPort != NULL) { OsclAny* temp = NULL; connectedPort->QueryInterface(PVMI_CAPABILITY_AND_CONFIG_PVUUID, temp); PvmiCapabilityAndConfig *config = OSCL_STATIC_CAST(PvmiCapabilityAndConfig*, temp); config->setParametersSync(aSession, aParameters, aNumElements, aRetKVP); return; } } }
PVMFStatus PVMp4FFComposerNode::GetConfigParameter(PvmiKvp*& aParameters, int& aNumParamElements, int32 aIndex, PvmiKvpAttr aReqattr) { PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMp4FFComposerNode::GetConfigParameter() In")); aNumParamElements = 0; // Allocate memory for the KVP aParameters = (PvmiKvp*)oscl_malloc(sizeof(PvmiKvp)); if (NULL == aParameters) { PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMp4FFComposerNode::GetConfigParameter() Memory allocation for KVP failed")); return PVMFErrNoMemory; } oscl_memset(aParameters, 0, sizeof(PvmiKvp)); // Allocate memory for the key string in KVP PvmiKeyType memblock = (PvmiKeyType)oscl_malloc(MP4CONFIG_KEYSTRING_SIZE * sizeof(char)); if (NULL == memblock) { oscl_free(aParameters); PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMp4FFComposerNode::GetConfigParameter() Memory allocation for key string failed")); return PVMFErrNoMemory; } oscl_strset(memblock, 0, MP4CONFIG_KEYSTRING_SIZE * sizeof(char)); // Assign the key string buffer to KVP aParameters[0].key = memblock; // Copy the key string oscl_strncat(aParameters[0].key, _STRLIT_CHAR("x-pvmf/composer/mp4/"), 7); oscl_strncat(aParameters[0].key, MP4ComposerNodeConfig_BaseKeys[aIndex].iString, oscl_strlen(MP4ComposerNodeConfig_BaseKeys[aIndex].iString)); oscl_strncat(aParameters[0].key, _STRLIT_CHAR(";type=value;valtype="), 20); switch (MP4ComposerNodeConfig_BaseKeys[aIndex].iValueType) { case PVMI_KVPVALTYPE_BITARRAY32: oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_BITARRAY32_STRING), oscl_strlen(PVMI_KVPVALTYPE_BITARRAY32_STRING)); break; case PVMI_KVPVALTYPE_KSV: oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_KSV_STRING), oscl_strlen(PVMI_KVPVALTYPE_KSV_STRING)); break; case PVMI_KVPVALTYPE_BOOL: oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_BOOL_STRING), oscl_strlen(PVMI_KVPVALTYPE_BOOL_STRING)); break; case PVMI_KVPVALTYPE_INT32: if (aReqattr == PVMI_KVPATTR_CUR) { oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_INT32_STRING), oscl_strlen(PVMI_KVPVALTYPE_RANGE_UINT32_STRING)); } break; case PVMI_KVPVALTYPE_CHARPTR: oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_CHARPTR_STRING), oscl_strlen(PVMI_KVPVALTYPE_CHARPTR_STRING)); break; case PVMI_KVPVALTYPE_UINT32: default: if (PVMI_KVPATTR_CAP == aReqattr) { oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_RANGE_UINT32_STRING), oscl_strlen(PVMI_KVPVALTYPE_RANGE_UINT32_STRING)); } else { oscl_strncat(aParameters[0].key, _STRLIT_CHAR(PVMI_KVPVALTYPE_UINT32_STRING), oscl_strlen(PVMI_KVPVALTYPE_UINT32_STRING)); } break; } aParameters[0].key[MP4CONFIG_KEYSTRING_SIZE-1] = 0; // Copy the requested info switch (aIndex) { case PRESENTATION_TIMESCALE: // "presentation-timescale" if (PVMI_KVPATTR_CUR == aReqattr) { // Return current value aParameters[0].value.uint32_value = iPresentationTimescale; } else if (PVMI_KVPATTR_DEF == aReqattr) { // return default } else { // Return capability } break; case PV_CACHE_SIZE: // "pv-cache-size" if (PVMI_KVPATTR_CUR == aReqattr) { // set any parameter here aParameters[0].value.uint32_value = iCacheSize; } else if (PVMI_KVPATTR_DEF == aReqattr) { // return default aParameters[0].value.uint32_value = DEFAULT_CAHCE_SIZE; } else { // Return capability range_uint32* rui32 = (range_uint32*)oscl_malloc(sizeof(range_uint32)); if (NULL == rui32) { oscl_free(aParameters[0].key); oscl_free(aParameters); PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMp4FFComposerNode::GetConfigParameter() Memory allocation for range uint32 failed")); return PVMFErrNoMemory; } rui32->min = MIN_CACHE_SIZE; rui32->max = MAX_CACHE_SIZE; aParameters[0].value.key_specific_value = (void*)rui32; } break; #ifdef _TEST_AE_ERROR_HANDLING case ERROR_START_ADDMEMFRAG: if (PVMI_KVPATTR_CUR == aReqattr) { // Return current value aParameters[0].value.bool_value = iErrorHandlingAddMemFrag; } else if (PVMI_KVPATTR_DEF == aReqattr) { // return default aParameters[0].value.bool_value = true; } else { // Return capability } break; case ERROR_START_ADDTRACK: if (PVMI_KVPATTR_CUR == aReqattr) { // Return current value aParameters[0].value.bool_value = iErrorHandlingAddTrack; } else if (PVMI_KVPATTR_DEF == aReqattr) { // return default aParameters[0].value.bool_value = true; } else { // Return capability } break; #endif default: // Invalid index oscl_free(aParameters[0].key); oscl_free(aParameters); PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVMp4FFComposerNode::GetConfigParameter() Invalid index to composer node parameter")); return PVMFErrNotSupported; } aNumParamElements = 1; PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMp4FFComposerNode::GetConfigParameter() Out")); return PVMFSuccess; }