Files
2025-12-03 11:12:34 +08:00

157 lines
3.5 KiB
C

#ifndef _JPEG_DECODER_H_
#define _JPEG_DECODER_H_
#include "typedef.h"
#include "system/task.h"
#include "generic/rect.h"
extern u16 QT_TBL[0x80];
extern u16 STD_HUFFMAN_TBL[258];
#define QTAB_ADDR ((s16 *)(QT_TBL))
#define HTAB_DC0_ADDR ((u16 *)((u8*)STD_HUFFMAN_TBL)) // 0x30
#define HTAB_AC0_ADDR ((u16 *)((u8*)STD_HUFFMAN_TBL + 0x30)) // 0xd2
#define HTAB_DC1_ADDR ((u16 *)((u8*)STD_HUFFMAN_TBL + 0x30 + 0xd2)) // 0x30
#define HTAB_AC1_ADDR ((u16 *)((u8*)STD_HUFFMAN_TBL + 0x30 + 0xd2 + 0x30)) // 0xd2
#define JPG_SAMP_FMT_INVALID 0x0
#define JPG_SAMP_FMT_YUV444 0x1
#define JPG_SAMP_FMT_YUV422 0x2
#define JPG_SAMP_FMT_YUV420 0x3
#define jpg_be16_to_cpu(x) (((x)[0] << 8) | (x)[1])
#define SINGLE_BUFFER_MODE 0x0
#define DOUBLE_BUFFER_MODE 0x1
enum {
RGB888,
RGB565,
};
struct jpeg_yuv {
u8 *y;
u8 *u;
u8 *v;
};
struct jpeg_data {
u8 *buf;
u32 len;
};
struct jpeg_codec_handle {
JL_JPG_TypeDef *reg;
struct jpeg_decoder_fd *decoder_fd;
OS_SEM sem;
};
enum std_markers {
DQT = 0xDB,
SOF = 0xC0,
DHT = 0xC4,
SOI = 0xD8,
SOS = 0xDA,
RST = 0xD0,
RST7 = 0xD7,
EOI = 0xD9,
DRI = 0xDD,
APP0 = 0xE0,
};
struct decoder_info {
u16 x;
u16 y;
u16 x_mcu_num;
u16 y_mcu_num;
u16 x_mcu_cnt;
u16 y_mcu_cnt;
u8 mcu_h;
u8 samp_Y;
u8 htab_Y;
u8 htab_Cr;
u8 htab_Cb;
u8 qtab_Y;
u8 qtab_Cr;
u8 qtab_Cb;
u8 y_cnt;
};
typedef u8 *(*jpg_stream_input)(void *__fat_info, u32 *len, u32 offset_4k);
struct jpeg_decoder_fd {
void *parent;
struct decoder_info info;
struct jpeg_yuv yuv;
struct jpeg_yuv yuv0;
struct jpeg_yuv yuv1;
struct jpeg_data data;
u32 mcu_num;
u32 head_len;
u8 *stream;
//u8 *stream_end;
u8 *cur_stream;
u32 bits_cnt;
u32 cur_bits_cnt;
u8 yuv_type;
u8 last_rst_marker_seen;
u8 DRI_enable;
u8 next_rst;
u8 rst_flag;
u8 mcupnd_flag;
u32 next_rst_bits_cnt;
u32 restart_interval;
u32 rst_mcu_cnt;
u16 row_mcu_num;
u8 rgb_format;
u16 seg_idx;
u16 seg_num;
// u16 lcd_width;
// u16 lcd_height;
u16 need_dec_mcu_num;
u8 data_out_mode;
u8 buf_flag;
u8 *fb;
u8 *fb0;
u8 *fb1;
u8 *hbuf;
u8 fend;
u8 stop_flag;
u8 head_buf[512];
u8 fd_free_enable;
void *fat_info;
jpg_stream_input jpg_ginfo_cb;
u32 fb_size;
u8 *jpg_obuf;
struct rect cur_draw;
struct rect draw_rect;
struct rect jpeg_rect;
};
int jpeg_dec_init(void *fat_info, u8 lcd_format, jpg_stream_input jpg_ginfo_cb);
int jpeg_dec_start(struct rect *cur_draw, struct rect *draw_rect, struct rect *jpeg_rect, void *dec_out_buf);
struct jpeg_decoder_fd *jpeg_dec_get_fd();
void jpeg_dec_stop();
void jpeg_dec_uninit();
int jpeg_decoder_open(struct jpeg_decoder_fd *fd);
int _jpeg_parse_header(struct jpeg_decoder_fd *fd, u8 *buf, int len);
int jpeg_decode_area(struct jpeg_decoder_fd *decoder_fd);
int jpeg_decoder_start(void *_fd);
int jpeg_decoder_init(struct jpeg_decoder_fd *fd);
int decoder_bits_pnd_handler(struct jpeg_decoder_fd *fd);
int decoder_mcu_pnd_handler(struct jpeg_decoder_fd *fd);
int jpeg_decoder_manual_start(void *_fd);
int jpeg_decoder_close(void *fd);
int jpeg_codec_init(void);
extern u8 *jpg_ginfo(void *__fat_info, u32 *len, u32 offset_4k);
int ui_jpeg_decoder_init();
int ui_jpeg_decoder_uninit();
#endif