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

📄 id3.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 3 页
字号:

    *iFrameOffset = (int)sizeof(ID3V2XHeaderType);
    if (pID3V2XHeader->mFlags & ID3_FLAG_EXTHEADER)
    {
        pID3V2XExtHeaderType pID3V2XExtHeader;

        pID3V2XExtHeader = (pID3V2XExtHeaderType) & tempbuf[*iFrameOffset];

        // tag extheader info
        if (pID3V2XExtHeader->mExtFlags & ID3_FLAG_UPDATE)
        {
            *iFrameOffset += ID3_GetIntValue(pID3V2XExtHeader->mHeaderSize);
        }
    }

    return iTotalSize;
}

/******************************************************
Name:  ID3_GetFrameInfo
Desc:  读取ID3 V2帧信息
Param: 字符缓冲,版本
Return:
Global: 无
Note:  无
Author: FSH
Log:
/******************************************************/
int ID3_GetFrameInfo(char *tempbuf, int iVersion)
{
    int iFrameInfo = ID3_NONINFO;

    if (iVersion < 3)
    {
        switch (tempbuf[0])
        {
            case 'T':
                switch (tempbuf[1])
                {
                    case 'C':
                        if (tempbuf[2]  == 'O')
                            iFrameInfo = ID3_GENRE;
                        break;
#if DEBUG_OPT
                    case 'Y':
                        if (tempbuf[2]  == 'E')
                            iFrameInfo = ID3_YEAR;
                        break;
                    case 'R':
                        if (tempbuf[2]  == 'K')
                            iFrameInfo = ID3_TRACK;
                        break;
#endif
                    case 'T':
                        if (tempbuf[2]  == '2')
                            iFrameInfo = ID3_TITLE;
                        break;
                    case 'A':
                        if (tempbuf[2]  == 'L')
                            iFrameInfo = ID3_ALBUM;
                        break;
                    case 'P':
                        if (tempbuf[2]  == '1')
                            iFrameInfo = ID3_ARTIST;
                        break;
                }
                break;
#if DEBUG_OPT
            case 'P':
                switch (tempbuf[1])
                {
                    case 'I':
                        if (tempbuf[2] == 'C')
                            iFrameInfo = ID3_NOTUSEDFRAME;
                        break;
                }
                break;
#endif
        }
    }
    else
    {
        switch (tempbuf[0])
        {
            case 'T':
                switch (tempbuf[1])
                {
#ifdef ID3_EXT_INCLUDE
                    case 'E':
                        if (tempbuf[2]  == 'N' && tempbuf[3]  == 'C')
                        {
                            iFrameInfo = ID3_ENCODEDBY;
                        }
                        break;
#endif
                    case 'C':
                        if (tempbuf[2]  == 'O')
                        {
                            switch (tempbuf[3])
                            {
#ifdef ID3_EXT_INCLUDE
                                case 'P':
                                    iFrameInfo = ID3_COPYRIGHT;
                                    break;
                                case 'M':
                                    iFrameInfo = ID3_COMPOSER;
                                    break;
#endif
                                case 'N':
                                    iFrameInfo = ID3_GENRE;
                                    break;
                            }
                        }
                        break;
#ifdef ID3_EXT_INCLUDE
                    case 'O':
                        if (tempbuf[2]  == 'P' && tempbuf[3]  == 'E')
                            iFrameInfo = ID3_ORIGARTIST;
                        break;
#endif
#if DEBUG_OPT
                    case 'Y':
                        if (tempbuf[2]  == 'E' && tempbuf[3]  == 'R')
                            iFrameInfo = ID3_YEAR;
                        break;
                    case 'R':
                        if (tempbuf[2]  == 'C' && tempbuf[3]  == 'K')
                            iFrameInfo = ID3_TRACK;
                        break;
#endif
                    case 'I':
                        if (tempbuf[2]  == 'T' && tempbuf[3]  == '2')
                            iFrameInfo = ID3_TITLE;
                        break;
                    case 'A':
                        if (tempbuf[2]  == 'L' && tempbuf[3]  == 'B')
                            iFrameInfo = ID3_ALBUM;
                        break;
                    case 'P':
                        if (tempbuf[2]  == 'E' && tempbuf[3]  == '1')
                            iFrameInfo = ID3_ARTIST;
                        break;
                }
                break;
#ifdef ID3_EXT_INCLUDE
            case 'W':
                iFrameInfo = ID3_URL;
                break;
            case 'C':
                if (!memcmp(&tempbuf[1], "OMM", 3))
                    iFrameInfo = ID3_COMMENT;
                break;
#endif

#ifdef RK_JPEG_ID3
            case 'A':
                if (!memcmp(&tempbuf[1], "PIC", 3))
                    if ((!memcmp(&tempbuf[11], "image/jpeg", 10)) || (!memcmp(&tempbuf[11], "image/jpg", 9)))
                        iFrameInfo = ID3_PICTURE;
                break;
#endif
#if DEBUG_OPT
            case 'G':
                if (!memcmp(&tempbuf[1], "EOB", 3))
                    iFrameInfo = ID3_GEOB;
                break;
#endif
        }
    }

    return iFrameInfo;
}

