id3_ext.c
来自「瑞星微公司RK27XX系列芯片的SDK开发包」· C语言 代码 · 共 635 行 · 第 1/2 页
C
635 行
Name: PROFILE_GetContentDescriptors
Desc:
Param:
Return:
Global: 无
Note: 无
Author: FSH
Log:
******************************************************/
int PROFILE_GetDescriptorName(char *tempbuf, int iSize)
{
int i;
int iDescriptorSize;
for (i = 0 ; i < (WMA_DESCRIPTOR_MAX - 1); i++)
{
iDescriptorSize = ASFContentDescriptor[i].mSize;
//if(iDescriptorSize == iSize)
{
if (!memcmp(tempbuf, ASFContentDescriptor[i].mDescriptor, iDescriptorSize))
{
return ASFContentDescriptor[i].mID;
}
}
}
return WMA_DESCRIPTOR_UNKNOWN;
}
/******************************************************
Name: PROFILE_GetContentDescriptors
Desc:
Param:
Return:
Global: 无
Note: 无
Author: FSH
Log:
******************************************************/
int PROFILE_GetContentDescriptors(char *tempbuf, void *pID3Info)
{
int iOffset = 0;
unsigned short usNameLength;
unsigned short usDataType;
unsigned short usDataLength;
int iDescriptorID;
usNameLength = (tempbuf[1] << 8) | tempbuf[0];
iOffset += sizeof(unsigned short);
#ifdef RK_JPEG_ASF
if (WMA_JPEG.FileSize == 0)
WMA_JPEG.StartDataPosition += sizeof(unsigned short);
#endif
iDescriptorID = PROFILE_GetDescriptorName(&tempbuf[iOffset], usNameLength);
iOffset += usNameLength;
#ifdef RK_JPEG_ASF
if (WMA_JPEG.FileSize == 0)
WMA_JPEG.StartDataPosition += usNameLength;
#endif
usDataType = (tempbuf[iOffset+1] << 8) | tempbuf[iOffset];
iOffset += sizeof(unsigned short);
#ifdef RK_JPEG_ASF
if (WMA_JPEG.FileSize == 0)
WMA_JPEG.StartDataPosition += sizeof(unsigned short);
#endif
usDataLength = (tempbuf[iOffset+1] << 8) | tempbuf[iOffset];
iOffset += sizeof(unsigned short);
#ifdef RK_JPEG_ASF
if (iDescriptorID != WMA_DESCRIPTOR_PICTURE && WMA_JPEG.FileSize == 0)
{
WMA_JPEG.StartDataPosition += usDataLength;
WMA_JPEG.StartDataPosition += sizeof(unsigned short);
}
#endif
/*
if(!usDataType) // Unicode is 0
{
switch(iDescriptorID)
{
case WMA_DESCRIPTOR_ALBUM:
// iOffset += PROFILE_FillWMAMetaData(usDataLength,&tempbuf[iOffset],pstMTPFileDB->OBJProp.AudioObj.AlbumName);
break;
case WMA_DESCRIPTOR_GENRE:
// iOffset += PROFILE_FillWMAMetaData(usDataLength,&tempbuf[iOffset],pstMTPFileDB->OBJProp.AudioObj.Genre);
break;
case WMA_DESCRIPTOR_TRACK:
//if( pstMTPFileDB->OBJProp.AudioObj.Track == 0 )
// pstMTPFileDB->OBJProp.AudioObj.Track = (int)(((int)(tempbuf[iOffset]-'0')*10) + (tempbuf[iOffset+2]-'0'));
break;
case WMA_DESCRIPTOR_TRACKNUMBER:
// if(usDataLength>6)
// pstMTPFileDB->OBJProp.AudioObj.Track = (int)(((int)(tempbuf[iOffset]-'0')*100) + ((int)(tempbuf[iOffset+2]-'0')*10) + (tempbuf[iOffset+4]-'0'));
// else if(usDataLength>4)
// pstMTPFileDB->OBJProp.AudioObj.Track = (int)(((int)(tempbuf[iOffset]-'0')*10) + (tempbuf[iOffset+2]-'0'));
// else
// pstMTPFileDB->OBJProp.AudioObj.Track = (int)((int)(tempbuf[iOffset]-'0'));
break;
case WMA_DESCRIPTOR_YEAR:
//iOffset += PROFILE_FillWMAMetaData(usDataLength,&tempbuf[iOffset],pstMTPFileDB->OBJProp.AudioObj.OriginalReleasedDate);
break;
case WMA_DESCRIPTOR_ID3TAG:
break;
#ifdef RK_JPEG_ASF
if(WMA_JPEG.FileSize ==0)
WMA_JPEG.StartDataPosition +=iOffset;
#endif
}
}
*/
#ifdef RK_JPEG_ASF
else if (usDataType == 0x0001) //BYTE array
{
switch (iDescriptorID)
{
case WMA_DESCRIPTOR_PICTURE:
if (WMA_JPEG.FileSize == 0)
WMA_JPEG.StartDataPosition += sizeof(unsigned short);
iOffset += PROFILE_GetWMAPictureData(usDataLength, &tempbuf[iOffset], (unsigned int)iOffset, &WMA_JPEG);
break;
}
}
#endif
/*
else if(usDataType == 3) // Data Type WORD
{
switch(iDescriptorID)
{
case WMA_DESCRIPTOR_TRACK:
if( pstMTPFileDB->OBJProp.AudioObj.Track == 0 )
pstMTPFileDB->OBJProp.AudioObj.Track =( (tempbuf[iOffset]) |(tempbuf[iOffset+1] <<8));
break;
case WMA_DESCRIPTOR_TRACKNUMBER:
//pstMTPFileDB->OBJProp.AudioObj.Track =( (tempbuf[iOffset]) |(tempbuf[iOffset+1] <<8));
break;
}
}
*/
iOffset = (int)(sizeof(unsigned short) * 3) + usNameLength + usDataLength;
return iOffset;
}
///////////////////////////////////////////////////////////////////////////////////
//
// Function : PROFILE_GetASFExtendedContentDescriptionObject
//
// Description : Get the extended content description
//
///////////////////////////////////////////////////////////////////////////////////
int PROFILE_GetASFExtContentDescriptionObject(char *tempbuf, void *pID3Info)
{
pASFExtContentDescripObjType pASFExtContentDescripObj;
int iSize;
int iOffset = 0;
int i;
int iObjectSize = 0;
int iDescriptorSize;
if (tempbuf[iOffset] == 0x40 && tempbuf[iOffset+1] == 0xA4)
{
pASFExtContentDescripObj = (pASFExtContentDescripObjType) & tempbuf[iOffset];
iSize = sizeof(ASF_Extended_Content_Description_Object);
#ifdef RK_JPEG_ASF
if (WMA_JPEG.FileSize == 0)
WMA_JPEG.StartDataPosition += WMA_JPEG.Header_Ref;
#endif
if (!memcmp((void*)pASFExtContentDescripObj->mObjectID, ASF_Extended_Content_Description_Object, iSize))
{
iSize = sizeof(ASFExtContentDescripObjType);
iOffset += iSize;
iObjectSize += iSize;
#ifdef RK_JPEG_ASF
if (WMA_JPEG.FileSize == 0)
WMA_JPEG.StartDataPosition += iSize;
#endif
for (i = 0 ; i < pASFExtContentDescripObj->mContentDescriptorsCnt ; i++)
{
iDescriptorSize = PROFILE_GetContentDescriptors(&tempbuf[iOffset], pID3Info);
iOffset += iDescriptorSize;
iObjectSize += iDescriptorSize;
}
iOffset = iObjectSize;
}
}
return iOffset;
}
///////////////////////////////////////////////////////////////////////////////////
//
// Function : PROFILE_GetWMAInfo
//
// Description : Get the Meta data for WMA file
//
///////////////////////////////////////////////////////////////////////////////////
int PROFILE_GetWMAInfo(int fHandle, unsigned char *tempbuf, int iBuffSize, void *pID3Info)
{
unsigned int i, Ref;
int iFileSize;
int iHeaderSize;
int iReadSize;
pASFHeaderObjectType pASFHeaderObject;
iFileSize = RKFIO_FLength((MY_FILE*)fHandle);
if (iFileSize < 128)
{
return -1;
}
iReadSize = sizeof(ASFHeaderObjectType);
#ifdef RK_JPEG_ASF
WMA_JPEG.Header_Ref = iReadSize;
#endif
RKFIO_FSeek((MY_FILE*)fHandle, 0, FSEEK_SET);
RKFIO_FRead((MY_FILE*)fHandle, tempbuf, iReadSize);
pASFHeaderObject = (pASFHeaderObjectType)tempbuf;
if (!memcmp((void*)pASFHeaderObject->mObjectID, ASF_Header_Object, sizeof(ASF_Header_Object)))
{
iHeaderSize = pASFHeaderObject->mObjectSize[0];
}
else
{
return 1; // Wrong WMA File
}
if (iHeaderSize > iBuffSize)
{
iReadSize = iBuffSize;
}
else
{
iReadSize = iHeaderSize;
}
RKFIO_FRead((MY_FILE*)fHandle, tempbuf, iReadSize);
for (i = 0; i < iReadSize && i < iHeaderSize ;)
{
Ref = i;
// Find the signature of ASF_File_Properties_Object
//////////////////////////////////////////////////////////////
i += PROFILE_GetASFFilePropertiesObject((char *) & tempbuf[i], pID3Info);
// Find the signature of ASF_Content_Description_Object
/////////////////////////////////////////////////////////////////
i += PROFILE_GetASFContentDescriptionObject((char *) & tempbuf[i], pID3Info);
// Find Extended Content Descriptor
////////////////////////////////////////////////////
#ifdef RK_JPEG_ASF
if (WMA_JPEG.FileSize == 0)
WMA_JPEG.StartDataPosition = i;
#endif
i += PROFILE_GetASFExtContentDescriptionObject((char *) & tempbuf[i], (void *)pID3Info);
#ifdef RK_JPEG_ASF
// Find Meta Data Library Object
////////////////////////////////////////////////////
i += PROFILE_GetASFMetaDataLibraryObject((char *) & tempbuf[i], (void *)pID3Info, WMA_JPEG);
#endif
if (Ref == i)
i++ ;
}
return 1;
}
#endif // WMA_INCLUDE
//
#endif // RK_TAG_JPEG
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?