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

📄 mosaic_parse.c

📁 c语言编的
💻 C
📖 第 1 页 / 共 4 页
字号:
/* 
 * File: parsemosaic.c
 * Contains:
 *      the file of mosaic application for parse descriptor in the mosaic table
 *
 * Author:
 *      stone
 *
 * CVS control words:
 *
 * $Id: mosaic_parse.c,v 1.1.1.1 2005/06/28 08:52:23 wjbai Exp $ 
 *
 * Last checked in:
 * $Date: 2005/06/28 08:52:23 $ 
 *
 * History:
 *      $Log: mosaic_parse.c,v $
 *      Revision 1.1.1.1  2005/06/28 08:52:23  wjbai
 *      no message
 *
 *      Revision 1.18  2005/03/23 06:46:51  syan
 *      no message
 *
 *      Revision 1.17  2004/11/03 06:02:19  syan
 *      modify some mem_deallocate. add the pic of different language.
 *
 *      Revision 1.16  2004/10/28 08:29:03  syan
 *      use new pallette(177 nums) and delete cache data when enter browser.
 *
 *      Revision 1.15  2004/10/26 13:22:25  syan
 *      modify about when background pis is NULL, delete audio,vol rect,
 *      get PMT...
 *
 *      Revision 1.14  2004/07/14 01:33:16  syan
 *      no message
 *
 *      Revision 1.13  2004/07/09 11:16:05  syan
 *      modify the cell navigation , geo mask.
 *
 *      Revision 1.12  2004/07/01 08:52:26  syan
 *      CA mask and modify some color.
 *
 *      Revision 1.11  2004/06/21 02:26:21  syan
 *      support multilingual in page area display.
 *
 *      Revision 1.10  2004/06/18 05:31:47  syan
 *      support multilingual info area display in a page.
 *
 *      Revision 1.9  2004/06/16 11:40:09  syan
 *      modify multilingual text display in mask and page.
 *
 *      Revision 1.8  2004/06/16 05:52:54  syan
 *      modify multilingual text display in page.
 *
 *      Revision 1.7  2004/06/03 01:41:07  syan
 *      modify some data structure and VK in MOSAIC.
 *
 *      Revision 1.6  2004/05/25 01:00:34  syan
 *      modify page display function to display the test page correctly.
 *
 *      Revision 1.5  2004/05/11 08:17:23  syan
 *      add mask and color_index from the stream.
 *
 *      Revision 1.4  2004/03/29 09:47:36  syan
 *      no message
 *
 *      Revision 1.3  2004/03/12 05:33:43  syan
 *      provide other application linking
 *
 *      Revision 1.2  2004/02/04 08:54:01  dsqu
 *      no message
 *
 *      Revision 1.1  2004/01/07 12:46:51  dsqu
 *      Initial creation
 *
 *      Revision 1.1.1.1  2003/12/10 14:07:01  stone
 *      no message
 *
 *
 */
#include <stdio.h>
#include <string.h>
#include "stddefs.h"
#include "stcommon.h"
#include "modules.h"
#include "mosaic.h"

ms_eitpf_event_t ms_eitpf_event[2];
int16_t	ms_pre_eitpf_version_number;

extern mosaic_node_t *mosaic_tree_data_t;

extern mosaic_data_t *mosaic_node_data;
extern page_data_t *page_node_data;
extern cell_data_t *cell_node_data;

extern ms_network_data_t ms_network_data;

/*multi_text_t *multi_text_head;*/
/*
 *to parse all the descriptor of mosaic service 
 */
