📄 gif_decoder_v2.c
字号:
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 + -