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

📄 gif_decoder_v2.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
				if(!gif_stop_now)
				{
					status = gif_decode_resume(p, &gif_info);
					kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);										
				}
				else
				{
					gif_decode_stop();
					goto end;
				}
			}
			else if (cb_status == GIF_STATUS_COMPLETE)
			{
				if(p->frame_number > cb_fn)
				{
					status = gif_decode_resume(p, &gif_info);
					kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);						
				}
				else if(p->frame_number == cb_fn)
				{
					GIF_Display(lcd_buffer, LCD_WIDTH, LCD_HEIGHT);
					p->frame_number++;
					break;
				}			
			}
			else
			{				
				gif_decode_stop();
				dbg_print("\n\r decode fail %d !", cb_status);
				break;
			}				
		}
	}

end:	
	DRM_close_file(p->file_handle);
	memset(lcd_buffer, 0x55, sizeof lcd_buffer);
	GIF_Display(lcd_buffer, LCD_WIDTH, LCD_HEIGHT);	
}

// memory mode, single frame, no resizing
void test_case_2(void)
{
	gif_config_struct *p = &gif_config;
	gif_report_status_enum status;
	kal_uint32 bytes;
	
	p->decode_mode = GIF_DECODE_MEMORY;	
	sprintf(file_name, "c:\\gif\\test1.gif"); // single
	kal_wsprintf(file_name_w,(char*)file_name);
	p->file_handle = DRM_open_file(file_name_w,FS_READ_ONLY|FS_OPEN_NO_DIR,0);
	if(p->file_handle < 0 )
		ASSERT(0);
	DRM_file_size(p->file_handle, &file_size);
	p->cache_id = gif_get_cache_key_from_file(file_name, file_size);
	if(file_size <= sizeof in_buffer)
		DRM_read_file(p->file_handle,in_buffer, file_size, &bytes);
	else
		ASSERT(0);
	
	p->file_buffer_adrs = in_buffer;
	p->file_buffer_size = file_size;
	p->output_buffer_adrs = (kal_uint8*)lcd_buffer;
	p->output_buffer_size = sizeof lcd_buffer;
	p->stack_adrs = gif_stack;
	p->stack_size = GIF_STACK_SIZE;
	p->tree_adrs = gif_tree;
	p->tree_size = GIF_TREE_SIZE;
	p->LCT_adrs = gif_lct;

	p->shadow_w = LCD_WIDTH;
	p->shadow_h = LCD_HEIGHT;
	p->clip_x1 = 0;
	p->clip_y1 = 0;
	p->clip_x2 = LCD_WIDTH-1;
	p->clip_x2 = LCD_HEIGHT-1;
	p->dest_x = 0;
	p->dest_y = 100;

	p->expect_w = LCD_WIDTH;
	p->expect_h = LCD_HEIGHT;
	
	p->pack_enable =  KAL_FALSE;
	// 1:1 ratio (pack mode)
	p->p_resz_w_Q = 0;
	p->p_resz_w_N = 1;
	p->p_resz_w_D = 0;
	p->p_resz_h_Q = 0;
	p->p_resz_h_N = 1;
	p->p_resz_h_D = 0;

	p->clip_enable = KAL_TRUE;
	p->out_format = GIF_OUT_RGB565;
	p->frame_number = 0;
	p->gif_cb = gif_callback;
	
	while(1)
	{
		kal_uint32 flag;
		
		status = gif_decode_start(p, &gif_info);
		if(status ==  GIF_INVALID_FORMAT || status == GIF_NO_FRAME)
			goto end;		
		kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);						
			
		while(1)
		{
			if(cb_status == GIF_STATUS_INEMPTY)
			{
				if(!gif_stop_now)
				{
					status = gif_decode_resume(p, &gif_info);
					kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);										
				}
				else
				{
					gif_decode_stop();
					goto end;
				}
			}
			else if (cb_status == GIF_STATUS_COMPLETE)
			{
				if(p->frame_number > cb_fn)
				{
					status = gif_decode_resume(p, &gif_info);
					kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);						
				}
				else if(p->frame_number == cb_fn)
				{
					GIF_Display(lcd_buffer, LCD_WIDTH, LCD_HEIGHT);
					p->frame_number++;
					break;
				}			
			}
			else
			{				
				gif_decode_stop();
				dbg_print("\n\r decode fail %d !", cb_status);
				break;
			}				
		}
	}
