int PlayerDriver::setupHttpStreamPost()
{
    PvmiKvp iKVPSetAsync;
    OSCL_StackString<64> iKeyStringSetAsync;
    PvmiKvp *iErrorKVP = NULL;

    int error = 0;

    // PV will set a default user agent value. The below string will be appended to the default value.
    // The default value [PVPLAYER_ENGINE_SDKINFO_LABEL] can be found at device/extlibs/pv/engines/player/src/pv_player_sdkinfo.h 
    iKVPSetAsync.key = _STRLIT_CHAR("x-pvmf/net/user-agent;valtype=wchar*");
    OSCL_wHeapString<OsclMemAllocator> userAgent = _STRLIT_WCHAR("(Linux;U;Android 1.0)(AndroidMediaPlayer 1.0)");
    iKVPSetAsync.value.pWChar_value=userAgent.get_str();
    iErrorKVP=NULL;
    OSCL_TRY(error, mPlayerCapConfig->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
    OSCL_FIRST_CATCH_ANY(error, return -1);

    iKeyStringSetAsync=_STRLIT_CHAR("x-pvmf/net/http-timeout;valtype=uint32");
    iKVPSetAsync.key=iKeyStringSetAsync.get_str();
    iKVPSetAsync.value.uint32_value=20;
    iErrorKVP=NULL;
    OSCL_TRY(error, mPlayerCapConfig->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
    OSCL_FIRST_CATCH_ANY(error, return -1);

    iKeyStringSetAsync=_STRLIT_CHAR("x-pvmf/net/num-redirect-attempts;valtype=uint32");
    iKVPSetAsync.key=iKeyStringSetAsync.get_str();
    iKVPSetAsync.value.uint32_value=4;
    iErrorKVP=NULL;
    OSCL_TRY(error, mPlayerCapConfig->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
    OSCL_FIRST_CATCH_ANY(error, return -1);

    // enable or disable HEAD request
    iKeyStringSetAsync=_STRLIT_CHAR("x-pvmf/net/http-header-request-disabled;valtype=bool");
    iKVPSetAsync.key=iKeyStringSetAsync.get_str();
    iKVPSetAsync.value.bool_value=false;
    iErrorKVP=NULL;
    OSCL_TRY(error, mPlayerCapConfig->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
    OSCL_FIRST_CATCH_ANY(error, return -1);

    iKeyStringSetAsync=_STRLIT_CHAR("x-pvmf/net/max-tcp-recv-buffer-size-download;valtype=uint32");
    iKVPSetAsync.key=iKeyStringSetAsync.get_str();
    iKVPSetAsync.value.uint32_value=64000;
    iErrorKVP=NULL;
    OSCL_TRY(error, mPlayerCapConfig->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
    OSCL_FIRST_CATCH_ANY(error, return -1);

    return 0;
}
OSCL_EXPORT_REF PvmiKvpType GetTypeFromKeyString(PvmiKeyType aKeyString)
{
    if (aKeyString == NULL)
    {
        return PVMI_KVPTYPE_UNKNOWN;
    }

    // Determine the type
    char* paramstr = NULL;
    OSCL_StackString<24> typestr;
    OSCL_StackString<10> basestr(PVMI_KVPTYPE_STRING_CONSTCHAR);

    // value
    typestr = basestr;
    typestr += PVMI_KVPTYPE_VALUE_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, typestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPTYPE_VALUE;
    }

    // pointer
    typestr = basestr;
    typestr += PVMI_KVPTYPE_POINTER_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, typestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPTYPE_POINTER;
    }

    // aggregate
    typestr = basestr;
    typestr += PVMI_KVPTYPE_AGGREGATE_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, typestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPTYPE_AGGREGATE;
    }

    return PVMI_KVPTYPE_UNKNOWN;
}
OSCL_EXPORT_REF PvmiKvpAttr GetAttrTypeFromKeyString(PvmiKeyType aKeyString)
{
    if (aKeyString == NULL)
    {
        return PVMI_KVPATTR_UNKNOWN;
    }

    // Determine the attribute type
    char* paramstr = NULL;
    OSCL_StackString<16> attrstr;
    OSCL_StackString<8> basestr(PVMI_KVPATTR_STRING_CONSTCHAR);

    // cap
    attrstr = basestr;
    attrstr += PVMI_KVPATTR_CAP_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, attrstr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPATTR_CAP;
    }
    // def
    attrstr = basestr;
    attrstr += PVMI_KVPATTR_DEF_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, attrstr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPATTR_DEF;
    }
    // cur
    attrstr = basestr;
    attrstr += PVMI_KVPATTR_CUR_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, attrstr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPATTR_CUR;
    }

    return PVMI_KVPATTR_UNKNOWN;
}
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;
}
OSCL_EXPORT_REF PvmiKvpValueType GetValTypeFromKeyString(PvmiKeyType aKeyString)
{
    if (aKeyString == NULL)
    {
        return PVMI_KVPVALTYPE_UNKNOWN;
    }

    // Determine the valtype
    char* paramstr = NULL;
    OSCL_StackString<64> valtypestr;
    OSCL_StackString<10> basestr(PVMI_KVPVALTYPE_STRING_CONSTCHAR);

    // bool
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_BOOL_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_BOOL;
    }
    // float
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_FLOAT_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_FLOAT;
    }
    // double
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_DOUBLE_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_DOUBLE;
    }
    // uint8
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_UINT8_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_UINT8;
    }
    // int32
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_INT32_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_INT32;
    }
    // uint32
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_UINT32_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_UINT32;
    }
    // int64
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_INT64_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_INT32;
    }
    // uint64
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_UINT64_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_UINT32;
    }
    // wchar*
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_WCHARPTR_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_WCHARPTR;
    }
    // char*
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_CHARPTR_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_CHARPTR;
    }
    // uint8*
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_UINT8PTR_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_UINT8PTR;
    }
    // int32*
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_INT32PTR_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_INT32PTR;
    }
    // uint32*
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_UINT32PTR_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_UINT32PTR;
    }
    // int64*
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_INT64PTR_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_INT64PTR;
    }
    // uint64*
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_UINT64PTR_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_UINT64PTR;
    }
    // float*
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_FLOATPTR_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_FLOATPTR;
    }
    // double*
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_DOUBLEPTR_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_DOUBLEPTR;
    }
    // ksv
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_KSV_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_KSV;
    }
    // pKvp
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_PKVP_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_PKVP;
    }
    // ppKvp
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_PPKVP_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_PPKVP;
    }
    // range_float
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_RANGE_FLOAT_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_RANGE_FLOAT;
    }
    // range_double
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_RANGE_DOUBLE_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_RANGE_DOUBLE;
    }
    // range_uint8
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_RANGE_UINT8_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_RANGE_UINT8;
    }
    // range_int32
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_RANGE_INT32_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_RANGE_INT32;
    }
    // range_uint32
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_RANGE_UINT32_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_RANGE_UINT32;
    }
    // range_int64
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_RANGE_INT64_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_RANGE_INT64;
    }
    // range_uint64
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_RANGE_UINT64_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_RANGE_UINT64;
    }
    // bitarray32
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_BITARRAY32_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_BITARRAY32;
    }
    // bitarray64
    valtypestr = basestr;
    valtypestr += PVMI_KVPVALTYPE_BITARRAY64_STRING_CONSTCHAR;
    if (pv_mime_string_parse_param(aKeyString, valtypestr.get_str(), paramstr) > 0)
    {
        return PVMI_KVPVALTYPE_BITARRAY64;
    }

    return PVMI_KVPVALTYPE_UNKNOWN;
}