Files
OpenTXW81X/sdk/app/decode/read_jpg_file_demo.c
T
2025-08-27 09:51:58 +01:00

176 lines
4.3 KiB
C

#include "sys_config.h"
#include "typesdef.h"
#include "dev.h"
#include "devid.h"
#include "stream_frame.h"
#include "utlist.h"
#include "osal/task.h"
#include "jpg_decode_stream.h"
#include "osal/string.h"
#include "osal_file.h"
#include "custom_mem/custom_mem.h"
void read_file_thread(void*d)
{
os_printf("%s:%d\n",__FUNCTION__,__LINE__);
stream *s = (stream *)d;
//struct data_structure *data;
void *fp = osal_fopen("0:0.jpg","rb");
uint32_t filesize = 0;
uint8_t *tmp = (uint8_t*)os_malloc(4096);
uint8_t *sd_buf = NULL;
uint32_t offset = 0;
uint32_t readlen;
if(fp)
{
filesize = osal_fsize(fp);
}
os_printf("%s:%d\ttmp:%X\n",__FUNCTION__,__LINE__,tmp);
if(filesize)
{
sd_buf = (uint8_t*)custom_malloc_psram(filesize);
if(sd_buf)
{
while(filesize)
{
if(filesize < 4096)
{
readlen = osal_fread(tmp,filesize,1,fp);
}
else
{
readlen = osal_fread(tmp,4096,1,fp);
}
if(readlen)
{
hw_memcpy(sd_buf+offset,tmp,readlen);
}
offset += readlen;
filesize -= readlen;
}
}
}
while(1)
{
struct data_structure *data = get_src_data_f(s);
if(data)
{
os_printf("data:%X\n",data);
if(sd_buf)
{
data->data = (void*)custom_malloc_psram(offset);
if(data->data)
{
//配置显示的参数
struct jpg_decode_arg_s *msg = data->priv;
msg->yuv_arg.out_w = 320;
msg->yuv_arg.out_h = 240;
msg->rotate = 0;
msg->decode_w = 640;
msg->decode_h = 480;
msg->step_w = 320;
msg->step_h = 240;
hw_memcpy(data->data,sd_buf,offset);
set_stream_real_data_len(data,offset);
os_printf("%s:%d\n",__FUNCTION__,__LINE__);
data->type = SET_DATA_TYPE(JPEG,JPEG_FILE);
int success = send_data_to_stream(data);
os_printf("success:%d\n",success);
data = NULL;
}
else
{
force_del_data(data);
}
}
else
{
force_del_data(data);
}
}
os_sleep_ms(1000);
}
}
static int opcode_func(stream *s,void *priv,int opcode)
{
int res = 0;
switch(opcode)
{
case STREAM_OPEN_ENTER:
break;
case STREAM_OPEN_EXIT:
{
s->priv = priv;
stream_data_dis_mem_custom(s);
streamSrc_bind_streamDest(s,S_JPG_DECODE);
enable_stream(s,1);
//创建一个线程
os_task_create("aaa", read_file_thread, s, OS_TASK_PRIORITY_NORMAL, 0, NULL, 1024);
}
break;
case STREAM_OPEN_FAIL:
break;
case STREAM_DATA_DIS:
{
struct data_structure *data = (struct data_structure *)priv;
data->priv = (void *)custom_zalloc(sizeof(struct jpg_decode_arg_s));
data->data = NULL;
}
break;
case STREAM_DATA_FREE:
{
struct data_structure *data = (struct data_structure *)priv;
os_printf("%s:%d\tdata:%X\n",__FUNCTION__,__LINE__,data);
if(data->data)
{
custom_free_psram(data->data);
data->data = NULL;
}
}
break;
case STREAM_FILTER_DATA:
{
}
break;
case STREAM_DATA_FREE_END:
break;
//数据发送完成,可以选择唤醒对应的任务
case STREAM_SEND_DATA_FINISH:
break;
case STREAM_SEND_DATA_START:
{
}
break;
case STREAM_DATA_DESTORY:
{
struct data_structure *data = (struct data_structure *)priv;
if(data->priv)
{
custom_free(data->priv);
}
}
break;
default:
//默认都返回成功
break;
}
return res;
}
void *read_jpg_file_stream()
{
os_printf("%s:%d\n",__FUNCTION__,__LINE__);
stream *s = open_stream_available("read_jpg", 3, 0, opcode_func,NULL);
os_printf("%s:%d\n",__FUNCTION__,__LINE__);
return s;
}