⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdpchunk.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        }
    }

    return retVal;
}


/****************************************************************************
 *  Pull Functions
 */
/****************************************************************************
 *  Pull Functions
 */
/*
 * "s=" text CRLF
 */
static HX_RESULT PullSessionName(char* pData,
                                 ULONG32 ulLength,
                                 IHXValues* pSDPValues,
                                 IHXCommonClassFactory* pClassFactory)
{
    HX_ASSERT(pData && !strncmp(pData, "s=", 2));

    HX_RESULT retVal = HXR_FAIL;
    IHXBuffer* pSessionName = NULL;

    retVal = PullLine(pData + 2, ulLength - 2, pSessionName, pClassFactory);
    if (SUCCEEDED(retVal))
    {
      retVal = pSDPValues->SetPropertyCString("Title", pSessionName);
    }
    HX_RELEASE(pSessionName);
    return retVal;
}
static HX_RESULT PullMediaDesc	(char* pData, 
                                 ULONG32 ulLength, 
                                 IHXValues* pSDPValues,
                                 IHXCommonClassFactory* pClassFactory)
{
    char* pPattern;
    ULONG32 ulPayloadType = 0;
    IHXBuffer* pMimeType = NULL;
    HX_RESULT retVal = HXR_FAIL;

    // Extract Payload Type
    pPattern = FindSDPFieldByIdx(pData, ulLength, 3);
    if (pPattern != NULL)
    {
        char pNumBuffer[MAX_INT_TEXT_LENGTH + 1]; /* Flawfinder: ignore */
        char* pNumEnd;

        ULONG32 ulNumTextLength = (ulLength - (pPattern - pData));

        if (ulNumTextLength > MAX_INT_TEXT_LENGTH)
        {
            ulNumTextLength = MAX_INT_TEXT_LENGTH;
        }

        memcpy(pNumBuffer, pPattern, ulNumTextLength); /* Flawfinder: ignore */
        pNumBuffer[ulNumTextLength] = '\0';

        ulPayloadType = strtol(pNumBuffer, &pNumEnd, 10);

        if (pNumEnd > pNumBuffer)
        {
            retVal = HXR_OK;
        }
    }

    // Prepare Mime Type
    if (SUCCEEDED(retVal))
    {
        const char* pPayloadMime = NULL;
        ULONG32 ulPayloadMimeLength = 0;
        char* pMimeStart = NULL;
        ULONG32 ulMimeLength = 0;

        if (SDPIsStaticPayload(ulPayloadType))
        {
            pPayloadMime = SDPMapPayloadToEncodingName(ulPayloadType);

            retVal = HXR_FAIL;
            if (pPayloadMime != NULL)
            {
                ulPayloadMimeLength = strlen(pPayloadMime) + 1;

                pSDPValues->SetPropertyULONG32(
                    "SamplesPerSecond",
                    SDPMapPayloadToSamplesPerSecond(ulPayloadType));

                UINT16 uChannels = 
                    SDPMapPayloadToChannels(ulPayloadType);
                if (uChannels > 0)
                {
                    pSDPValues->SetPropertyULONG32(
                        "Channels",
                        uChannels);
                }

                retVal = HXR_OK;
            }
        }

        if (SUCCEEDED(retVal))
        {
            // extract portion of mime type
            // - will be completed when rtp map encountered
            // if this is not a static payload
            pPattern = StrNChr((char *) pData, ' ', ulLength);
            pMimeStart = pData + 2;
            
            retVal = HXR_FAIL;
            
            if ((pPattern != NULL) &&
                ((pPattern - pData) > 2))
            {
                ulMimeLength = pPattern - pData - 2;
                
                retVal = pClassFactory->CreateInstance(
                    CLSID_IHXBuffer,
                    (void**) &pMimeType);
            }
            
            if (SUCCEEDED(retVal))
            {
                retVal = pMimeType->SetSize(ulMimeLength + 
                                            ulPayloadMimeLength + 
                                            1);
            }
            
            if (SUCCEEDED(retVal))
            {
                memcpy(pMimeType->GetBuffer(), /* Flawfinder: ignore */
                       pMimeStart, 
                       ulMimeLength);

                if (ulPayloadMimeLength > 0)
                {
                    memcpy(pMimeType->GetBuffer() + ulMimeLength + 1, /* Flawfinder: ignore */
                           pPayloadMime, 
                           ulPayloadMimeLength - 1);

                    pMimeType->GetBuffer()[ulMimeLength] = '/';
                }
                
                pMimeType->GetBuffer()[ulMimeLength + 
                                       ulPayloadMimeLength] = '\0';
            }
        }
    }

    if (SUCCEEDED(retVal))
    {
        pSDPValues->SetPropertyULONG32("RTPPayloadType", ulPayloadType);
        pSDPValues->SetPropertyCString("MimeType", pMimeType);
    }

    HX_RELEASE(pMimeType);

    return retVal;
}


