📄 id3_jpeg.c
字号:
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*
File : \Audio\ID3
Desc : ID3
Author : FSH
Date : 2007-08-xx
Notes :
$Log :
* FSH 2007/08/xx 建立此文件
*
* vincent 2007/08/xx
*
*/
/****************************************************************/
#include "../include/audio_main.h"
#include "../include/audio_globals.h"
#include "../include/file_access.h"
#include "ID3_Jpeg.h"
#ifdef RK_TAG_JPEG
#define MAX_SIZE_OF_JPEG_STREAM_BUF (64*1024)
__align(4) unsigned char JpegBuf[MAX_SIZE_OF_JPEG_STREAM_BUF]; //64k buf
stTAG_JPG stTagJpg;
#endif
#ifdef RK_JPEG_ASF
_WMA_PICTURE_TYPE WMA_JPEG;
#endif
#ifdef RK_JPEG_ID3
int ID3_Get_JPEG_V2X(int fHandle, unsigned int * data_size, unsigned char * tempbuf)
{
unsigned int ID3_JPEG_SIZE;
int i, j, ID3tag_headerSize = 10;
int iFrameOffset;
int iFrameInfo;
int iFrameSize;
int iCopySize;
int iFileSize;
int iReadSize;
int iTotalSize;
int iRemainSize;
int iCurrentOffset;
int iHeaderSize;
int iMetaCnt = -1;
int iVersion;
int iOffset;
unsigned int ID3_PIC_OffSet;
unsigned short int usJpgTag;
unsigned int offset;
pID3V2XFrameInfoType pID3V2XFrameInfo;
pID3V22FrameInfoType pID3V22FrameInfo;
iHeaderSize = (3 + (int)sizeof(ID3V2XHeaderType) + (int)sizeof(ID3V2XHeaderType));
iFileSize = RKFIO_FLength((MY_FILE*)fHandle);
iRemainSize = iFileSize;
iTotalSize = 0;
//////////////////////////////////////////////////////////////////////
iReadSize = ID3_UpdateBufferData(fHandle, tempbuf, iRemainSize, 0);
iCurrentOffset += iReadSize;
iRemainSize -= iReadSize;
if (tempbuf[0] == 'I' && tempbuf[1] == 'D' && tempbuf[2] == '3')
{
iTotalSize = ID3_GetID3V2xHeader(&tempbuf[0], &iFrameOffset, &iVersion);
if (iTotalSize == -1 || iTotalSize == 0)
{
return -1;
}
}
else
{
return -1;
}
if (iVersion < 3)
{
iOffset = sizeof(ID3V22FrameInfoType);
}
else
{
iOffset = sizeof(ID3V2XFrameInfoType);
}
for (i = 3, j = 3 ; i < iFileSize && i < iTotalSize + (ID3tag_headerSize - 3);)
{
if (iTotalSize > 0)
{
if (j + iOffset + MAX_ID3V2_FIELD > iReadSize)
{
iCurrentOffset = i;
iRemainSize = iFileSize - i;
iReadSize = ID3_UpdateBufferData(fHandle, tempbuf, iRemainSize, iCurrentOffset);
iCurrentOffset += iReadSize;
iRemainSize -= iReadSize;
j = 0;
}
iFrameInfo = ID3_GetFrameInfo(&tempbuf[j], iVersion);
if (iFrameInfo != ID3_NONINFO)
{
iMetaCnt = 1;
if (iVersion < 3)
{
pID3V22FrameInfo = (pID3V22FrameInfoType) & tempbuf[j];
iFrameSize = ID3_Get3ByteValue(pID3V22FrameInfo->mSize);
iCopySize = iFrameSize;
if (iCopySize > MAX_ID3V2_FIELD)
{
iCopySize = MAX_ID3V2_FIELD - ID3_UNICODE_START;
}
}
else
{
pID3V2XFrameInfo = (pID3V2XFrameInfoType) & tempbuf[j];
iFrameSize = ID3_Get4byteIntValue(pID3V2XFrameInfo->mSize);
iCopySize = iFrameSize;
if (iCopySize > MAX_ID3V2_FIELD)
{
iCopySize = MAX_ID3V2_FIELD - ID3_UNICODE_START;
}
}
switch (iFrameInfo)
{
case ID3_TRACK:
break;
case ID3_YEAR:
break;
case ID3_NOTUSEDFRAME:
break;
case ID3_PICTURE :
for (ID3_PIC_OffSet = 0; ID3_PIC_OffSet < iReadSize; ID3_PIC_OffSet++)
{
if (tempbuf[ID3_PIC_OffSet+i] == 'A' && tempbuf[ID3_PIC_OffSet+i+1] == 'P'
&& tempbuf[ID3_PIC_OffSet+i+2] == 'I' && tempbuf[ID3_PIC_OffSet+i+3] == 'C')
{
ID3_JPEG_SIZE = tempbuf[ID3_PIC_OffSet+i+4] << 16 | (tempbuf[ID3_PIC_OffSet+i+5]) << 12 | (tempbuf[ID3_PIC_OffSet+i+6]) << 8 | (tempbuf[ID3_PIC_OffSet+i+7]);
if (ID3_JPEG_SIZE > JPEG_ID3_SIZE*1000)
return (-1);
}
usJpgTag = tempbuf[ID3_PIC_OffSet+i] << 8 | (tempbuf[ID3_PIC_OffSet+i+1]);
if (usJpgTag == 0xFFD8)
break;
}
if (usJpgTag == 0xFFD8)
{
offset = i + ID3_PIC_OffSet;
*data_size = iFrameSize + (ID3tag_headerSize - ID3_PIC_OffSet);
return (offset);
}
else
return (-1);
default:
break;
}
iFrameSize = (iOffset + iFrameSize);
j += iFrameSize;
i += iFrameSize;
if (j > iReadSize)
{
iCurrentOffset = i;
iReadSize = ID3_UpdateBufferData(fHandle, tempbuf, iRemainSize, iCurrentOffset);
iCurrentOffset += iReadSize;
iRemainSize -= iReadSize;
j = 0;
}
if ((tempbuf[j] < '0') || (tempbuf[j] > 'Z'))
if ((tempbuf[j+1] < '0') || (tempbuf[j+1] > 'Z'))
if ((tempbuf[j+2] < '0') || (tempbuf[j+2] > 'Z'))
{
iTotalSize = 0;
return -1;
}
}
else
{
j++;
i++;
}
}
if (j > iReadSize)
{
iReadSize = ID3_UpdateBufferData(fHandle, tempbuf, iRemainSize, iCurrentOffset);
iCurrentOffset += iReadSize;
iRemainSize -= iReadSize;
j = 0;
}
}
return (-1);
}
#endif
#ifdef RK_JPEG_ASF
int PROFILE_Rest_WMA_JPEG(void)
{
WMA_JPEG.Flag = 0;
WMA_JPEG.FileSize = 0;
WMA_JPEG.StartDataPosition = -1;
WMA_JPEG.Header_Ref = 0;
}
#ifdef RK_JPEG_ASF
// ASF_MetaData_Library_Object
unsigned char ASF_MetaData_Library_Object[] =
{
0x94, 0x1C, 0x23, 0x44,
0x98, 0x94, 0xD1, 0x49,
0xA1, 0x41, 0x1D, 0x13,
0x4E, 0x45, 0x70, 0x54
};
#endif
int PROFILE_GetASFMetaDataLibraryObject(char *tempbuf, void *pID3Info, _WMA_PICTURE_TYPE *WMA_JPEG)
{
pASFExtContentDescripObjType pASFExtContentDescripObj;
int iSize;
int iOffset = 0;
int i;
int iObjectSize = 0;
int iDescriptorSize;
if (tempbuf[iOffset] == 0x94 && tempbuf[iOffset+1] == 0x1C)
{
pASFExtContentDescripObj = (pASFExtContentDescripObjType) & tempbuf[iOffset];
iSize = sizeof(ASF_MetaData_Library_Object);
if (!memcmp((void*)pASFExtContentDescripObj->mObjectID, (void*) ASF_MetaData_Library_Object, iSize))
{
iSize = sizeof(ASFExtContentDescripObjType);
iOffset += iSize;
iObjectSize += iSize;
for (i = 0 ; i < pASFExtContentDescripObj->mContentDescriptorsCnt ; i++)
{
iDescriptorSize = PROFILE_GetContentDescriptors(&tempbuf[iOffset], pID3Info, WMA_JPEG);
iOffset += iDescriptorSize;
iObjectSize += iDescriptorSize;
}
iOffset = iObjectSize;
}
}
return iOffset;
}
int PROFILE_GetWMAPictureData(int iDataSize, char *SrcBuf, unsigned int Start_Pos, _WMA_PICTURE_TYPE *WMA_JPEG)
{
unsigned int i;
unsigned int iOffset = 0;
unsigned int usDataLength;
usDataLength = (unsigned int)(SrcBuf[iOffset+2] << 8) | SrcBuf[iOffset+1];
WMA_JPEG->FileSize = usDataLength; //Data Fild size
for (i = 0; i < 512 ;i++)
{
if (SrcBuf[i] == 0xFF & SrcBuf[i+1] == 0xD8)
{
WMA_JPEG->Flag = 1;
WMA_JPEG->StartDataPosition += i;
return iDataSize;
}
else
{
WMA_JPEG->Flag = 0; // Not Support Image Type
}
}
}
#endif
/*
void TAGJPG_SetJpgBuff(void)
{
#ifdef RK_TAG_JPEG
stTagJpg.iTAGJpgBuffSize = MAX_SIZE_OF_JPEG_STREAM_BUF;
stTagJpg.ucTAGJpgBuff = JpegBuf;
#endif
}
*/
int ID3_Jpeg_Decode(int Codec, unsigned int iParm)
{
#ifdef RK_TAG_JPEG
unsigned int uiImageSize;
unsigned char ucAlbumArt_Type = AlbumArtType_Error;
char temp[256];
stTagJpg.iTAGJpgBuffSize = MAX_SIZE_OF_JPEG_STREAM_BUF;
stTagJpg.ucTAGJpgBuff = JpegBuf;
RKFIO_FSeek(pRawFileCache, 0, 0);
switch (Codec)
{
#ifdef RK_JPEG_ID3
case CODEC_MP3 :
stTagJpg.iAlbumArtOffset = ID3_Get_JPEG_V2X((int)pRawFileCache, &uiImageSize, stTagJpg.ucTAGJpgBuff);
if (stTagJpg.iAlbumArtOffset > 0)
{
stTagJpg.iAlbumArtType = JPEG_TAG_MP3;
ucAlbumArt_Type = AlbumArtType_TAGJPG;
}
break;
#endif
#ifdef RK_JPEG_ASF
case CODEC_WMA :
PROFILE_Rest_WMA_JPEG();
PROFILE_GetWMAInfo(pRawFileCache, stTagJpg.ucTAGJpgBuff, stTagJpg.iTAGJpgBuffSize, (void *)temp);
stTagJpg.iAlbumArtOffset = (int) WMA_JPEG.StartDataPosition;
if ((WMA_JPEG.FileSize != 0) && (WMA_JPEG.Flag))
{
stTagJpg.iAlbumArtType = JPEG_ASF_WMA;
ucAlbumArt_Type = AlbumArtType_TAGJPG;
}
break;
#endif
default:
return -1;
break;
}
if (ucAlbumArt_Type == AlbumArtType_Error)
{
//歌曲无图片资源
return -1;
}
return 1;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -