Exemplo n.º 1
0
/*****************************************************************************
 * FUNCTION
 *  daf_seek
 * DESCRIPTION
 *  
 * PARAMETERS
 *  input_stream        [?]     
 *  offset              [?]     
 *  aud_info_struct *info_p(?)
 * RETURNS
 *  kal_bool
 *****************************************************************************/
kal_bool daf_seek(audio_input_stream_struct *input_stream, kal_uint32 *offset)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int32 v2_tag_size;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (*offset == 0)
    {
        /* skip id3v2 tag */
        if (audio_input_stream_read(input_stream, 10) != 10)
        {
            return KAL_FALSE;
        }
        if ((v2_tag_size = id3_tag_parse_v2_tag_size(input_stream->ptr)) > 0)
        {
            *offset = v2_tag_size;
        }
    }
    audio_input_stream_seek(input_stream, (kal_int32) * offset);
    if (!daf_parse(input_stream, offset, NULL))
    {
        return KAL_FALSE;
    }
    audio_input_stream_seek(input_stream, (kal_int32) * offset);
    return KAL_TRUE;
}
Exemplo n.º 2
0
/*****************************************************************************
* FUNCTION
*     daf_seek
* DESCRIPTION
*     
* IMPACT 
*     
* PARAMETERS
*     aud_info_struct *info_p
*     kal_uint32* offset
* RETURNS
*     kal_bool
* GLOBALS AFFECTED
*     
*****************************************************************************/
kal_bool daf_seek( audio_input_stream_struct *input_stream, kal_uint32* offset )
{
	kal_int32 v2_tag_size;
	
	if( *offset == 0 )
	{
		// skip id3v2 tag
		if( audio_input_stream_read( input_stream, 10 ) != 10 )
			return KAL_FALSE;
		if( ( v2_tag_size = id3_tag_parse_v2_tag_size( input_stream->ptr )) > 0 )
			*offset = v2_tag_size;
	}
	audio_input_stream_seek( input_stream, (kal_int32) *offset );
	if( !daf_parse( input_stream, offset, NULL ) )
		return KAL_FALSE;
	audio_input_stream_seek( input_stream, (kal_int32) *offset );
	return KAL_TRUE;
}
Exemplo n.º 3
0
/*****************************************************************************
 * FUNCTION
 *  daf_parse_data_info
 * DESCRIPTION
 *  
 * PARAMETERS
 *  info_p              [?]     
 *  input_stream        [?]     
 *  id3_tag             [?]     
 * RETURNS
 *  void
 *****************************************************************************/
void daf_parse_data_info(aud_info_struct *info_p, audio_input_stream_struct *input_stream, id3_tag_struct *id3_tag)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int32 data_size;
    kal_uint32 offset;
    kal_bool v2_result = KAL_FALSE;
    kal_bool v1_result = KAL_FALSE;
    kal_bool daf_parse_result;
    daf_data_info_struct daf_data_info;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    /* zero all info_p */
    memset(info_p, 0, sizeof(aud_info_struct));

    /* init id3 tag data structure */
    id3_tag_init(id3_tag);

    audio_input_stream_seek(input_stream, 0);
    /*
     * check id3v2 magic word -- "ID3"
     * and parse & save data to frames
     */
    v2_result = id3_tag_parse_v2_tag(input_stream, id3_tag);

    /*
     * parse daf frame to get duration, bitrate, samplerate, channel_num
     */
    if (v2_result)
    {
        /* skip id3v2 tag */
        offset = id3_tag->v2_size + 10;
        if (id3_tag->v2_footer)
        {
            offset += 10;
        }
    }
    else
    {
        offset = 0;
    }

    audio_input_stream_seek(input_stream, offset);
    daf_parse_result = daf_parse(input_stream, &offset, &daf_data_info);

    /* 
     * parse id3v1 tag
     */
    if ((data_size = audio_input_stream_get_data_size(input_stream)) >= 128)
    {
        /* move to last 128 bytes before file end for checking id3v1 tag */
        audio_input_stream_seek(input_stream, data_size - 128);

        /*
         * check id3v1 magic word -- "TAG"
         * and parse & save data to frames
         */
        v1_result = id3_tag_parse_v1_tag(input_stream, id3_tag);
    }
    else
    {
        v1_result = KAL_FALSE;
    }

    /* copy title to info_p */
    if (id3_tag->frames[ID3_FRAME_TITLE].text != NULL)
    {
        kal_wstrncpy(
            (kal_wchar*) info_p->title,
            (const kal_wchar*)id3_tag->frames[ID3_FRAME_TITLE].text,
            MAX_ID3_TITLE_LEN);
    }

    /* copy artist to info_p */
    if (id3_tag->frames[ID3_FRAME_ARTIST].text != NULL)
    {
        kal_wstrncpy(
            (kal_wchar*) info_p->artist,
            (const kal_wchar*)id3_tag->frames[ID3_FRAME_ARTIST].text,
            MAX_ID3_ARTIST_LEN);
    }

    /* copy album to info_p */
    if (id3_tag->frames[ID3_FRAME_ALBUM].text != NULL)
    {
        kal_wstrncpy(
            (kal_wchar*) info_p->album,
            (const kal_wchar*)id3_tag->frames[ID3_FRAME_ALBUM].text,
            MAX_ID3_ALBUM_LEN);
    }

    /* copy genre to info_p */
    if (id3_tag->frames[ID3_FRAME_GENRE].text != NULL)
    {
        kal_wstrncpy(
            (kal_wchar*) info_p->genre,
            (const kal_wchar*)id3_tag->frames[ID3_FRAME_GENRE].text,
            MAX_ID3_GENRE_LEN);
    }

    /* copy year to info_p */
    if (id3_tag->frames[ID3_FRAME_YEAR].text != NULL)
    {
        kal_wstrncpy(
            (kal_wchar*) info_p->year,
            (const kal_wchar*)id3_tag->frames[ID3_FRAME_YEAR].text,
            MAX_ID3_YEAR_LEN);
    }

    if (daf_parse_result)
    {
        daf_set_data_info(
            info_p,
            daf_data_info.channel_num,
            daf_data_info.duration,
            data_size,
            daf_data_info.bitrate,
            daf_data_info.samplerate);
    }
}
Exemplo n.º 4
0
/*****************************************************************************
 * FUNCTION
 *  daf_parse
 * DESCRIPTION
 *  
 * PARAMETERS
 *  input_stream        [?]     
 *  offset              [?]     
 *  info_p              [?]     
 *  FILE* file(?)
 * RETURNS
 *  kal_bool
 *****************************************************************************/
