📄 mosaic_parse.c
字号:
/*
* 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 + -