end:	
	DRM_close_file(p->file_handle);
	memset(lcd_buffer, 0x55, sizeof lcd_buffer);
	GIF_Display(lcd_buffer, LCD_WIDTH, LCD_HEIGHT);	
	
}

// file mode, single frame, partial input, resizing
void test_case_3(void)
{
	gif_config_struct *p = &gif_config;
	gif_report_status_enum status;

	sprintf(file_name, "c:\\gif\\1.gif"); // multi frame BD_NC02.gif
	kal_wsprintf(file_name_w,(char*)file_name);
	p->decode_mode = GIF_DECODE_FILE;	
	p->file_handle = DRM_open_file(file_name_w,FS_READ_ONLY|FS_OPEN_NO_DIR,0);
	if(p->file_handle < 0 )
		ASSERT(0);
	DRM_file_size(p->file_handle, &file_size);
	p->cache_id = gif_get_cache_key_from_file(file_name, file_size);	
	p->file_buffer_adrs = in_buffer;
	p->file_buffer_size = 1024;
	p->output_buffer_adrs = (kal_uint8*)lcd_buffer;
	p->output_buffer_size = sizeof lcd_buffer;
	p->stack_adrs = gif_stack;
	p->stack_size = GIF_STACK_SIZE;
	p->tree_adrs = gif_tree;
	p->tree_size = GIF_TREE_SIZE;
	p->LCT_adrs = gif_lct;

	p->shadow_w = LCD_WIDTH;
	p->shadow_h = LCD_HEIGHT;
	p->clip_x1 = 0;
	p->clip_y1 = 0;
	p->clip_x2 = LCD_WIDTH-1;
	p->clip_y2 = LCD_HEIGHT-1;
	p->dest_x = 0;
	p->dest_y = 0;

	p->expect_w = LCD_WIDTH;
	p->expect_h = LCD_HEIGHT;
	
	p->pack_enable =  KAL_FALSE;
	// 1:1 ratio (pack mode)
	p->p_resz_w_Q = 0;
	p->p_resz_w_N = 1;
	p->p_resz_w_D = 0;
	p->p_resz_h_Q = 0;
	p->p_resz_h_N = 1;
	p->p_resz_h_D = 0;

	p->clip_enable = KAL_TRUE;
	p->out_format = GIF_OUT_RGB565;
	p->frame_number = 0;
	p->gif_cb = gif_callback;
	
	while(1)
	{
		kal_uint32 flag;
		
		status = gif_decode_start(p, &gif_info);
		if(status ==  GIF_INVALID_FORMAT || status == GIF_NO_FRAME)
			goto end;		
		kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);						
			
		while(1)
		{
			if(cb_status == GIF_STATUS_INEMPTY)
			{
				if(!gif_stop_now)
				{
					status = gif_decode_resume(p, &gif_info);
					kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);										
				}
				else
				{
					gif_decode_stop();
					goto end;
				}
			}
			else if (cb_status == GIF_STATUS_COMPLETE)
			{
				if(p->frame_number > cb_fn)
				{
					status = gif_decode_resume(p, &gif_info);
					kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);						
				}
				else if(p->frame_number == cb_fn)
				{
					GIF_Display(lcd_buffer, LCD_WIDTH, LCD_HEIGHT);
					p->frame_number++;
					break;
				}			
			}
			else
			{				
				gif_decode_stop();
				dbg_print("\n\r decode fail %d !", cb_status);
				break;
			}				
		}
	}
end:	
	DRM_close_file(p->file_handle);
	memset(lcd_buffer, 0x55, sizeof lcd_buffer);
	GIF_Display(lcd_buffer, LCD_WIDTH, LCD_HEIGHT);	
}

