Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources
This commit is contained in:
132
sdk/app/app_lcd/lvgl_osd_msi.c
Normal file
132
sdk/app/app_lcd/lvgl_osd_msi.c
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user