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 + -
显示快捷键?