// file mode, multi frame, partial input, random frame number, in order
// frame number larger than the GIF_CACHE_FRAME_NUM
void test_case_4(void)
{
	gif_config_struct *p = &gif_config;
	gif_report_status_enum status;
	kal_uint32 i;

	sprintf(file_name, "c:\\gif\\atsugari_0205bana.gif"); // multi frame atsugari_0205bana.gif
	kal_wsprintf(file_name_w,(char*)file_name);
	p->decode_mode = GIF_DECODE_FILE;	
	p->file_handle = DRM_open_file(file_name_w,FS_READ_ONLY|FS_OPEN_NO_DIR,0);
	if(p->file_handle < 0 )
		ASSERT(0);
	DRM_file_size(p->file_handle, &file_size);
	p->cache_id = gif_get_cache_key_from_file(file_name, file_size);	
	p->file_buffer_adrs = in_buffer;
	p->file_buffer_size = 1111;
	p->output_buffer_adrs = (kal_uint8*)lcd_buffer;
	p->output_buffer_size = sizeof lcd_buffer;
	p->stack_adrs = gif_stack;
	p->stack_size = GIF_STACK_SIZE;
	p->tree_adrs = gif_tree;
	p->tree_size = GIF_TREE_SIZE;
	p->LCT_adrs = gif_lct;

	p->shadow_w = LCD_WIDTH;
	p->shadow_h = LCD_HEIGHT;
	p->clip_x1 = 0;
	p->clip_y1 = 0;
	p->clip_x2 = LCD_WIDTH-1;
	p->clip_y2 = LCD_HEIGHT-1;
	p->dest_x = 0;
	p->dest_y = 0;

	p->expect_w = LCD_WIDTH;
	p->expect_h = LCD_HEIGHT;
	
	p->pack_enable =  KAL_FALSE;
	// 1:1 ratio (pack mode)
	p->p_resz_w_Q = 0;
	p->p_resz_w_N = 1;
	p->p_resz_w_D = 0;
	p->p_resz_h_Q = 0;
	p->p_resz_h_N = 1;
	p->p_resz_h_D = 0;

	p->clip_enable = KAL_TRUE;
	p->out_format = GIF_OUT_RGB565;
	p->gif_cb = gif_callback;

	// in random order
	srand( (unsigned)file_size);
	i=0;
	while(i<200)
	{
		kal_uint32 flag;
		
		p->frame_number = rand()%24;		
		status = gif_decode_start(p, &gif_info);
		i++;
		if(status ==  GIF_INVALID_FORMAT || status == GIF_NO_FRAME)
			goto end;		
		kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);						
			
		while(1)
		{
			if(cb_status == GIF_STATUS_INEMPTY)
			{
				if(!gif_stop_now)
				{
					status = gif_decode_resume(p, &gif_info);
					kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);										
				}
				else
				{
					gif_decode_stop();
					goto end;
				}
			}
			else if (cb_status == GIF_STATUS_COMPLETE)
			{
				if(p->frame_number > cb_fn)
				{
					status = gif_decode_resume(p, &gif_info);
					kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);						
				}
				else if(p->frame_number == cb_fn)
				{
					GIF_Display(lcd_buffer, LCD_WIDTH, LCD_HEIGHT);
					p->frame_number++;
					break;
				}			
			}
			else
			{				
				gif_decode_stop();
				dbg_print("\n\r decode fail %d !", cb_status);
				break;
			}				
		}
	}
end:	
	
	DRM_close_file(p->file_handle);
	memset(lcd_buffer, 0x55, sizeof lcd_buffer);
	GIF_Display(lcd_buffer, LCD_WIDTH, LCD_HEIGHT);	
	
}