int parse_mosaic_structure (  uint8_t mosaic_str_tag,
                              uint8_t *mosaic_str_data, 
                              uint8_t data_source_identifier,
                              int16_t mosaic_str_length )
{
    int16_t block_length;
    
    action_data_t  cell_possible_link;
    service_link_t service_data;
    app_link_t     app_data;
    
    stream_locator_t link_audio_data,service_tag;
    
    #if 0
    int16_t languages_loop_length; 
    private_locator_t private_data;
	#endif
	
    switch( mosaic_str_tag )     /*structure tag value*/
	{
		#if 0
		/*Not used*/
		case Private_table_locator_STR:
	    	block_length = mosaic_str_data[ 0 ];
	    	break;
	                         
        case Mask_STR:
        	block_length = mosaic_str_data[ 0 ];
        	break;                                
            
        case Background_picture_STR:
        	block_length = mosaic_str_data[ 0 ];
        	break;
            
        case Font_attributes_STR:
        	block_length = mosaic_str_data[ 0 ];
        	break;
            
        case Text_frame_STR:
        	block_length = mosaic_str_data[ 0 ];
        	break;
        
        case Multilingual_text_STR:
        	/*
	     	 *the length of multilingual_list data structure in the mask data structure
          	 */ 	 
	     	block_length = mosaic_str_data[ 0 ]<<8 | mosaic_str_data[ 1 ];
	 		
	     	languages_loop_length = mosaic_str_data[ 2 ]<<8 | mosaic_str_data[ 3 ];	 		
	        
			break;
            
        case Multilingual_texts_list_STR:
        	block_length = mosaic_str_data[ 0 ];
        	break;
                
        case Local_file_locator_STR:
        	block_length = mosaic_str_data[ 0 ];
       		break;
        #endif

        case Stream_locator_STR:
        	block_length = mosaic_str_data[ 0 ];
            
          	if( data_source_identifier == PAGE_LAYER_DATA )
            {
            	page_node_data->background_type = 0x02;            	
            	service_tag.remote_flag =( mosaic_str_data[ 1 ] & 0xC0 )>>6;
            	if(  service_tag.remote_flag == 0x00 )
            	{
            		 service_tag.component_tag = mosaic_str_data[2];
            	}
            	if( service_tag.remote_flag == 0x01 )
                {
            		service_tag.on_id = mosaic_str_data[ 2 ]<<8 | mosaic_str_data[ 3 ];
            		service_tag.ts_id = mosaic_str_data[ 4 ]<<8 | mosaic_str_data[ 5 ];
            		service_tag.service_id = mosaic_str_data[ 6 ]<<8 | mosaic_str_data[ 7 ];
            		service_tag.component_tag = mosaic_str_data[8];
                }
            	else if( service_tag.remote_flag == 0x02 )
              	{
            		service_tag.service_id = mosaic_str_data[ 2 ]<<8 | mosaic_str_data[ 3 ];
                	service_tag.component_tag = mosaic_str_data[ 4 ]; 
              	}
              	page_node_data->possible_background_type.service_tag = service_tag;
            }
          	
          	if( data_source_identifier == CELL_LAYER_DATA )
            {
            	link_audio_data.remote_flag =( mosaic_str_data[ 1 ] & 0xC0 )>>6;
            	if( link_audio_data.remote_flag == 0x00 )
            	{
            		link_audio_data.component_tag = mosaic_str_data[2];
            	}
            	if( link_audio_data.remote_flag == 0x01 )
            	{
            		link_audio_data.on_id = mosaic_str_data[ 2 ]<<8 | mosaic_str_data[ 3 ];
            		link_audio_data.ts_id = mosaic_str_data[ 4 ]<<8 | mosaic_str_data[ 5 ];
            		link_audio_data.service_id = mosaic_str_data[ 6 ]<<8 | mosaic_str_data[ 7 ];
            		link_audio_data.component_tag = mosaic_str_data[ 8 ];
              	}
            	else if( link_audio_data.remote_flag == 0x02 )
              	{
            		link_audio_data.service_id = mosaic_str_data[ 2 ]<<8 | mosaic_str_data[ 3 ];
                	link_audio_data.component_tag = mosaic_str_data[ 4 ]; 
              	}
              	cell_node_data->link_audio_data = link_audio_data;
              	
              	cell_node_data->activation_mask = (cell_node_data->activation_mask | 0x02);
            }
        
       		break;
            
        case Action_STR:         
        	block_length = mosaic_str_data[ 0 ];
                        
            cell_possible_link.action_type = mosaic_str_data[ 1 ];
            cell_node_data->cell_possible_link = cell_possible_link;
            if( cell_possible_link.action_type == 0x01 ) /*this byte is the Action_type*/
            {
            	service_data.link_on_id = mosaic_str_data[ 2 ]<<8 | mosaic_str_data[ 3 ];
            	service_data.link_ts_id = mosaic_str_data[ 4 ]<<8 | mosaic_str_data[ 5 ];
            	service_data.link_service_id= mosaic_str_data[ 6 ]<<8 | mosaic_str_data[ 7 ];
                cell_node_data->cell_possible_link.possible_cell_link.service_data = service_data;
            }
            else if( cell_possible_link.action_type == 0x02 )
            {
            	app_data.link_org_id =((mosaic_str_data[ 2 ]<<8|mosaic_str_data[ 3 ])<<8|mosaic_str_data[ 4 ])<<8|mosaic_str_data[ 5 ];
            	app_data.link_app_id = mosaic_str_data[ 6 ]<<8 | mosaic_str_data[ 7 ];
            	cell_node_data->cell_possible_link.possible_cell_link.app_data = app_data;
            }
            
            cell_node_data->activation_mask = (cell_node_data->activation_mask | 0x01);
            
          	break;
            
	}
    return( block_length );	
}	                              


