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

📄 aud_id3_parser.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*******************************************************************************
* Filename:
* ---------
*  aud_id3_parser.c
*
* Project:
* --------
*   MAUI
*
* Description:
* ------------
*   id3 parsing process: id3v1, id3v2.2, id3v2.3, and id3v2.4 are all supported.
*   to save code size and processing time, we get only what we want from id3 tags:
*   (1) title (2) artist (3) album (4) year (5) genre
*   it's flexible to add more fields in the future when applications need more.
*   decryption, decompression are not supported so
*   if a v2 tag frame is encrpyted or compressed, we skip the single frame, and continue to parse next frame.
*   if a entire id3v2 tag is encrypted or compressed, we skip the v2 tag parsing, and continue to parse v1 tag.   
*
* Author:
* -------
*  Tim Chen
*
*==============================================================================
*           HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
 *------------------------------------------------------------------------------
 * $Log$
 *
 * removed!
 * removed!
 * 
 *
 * removed!
 * removed!
 * 
 *
 * removed!
 * removed!
 * 
 *
 * removed!
 * removed!
 * 
 *
 * removed!
 * removed!
 * 
 *
 * removed!
 * removed!
 * 
 *
 *------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
*==============================================================================
*******************************************************************************/

#ifndef MED_NOT_PRESENT

#include "med_global.h"

#ifdef __RICH_AUDIO_PROFILE__

#include "aud_id3_parser.h"

/* import from other files */
extern kal_int32 mmi_chset_text_to_ucs2(kal_uint8 *dest, kal_int32 dest_size, kal_uint8 *src);        /* from conversions.c */
extern kal_uint32 med_crc_calculate(kal_uint8 const *data, kal_uint32 length);  /* from med_utility.c */

id3_tag_struct id3_tag;

/* id3 tag v2 frame id -- title, artist, album, genre, year */
const char *id3_tag_v2_2_frame_id_list[NUM_OF_ID3_FRAME] = { "TT2", "TP1", "TAL", "TCO", "TYE" };
const char *id3_tag_v2_3_frame_id_list[NUM_OF_ID3_FRAME] = { "TIT2", "TPE1", "TALB", "TCON", "TYER" };
const char *id3_tag_v2_4_frame_id_list[NUM_OF_ID3_FRAME] = { "TIT2", "TPE1", "TALB", "TCON", "TDRC" };
const id3_tag_v1_field_struct id3_tag_v1_field_list[NUM_OF_ID3_FRAME] =
    { {3, 30}, {33, 30}, {63, 30}, {127, 1}, {93, 4} };
const char *id3_tag_genres[] = 
{
    "Blues",
    "Classic Rock",
    "Country",
    "Dance",
    "Disco",
    "Funk",
    "Grunge",
    "Hip-Hop",
    "Jazz",
    "Metal",
    "New Age",
    "Oldies",
    "Other",
    "Pop",
    "R&B",
    "Rap",
    "Reggae",
    "Rock",
    "Techno",
    "Industrial",
    "Alternative",
    "Ska",
    "Death Metal",
    "Pranks",
    "Soundtrack",
    "Euro-Techno",
    "Ambient",
    "Trip-Hop",
    "Vocal",
    "Jazz+Funk",
    "Fusion",
    "Trance",
    "Classical",
    "Instrumental",
    "Acid",
    "House",
    "Game",
    "Sound Clip",
    "Gospel",
    "Noise",
    "Alt",
    "Bass",
    "Soul",
    "Punk",
    "Space",
    "Meditative",
    "Instrumental Pop",
    "Instrumental Rock",
    "Ethnic",
    "Gothic",
    "Darkwave",
    "Techno-Industrial",
    "Electronic",
    "Pop-Folk",
    "Eurodance",
    "Dream",
    "Southern Rock",
    "Comedy",
    "Cult",
    "Gangsta Rap",
    "Top 40",
    "Christian Rap",
    "Pop/Funk",
    "Jungle",
    "Native American",
    "Cabaret",
    "New Wave",
    "Psychedelic",
    "Rave",
    "Showtunes",
    "Trailer",
    "Lo-Fi",
    "Tribal",
    "Acid Punk",
    "Acid Jazz",
    "Polka",
    "Retro",
    "Musical",
    "Rock & Roll",
    "Hard Rock",
    "Folk",
    "Folk/Rock",
    "National Folk",
    "Swing",
    "Fast-Fusion",
    "Bebob",
    "Latin",
    "Revival",
    "Celtic",
    "Bluegrass",
    "Avantgarde",
    "Gothic Rock",
    "Progressive Rock",
    "Psychedelic Rock",
    "Symphonic Rock",
    "Slow Rock",
    "Big Band",
    "Chorus",
    "Easy Listening",
    "Acoustic",
    "Humour",
    "Speech",
    "Chanson",
    "Opera",
    "Chamber Music",
    "Sonata",
    "Symphony",
    "Booty Bass",
    "Primus",
    "Porn Groove",
    "Satire",
    "Slow Jam",
    "Club",
    "Tango",
    "Samba",
    "Folklore",
    "Ballad",
    "Power Ballad",
    "Rhythmic Soul",
    "Freestyle",
    "Duet",
    "Punk Rock",
    "Drum Solo",
    "A Cappella",
    "Euro-House",
    "Dance Hall",
    "Goa",
    "Drum & Bass",
    "Club-House",
    "Hardcore",
    "Terror",
    "Indie",
    "BritPop",
    "Negerpunk",
    "Polsk Punk",
    "Beat",
    "Christian Gangsta Rap",
    "Heavy Metal",
    "Black Metal",
    "Crossover",
    "Contemporary Christian",
    "Christian Rock",
    "Merengue",
    "Salsa",
    "Thrash Metal",
    "Anime",
    "JPop",
    "Synthpop"
};


