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

📄 mosaic_parse.c

📁 c语言编的
💻 C
📖 第 1 页 / 共 4 页
字号:
				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 + -