📄 id3.c
字号:
*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 + -