/*****************************************************************************
 * FUNCTION
 *  id3_tag_utf16_to_ucs2
 * DESCRIPTION
 *  
 * PARAMETERS
 *  byte_order      [IN]        
 *  dest            [?]         
 *  dest_size       [IN]        (>=4)
 *  src             [?]         
 *  src_size        [IN]        (>=1)
 * RETURNS
 *  kal_int32
 *****************************************************************************/
kal_int32 id3_tag_utf16_to_ucs2(
            kal_uint8 byte_order,
            kal_uint8 *dest,
            kal_uint32 dest_size,
            kal_uint8 *src,
            kal_uint32 src_size)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint16 utf16;
    kal_uint32 dest_count = 0;
    kal_uint32 src_count = 0;   /* src_size is used to prevent from infinte loop when src data are not utf16 */

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (byte_order == ID3_UTF16_UNKNOWN_BYTE_ORDER)
    {
        /* check BOM */
        if (src[0] == 0xFF && src[1] == 0xFE)
        {
            byte_order = ID3_UTF16_LE;
        }
        else if (src[0] == 0xFE && src[1] == 0xFF)
        {
            byte_order = ID3_UTF16_BE;
        }
        src += 2;
        src_count += 2;
    }

    if (byte_order != ID3_UTF16_UNKNOWN_BYTE_ORDER)
    {
        dest_size -= ((dest_size % 2) + 2); /* make it a even number + null terminator */
        /* ID3_UTF16_BE = 0, ID3_UTF16_LE = 1 */
        while (dest_count < dest_size && src_count < src_size &&
               (utf16 = ((kal_uint16) src[byte_order] << 8) | ((kal_uint16) src[1 - byte_order])))
        {
            if (utf16 < 0xD800 || utf16 > 0xDFFF)
            {
                dest[dest_count] = (kal_uint8) (utf16 & 0xFF);
                dest[dest_count + 1] = (kal_uint8) (utf16 >> 8);
                dest_count += 2;
            }
            src += 2;
            src_count += 2;
        }
    }
    dest[dest_count] = 0;
    dest[dest_count + 1] = 0;
    return dest_count + 2;
}


/*****************************************************************************
 * FUNCTION
 *  id3_tag_parse_number
 * DESCRIPTION
 *  
 * PARAMETERS
 *  text            [?]         UCS2 and its format is *((0-9)+)*, i.e. (12) or (123), ....etc.
 *  text_size       [IN]        (word)
 * RETURNS
 *  kal_int32
 *****************************************************************************/
kal_int32 id3_tag_parse_number(kal_wchar *text, kal_uint32 text_size)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int32 val;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    for (val = -1; text_size != 0; text_size--, text++)
    {
        if (*text >= L'0' && *text <= L'9')
        {
            if (val < 0)    /* check if it's the first time */
            {
                val = 0;
            }
            val = val * 10 + (kal_int32) (*text - L'0');
        }
        else if (*text == L'(' || *text == L')')
        {
            if (val >= 0)
            {
                break;  /* finish */
            }
        }
    }
    return val;
}


/*****************************************************************************
 * FUNCTION
 *  id3_tag_get_unsync_uint32
 * DESCRIPTION
 *  
 * PARAMETERS
 *  data        [?]         
 *  size        [IN]        
 * RETURNS
 *  kal_uint32
 *****************************************************************************/
kal_uint32 id3_tag_get_unsync_uint32(kal_uint8 *data, kal_uint8 size)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint32 num = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -