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

📄 sdpchunk.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
            ulPatternLength = pPatternEnd - pPattern;
            if (ulPatternLength > 0)
            {
                retVal = HXR_OK;
            }
        }

        if (SUCCEEDED(retVal))
        {
            retVal = HXR_OUTOFMEMORY;
            pParmName = new char [ulPatternLength + FMPT_PREFIX_SIZE + 1];
            if (pParmName)
            {
                retVal = HXR_OK;
            }
        }

        if (SUCCEEDED(retVal))
        {
            memcpy(pParmName, /* Flawfinder: ignore */
                   FMPT_PREFIX,
                   FMPT_PREFIX_SIZE);
            memcpy(pParmName + FMPT_PREFIX_SIZE, /* Flawfinder: ignore */
                   pPattern, 
                   ulPatternLength);
            pParmName[ulPatternLength + FMPT_PREFIX_SIZE] = '\0';

            pPattern = pPatternEnd;
            ulPatternLength = (ulLength - ((++pPattern) - pData));
        }

        // Parse the tuple value
        if (SUCCEEDED(retVal))
        {
            retVal = HXR_FAIL;

            pPatternEnd = StrNChr(pPattern, ';', ulPatternLength);

            if (!pPatternEnd)
            {
                pPatternEnd = FindSDPFieldEnd(pPattern, ulPatternLength);
            }

            if (pPatternEnd)
            {
                ulPatternLength = pPatternEnd - pPattern;
            }

            if (ulPatternLength > 0)
            {
                retVal = HXR_OK;
            }
        }

        bParmNumeric = FALSE;

        if (SUCCEEDED(retVal) && (ulPatternLength <= (MAX_INT_TEXT_LENGTH - 1)))
        {
            char pNumBuffer[MAX_INT_TEXT_LENGTH + 1]; /* Flawfinder: ignore */
            char* pNumEnd = NULL;

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

            ulParmValue = strtol(pNumBuffer, &pNumEnd, 10);
            if (pNumEnd && (pNumEnd == (pNumBuffer + ulPatternLength)))
            {
                bParmNumeric = TRUE;
            }
        }

        if (bParmNumeric)
        {
            if (SUCCEEDED(retVal))
            {
                retVal = pSDPValues->SetPropertyULONG32(pParmName, 
                                                        ulParmValue);
            }
        }
        else
        {
            if (SUCCEEDED(retVal))
            {
                retVal = pClassFactory->CreateInstance(CLSID_IHXBuffer,
                    (void**) &pParmValue);
            }
            
            if (SUCCEEDED(retVal))
            {
                retVal = pParmValue->SetSize(ulPatternLength + 1);
            }
            
            if (SUCCEEDED(retVal))
            {
                UINT8* pBufferData = pParmValue->GetBuffer();
                memcpy(pBufferData, pPattern, ulPatternLength); /* Flawfinder: ignore */
                pBufferData[ulPatternLength] = '\0';
                
                retVal = pSDPValues->SetPropertyCString(pParmName, pParmValue);
            }
        }

        if (SUCCEEDED(retVal))
        {
            ulPatternLength = 0;
            pPattern = pPatternEnd;
            if (pPattern)
            {
                ulPatternLength = (ulLength - ((++pPattern) - pData));
            }
        }

        HX_VECTOR_DELETE(pParmName);
        HX_RELEASE(pParmValue);
    } while (SUCCEEDED(retVal) && (ulPatternLength != 0));

    return retVal;
}


static HX_RESULT PullBufferDelay(char* pData, 
                                 ULONG32 ulLength, 
                                 IHXValues* pSDPValues,
                                 IHXCommonClassFactory* pClassFactory)
{
    char* pPattern;
    ULONG32 ulPatternLength;
    char pNumBuffer[MAX_INT_TEXT_LENGTH + 1]; /* Flawfinder: ignore */
    char* pNumEnd;
    ULONG32 ulPreroll;
    double fPreroll;
    HX_RESULT retVal = HXR_FAIL;

    if (pSDPValues->GetPropertyULONG32("Preroll", ulPreroll) != HXR_OK)
    {
        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';
            
            fPreroll = strtod(pNumBuffer, &pNumEnd);
            
            if (pNumEnd > pNumBuffer)
            {
                retVal = pSDPValues->SetPropertyULONG32(
                    "Preroll", 
                    (ULONG32) (fPreroll * 1000.0 + 0.5));
            }
        }
    }

    return retVal;
}

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

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

    if (pPattern)
    {
        ulPatternLength = (ulLength - ((++pPattern) - pData));

        pPattern = StrNChr((char *) pPattern, '=', ulPatternLength);
    }
    
    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';
        
        ulGroupID = strtol(pNumBuffer, &pNumEnd, 10);
                
        if (pNumEnd > pNumBuffer)
        {
            retVal = pSDPValues->SetPropertyULONG32(
                "AlternateGroupID",
                ulGroupID);
        }
    }

    return retVal;
}

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

    pPattern = StrNChr((char *) pData, ':', ulLength);
   
    if (pPattern)
    {
        ulPatternLength = (ulLength - ((++pPattern) - pData));
        
        pPattern = StrNChr((char *) pPattern, '=', ulPatternLength);
    }

    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';
        
        ulGroupBitrate = strtol(pNumBuffer, &pNumEnd, 10);
                
        if (pNumEnd > pNumBuffer)
        {
            retVal = pSDPValues->SetPropertyULONG32(
                "AlternateGroupBitrate",
                ulGroupBitrate);
        }
    }

    return retVal;
}


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

    char* pPropName = NULL;
    ULONG32 ulBandwidth = 0;
    
    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';
        
        ulBandwidth = strtol(pNumBuffer, &pNumEnd, 10);

        if (pNumEnd > pNumBuffer)
        {	    
	    // skip b=
	    pData += 2;
	    ulLength -= 2;
	    if (StrNStr((char*)pData, "AS:", ulLength, 3))
	    {        
		pPropName = "AvgBitRate";
		ulBandwidth *= 1000;
	    }
	    else if (StrNStr((char*)pData, "RR:", ulLength, 3))
	    {        
		pPropName = "RtcpRRRate";
	    }
	    else if (StrNStr((char*)pData, "RS:", ulLength, 3))
	    {        
		pPropName = "RtcpRSRate";
	    }
	    else
	    {
		// fine, ignore
		retVal = HXR_OK;
	    }	   
        }

	if (pPropName)
	{
	    retVal = pSDPValues->SetPropertyULONG32(pPropName, ulBandwidth);	    
	}
    }

    return retVal;
}

