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

📄 id3_jpeg.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 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 + -