// concurrent 4 gif images decoding in order
// 2 in memory 2 in file
void test_case_5(void)
{
	gif_config_struct *p;
	kal_uint32 i,count;
	gif_report_status_enum status;
	kal_bool done[4] = {0};

	// file 1
	p = &gif_cfg[0];	
	p->decode_mode = GIF_DECODE_FILE;		
	sprintf(f_name[0], "c:\\gif\\BD_OF03.gif"); // multi frame
	p->dest_x = 0;
	p->dest_y = 0;
	
	// file 2
	p = &gif_cfg[1];	
	p->decode_mode = GIF_DECODE_FILE;		
	sprintf(f_name[1], "c:\\gif\\ehon01.gif"); // multi frame
	p->dest_x = LCD_WIDTH/2;
	p->dest_y = 0;
	
	// memory 1
	p = &gif_cfg[2];	
	p->decode_mode = GIF_DECODE_MEMORY;		
	sprintf(f_name[2], "c:\\gif\\color2full.gif"); // single frame
	p->dest_x = 0;
	p->dest_y = LCD_HEIGHT/2;
	
	// memory 2
	p = &gif_cfg[3];	
	p->decode_mode = GIF_DECODE_MEMORY;		
	sprintf(f_name[3], "c:\\gif\\test457.gif"); // multi frame
	p->dest_x = LCD_WIDTH/2;
	p->dest_y = LCD_HEIGHT/2;

	for(i=0;i<GIF_NUM;i++)
	{
		kal_uint32 bytes;
		
		p = &gif_cfg[i];	
		kal_wsprintf(f_name_w[i],(char*)f_name[i]);
		p->file_handle = DRM_open_file(f_name_w[i],FS_READ_ONLY|FS_OPEN_NO_DIR,0);
		if(p->file_handle < 0 )
			ASSERT(0);
		DRM_file_size(p->file_handle, &fs[i]);		
		if(p->decode_mode == GIF_DECODE_MEMORY)
		{
			p->file_buffer_size = sizeof in_buf[i];
			if(fs[i] <= sizeof in_buf[i])
				DRM_read_file(p->file_handle,in_buf[i], fs[i], &bytes);
			else
				ASSERT(0);
		}		
		else
		{
			p->file_buffer_size = 1111;
		}
		p->cache_id = gif_get_cache_key_from_file(f_name[i], fs[i]);	
		p->file_buffer_adrs = in_buf[i];
		p->output_buffer_adrs = (kal_uint8*)lcd_buffer;
		p->output_buffer_size = sizeof lcd_buffer;
		p->stack_adrs = gif_stack;
		p->stack_size = GIF_STACK_SIZE;
		p->tree_adrs = gif_tree;
		p->tree_size = GIF_TREE_SIZE;
		p->LCT_adrs = gif_lct;

		p->shadow_w = LCD_WIDTH;
		p->shadow_h = LCD_HEIGHT;
		p->clip_x1 = 0;
		p->clip_y1 = 0;
		p->clip_x2 = LCD_WIDTH-1;
		p->clip_y2 = LCD_HEIGHT-1;

		p->expect_w = LCD_WIDTH/2;
		p->expect_h = LCD_HEIGHT/2;
		
		p->pack_enable =  KAL_FALSE;
		// 1:1 ratio (pack mode)
		p->p_resz_w_Q = 0;
		p->p_resz_w_N = 1;
		p->p_resz_w_D = 0;
		p->p_resz_h_Q = 0;
		p->p_resz_h_N = 1;
		p->p_resz_h_D = 0;

		p->clip_enable = KAL_TRUE;
		p->out_format = GIF_OUT_RGB565;		
		p->frame_number = 0;	
		p->gif_cb = gif_callback;
	}
	count = 0;
	do{

		kal_uint32 flag;
		
		for(i=0; i<GIF_NUM; i++)
		{		
			p = &gif_cfg[i];				
			status = gif_decode_start(p, &gif_info);
			if( status == GIF_NO_FRAME)
			{
				p->frame_number = 0;
				if(done[i] == 0)
				{
					count++;
					done[i] = KAL_TRUE;
				}
				break;
			}
			else if(status == GIF_INVALID_FORMAT)
			{
				goto end;
			}

			kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);						
			
			while(1)
			{
				if(cb_status == GIF_STATUS_INEMPTY)
				{
					if(!gif_stop_now)
					{
						status = gif_decode_resume(p, &gif_info);
						kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);										
					}
					else
					{
						gif_decode_stop();
						goto end;
					}
				}
				else if (cb_status == GIF_STATUS_COMPLETE)
				{
					if(p->frame_number > cb_fn)
					{
						status = gif_decode_resume(p, &gif_info);
						kal_retrieve_eg_events(GIF_Events,(1),KAL_OR_CONSUME,&flag,KAL_SUSPEND);						
					}
					else if(p->frame_number == cb_fn)
					{
						GIF_Display(lcd_buffer, LCD_WIDTH, LCD_HEIGHT);
						p->frame_number++;
						break;
					}			

⌨️ 快捷键说明

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