示例#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;
}
示例#2
0
/*****************************************************************************
* FUNCTION
*     daf_check_next_frame
* DESCRIPTION
*     
* IMPACT 
*     
* PARAMETERS
*     audio_input_stream_struct *input_stream
*     daf_header_struct* prev_header
*     kal_int32 min_next_pos
*     kal_int32 max_next_pos
*     kal_int32 *next_pos
* RETURNS
*     kal_uint8 : DAF_CHECK_NEXT_FRAME_RESULT_ENUM
* GLOBALS AFFECTED
*     
*****************************************************************************/
kal_uint8 daf_check_next_frame( audio_input_stream_struct *input_stream, daf_header_struct* prev_header, kal_int32 min_next_pos, kal_int32 max_next_pos, kal_int32 *next_pos )
{
	daf_header_struct header;
	kal_int32 search_pos;
	kal_uint8 search_count;
	
	if( (kal_uint32)max_next_pos + 4 > input_stream->total_load ) // check if enough space for decoding next frame header
	{
		// refill buffer
		audio_input_stream_read( input_stream, 0 );
		if( (kal_uint32)max_next_pos + 4 > input_stream->total_load ) // check if still have enough space
			return DAF_CHECK_FRAME_EOF; // eof
	}
	// check if it's a valid frame header
	for( search_count = 0; search_count < 2; search_count++ )
	{
		if( search_count == 0 )
			search_pos = max_next_pos;
		else
			search_pos = min_next_pos;
		if( daf_parse_frame_header( input_stream->tail + search_pos - input_stream->total_load, &header ) )
		{
			if( prev_header->version == header.version && prev_header->layer == header.layer &&
				prev_header->channel_num == header.channel_num && prev_header->sample_rate == header.sample_rate )
			{
				*next_pos = search_pos;
				return DAF_CHECK_FRAME_TRUE;
			}
		}
	}
	return DAF_CHECK_FRAME_FALSE;
}
示例#3
0
/*****************************************************************************
 * FUNCTION
 *  daf_check_next_frame
 * DESCRIPTION
 *  
 * PARAMETERS
 *  input_stream        [?]         
 *  prev_header         [?]         
 *  min_next_pos        [IN]        
 *  max_next_pos        [IN]        
 *  next_pos            [?]         
 * RETURNS
 *  kal_uint8 : DAF_CHECK_NEXT_FRAME_RESULT_ENUM
 *****************************************************************************/
kal_uint8 daf_check_next_frame(
            audio_input_stream_struct *input_stream,
            daf_header_struct *prev_header,
            kal_int32 min_next_pos,
            kal_int32 max_next_pos,
            kal_int32 *next_pos)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    daf_header_struct header;
    kal_int32 search_pos;
    kal_uint8 search_count;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if ((kal_uint32) max_next_pos + 4 > input_stream->total_load)       /* check if enough space for decoding next frame header */
    {
        /* refill buffer */
        audio_input_stream_read(input_stream, 0);
        if ((kal_uint32) max_next_pos + 4 > input_stream->total_load)   /* check if still have enough space */
        {
            return DAF_CHECK_FRAME_EOF; /* eof */
        }
    }
    /* check if it's a valid frame header */
    for (search_count = 0; search_count < 2; search_count++)
    {
        if (search_count == 0)
        {
            search_pos = max_next_pos;
        }
        else
        {
            search_pos = min_next_pos;
        }
        if (daf_parse_frame_header(input_stream->tail + search_pos - input_stream->total_load, &header))
        {
            if (prev_header->version == header.version && prev_header->layer == header.layer &&
                prev_header->channel_num == header.channel_num && prev_header->sample_rate == header.sample_rate)
            {
                *next_pos = search_pos;
                return DAF_CHECK_FRAME_TRUE;
            }
        }
    }
    return DAF_CHECK_FRAME_FALSE;
}
示例#4
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;
}
示例#5
0
/*****************************************************************************
 * FUNCTION
 *  daf_find_next_frame
 * DESCRIPTION
 *  
 * PARAMETERS
 *  input_stream        [?]         
 *  header              [?]         
 *  move_offset         [IN]        
 * RETURNS
 *  kal_bool
 *****************************************************************************/