/*
 *to parse all the descriptor of mosaic service 
 */
int parse_mosaic_descriptor ( uint8_t *mosaic_des_data,
                              uint8_t data_source_identifier, 
                              int16_t mosaic_des_length )
{   
    int16_t    desc_length, block_length, des_data_loop_length, languages_loop_length, text_content_length;
    uint16_t    iNoOfBytesParsed = 0;
    uint16_t    i_count = 0, i = 0, num;
    
    cell_navigation_t cell_nav_data;
    picture_t  picture_tag, *pic, *pic1;
    text_frame_t text_frame_data;
    private_locator_t private_data;
    uint8_t *mosaic_str_data;
    
    multilingual_text_t *tag_multi_mask, *tag_multi_mask1, *tag_multi_page, *tag_multi_page1;
    multilingual_texts_list_t *tag_texts_list, *tag_texts_list1;
    
    ms_offers_t *offers_list, *offers_list1;
    geo_zones_t *geo_zones, *geo_zones1;
    country_data_t *country_data;
    country_code_t *country_code, *country_code1;
    uint8_t list_mode;
    
    info_dis_area_data_t *tag_info_data, *tag_info_data1;
    		
    switch( mosaic_des_data[ 0 ] )     /*descriptor tag value*/
	{
	/*
	 * the following is the descriptor in mosaic layer 
	 */		 	
	case CA_offers_mask_DES:                     /*long*/
	    
	case Geographical_offers_mask_DES:           /*long*/ 
	    
	case Morality_offers_mask_DES:               /*long*/
	     
	case Locked_offers_mask_DES:                 /*long*/

    	if      ( mosaic_des_data[ 0 ] == CA_offers_mask_DES )           i = 0;             
        else if ( mosaic_des_data[ 0 ] == Geographical_offers_mask_DES ) i = 1;
        else if ( mosaic_des_data[ 0 ] == Morality_offers_mask_DES )     i = 2;
        else if ( mosaic_des_data[ 0 ] == Locked_offers_mask_DES )       i = 3;
             
	    desc_length = mosaic_des_data[ 1 ]<<8 | mosaic_des_data[ 2 ];
	    /*
	     *the length of mask data structure
	     */ 
	    block_length =  mosaic_des_data[ 3 ]<<8 | mosaic_des_data[ 4 ];
	 
	 
	    mosaic_node_data->mask_data[i].bottom_margin = mosaic_des_data[ 5 ];
	    mosaic_node_data->mask_data[i].top_margin = mosaic_des_data[ 6 ];
	    mosaic_node_data->mask_data[i].left_margin = mosaic_des_data[ 7 ];
	    mosaic_node_data->mask_data[i].right_margin = mosaic_des_data[ 8 ];
        mosaic_node_data->mask_data[i].mask_color_index = mosaic_des_data[ 9 ];
	    mosaic_node_data->mask_data[i].corner_type =  mosaic_des_data[ 10 ]; 
	
		/* following is the multilingual_text structure*/
		mosaic_str_data = mosaic_des_data + 11;
	    /*
     	 *the length of multilingual text data structure in the mask data structure
      	 */     	
     	languages_loop_length = mosaic_str_data[ 2 ]<<8 | mosaic_str_data[ 3 ]; 		 		
            
        mosaic_node_data->mask_data[i].multi_mask_text_list = NULL;
        
        mosaic_str_data += 4;
        
        while(languages_loop_length>0)
		{        	
        	tag_multi_mask = app_mem_allocate(sizeof(multilingual_text_t));
        	tag_multi_mask -> next = NULL;
	        /*
	  		 *parse the multilingual_text structure in the mask descriptor 
	  		 */   		     	
	       	memcpy( (char *)(tag_multi_mask->iso_639_language) , (char *)mosaic_str_data , 3);
	       	APP_TRACE("\n the mask text language is [%c%c%c]", 
	       	          (char)tag_multi_mask->iso_639_language[0], (char)tag_multi_mask->iso_639_language[1], (char)tag_multi_mask->iso_639_language[2]);
	        
	        text_content_length = mosaic_str_data[ 3 ]<<8 | mosaic_str_data[ 4 ];	        
	        mosaic_str_data += 5;	        
	        tag_multi_mask->text_content = NULL;
	        tag_multi_mask->text_content = app_mem_allocate(text_content_length + 1);
	        memset ( (char *)(tag_multi_mask->text_content) , 0 ,text_content_length + 1);
			memcpy ( (char *)(tag_multi_mask->text_content) , (char *)mosaic_str_data , text_content_length);
			APP_TRACE("\n***mask text=%s. length=%d\n",tag_multi_mask->text_content, text_content_length);
			
			mosaic_str_data += text_content_length;
									
			/* check the default_text_frame and the default_font */
			tag_multi_mask->default_mask = mosaic_str_data[0];
			
			i_count = 6;
			block_length = 0;
			if((tag_multi_mask->default_mask & 0x80) == 0)/*this bit indicate the default_text_frame*/
			{
				i_count++;
				block_length = mosaic_str_data[1];
				text_frame_data.x = mosaic_str_data[2]<<8 | mosaic_str_data[3];
				text_frame_data.y = mosaic_str_data[4]<<8 | mosaic_str_data[5];
				text_frame_data.w = mosaic_str_data[6]<<8 | mosaic_str_data[7];
				text_frame_data.h = mosaic_str_data[8]<<8 | mosaic_str_data[9];
				text_frame_data.h_alignment = (mosaic_str_data[10] & 0xF0)>>4;
        		text_frame_data.v_alignment = (mosaic_str_data[10] & 0x0F);
        		text_frame_data.background_color = mosaic_str_data[11];
        		text_frame_data.foreground_color = mosaic_str_data[12];
        		
        		mosaic_str_data += (block_length + 2);
        		
				tag_multi_mask->text_frame = text_frame_data;
			}			
			if((tag_multi_mask->default_mask & 0x40) == 0)/*this bit indicate the default_font*/
			{
				i_count++;
				block_length += mosaic_str_data[0];
				
				/*not complete*/
				
				mosaic_str_data += (mosaic_str_data[0] + 1);
			}
			/*i is the 3(639), 2(text content), 1(default and reserved), other is in the structure*/
	        languages_loop_length = languages_loop_length - text_content_length - block_length - i_count;
	        
	        /*put the data to the node*/
	        if(mosaic_node_data->mask_data[i].multi_mask_text_list == NULL)
        	{
        		mosaic_node_data->mask_data[i].multi_mask_text_list = tag_multi_mask;	        
        		mosaic_node_data->mask_data[i].multi_mask_text_list->next = NULL;
        	}
	        else
	        {
	        	tag_multi_mask1 = mosaic_node_data->mask_data[i].multi_mask_text_list;
		        while(1)
	        	{
	        		if(tag_multi_mask1->next == NULL)
	        			break;
	        		else
	        			tag_multi_mask1 = tag_multi_mask1->next;

⌨️ 快捷键说明

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