/******************************************************
Name:  ID3_ParseMetaData
Desc:  读取ID3信息
Param: 字符缓冲,目标缓冲,字符串长度
Return:
Global: 无
Note:  无
Author: FSH
Log:
/******************************************************/
int ID3_ParseMetaData(unsigned char *tempbuf, unsigned char *cTargetBuf, int iStringSize)
{
    pID3V2XEncodeInfoType pID3V2XEncodeInfo;
    unsigned char *pSrcBuf;
    int iStringCnt;

    pID3V2XEncodeInfo = (pID3V2XEncodeInfoType)tempbuf;
    iStringCnt      = 0;

    switch (pID3V2XEncodeInfo->mEncodeType & ID3_ENCODE_MASK)
    {
        case ID3_ENCODE_UTF16:
            if ((pID3V2XEncodeInfo->mUnicodeBOM != ID3_UNICODE_BOM1) &&
                    (pID3V2XEncodeInfo->mUnicodeBOM != ID3_UNICODE_BOM2))
            {
                break;
            }

            //iStringSize-=3;
            iStringSize -= 1;
            if (iStringSize <= 0)
            {
                break;
            }

            //pSrcBuf   = &tempbuf[3];
            pSrcBuf   = &tempbuf[1];
            iStringCnt = iStringSize;

            RKmemcpy(&cTargetBuf[ID3_UNICODE_START], pSrcBuf, iStringSize);

#ifdef MTP_INCLUDE
            cTargetBuf[0] = (iStringSize / 2) + 1; // Length field , The length must include space for null value.
#endif
            break;
        case ID3_ENCODE_UTF16BE:
            iStringSize--;
            if (iStringSize <= 0)
            {
                break;
            }

            pSrcBuf    = &tempbuf[1];
            iStringCnt = iStringSize;
            RKmemcpy(&cTargetBuf[ID3_UNICODE_START], pSrcBuf, iStringSize);

#ifdef MTP_INCLUDE
            cTargetBuf[0] = (iStringSize / 2) + 1; // Length field , The length must include space for null value.
#endif
            break;
        case ID3_ENCODE_UTF8:
            iStringSize--;
            if (iStringSize <= 0)
            {
                break;
            }

            pSrcBuf  = &tempbuf[1];

#ifdef MTP_INCLUDE
            iStringCnt = PROFILE_GetUTF8agString(iStringSize, 0, pSrcBuf);
            RKmemcpy(&cTargetBuf[ID3_UNICODE_START], UTF8_Targetbuf, iStringCnt);
#else
            RKmemcpy(&cTargetBuf[ID3_UNICODE_START], pSrcBuf, iStringSize);
#endif
            iStringCnt = iStringSize;
            break;
        case ID3_ENCODE_ISO88591:
            //add by vincent hisung , Nov 5,2007
            /*
            iStringCnt=(*(unsigned char *)&tempbuf[1]);
                  if (iStringCnt>0)
                      iStringCnt--;
            iStringCnt = iStringSize;
            pSrcBuf   = &tempbuf[5];
                  if (iStringCnt>iStringSize)
                iStringCnt = iStringSize;
            memcpy(&cTargetBuf[0],pSrcBuf,iStringCnt);
            iStringSize-=5;
            */
            iStringSize--;

            //FSL 08.04.27
            if (iStringSize <= 0)
            {
                break;
            }

            pSrcBuf   = &tempbuf[1];

            RKmemcpy(&cTargetBuf[0], pSrcBuf, iStringSize);
            break;
            //return -1;
    }

    return iStringCnt;
}

/******************************************************
Name:  ID3_GetMetaData
Desc:  读取ID3信息
Param: 字符缓冲,目标缓冲,字符串长度,帧信息
Return:
Global: 无
Note:  无
Author: FSH
Log:
/******************************************************/
int ID3_GetMetaData(unsigned char *tempbuf, unsigned char *cTargetBuf, int iStringSize, int iFrameInfo)
{
    int Result;

    Result = ID3_ParseMetaData(tempbuf, cTargetBuf, iStringSize);
    if (Result == -1)
    {
        // ID3_ENCODE_ISO88591
#ifdef MTP_INCLUDE
        if (iFrameInfo == ID3_GENRE)
        {
            if ((tempbuf[1] == '(') && (tempbuf[1+iStringSize-2] == ')'))
            {
                int iSize = iStringSize - 3;
                int i;
                int iSeed = 1;
                int iTotal = 0;

                for (i = iSize ;i > 0; i--)
                {
                    if (tempbuf[1+i] >= '0' && tempbuf[1+i] <= '9')
                    {
                        iTotal += (tempbuf[1+i] - '0') * iSeed;
                    }
                    iSeed *= 10;
                }
                ID3_MakeAscii2Unicode(&ID3_GenreTable[iTotal][0], cTargetBuf, strlen(ID3_GenreTable[iTotal]), MAX_ID3V2_FIELD);
                return iSize;
            }
        }

        ID3_MakeAscii2Unicode(&tempbuf[1], cTargetBuf, (iStringSize - 1), MAX_ID3V2_FIELD);
#else
        RKmemcpy(cTargetBuf, tempbuf, iStringSize);

⌨️ 快捷键说明

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