kal_bool daf_find_next_frame(
            audio_input_stream_struct *input_stream,
            daf_header_struct *header,
            kal_uint32 move_offset)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    daf_header_struct free_bitrate_header;
    kal_uint32 round, read_size;
    kal_uint32 sample_rate, bitrate, frame_slots, channel_num;
    kal_uint8 layer, version, slot_bytes;
    kal_uint8 *ptr, *end;
    kal_uint8 result = DAF_FIND_FRAME_FALSE;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    for (round = 0; result != DAF_FIND_FRAME_TRUE; round++)
    {
        /* check if it is out of searching range */
        if (input_stream->total_load > input_stream->skip + DAF_FRAME_CHECK_SIZE)
        {
            return KAL_FALSE;
        }

        /* refill data */
        audio_input_stream_read(input_stream, 0);
        read_size = input_stream->tail - input_stream->ptr;
        if (round == 0)
        {
            if (read_size < 4 + move_offset)    /* we need at least 4 + move_offset bytes to check frame header */
            {
                return KAL_FALSE;   /* eof */
            }
            input_stream->ptr += move_offset;
        }
        else if (read_size < 4) /* we need at least 4 bytes to check frame header */
        {
            return KAL_FALSE;   /* eof */
        }

        if (result == DAF_FIND_FRAME_FREE_BITRATE)
        {
            /* search next frame for calculating free bitrate */
            bitrate = 0;
            version = header->version;
            layer = header->layer;
            sample_rate = header->sample_rate;
            channel_num = header->channel_num;
            for (ptr = input_stream->ptr + 4, end = input_stream->tail - 4; ptr <= end; ptr++)
            {
                /* check if ptr reference to a valid frame header */
                if (daf_parse_frame_header(ptr, &free_bitrate_header))
                {
                    if (version == free_bitrate_header.version &&
                        layer == free_bitrate_header.layer &&
                        sample_rate == free_bitrate_header.sample_rate &&
                        bitrate == free_bitrate_header.bitrate && channel_num == free_bitrate_header.channel_num)
                    {
                        slot_bytes = 1;
                        if (layer == DAF_LAYER_I)
                        {
                            frame_slots = 12;
                            slot_bytes = 4;
                        }
                        else if ((layer == DAF_LAYER_III) && (version == DAF_VERSION_2 || version == DAF_VERSION_2_5))
                        {
                            frame_slots = 72;
                        }
                        else
                        {
                            frame_slots = 144;
                        }
                        header->min_frame_size = header->max_frame_size = ptr - input_stream->ptr;
                        bitrate = (header->min_frame_size / slot_bytes) * sample_rate / frame_slots;
                        if (bitrate >= 8000 && !(layer == DAF_LAYER_III && bitrate > 640000))
                        {
                            header->bitrate = input_stream->free_bitrate = bitrate;
                            input_stream->ptr = ptr;
                            return KAL_TRUE;
                        }
                    }

                    // if the latest found frame header doesn't match with the previous frame header,
                    // we discard the previous one, and use the latest found frame header
                    memcpy(header, &free_bitrate_header, sizeof(daf_header_struct));
                    bitrate = header->bitrate;
                    layer = header->layer;
                    if (header->bitrate != 0)
                    {
                        result = DAF_FIND_FRAME_TRUE;
                    }
                    break;
                }
            }
            input_stream->ptr = ptr;
        }
        else
        {
            /* loop through all data in input_stream */
            for (ptr = input_stream->ptr, end = input_stream->tail - 4; ptr <= end; ptr++)
            {
                /* check if ptr reference to a valid frame header */
                if (daf_parse_frame_header(ptr, header))
                {
                    result = DAF_FIND_FRAME_TRUE;

                    /* check if it's free bitrate */
                    if (header->bitrate == 0)
                    {
                        if (input_stream->free_bitrate == 0)
                        {
                            result = DAF_FIND_FRAME_FREE_BITRATE;
                        }
                        else
                        {
                            header->bitrate = input_stream->free_bitrate;
                            /* calculate frame length */
                            version = header->version;
                            layer = header->layer;
                            slot_bytes = 1;
                            if (layer == DAF_LAYER_I)
                            {
                                frame_slots = 12;
                                slot_bytes = 4;
                            }
                            else if ((layer == DAF_LAYER_III) &&
                                     (version == DAF_VERSION_2 || 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;
                        }
                    }
                    break;
                }
            }
            input_stream->ptr = ptr;
        }
    }
    return KAL_TRUE;
}