/****************************************************************************
 *  Local Utilities
 */
inline static ULONG32 GetPullTableIdx(const SDPRecordPuller* pTable,
                                      char* pData, 
                                      ULONG32 ulRecordSize)
{
    ULONG32 ulIdx = 0;

    HX_ASSERT(pTable);

    while (pTable->pSDPMatch != NULL)
    {
        if (pTable->ulSDPMatchSize <= ulRecordSize)
        {
            if (!strncmp(pTable->pSDPMatch, 
                         pData, 
                         pTable->ulSDPMatchSize))
            {
                return ulIdx;
            }
        }

        pTable++;
        ulIdx++;
    }

    return BAD_PULL_TABLE_IDX;
}


inline static char* FindSDPFieldByIdx(char* pData, 
                                       ULONG32 ulLength, 
                                       ULONG32 ulIdx)
{
    char* pField;

    while((ulIdx != 0) && (pData != NULL))
    {
        pField = StrNChr((char *) pData, ' ', ulLength);
        if (pField)
        {
            ulLength -= ((++pField) - pData);  
            ulIdx--;
        }
        pData = pField;
    } 

    if (ulLength == 0)
    {
        pData = NULL;
    }

    return pData;
}

inline static char* FindSDPFieldEnd(char* pData, 
                                     ULONG32 ulLength)
{
    while((ulLength != 0) &&
          (*pData != ' ') &&
          (*pData != CHAR_CR) &&
          (*pData != CHAR_LF))
    {
        pData++;
        ulLength--;
    } 

    return pData;
}

inline static char* FindCRLF(char* pData, 
                             ULONG32 ulLength)
{
    HX_ASSERT(pData && ulLength);
    
    while((0 != ulLength) &&
          (CHAR_CR != *pData))
    {
        pData++;
        ulLength--;
    } 

    if (ulLength)
    {	
        if (*(pData+1) == CHAR_LF)
        {
            // found it
            return pData;
        }	
        else
        {
            pData++;
            ulLength--;
            return FindCRLF(pData, ulLength);
        }
    }

    return NULL;
}

/*
 * saves what pData points to upto CRLF sequence in pLine ('\0' terminated)
 */
inline static HX_RESULT PullLine(char* pData, 
                             ULONG32 ulLength,
                             REF(IHXBuffer*) pLine,
                             IHXCommonClassFactory* pClassFactory)
{
    HX_ASSERT(pData && ulLength);
    
    char* pc = NULL;
    HX_RESULT retVal = HXR_FAIL;

    pc = FindCRLF((char*)pData, ulLength);
    if (pc)
    {
        HX_ASSERT((pc > pData) && (ulLength > (ULONG32)(pc - pData)));
        ulLength = pc - pData;
        retVal = HXR_OK;
    }

    if (SUCCEEDED(retVal))
    {
        retVal = pClassFactory->CreateInstance
            (CLSID_IHXBuffer, (void**) &pLine);
    }	

    if (SUCCEEDED(retVal))
    {
        retVal = pLine->SetSize(ulLength + 1);	
        BYTE* pcLine = pLine->GetBuffer();
        memcpy(pcLine, pData, ulLength); /* Flawfinder: ignore */
        pcLine[ulLength] = '\0';
    }

    return retVal;            
}


inline static char* SkipSDPFieldEnd(char* pData, ULONG32 ulSize)
{
    while((ulSize > 0) &&
          ((*pData == CHAR_CR) ||
           (*pData == CHAR_LF) ||
           (*pData == ' ')))
    {
        pData++;
        ulSize--;
    } 

    return pData;
}

inline static void OrderUp(LONG32 &l1, LONG32 &l2)
{
    LONG32 temp;

    if (l1 > l2)
    {
        temp = l1;
        l1 = l2;
        l2 = temp;
    }
}

⌨️ 快捷键说明

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