Files
AC707N/SDK/apps/watch/video/avi_video.h
T
2025-12-15 14:39:25 +08:00

351 lines
8.4 KiB
C
Raw 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.
#ifndef __AVI_VIDEO_
#define __AVI_VIDEO_
#include "app_config.h"
#include "cpu.h"
#include "fs/fs.h"
#include "app_config.h"
#include "board_config.h"
#include "generic/circular_buf.h"
#include "app_config.h"
#include "asm/audio_adc.h"
#include "generic/circular_buf.h"
#include "media/audio_decoder.h"
#include "media/mixer.h"
#include "generic/log.h"
#include "app_config.h"
#include "system/timer.h"
#include "device/device.h"
#include "key_event_deal.h"
#include "res/resfile.h"
#include "jlui/ui.h"
#include "jlui_app/ui_style.h"
#include "jlui_app/ui_api.h"
#include "jlui_app/res_config.h"
#include "jlui_app/ui_resource.h"
#include "jlui_app/ui_sys_param.h"
#include "timer.h" // 定时器
#include "ui/lcd/lcd_drive.h" // lcd 驱动
#include "res_config.h" // res 文件管理
#include <math.h>
#include "ascii.h"
#include "res/font_ascii.h"
#include "res/mem_var.h"
#include "res/zz.h"
#include "res/jpeg_decoder.h"
#include "dev_manager.h"
#include "fs/fs.h"
#include "watch_syscfg_manage.h"
#include "ui_core.h"
#include "control.h"
#include "dbi.h" // 推屏模块
#include "jlgpu_math.h" // matrix
#include "jlgpu_driver.h" // gpu 驱动
#include "gpu_port.h" // GPU 接口,依赖于 jlgpu_driver.h
#include "gpu_task.h"
#include "ui_resource.h" // ui资源管理
#include "jlui_effect/jlui_effect.h" //特效相关
#include "ui_expand/buffer_manager.h" // buffer管理
#include "ui_expand/ui_expand.h" // 部分宏定义
#include "font/font_all.h"
#include "font/font_textout.h"
#include "ui_draw/ui_circle.h"
#include "ui_animation.h"
#include "font/language_list.h"
#include "ui_measure.h"
#include "jljpeg_decode.h"
#include "gpu_draw.h"
#include "ui_page_switch.h"
#include "ui_draw/ui_basic.h"
#include "ui_text.h"
#include "jlui_app/ui_style.h"
#include "res/resfile.h"
#include "media/includes.h"
#include "audio_config.h"
#include "gpio.h"
typedef void (*ChunkCallback)(FILE *file,
off_t chunk_offset,
const char *chunk_id,
uint32_t chunk_size,
const char *list_name,
const char **hierarchy,
int level,
int *jump,
void *user_param);
#pragma pack(push, 1)
enum avi_status {
AVI_PLAY_STATUS = 1,
AVI_STOP_STATUS,
};
enum {
MIC2DAC_STATUS_STOP = 0,
MIC2DAC_STATUS_START,
MIC2DAC_STATUS_PAUSE, // 暂时未添加这个状态
};
enum {
AVI_PLAY_ONCE = 0,
AVI_PLAY_LOOP,
AVI_PLAY_SEQUENCE,
};
typedef struct {
uint32_t dwMicroSecPerFrame; // 每帧时长(微秒)
uint32_t dwMaxBytesPerSec; // 最大字节/秒(数据传输率)
uint32_t dwPaddingGranularity;// 数据填充粒度(单位字节)
uint32_t dwFlags; // 全局标志(如索引存在性)
uint32_t dwTotalFrames; // 总帧数
uint32_t dwInitialFrames; // 初始帧数(用于交错格式)
uint32_t dwStreams; // 流数量(如视频、音频)
uint32_t dwSuggestedBufferSize; // 建议缓冲区大小
uint32_t dwWidth; // 视频宽度(像素)
uint32_t dwHeight; // 视频高度(像素)
uint32_t dwReserved[4]; // 保留字段(必须为0
} AVIH_Header;
// 流头结构(strh
typedef struct {
char fccType[4]; // 流类型 'vids'或'auds'
char fccHandler[4]; // 编码类型
uint32_t dwFlags; // 标志位
uint16_t wPriority; // 优先级
uint16_t wLanguage; // 语言
uint32_t dwInitialFrames; // 初始帧数
uint32_t dwScale; // 时间刻度
uint32_t dwRate; // 每秒采样数
uint32_t dwStart; // 开始时间
uint32_t dwLength; // 流长度
uint32_t dwSuggestedBufferSize;
uint32_t dwQuality;
uint32_t dwSampleSize; // 样本大小
} StreamHeader;
// 视频格式结构(strf
typedef struct {
uint32_t biSize; // 结构体大小
uint32_t biWidth; // 视频宽度
uint32_t biHeight; // 视频高度
uint16_t biPlanes; // 颜色平面数
uint16_t biBitCount; // 每像素位数
uint32_t biCompression; // 压缩类型
uint32_t biSizeImage; // 图像数据大小
} VideoFormat;
// 音频格式结构(strf
typedef struct {
uint16_t wFormatTag; // 格式类型
uint16_t nChannels; // 声道数
uint32_t nSamplesPerSec; // 采样率
uint32_t nAvgBytesPerSec; // 平均字节率
uint16_t nBlockAlign; // 块对齐
uint16_t wBitsPerSample; // 位深
} AudioFormat;
typedef struct {
u32 time; // jpeg 最新更新时间
jdec_opj *opj; // jpeg 句柄
int pos; // 相对文件位置
int len; // 单个JPEG长度
u8 *data;
} mjpegdata;
typedef struct {
int block_len; // 最大的jpeg 长度
int cnt; // 缓存数量
int act_idx; // 当前正在忙的缓存
int pre_idx;
mjpegdata *m;
u8 *data; //所有jpeg+信息数据
} cachebuf;
#pragma pack(pop) // 恢复内存对齐
typedef enum {
STREAM_NULL,
STREAM_VIDEO,
STREAM_AUDIO
} StreamType;
typedef enum {
AVI_READ_CHUNK_ID_FAIL = 1,
AVI_READ_CHUNK_SIZE_FAIL,
AVI_READ_SUB_CHUNK_ID_FAIL,
AVI_READ_SUB_CHUNK_SIZE_FAIL,
AVI_LIST_TYPE_ERR,
AVI_FILE_LEN_ERR,
AVI_SUB_CHUNK_LEN_ERR
} AVI_ERR_CODE;
typedef struct {
// 文件信息
FILE *file;
int movi_data_start; // movi列表区起始位置(movi字符前)
size_t movi_data_len; //(包括movi字符)
int idx1_offset; // idx1块起始偏移
size_t idx1_size; // idx1块数据大小
AVIH_Header avih_header;
// 流头状态机
StreamType stream_type;
StreamHeader video_stream_header;
VideoFormat video_format;
StreamHeader audio_stream_header;
AudioFormat audio_format;
// 视频信息
int width;
int height;
int frame_rate;
uint32_t total_frames;
uint64_t total_duration;
// 音频信息
int sample_rate;
int channels;
int bits_per_sample;
u8 auds_vol;
u8 auds_drop;
u8 auds_exit;
int auds_idx;
u16 auds_inr;
int auds_rate;
int auds_total;
char *auds_frame;
cbuffer_t auds_cbuf;
// 播放状态
int current_pos;
int is_playing;
int lv_pos;
int lv_size;
cachebuf cache;
int timerid;
int redrawid;
u8 ui_work;
unsigned long jump_mjpeg;
// MyReadHandle frhandle; // fread缓冲
int now_offset; // 在文件的偏移
int now_len; // 块长度
struct flash_file_info *view_file_info;
OS_MUTEX mutex;
struct audio_dac_hdl ad;
uint8_t buf_ok;
} AVIPlayer;
void *avi_open(const char *path, int en_buf, int redrawid);
void avi_close(void *avip);
int avi_fluh(void *priv);
typedef struct {
u8 is_dial;
u8 is_audio_mute;
u8 mode;
char fname[64];
} AVI_PARAM;
typedef struct {
void *fp;
OS_SEM mv_sem;
void *st; // 解码器
int drawid;
int act; // -1: 销毁 0:关闭解码器 1:活跃
u8 pause;
u8 repeat;
u8 type;
u8 avi_audio_start;
u8 avi_play_mode;
u8 avi_is_switching;
u8 avi_index;
u16 avi_playtimer;
AVI_PARAM param;
int start;
int time;
int frameCount;
int flushTimer;
int avi_now_idx;
u8 *avi_pcm_buf;
long file_offset;
} MV_DRAW;
typedef struct {
u8 **file_path;
u8 *cur_index;
} PLAY_VIDEO_PATH_MANAGE;
void __jpeg_draw_cb_gpu(int id, u8 *dst_buf, struct rect *dst_r, struct rect *src_r, u8 bytes_per_pixel, void *priv, void *matrix);
void avi_pcm_open(void *avip);
void avi_pcm_close(void *avip) ;
// 0918新增内容
const char *set_avi_play_file(void);
void avi_play_next(void);
void avi_play_prev(void);
void avi_play_shutdown(void);
void set_avi_play_mode(u8 mode);
int avi_get_width(void *avip);
int avi_get_height(void *avip);
void *avi_get_fp(void *avip);
int avi_get_now_len(void *avip);
int avi_get_now_offset(void *avip);
int avi_get_mjpegbuflen(void *avip);
int avi_get_redrawid(void *avip);
float avi_get_total_sec(void *avip);
void *avi_get_view_file_info(void *priv);
// void *animig_open(char *name, int window_id, int arg);
void *animig_open(char *name, AVI_PARAM param, int arg);
void avi_set_avi_playtimer_id(u16 timer_id);
u16 avi_get_avi_playtimer_id();
void *get_aviplay_handle();
void *get_avi_player_st_handle();
#define AVI_WINDOW PAGE_77
#define AVI_LAYOUT AVI_DEMO_LAYOUT
#endif