/******************************************************************************
* Copyright(c)2006 Analog Devices,Inc. All Rights Reserved
* This software is proprietary and confidential to Analog Devices,Inc.and its licensors
*
* File Name		: id_parser.h
* Function Names: 
*
* Revision		: 1.0
*
* Description	: This file contains the 
*					1. 
*					
*						
*
* Author       : Dushyanth
*
* Date         :
*
******************************************************************************/

#include <stdio.h>
#include <stdlib.h>


typedef struct
{
	char *input_buf_base;
	int input_buf_length;
	int no_more_data_with_app;
	char *curr_input_bitstream_ptr;
	int use_circular_buffer;
}id3_config_t;


typedef struct
{
	char *tag_data;
	int tag_length;
	int max_length;
	char text_encoding;
	int language;
}tag_field_t;

typedef struct
{
	tag_field_t songtitle;
	tag_field_t artist;
	tag_field_t album;
	tag_field_t year;
	tag_field_t comments; 
	tag_field_t genre;
	tag_field_t track_time;
	tag_field_t modified;
	tag_field_t recording_time;
	tag_field_t recording_date;
}id3_tag_t;


typedef struct 
{
	char *base;
	char *read;
	int	 length; 
	int  bytes_available;
}id3_inbuf_t;


typedef struct
{
	id3_tag_t		fields;
	id3_inbuf_t		inbuf_struct;

	/* parser state */   
	//int search_for_tag_sync;
	int search_state;
	int parser_next_state;
	int no_tag_found;
	int ID3_ver;
	int id3_v2_header_done;
	char flags_in_tag_header;
	int  tag_size ;
	int  tag_has_compression;
	int  tag_has_extended_header;
	int  use_circular_buffer;
	int  unsynchronisation_in_tag;
	int  frame_state;
	int  frame_flags_read;
	int  total_frame_bytes_to_read;
	int  frame_bytes_read;
	int  total_bytes_to_be_skipped_in_valid_frame;
	int  bytes_skipped_in_valid_frame;
	int  no_of_desired_frames_found;
	int  bytes_skipped_in_unrequired_frame;
	int  total_bytes_processed;
	int  bytes_left_to_skip_after_required_frames;
	char  current_frame[4];
	char  previous_frame[4];
	int  padding_start;
	int  footer_present;
	int  get_extended_header_size;
	int extended_header_done;
	int frame_data_read;
	int footer_processing;
	int frame_size;
	char frame_id[4];
	short frame_flags;
	
	/* process_frame  variables */
	int read_frame;
	char *field;
	int field_length;
	int	field_max_length;
	char field_text_encoding;
	int	comm_frame_lang;
	int	comments_frame ;
	int frame_matching_done;
	int skip_frame;

	/* universal skip/read variable*/
	int  bytes_to_process;
	int required_bytes;		

	// corrupted
	int tag_corrupted;
}id3_t;

#define ADI_ID3_PARSER_SUCCESS		0x100
#define ADI_ID3_PARSER_NEED_DATA	0x101
#define ADI_ID3_PARSER_FAIL			0x102
#define ADI_ID3_PARSER_NO_TAG_FOUND        0x103
#define ADI_ID3_PARSER_STREAM_COMPLETE     0x104
#define ADI_ID3_PARSER_TAG_CORRUPTED	   0x105

#define ADI_ID3_VER2_HEADER_SIZE    10


void adi_id3_parser_init(id3_t* instance , id3_config_t	*config_ptr);
int adi_id3_parser(id3_t* id3_parser_instance ,int available_bytes,char* input_buffer, int no_more_data_with_app);
int process_id3v1(id3_t *id3_parser_instance);
int process_id3v2(id3_t *id3_parser_instance );
int search_for_tag(id3_t *id3_parser_instance);
char id3_getbyte(id3_inbuf_t *ibuf);

int get_v2_header(id3_t *id3_parser_instance);

int process_id3v2_2(id3_t *id3_parser_instance );

int process_id3v2_3(id3_t *id3_parser_instance );
int process_id3v2_4(id3_t *id3_parser_instance );

//int get_frame_id_and_size(id3_t *id3_parser_instance,char* frame_id ,int* frame_size,short *flags,int ver);
void unsynch_frame_data(id3_t *id3_parser_instance,int field_length,int ver);

void skip_extended_header(id3_t *id3_parser_instance,int ver);
void string_copy(char *str1,char*str2,int len);

//void id3_frame_state_init();
void id3_frame_state_init(id3_t *instance);
