doubao_chat/include_lib/driver/cpu/wl82/asm/jpeg_decoder.h

143 lines
4.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*****************************************************************
>file name : lib/system/cpu/dv16/video-dev/jpeg/jpeg_decoder.h
>author : lichao
>create time : Thu 08 Jun 2017 04:12:49 PM HKT
*****************************************************************/
#ifndef _JPEG_DECODER_H_
#define _JPEG_DECODER_H_
#include "typedef.h"
#include "spinlock.h"
#include "jpeg_codec.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
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 {
u8 *data_out;
u32 cur_pos;
u16 x_pos;
u16 y_pos;
u16 x;
u16 y;
u16 old_x;
u16 old_y;
u16 old_x_mcu_num;
u16 old_y_mcu_num;
u16 x_mcu_num;
u16 y_mcu_num;
u16 x_mcu_cnt;
u16 y_mcu_cnt;
u8 samp_Y;
u8 htab_Y;
u8 htab_Cr;
u8 htab_Cb;
u8 qtab_Y;
u8 qtab_Cr;
u8 qtab_Cb;
u8 y_cnt;
};
struct jpeg_decoder_fd {
void *parent;
struct decoder_info info;
struct jpeg_yuv yuv[2];
u32 static_yuv_size;
u8 *static_yuv_addr;
u32 mcu_num;
u32 mcu_len;
u32 head_len;
u8 *stream;
u8 *stream_alige4byte;
u8 *stream_begin;
u8 *stream_end;
u32 bits_cnt;
spinlock_t lock;
volatile u8 active;
u8 bits_mode;
u8 dec_query_mode;
u8 mode;
u8 old_mode;
u8 state;
u8 yuv_type;
u8 obuf_index;
u8 manual_en;//control
u8 frame_end;
u8 last_rst_marker_seen;
u8 DRI_enable;
u8 next_rst;
u32 next_rst_bits_cnt;
u32 restart_interval;
u32 rst_mcu_cnt;
u32 frame_num;
void *priv;
int (*decoder_yuv_out)(void *priv, void *arg);
int (*reset_output)(void *priv);
u8 *fb;
int cb_ylen;
int cb_ulen;
int cb_vlen;
struct list_head entry;
void *event_priv;
int (*event_handler)(void *priv, enum jpg_dec_event event, void *arg);
OS_SEM sem_bits;
};
int jpeg_decoder_init(struct jpeg_decoder_fd *fd, void *arg);
int jpeg_decoder_reset_param(struct jpeg_decoder_fd *fd, void *arg);
int jpeg_decoder_close(void *_fd);
int jpeg_decoder_reset(void *_fd, void *arg);
int jpeg_parse_header(void *_fd, void *info, u8 *buf, int len);
int jpeg_decoder_start(void *_fd, u8 *jframe, u32 len, u8 manual_en);
int jpeg_decoder_manual_start(void *_fd);
int jpeg_decoder_release(void *_fd);
int jpeg_decoder_change_omode(void *_fd, u8 *obuf, u8 omode);
int jpeg_decoder_set_yuv(void *_fd, void *yuv_addr, u32 len);
int decoder_bits_irq_handler(struct jpeg_decoder_fd *fd);
int decoder_mcu_irq_handler(struct jpeg_decoder_fd *fd);
int jpeg_decoder_input_data(void *_fd, void *data, int len);
int jpeg_decoder_set_event_handler(void *_fd, void *priv,
int (*handler)(void *, enum jpg_dec_event, void *));
//subdevice_djpeg.c API
void *jpg_dec_open(struct video_format *f);
int jpg_dec_get_s_attr(void *_fh, struct jpg_dec_s_attr *attr);
int jpg_dec_set_yuv(void *_fh, void *yuv, u32 len);//yuv420/422图片的yuv长度:(w*16*3/2+64)*2以上,yuv422/444图片的yuv长度:(w*8*3/2+64)*2以上
int jpg_dec_set_s_attr(void *_fh, struct jpg_dec_s_attr *attr);
int jpg_dec_set_scaler_handler(void *_fh, void *priv,
int (*handler)(void *, struct image_scale_data *));
int jpg_dec_set_output_handler(void *_fh, void *priv,
int (*handler)(void *, struct YUV_frame_data *));
int jpg_dec_set_event_handler(void *_fh, void *priv,
int (*handler)(void *, enum jpg_dec_event, struct jpg_dec_mem *));
int jpg_dec_start(void *_fh);
int jpg_dec_stop(void *_fh);
int jpg_dec_input_data(void *_fh, void *data, u32 len);
int jpg_dec_close(void *_fh);
#endif