static HX_RESULT PullRTPMap(char* pData, 
                            ULONG32 ulLength, 
                            IHXValues* pSDPValues,
                            IHXCommonClassFactory* pClassFactory)
{
    char* pPattern = NULL;
    char* pPatternEnd = NULL;
    char pNumBuffer[MAX_INT_TEXT_LENGTH + 1]; /* Flawfinder: ignore */
    char* pNumEnd = NULL;
    ULONG32 ulPatternLength = 0;
    ULONG32 ulPayloadType = 0;
    ULONG32 ulMediaPayloadType = 0;
    HX_RESULT retVal = HXR_FAIL;

    // Extract the Payload Type
    pPattern = StrNChr((char *) pData, ':',  ulLength);
    if (pPattern)
    {
        ulPatternLength = (ulLength - ((++pPattern) - pData));

        if (ulPatternLength > MAX_INT_TEXT_LENGTH)
        {
            ulPatternLength = MAX_INT_TEXT_LENGTH;
        }

        memcpy(pNumBuffer, pPattern, ulPatternLength); /* Flawfinder: ignore */
        pNumBuffer[ulPatternLength] = '\0';

        ulPayloadType = strtol(pNumBuffer, &pNumEnd, 10);
        
        if (pNumEnd > pNumBuffer)
        {
            retVal = pSDPValues->GetPropertyULONG32(
                "RTPPayloadType", ulMediaPayloadType);
        }
    }

    // Check if this is the payload type entry we are looking for
    if (SUCCEEDED(retVal) && 
        (ulMediaPayloadType == ulPayloadType))
    {
        IHXBuffer* pMimeType = NULL;
        ULONG32 ulOldMimeTextLength;
        BOOL bHasParams = TRUE;

        // Locate New and Old Mime Name Section
        pPattern = StrNChr((char *) pData, ' ',  ulLength);
        retVal = HXR_FAIL;

        if (pPattern)
        {
            pPattern++;
            
            pPatternEnd = StrNChr(pPattern, 
                                  '/',
                                  ulLength - (pPattern - pData));
            if (pPatternEnd == NULL)
            {
                bHasParams = FALSE;
                pPatternEnd = FindSDPFieldEnd(pPattern,
                                              ulLength - (pPattern - pData));
            }
            
            ulPatternLength = pPatternEnd - pPattern;
            
            if (ulPatternLength != 0)
            {
                retVal = pSDPValues->GetPropertyCString(
                    "MimeType", pMimeType);
            }
        }

        // Realocate memory for combined name
        if (SUCCEEDED(retVal))
        {
            pMimeType->Release();   // OK since pSDPValues has ref.
            ulOldMimeTextLength = pMimeType->GetSize() - 1;
            retVal = pMimeType->SetSize(
                ulOldMimeTextLength + ulPatternLength + 2);
        }

        // Copy in new Mime Name section
        if (SUCCEEDED(retVal))
        {
            char *pMimeData = (char*) pMimeType->GetBuffer();

            memcpy(pMimeData + ulOldMimeTextLength + 1, /* Flawfinder: ignore */
                   pPattern,
                   ulPatternLength);

            pMimeData[ulOldMimeTextLength] = '/';
            pMimeData[pMimeType->GetSize() - 1] = '\0';
        }

        // Check for parameters following mime type
        if (SUCCEEDED(retVal))
        {
            ULONG32 ulParamIdx = 0;

            while (bHasParams)
            {
                pPattern += ulPatternLength + 1;
                 
                pPatternEnd = StrNChr(pPattern, 
                                      '/',
                                      ulLength - (pPattern - pData));
                if (pPatternEnd == NULL)
                {
                    bHasParams = FALSE;
                    pPatternEnd = FindSDPFieldEnd(
                                    pPattern,
                                    ulLength - (pPattern - pData));
                }

                ulPatternLength = pPatternEnd - pPattern;
            
                if (ulPatternLength != 0)
                {
                    LONG32 lValue;

                    if (ulPatternLength > MAX_INT_TEXT_LENGTH)
                    {
                        ulPatternLength = MAX_INT_TEXT_LENGTH;
                    }
                    
                    memcpy(pNumBuffer, pPattern, ulPatternLength); /* Flawfinder: ignore */
                    pNumBuffer[ulPatternLength] = '\0';
                    
                    lValue = strtol(pNumBuffer, &pNumEnd, 10);

                    if (pNumEnd > pNumBuffer)
                    {
                        switch (ulParamIdx)
                        {
                        case 0:
                            pSDPValues->SetPropertyULONG32(
                                "SamplesPerSecond", (ULONG32) lValue);
                            break;
                        case 1:
                            pSDPValues->SetPropertyULONG32(
                                "Channels", (ULONG32) lValue);
                            break;
                        default:
                            // do nothing
                            break;
                        }
                    }
                }

                ulParamIdx++;
            }
        }
    }

    return retVal;
}