kal_bool daf_parse(audio_input_stream_struct *input_stream, kal_uint32 *offset, daf_data_info_struct *info_p)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint8 result, sync_count;
    kal_uint8 slot_bytes, frame_slots;
    kal_int32 cur_pos, min_next_pos, max_next_pos, next_pos;
    kal_uint32 data_size, movement;
    daf_header_struct header;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    input_stream->skip = *offset;
    data_size = (kal_uint32) audio_input_stream_get_data_size(input_stream);

    /* find the first frame with 2 consecutive frames */
    for (movement = 0;; input_stream->free_bitrate = 0, movement = 1)
    {
        /* find the first frame */
        if (!daf_find_next_frame(input_stream, &header, movement))
        {
            return KAL_FALSE;   /* not found */
        }

        /* calculate current frame position */
        cur_pos = input_stream->total_load - (input_stream->tail - input_stream->ptr);

        /* calculate next frame position because we need to find 2 consecutive frames */
        min_next_pos = cur_pos + header.min_frame_size;
        max_next_pos = cur_pos + header.max_frame_size;

        /* check if next frame position reference to a valid frame */
        result = daf_check_next_frame(input_stream, &header, min_next_pos, max_next_pos, &next_pos);
        if (result == DAF_CHECK_FRAME_EOF)
        {
            break;
        }
        else if (result == DAF_CHECK_FRAME_TRUE)
        {
            /* calculate the offset of the first found frame position */
            *offset = (kal_uint32) cur_pos;

            /* calc frame_size */
            header.frame_size = next_pos - cur_pos;

            /* check 2 consecutive frames */
            for (sync_count = 0; sync_count < 2; sync_count++)
            {
                /* move to next frame */
                input_stream->ptr += header.frame_size;

                ASSERT(input_stream->ptr < input_stream->tail);

                /* decode frame header */
                daf_parse_frame_header(input_stream->ptr, &header);

                /* calculate frame length for free bitrate */
                if (header.bitrate == 0)
                {
                    /* if it's a free bitrate frame but the first frame is not, it's false */
                    if (input_stream->free_bitrate == 0)
                    {
                        break;
                    }

                    header.bitrate = input_stream->free_bitrate;
                    slot_bytes = 1;
                    if (header.layer == DAF_LAYER_I)
                    {
                        frame_slots = 12;
                        slot_bytes = 4;
                    }
                    else if ((header.layer == DAF_LAYER_III) &&
                             (header.version == DAF_VERSION_2 || header.version == DAF_VERSION_2_5))
                    {
                        frame_slots = 72;
                    }
                    else
                    {
                        frame_slots = 144;
                    }

                    header.min_frame_size = (frame_slots * header.bitrate / header.sample_rate) * slot_bytes;
                    header.max_frame_size = header.min_frame_size + slot_bytes;
                }

                /* calculate current frame position */
                cur_pos = input_stream->total_load - (input_stream->tail - input_stream->ptr);

                /* calculate next frame position because we need to find 2 consecutive frames */
                min_next_pos = cur_pos + header.min_frame_size;
                max_next_pos = cur_pos + header.max_frame_size;

                /* check if next frame position reference to a valid frame */
                result = daf_check_next_frame(input_stream, &header, min_next_pos, max_next_pos, &next_pos);

                if (result != DAF_CHECK_FRAME_TRUE)
                {
                    break;
                }

                /* calc frame_size */
                header.frame_size = next_pos - cur_pos;
            }

            if (result == DAF_CHECK_FRAME_EOF || sync_count == 2)
            {
                break;
            }
            else
            {
                audio_input_stream_seek(input_stream, (kal_int32) * offset);
            }
        }
    }

    if (info_p != NULL)
    {
        info_p->bitrate = header.bitrate;
        info_p->duration = (data_size - *offset) * 8 / header.bitrate;
        info_p->samplerate = header.sample_rate;
        info_p->channel_num = header.channel_num;
    }

    return KAL_TRUE;
}
Exemplo n.º 5
0
/*****************************************************************************
* FUNCTION
*     daf_parse_data_info
* DESCRIPTION
*     
* IMPACT 
*     
* PARAMETERS
*     aud_info_struct *info_p
*     audio_input_stream_struct* input_stream
*     id3_tag_struct* id3_tag
* RETURNS
*     void
* GLOBALS AFFECTED
*     
*****************************************************************************/
void daf_parse_data_info( aud_info_struct *info_p, audio_input_stream_struct* input_stream, id3_tag_struct* lid3_tag )
{
	kal_int32 data_size;
	kal_uint32 offset;
	kal_bool v2_result = KAL_FALSE;
	kal_bool v1_result = KAL_FALSE;
	kal_bool daf_parse_result;
	daf_data_info_struct daf_data_info;
	
	// init id3 tag data structure
	id3_tag_init( lid3_tag );
	
	audio_input_stream_seek( input_stream, 0 );
	/*
	 * check id3v2 magic word -- "ID3"
	 * and parse & save data to frames
	 */
	v2_result = id3_tag_parse_v2_tag( input_stream, lid3_tag );
	mmi_trace(1,"chenhe,daf_parse_data_info,v2_result is %d",v2_result);
	/*
	 * parse daf frame to get duration, bitrate, samplerate, channel_num
	 */
	if( v2_result )
	{
		// skip id3v2 tag
		offset = lid3_tag->v2_size + 10;
		if( lid3_tag->v2_footer )
			offset += 10;
	}
	else
		offset = 0;
	
	audio_input_stream_seek( input_stream, offset );
	daf_parse_result = daf_parse( input_stream, &offset, &daf_data_info );
	
	/* 
	 * parse id3v1 tag
	 */
	if( (data_size = audio_input_stream_get_data_size( input_stream )) >= 128 )
	{
		// move to last 128 bytes before file end for checking id3v1 tag
		audio_input_stream_seek( input_stream, data_size - 128 );
		
		/*
		 * check id3v1 magic word -- "TAG"
		 * and parse & save data to frames
		 */
		v1_result = id3_tag_parse_v1_tag( input_stream, lid3_tag );
	}
	else
		v1_result = KAL_FALSE;
	mmi_trace(1,"chenhe,daf_parse_data_info,v1_result is %d",v1_result);

	// copy title to info_p
	if( lid3_tag->frames[ID3_FRAME_TITLE].text != NULL )
		kal_wstrncpy( (kal_wchar*)info_p->title, (const kal_wchar*)lid3_tag->frames[ID3_FRAME_TITLE].text, MAX_ID3_TITLE_LEN );
	
	// copy artist to info_p
	if( lid3_tag->frames[ID3_FRAME_ARTIST].text != NULL )
		kal_wstrncpy( (kal_wchar*)info_p->artist, (const kal_wchar*)lid3_tag->frames[ID3_FRAME_ARTIST].text, MAX_ID3_ARTIST_LEN );
	
	// copy album to info_p
	if( lid3_tag->frames[ID3_FRAME_ALBUM].text != NULL )
		kal_wstrncpy( (kal_wchar*)info_p->album, (const kal_wchar*)lid3_tag->frames[ID3_FRAME_ALBUM].text, MAX_ID3_ALBUM_LEN );
	
	// copy genre to info_p
	if( lid3_tag->frames[ID3_FRAME_GENRE].text != NULL )
		kal_wstrncpy( (kal_wchar*)info_p->genre, (const kal_wchar*)lid3_tag->frames[ID3_FRAME_GENRE].text, MAX_ID3_GENRE_LEN );
	
	// copy year to info_p
	if( lid3_tag->frames[ID3_FRAME_YEAR].text != NULL )
		kal_wstrncpy( (kal_wchar*)info_p->year, (const kal_wchar*)lid3_tag->frames[ID3_FRAME_YEAR].text, MAX_ID3_YEAR_LEN );
	mmi_trace(1,"chenhe,daf_parse_data_info,daf_parse_result is %d",daf_parse_result);
	if( daf_parse_result )
		daf_set_data_info( info_p, daf_data_info.channel_num, daf_data_info.duration, data_size, daf_data_info.bitrate, daf_data_info.samplerate );
}