Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources

This commit is contained in:
2026-07-06 11:30:13 +08:00
commit e76462eeb7
3451 changed files with 1415300 additions and 0 deletions

View File

@@ -0,0 +1,132 @@
#include "app_lcd.h"
#include "basic_include.h"
#include "lib/multimedia/msi.h"
#include "lib/heap/av_heap.h"
#include "lib/heap/av_psram_heap.h"
// data申请空间函数
#define STREAM_MALLOC av_psram_malloc
#define STREAM_FREE av_psram_free
#define STREAM_ZALLOC av_psram_zalloc
// 结构体申请空间函数
#define STREAM_LIBC_MALLOC av_malloc
#define STREAM_LIBC_FREE av_free
#define STREAM_LIBC_ZALLOC av_zalloc
#define MAX_LVGL_OSD_TX 2
struct lvgl_osd_msi_s
{
struct msi *msi;
struct fbpool tx_pool;
};
static int lvgl_osd_msi_action(struct msi *msi, uint32 cmd_id, uint32 param1, uint32 param2)
{
int ret = RET_OK;
struct lvgl_osd_msi_s *lvgl_osd = (struct lvgl_osd_msi_s *)msi->priv;
switch (cmd_id)
{
// 暂时没有考虑释放
case MSI_CMD_POST_DESTROY:
{
struct framebuff *fb;
// 释放资源fb资源文件,priv是独立申请的
while (1)
{
fb = fbpool_get(&lvgl_osd->tx_pool, 0, NULL);
if (!fb)
{
break;
}
// 预分配空间释放
if (fb->priv)
{
STREAM_LIBC_FREE(fb->priv);
}
}
fbpool_destroy(&lvgl_osd->tx_pool);
STREAM_LIBC_FREE(lvgl_osd);
}
break;
// 接收,判断是类型是否可以支持压缩
case MSI_CMD_TRANS_FB:
{
}
break;
case MSI_CMD_FREE_FB:
{
struct framebuff *fb = (struct framebuff *)param1;
struct encode_data_s_callback *callback = (struct encode_data_s_callback *)fb->priv;
if (callback->finish_cb)
{
callback->finish_cb(callback->user_data);
}
if (callback->free_cb)
{
callback->free_cb(callback->user_data, fb->data);
}
// 这个data可能是lvgl那边的,暂时不需要释放
fb->data = NULL;
callback->finish_cb = NULL;
callback->free_cb = NULL;
callback->user_data = NULL;
// msi_get_fb(NULL,fb);
fbpool_put(&lvgl_osd->tx_pool, fb);
ret = RET_OK + 1;
}
break;
default:
break;
}
return ret;
}
struct framebuff *lvgl_osd_msi_get_fb(struct msi *msi)
{
struct lvgl_osd_msi_s *lvgl_osd = (struct lvgl_osd_msi_s *)msi->priv;
struct framebuff *fb = fbpool_get(&lvgl_osd->tx_pool, 0, lvgl_osd->msi);
if(fb)
{
fb->mtype = F_RGB;
fb->stype = LVGL_RGB;
}
return fb;
}
// 拷贝osd到内存,然后发送出去,使用workqueue去作为任务吧
struct msi *lvgl_osd_msi(const char *name)
{
struct msi *msi = msi_new(name, 0, NULL);
struct lvgl_osd_msi_s *lvgl_osd = (struct lvgl_osd_msi_s *)msi->priv;
if (!lvgl_osd)
{
lvgl_osd = (struct lvgl_osd_msi_s *)STREAM_LIBC_ZALLOC(sizeof(struct lvgl_osd_msi_s));
lvgl_osd->msi = msi;
fbpool_init(&lvgl_osd->tx_pool, MAX_LVGL_OSD_TX);
int init_count = 0;
void *priv;
// 初始化framebuffer节点数量空间?最后由workqueue去从ringbuf去获取一个节点
while (init_count < MAX_LVGL_OSD_TX)
{
priv = (void *)STREAM_LIBC_ZALLOC(sizeof(struct encode_data_s_callback));
FBPOOL_SET_INFO(&lvgl_osd->tx_pool, init_count, NULL, 0, priv);
init_count++;
}
msi->priv = (void *)lvgl_osd;
msi->action = lvgl_osd_msi_action;
msi->enable = 1;
msi_add_output(lvgl_osd->msi, NULL, R_OSD_ENCODE);
msi_add_output(lvgl_osd->msi, NULL, R_CSC_MSI);
}
return msi;
}