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