Files
TAIXIN/sdk/app/ui/mp4_recorder_ui.c

259 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.

/***************************************************************************************
***************************************************************************************/
#include "lvgl/lvgl.h"
#include "lvgl_ui.h"
#include "keyWork.h"
#include "keyScan.h"
#include "lib/heap/av_heap.h"
#include "lib/heap/av_psram_heap.h"
#include "audio_msi/audio_adc.h"
#include "audio_media_ctrl/audio_code_ctrl.h"
#include "file_process.h"
#include "fs/fatfs/osal_file.h"
#include "file_process.h"
#define RECORDER_DIR "0:MP4"
struct msi *mp4_encode_msi2_init(const char *mp4_msi_name, uint8_t srcID, uint8_t filter_type, uint8_t rec_time, uint32_t audio_encode, struct file_process *file_process, uint8_t mode);
#define LVGL_MP4_MSI_NAME "lvgl_mp4"
#define LV_OBJ_MP4_RECORD_FLAG LV_OBJ_FLAG_USER_1
// 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
extern lv_indev_t *indev_keypad;
extern lv_style_t g_style;
struct mp4_record_ui_s
{
lv_group_t *last_group;
lv_obj_t *base_ui;
uint16_t w, h;
lv_group_t *now_group;
lv_obj_t *now_ui;
lv_timer_t *timer;
lv_obj_t *label_time;
struct msi *s;
struct msi *h264_msi;
struct msi *mp4_msi;
struct msi *aac_msi;
uint8_t *play_name;
uint8_t start : 1, rev : 7;
};
static uint32_t self_key(uint32_t val)
{
uint32_t key_ret = 0;
if (val > 0)
{
if ((val & 0xff) == KEY_EVENT_SUP)
{
switch (val >> 8)
{
case AD_UP:
key_ret = 'q';
break;
case AD_DOWN:
key_ret = 'e';
break;
case AD_LEFT:
key_ret = 'a';
break;
case AD_RIGHT:
key_ret = 'd';
break;
case AD_PRESS:
key_ret = LV_KEY_ENTER;
break;
default:
break;
}
}
}
return key_ret;
}
static void *lvgl_mp4_file(struct file_process *file_process, char *filename, char *file_path, uint32_t file_size)
{
os_sprintf(filename, "%s/%016d.mp4", file_process->rec_path, (uint32_t) os_jiffies());
void *fp = osal_fopen_auto((const char *) filename, "w+", 0);
return fp;
}
static void start_mp4_record_ui(lv_event_t *e)
{
int32_t c = *((int32_t *) lv_event_get_param(e));
struct mp4_record_ui_s *ui_s = (struct mp4_record_ui_s *) lv_event_get_user_data(e);
if (c == LV_KEY_ENTER)
{
if (!lv_obj_has_flag(ui_s->now_ui, LV_OBJ_MP4_RECORD_FLAG))
{
os_printf("%s:%d\n", __FUNCTION__, __LINE__);
ui_s->h264_msi = msi_find(AUTO_H264, 1);
if (ui_s->h264_msi)
{
lv_obj_add_flag(ui_s->now_ui, LV_OBJ_MP4_RECORD_FLAG);
struct file_process mp4_file_process = {
.loop = NULL,
.rec_path = RECORDER_DIR,
.ext_name = ".MP4",
.create_file = lvgl_mp4_file,
.loop_free = NULL,
.lock_file = NULL,
};
uint8_t audio_flag = 0;
AUENC_INIT auenc_init;
auenc_init.destroy_self = 0;
auenc_init.src_msi = get_auadc_msi(AUSYS_AUAD);
ui_s->aac_msi = audio_encode_init(AAC_ENC, audio_adc_get_samplerate(AUSYS_AUAD), &auenc_init);
if (ui_s->aac_msi)
{
audio_code_add_output(ui_s->aac_msi, LVGL_MP4_MSI_NAME);
audio_flag = 1;
}
ui_s->mp4_msi = mp4_encode_msi2_init(LVGL_MP4_MSI_NAME, FRAMEBUFF_SOURCE_CAMERA0, FSTYPE_H264_VPP_DATA0, 1, audio_flag, &mp4_file_process, 0);
if (ui_s->mp4_msi)
{
msi_do_cmd(ui_s->mp4_msi, MSI_CMD_MEDIA_CTRL, MSI_MEDIA_CTRL_RECORD_START, 0);
msi_add_output(ui_s->h264_msi, NULL, LVGL_MP4_MSI_NAME);
}
else
{
if (ui_s->aac_msi)
{
audio_code_del_output(ui_s->aac_msi, LVGL_MP4_MSI_NAME);
audio_encode_deinit(ui_s->aac_msi);
ui_s->aac_msi = NULL;
}
if (ui_s->h264_msi)
{
msi_del_output(ui_s->h264_msi, NULL, LVGL_MP4_MSI_NAME);
msi_put(ui_s->h264_msi);
ui_s->h264_msi = NULL;
}
}
}
}
else
{
if (ui_s->mp4_msi)
{
msi_destroy(ui_s->mp4_msi);
ui_s->mp4_msi = NULL;
}
if (ui_s->aac_msi)
{
audio_code_del_output(ui_s->aac_msi, LVGL_MP4_MSI_NAME);
audio_encode_deinit(ui_s->aac_msi);
ui_s->aac_msi = NULL;
}
if (ui_s->h264_msi)
{
msi_del_output(ui_s->h264_msi, NULL, LVGL_MP4_MSI_NAME);
msi_put(ui_s->h264_msi);
ui_s->h264_msi = NULL;
}
lv_obj_clear_flag(ui_s->now_ui, LV_OBJ_MP4_RECORD_FLAG);
}
}
}
static void exit_mp4_record_ui(lv_event_t *e)
{
int32_t c = *((int32_t *) lv_event_get_param(e));
if (c == 'q')
{
struct mp4_record_ui_s *ui_s = (struct mp4_record_ui_s *) lv_event_get_user_data(e);
lv_indev_set_group(indev_keypad, ui_s->last_group);
lv_obj_clear_flag(ui_s->base_ui, LV_OBJ_FLAG_HIDDEN);
lv_group_del(ui_s->now_group);
ui_s->now_group = NULL;
if(ui_s->s)
{
msi_do_cmd(ui_s->s, MSI_CMD_SCALE3_NORMAL, MSI_SCALE3_START, 0);
}
msi_destroy(ui_s->s);
// 关闭VIDEO P0的使能释放占住的scale3的fb
msi_cmd(R_VIDEO_P0, MSI_CMD_LCD_VIDEO, MSI_VIDEO_ENABLE, 0);
if (ui_s->mp4_msi)
{
msi_destroy(ui_s->mp4_msi);
ui_s->mp4_msi = NULL;
}
if (ui_s->aac_msi)
{
audio_code_del_output(ui_s->aac_msi, LVGL_MP4_MSI_NAME);
audio_encode_deinit(ui_s->aac_msi);
ui_s->aac_msi = NULL;
}
if (ui_s->h264_msi)
{
msi_del_output(ui_s->h264_msi, NULL, LVGL_MP4_MSI_NAME);
msi_put(ui_s->h264_msi);
ui_s->h264_msi = NULL;
}
lv_obj_del(ui_s->now_ui);
set_lvgl_get_key_func(NULL);
}
}
static void enter_mp4_record_ui(lv_event_t *e)
{
set_lvgl_get_key_func(self_key);
struct mp4_record_ui_s *ui_s = (struct mp4_record_ui_s *) lv_event_get_user_data(e);
lv_obj_add_flag(ui_s->base_ui, LV_OBJ_FLAG_HIDDEN);
lv_obj_t *ui = lv_obj_create(lv_scr_act());
ui_s->now_ui = ui;
lv_obj_add_style(ui, &g_style, 0);
lv_obj_set_size(ui, LV_PCT(100), LV_PCT(100));
// 绑定流到Video_P0显示
ui_s->s = scale3_normal_msi2(S_PREVIEW_SCALE3, FSTYPE_YUV_P0, ui_s->w, ui_s->h);
if (ui_s->s)
{
msi_do_cmd(ui_s->s, MSI_CMD_SCALE3_NORMAL, MSI_SCALE3_START, 0x01);
msi_add_output(ui_s->s, NULL, R_VIDEO_P0);
msi_cmd(R_VIDEO_P0, MSI_CMD_LCD_VIDEO, MSI_VIDEO_ENABLE, 1);
ui_s->s->enable = 1;
}
lv_group_t *group;
group = lv_group_create();
lv_indev_set_group(indev_keypad, group);
lv_group_add_obj(group, ui);
ui_s->now_group = group;
lv_obj_add_event_cb(ui, start_mp4_record_ui, LV_EVENT_KEY, ui_s);
lv_obj_add_event_cb(ui, exit_mp4_record_ui, LV_EVENT_KEY, ui_s);
}
lv_obj_t *mp4_record_ui(lv_group_t *group, lv_obj_t *base_ui, uint16_t w, uint16_t h)
{
struct mp4_record_ui_s *ui_s = (struct mp4_record_ui_s *) STREAM_LIBC_ZALLOC(sizeof(struct mp4_record_ui_s));
ui_s->last_group = group;
ui_s->base_ui = base_ui;
ui_s->w = w;
ui_s->h = h;
lv_obj_t *btn = lv_list_add_btn(base_ui, NULL, "mp4_record_ui");
lv_group_add_obj(group, btn);
lv_obj_add_event_cb(btn, enter_mp4_record_ui, LV_EVENT_SHORT_CLICKED, ui_s);
return btn;
}