static HX_RESULT PullControl(char* pData, 
                             ULONG32 ulLength, 
                             IHXValues* pSDPValues,
                             IHXCommonClassFactory* pClassFactory)
{
    char* pPattern = NULL;
    char* pPatternEnd = NULL;
    ULONG32 ulPatternLength = 0;
    IHXBuffer* pControl = NULL;
    HX_RESULT retVal = HXR_FAIL;

    pPattern = StrNChr((char *) pData, ':', ulLength);

    if (pPattern)
    {
        pPattern++;
        pPatternEnd = FindSDPFieldEnd(
            pPattern, ulLength - (pPattern - pData));

        ulPatternLength = pPatternEnd - pPattern;

        if (ulPatternLength > 0)
        {
            retVal = pClassFactory->CreateInstance(
                CLSID_IHXBuffer,
                (void**) &pControl);
        }
    }

    if (SUCCEEDED(retVal))
    {
        retVal = pControl->SetSize(ulPatternLength + 1);
        memcpy(pControl->GetBuffer(), /* Flawfinder: ignore */
               pPattern, 
               ulPatternLength);
        (pControl->GetBuffer())[ulPatternLength] = '\0';

        pSDPValues->SetPropertyCString("Control", pControl);

        HX_RELEASE(pControl);
    }

    return retVal;
}


static HX_RESULT PullClipRect(char* pData, 
                              ULONG32 ulLength, 
                              IHXValues* pSDPValues,
                              IHXCommonClassFactory* pClassFactory)
{
    char* pPattern;
    ULONG32 ulPatternLength;
    char pNumBuffer[MAX_INT_TEXT_LENGTH + 1]; /* Flawfinder: ignore */
    char* pNumEnd;
    ULONG32 ulIdx = 0;
    LONG32 lCoord[N_CLIPRECT_COORDS];
    HX_RESULT retVal = HXR_FAIL;

    pPattern = StrNChr((char *) pData, ':', ulLength);

    if (pPattern)
    {
        do
        {
            ulPatternLength = (ulLength - ((++pPattern) - pData));
            
            if (ulPatternLength > MAX_INT_TEXT_LENGTH)
            {
                ulPatternLength = MAX_INT_TEXT_LENGTH;
            }
            
            memcpy(pNumBuffer, pPattern, ulPatternLength); /* Flawfinder: ignore */
            pNumBuffer[ulPatternLength] = '\0';
            
            lCoord[ulIdx] = strtol(pNumBuffer, &pNumEnd, 10);

            if (pNumEnd == pNumBuffer)
            {
                break;
            }
        } while (((++ulIdx) < N_CLIPRECT_COORDS) &&
                 (pPattern = StrNChr((char *) pPattern, ',', ulLength)));

        if (ulIdx == N_CLIPRECT_COORDS)
        {
            retVal = HXR_OK;
        }
    }

    if (SUCCEEDED(retVal))
    {
        OrderUp(lCoord[0], lCoord[2]);
        OrderUp(lCoord[1], lCoord[3]);

        pSDPValues->SetPropertyULONG32("ClipFrameLeft", lCoord[1]);
        pSDPValues->SetPropertyULONG32("ClipFrameRight", lCoord[3]);
        pSDPValues->SetPropertyULONG32("ClipFrameTop", lCoord[0]);
        pSDPValues->SetPropertyULONG32("ClipFrameBottom", lCoord[2]);
    }

    return retVal;
}


static HX_RESULT PullFormatParams(char* pData, 
                                  ULONG32 ulLength, 
                                  IHXValues* pSDPValues,
                                  IHXCommonClassFactory* pClassFactory)
{
    char* pPattern = NULL;
    char* pPatternEnd = NULL;
    BOOL bParmNumeric = FALSE;
    ULONG32 ulParmValue = 0;
    ULONG32 ulPatternLength = 0;
    char* pParmName = NULL;
    IHXBuffer* pParmValue = NULL;
    HX_RESULT retVal = HXR_FAIL;

    // Find the start of name-value tuple
    pPattern = FindSDPFieldEnd((char*) pData, ulLength);
    if (pPattern)
    {
        ulPatternLength = (ulLength - (pPattern - pData));
        retVal = HXR_OK;
    }

    do
    {
        // Find the start of name-value tuple
        if (SUCCEEDED(retVal))
        {
            retVal = HXR_FAIL;
            
            pPattern = SkipSDPFieldEnd(pPattern, ulPatternLength);
            if (pPattern)
            {
                ulPatternLength = (ulLength - (pPattern - pData));
                retVal = HXR_OK;
            }
        }

        if (SUCCEEDED(retVal))
        {
            if (ulPatternLength == 0)
            {
                // Done: no more tuples
                break;
            }
        }

        // Parse the tuple name
        if (SUCCEEDED(retVal))
        {
            retVal = HXR_FAIL;
            pPatternEnd = StrNChr((char*) pPattern, '=', ulPatternLength);
            if (pPatternEnd)
            {
                retVal = HXR_OK;
            }
        }

        if (SUCCEEDED(retVal))
        {
            retVal = HXR_FAIL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -