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

📄 gif_decoder_v2.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
				}
				else
				{				
					gif_decode_stop();
					dbg_print("\n\r decode fail %d !", cb_status);
					break;
				}				
			}
		}
		if(count == GIF_NUM)
			break; 
	}while(1);
	
end:	
	
	for(i=0;i<GIF_NUM;i++)
	{
		p = &gif_cfg[i];
		DRM_close_file(p->file_handle);
	}
	
}
// stress test more than 3000 files (RGB565)
void test_case_6(void)
{
	kal_int32 s, file_count;
	FS_HANDLE handle;
	RTFDOSDirEntry de;
	gif_config_struct *p = &gif_config;
	gif_report_status_enum status;
	static kal_bool is_first = KAL_TRUE;		

	file_count = 0;
	if(RTFSetCurrentDir(L"c:\\gif\\") < 0)
		while(1);
	while(1)
	{		
		kal_uint32 bytes;		
		
		if(is_first)
		{
			handle = RTFFindFirstEx(L"*.gif", 0, 0, &de, file_name_w, 256);
			ASSERT(handle > 0);
			is_first = KAL_FALSE;
		}
		else
		{
			status = RTFFindNextEx(handle,&de,file_name_w, 256);
		}
		if(status != RTF_NO_ERROR)
			break;
		file_count++;
		kal_dchar2char(file_name_w,(char*)file_name);
		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);	
		dbg_print("\r\n[%d] File: %s\t, size: %d\t, fn: ",file_count, file_name, file_size);
		if(file_size > 32*1024)
			p->decode_mode = GIF_DECODE_FILE;	
		else
			p->decode_mode = GIF_DECODE_MEMORY;	
		if(p->decode_mode == GIF_DECODE_MEMORY)
		{
			p->file_buffer_size = file_size;
			if(DRM_read_file(p->file_handle,in_buffer, file_size, &bytes) < 0)
				while(1);
		}		
		else
		{
			p->file_buffer_size = 32*1024;
		}		
		p->cache_id = gif_get_cache_key_from_file(file_name, file_size);	
		p->file_buffer_adrs = in_buffer;
		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;
		p->frame_number = 0;		
	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++;
					dbg_print("%d ", p->frame_number);
					break;
				}			
			}
			else
			{				
				gif_decode_stop();
				dbg_print("\n\r decode fail %d !", cb_status);
				goto end;
			}				
		}
	}

end:	

	DRM_close_file(p->file_handle);
	memset(lcd_buffer, 0x55, sizeof lcd_buffer);
	// kal_sleep_task(1);
	// GIF_Display(lcd_buffer, LCD_WIDTH, LCD_HEIGHT);							
	}
	RTFFindClose(handle);
	is_first = KAL_TRUE;
}

// index mode
void test_case_7(void)
{
	gif_config_struct *p = &gif_config;
	gif_report_status_enum status;

	sprintf(file_name, "c:\\gif\\BD_NC02.gif"); // multi frame 
	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_FALSE;
	p->out_format = GIF_OUT_INDEX;
	p->frame_number = 0;
	
	while(1)
	{		
		kal_uint32 i;
		kal_uint32 *ct, WxH, w, h;
		kal_uint8 *out;
		kal_uint32 flag;
		
		status = gif_decode_start(p, &gif_info);
		if(status ==  GIF_INVALID_FORMAT || status == GIF_NO_FRAME)
			goto end;		
		WxH = gif_info.w*gif_info.h;
		// refer to the color table
		out = (kal_uint8*)lcd_buffer;
		if(gif_info.LCT_flag)
			ct = p->LCT_adrs;
		else
			ct = gif_cache[gif_cache_index].GCT;		
		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)
				{
					for(i=0;i<WxH;i++)
					{
						lcd_buffer_i[i] = ((ct[out[i]]&0x00f80000)>>8)|((ct[out[i]]&0x0000fc00)>>5)|
							((ct[out[i]]&0x000000f8)>>3);
					}
					memset(lcd_buffer, 0 ,WxH);
					w = (gif_info.w>>gif_dcb.resz_w) + (gif_info.w&1);
					h = (gif_info.h>>gif_dcb.resz_h) + (gif_info.h&1);							
					GIF_Display(lcd_buffer_i, w, h);					
					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);	
}

// unpack pack mode to the index mode
void GIF_UnPack(kal_uint8 *src, kal_uint8 *dst, kal_uint32 bit
	,kal_uint32 pixels)
{
	kal_uint32 i, j, index,pixel_per_byte, bytes;
	kal_uint8 *in,tmp;
	kal_uint8 *out;
	kal_uint8 pack_mask[] = {1,3,15};

	if(bit == 8) 
	{
		memcpy(dst, src, pixels );
		return;
	}	
	
	ASSERT(bit == 1 || bit == 2 || bit == 4 || bit == 8);
	in = src;
	out = dst;
	pixel_per_byte = 8/bit;
	bytes = pixels/pixel_per_byte + ((pixels%pixel_per_byte)!= 0);
	
	if(1)
	{
		for(i=0;i<bytes;i++)
		{
			tmp = in[i];
			for(j=0;j<pixel_per_byte;j++)
			{
				index = i*pixel_per_byte+j;
				if(index < pixels)
					out[index] = (tmp&pack_mask[bit>>1]);
				else
					break;
				tmp >>= bit;
			}				
		}
	}								
}
// pack mode
void test_case_8(void)
{
	gif_config_struct *p = &gif_config;
	gif_report_status_enum status;

	// 220_200_4.gif (Q,N,D)
	sprintf(file_name, "c:\\gif\\test113.gif"); // multi frame 	
	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_i;
	p->output_buffer_size = sizeof lcd_buffer_i;
	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->clip_enable = KAL_FALSE;	///@@@@@@@////
	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_TRUE;  ///@@@@@@@////
	// 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->out_format = GIF_OUT_INDEX; ///@@@@@@@////
	p->frame_number = 0;
	p->gif_cb = gif_callback;
	
	while(1)
	{		
		kal_uint32 i;
		kal_uint32 *ct, WxH, w, h;
		kal_uint8 *src, *dst;
		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)
				{
					WxH = gif_info.w*gif_info.h;
					// refer to the color table
					src = (kal_uint8*)lcd_buffer_i;
					dst = (kal_uint8*)lcd_buffer;
					GIF_UnPack(src , dst, gif_info.bpp,WxH);			
					if(gif_info.LCT_flag)
						ct = p->LCT_adrs;
					else
						ct = gif_cache[gif_cache_index].GCT;
					for(i=0;i<WxH;i++)
					{
						lcd_buffer_i[i] = ((ct[dst[i]]&0x00f80000)>>8)|((ct[dst[i]]&0x0000fc00)>>5)|
							((ct[dst[i]]&0x000000f8)>>3);
					}
					memset(lcd_buffer, 0 ,WxH);	
					if(gif_dcb.resz_w)
						w = (gif_info.w>>gif_dcb.resz_w) + (gif_info.w&1);
					else
						w = gif_info.w;
					if(gif_dcb.resz_h)
						h = (gif_info.h>>gif_dcb.resz_h) + (gif_info.h&1);
					else
						h = gif_info.h;				
					
					GIF_Display(lcd_buffer_i, w, h);
					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);	
}

/*
void test_case_8(void)
{
}
void test_case_8(void)
{
}
*/
void gif_unit_test_main(void)
{
	IRQMaskAll();
	IRQUnmask(IRQ_CTIRQ1_CODE);
	IRQUnmask(IRQ_GPT_CODE);
	IRQUnmask(IRQ_LCD_CODE);
	IRQUnmask(IRQ_MSDC_CODE);
	IRQUnmask(IRQ_DMA_CODE);
	IRQUnmask(IRQ_UART1_CODE);

	GIF_Events = kal_create_event_group("GIF Events");
	LCD_Init();
	SD_Initialize();
	gif_init();
	//DRVPDN_Disable(DRVPDN_CON3,DRVPDN_CON3_GIF,PDN_GIF);
	while(1)
	{

		test_case_1();
 		test_case_2(); 
 		test_case_3();
 		test_case_4();
 		test_case_5();
  		test_case_7();				
		test_case_8();
 		test_case_6();	
 		
/*
		test_case_8();
 		test_case_7();				
 		test_case_1();
 		test_case_2(); 	
 		test_case_3();
 		test_case_4();
 		test_case_5();
		// stress test
 		test_case_6();		
*/ 		
	}
}

#endif	// end of the test

#endif // USE_HW_GIF_DECODER_V2

⌨️ 快捷键说明

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