📄 mosaic_parse.c
字号:
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_info_data->text_frame = text_frame_data;
}
if((tag_info_data->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 - block_length - i_count;
/*put the data to the node*/
if(page_node_data->info_position[page_node_data->info_dis_area_num].data_list == NULL)
{
page_node_data->info_position[page_node_data->info_dis_area_num].data_list = tag_info_data;
page_node_data->info_position[page_node_data->info_dis_area_num].data_list->next = NULL;
}
else
{
tag_info_data1 = page_node_data->info_position[page_node_data->info_dis_area_num].data_list;
while(1)
{
if(tag_info_data1->next == NULL)
break;
else
tag_info_data1 = tag_info_data1->next;
}
/*tag_info_data1->next = app_mem_allocate(sizeof(info_dis_area_data_t));*/
tag_info_data1->next = tag_info_data;
tag_info_data1->next->next = NULL;
}
}/*end of the while-loop*/
page_node_data->info_dis_area_num++;
iNoOfBytesParsed = desc_length + 2;
break;
/*
* the following is the descriptor in cell layer
*/
case Cell_DES:
desc_length = mosaic_des_data[ 1 ];
cell_node_data->x = mosaic_des_data[ 2 ] << 8 | mosaic_des_data[ 3 ];
cell_node_data->y = mosaic_des_data[ 4 ] << 8 | mosaic_des_data[ 5 ];
cell_node_data->w = mosaic_des_data[ 6 ] << 8 | mosaic_des_data[ 7 ];
cell_node_data->h = mosaic_des_data[ 8 ] << 8 | mosaic_des_data[ 9 ];
iNoOfBytesParsed = desc_length + 2;
break;
case Cell_Navigation_links_DES:
desc_length = mosaic_des_data[ 1 ];
i_count = 0;
cell_nav_data.common_directions_bitmap = mosaic_des_data[2];
if((mosaic_des_data[ 2 ] & 0x80) == 0x80 ) /*North*/
{
cell_nav_data.n_page_id = mosaic_des_data[ 3 ];
cell_nav_data.n_cell_id = mosaic_des_data[ 4 ];
i_count += 2;
}
if((mosaic_des_data[ 2 ] & 0x40) == 0x40 ) /*Reserved*/
{
i_count += 2;
}
if((mosaic_des_data[ 2 ] & 0x20) == 0x20 ) /*East*/
{
cell_nav_data.e_page_id = mosaic_des_data[ 3 + i_count ];
cell_nav_data.e_cell_id = mosaic_des_data[ 4 + i_count ];
i_count += 2;
}
if((mosaic_des_data[ 2 ] & 0x10) == 0x10 ) /*Reserved*/
{
i_count += 2;
}
if((mosaic_des_data[ 2 ] & 0x08) == 0x08 ) /*South*/
{
cell_nav_data.s_page_id = mosaic_des_data[ 3 + i_count ];
cell_nav_data.s_cell_id = mosaic_des_data[ 4 + i_count ];
i_count += 2;
}
if((mosaic_des_data[ 2 ] & 0x04) == 0x04 ) /*Reserved*/
{
i_count += 2;
}
if((mosaic_des_data[ 2 ] & 0x02) == 0x02 ) /*West*/
{
cell_nav_data.w_page_id = mosaic_des_data[ 3 + i_count ];
cell_nav_data.w_cell_id = mosaic_des_data[ 4 + i_count ];
i_count += 2;
}
if((mosaic_des_data[ 2 ] & 0x01) == 0x01 ) /*Reserved*/
{
i_count += 2;
}
/*
*parse the link function info of the current cell
*/
for( i=0; i<(mosaic_des_data[3+i_count])/4;i++ )
{
cell_nav_data.nav_link_data[i].possible_key_code = mosaic_des_data[4+i_count+i*4]<<8|mosaic_des_data[5+i_count+i*4];
cell_nav_data.nav_link_data[i].tag_page_id = mosaic_des_data[6+i_count+i*4];
cell_nav_data.nav_link_data[i].tag_cell_id = mosaic_des_data[7+i_count+i*4];
}
cell_node_data->nav_data = cell_nav_data;
iNoOfBytesParsed = desc_length + 2;
break;
case Multilingual_audio_stream_locator_DES:
desc_length = mosaic_des_data[ 1 ];
block_length = parse_mosaic_structure(Stream_locator_STR,
&mosaic_des_data[ 2 ],
data_source_identifier,
1 );
iNoOfBytesParsed = desc_length + 2;
break;
case Eit_filter_DES:
desc_length = mosaic_des_data[ 1 ];
cell_node_data->eit_ifo_data.link_on_id = mosaic_des_data[ 2 ]<<8 | mosaic_des_data[ 3 ];
cell_node_data->eit_ifo_data.link_ts_id = mosaic_des_data[ 4 ]<<8 | mosaic_des_data[ 5 ];
cell_node_data->eit_ifo_data.link_service_id= mosaic_des_data[ 6 ]<<8 | mosaic_des_data[ 7 ];
cell_node_data->activation_mask = (cell_node_data->activation_mask | 0x04);
iNoOfBytesParsed = desc_length + 2;
break;
case Actions_DES:
desc_length = mosaic_des_data[ 1 ];
block_length = parse_mosaic_structure( Action_STR,
&mosaic_des_data[ 2 ],
data_source_identifier,
1 );
iNoOfBytesParsed = desc_length + 2;
break;
case Authorized_offers_DES:
desc_length = mosaic_des_data[ 1 ];
cell_node_data->offers_data = app_mem_allocate(sizeof(authorized_offers_t));
cell_node_data->offers_data->stream_to_cut = mosaic_des_data[2];
des_data_loop_length = mosaic_des_data[3];
mosaic_des_data += 4;
cell_node_data->offers_data->offers_list = NULL;
offers_list = NULL;
while(des_data_loop_length)
{
offers_list = app_mem_allocate(sizeof(ms_offers_t));
offers_list->opi = mosaic_des_data[0]<<8 | mosaic_des_data[1];
for(i=0;i<8;i++)
{
offers_list->offers_map[i] = mosaic_des_data[2 + i];
}
des_data_loop_length = des_data_loop_length - 10;
mosaic_des_data += 10;
if(cell_node_data->offers_data->offers_list == NULL)
{
cell_node_data->offers_data->offers_list = offers_list;
cell_node_data->offers_data->offers_list->next = NULL;
}
else
{
offers_list1 = cell_node_data->offers_data->offers_list;
while(1)
{
if(offers_list1->next == NULL)
break;
else
offers_list1 = offers_list1->next;
}
offers_list1->next = offers_list;
offers_list1->next->next = NULL;
}
}
iNoOfBytesParsed = desc_length + 2;
break;
case Concealed_geo_zones_DES:
desc_length = mosaic_des_data[ 1 ];
geo_zones = app_mem_allocate(sizeof(geo_zones_t));
geo_zones->next = NULL;
geo_zones->opi = mosaic_des_data[2]<<8 | mosaic_des_data[3];
geo_zones->list_mode_length = mosaic_des_data[4];
list_mode = (mosaic_des_data[4] & 0x60)>>5;
des_data_loop_length = (mosaic_des_data[4] & 0x1F);
mosaic_des_data += 5;
if(list_mode == 0x00)
{
for(i=0;i<32;i++)
{
geo_zones->geo_info_data.conceal_geo_bitmap[i] = mosaic_des_data[i];
}
}
else if(list_mode == 0x01)
{
for(i=0;i<des_data_loop_length;i++)
{
geo_zones->geo_info_data.conceal_zone_num[i] = mosaic_des_data[i];
}
}
else if(list_mode == 0x02)
{
for(i=0;i<des_data_loop_length;i++)
{
geo_zones->geo_info_data.authorize_zone_num[i] = mosaic_des_data[i];
}
}
#if 0
/*if(geo_zones->opi == BGCTV_OPI)*/
cell_node_data->geo_zones_data = geo_zones;
/*else
app_mem_deallocate(geo_zones);*/
#else
if(cell_node_data->geo_zones_data == NULL)
{
cell_node_data->geo_zones_data = geo_zones;
}
else
{
geo_zones1 = cell_node_data->geo_zones_data;
while(1)
{
if(geo_zones1->next == NULL)
break;
else
geo_zones1 = geo_zones1->next;
}
geo_zones1->next = geo_zones;
geo_zones1->next->next = NULL;
}
#endif
iNoOfBytesParsed = desc_length + 2;
break;
case Country_availability_DES:
desc_length = mosaic_des_data[ 1 ];
country_data = app_mem_allocate(sizeof(country_data_t));
country_data->country_code_list = NULL;
country_data->country_availability_flag = (mosaic_des_data[2] & 0x80)>>7;
mosaic_des_data += 3;
des_data_loop_length = desc_length - 1;
for(i=0;i<des_data_loop_length;i++)
{
country_code = app_mem_allocate(sizeof(country_code_t));
country_code->next = NULL;
country_code->country_code_info[i*3] = mosaic_des_data[i*3];
country_code->country_code_info[i*3+1] = mosaic_des_data[i*3+1];
country_code->country_code_info[i*3+2] = mosaic_des_data[i*3+2];
if(country_data->country_code_list == NULL)
{
country_data->country_code_list = country_code;
country_data->country_code_list->next = NULL;
}
else
{
country_code1 = country_data->country_code_list;
while(1)
{
if(country_code1->next == NULL)
break;
else
country_code1 = country_code1->next;
}
country_code1->next = country_code;
country_code1->next->next = NULL;
}
}/*end of the for-loop*/
cell_node_data->country_data = country_data;
iNoOfBytesParsed = desc_length + 2;
break;
case Parental_rating_DES:
desc_length = mosaic_des_data[ 1 ];
iNoOfBytesParsed = desc_length + 2;
break;
case Welcome_page_DES: /*long*/
desc_length = mosaic_des_data[ 1 ]<<8 | mosaic_des_data[ 2 ];
iNoOfBytesParsed = desc_length + 2;
break;
case Persisant_save_DES:
desc_length = mosaic_des_data[ 1 ];
iNoOfBytesParsed = desc_length + 2;
break;
case Linked_mosaic_page_DES:
desc_length = mosaic_des_data[ 1 ];
iNoOfBytesParsed = desc_length + 2;
break;
case Multilingual_default_text_frame_DES:
desc_length = mosaic_des_data[ 1 ];
iNoOfBytesParsed = desc_length + 2;
break;
/*
* the following descriptor is defined by DVB
*/
case service_list_DES:
desc_length = mosaic_des_data[ 1 ];
for(i=0;i<(desc_length/3-1);i++)
{
ms_network_data.service_id = mosaic_des_data[ 2+3*i ]<<8 | mosaic_des_data[ 3+3*i ];
/* service_type = 0x06 indicate the mosaic service*/
if(mosaic_des_data[ 4+3*i ] == 0x06)
{
return -1;
}
}
iNoOfBytesParsed = desc_length + 2;
break;
case SHORT_EVENT_DESC: /* 0x4d */
desc_length = mosaic_des_data[ 1 ];
/*
* skip ISO_639_language_code and event_name_length
*/
mosaic_des_data += 5;
/*
* read event name
*/
{
uint8_t event_length;
uint16_t no_of_bytes_parsed;
event_length = mosaic_des_data [ 0 ];
/*
* skip the length byte and point to the data byte
*/
mosaic_des_data += 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -