Files
TAIXIN/sdk/app/takephoto_module/takephoto_module_over_dpi.c

217 lines
9.1 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.

/************************************************************************
* 这个是拍照以及缩略图模块的初始化demo
* 会涉及其他的msi调用
***********************************************************************/
#include "basic_include.h"
#include "lib/multimedia/msi.h"
#include "stream_define.h"
#include "osal/string.h"
#include "dev/vpp/hgvpp.h"
#include "lib/video/dvp/jpeg/jpg.h"
#include "lib/video/vpp/vpp_dev.h"
#include "dev/scale/hgscale.h"
#include "jpg_concat_msi.h"
#include "lib/heap/av_heap.h"
#include "lib/heap/av_psram_heap.h"
#include "lib/scale/scale_dev.h"
#include "gen420_hardware_msi.h"
#include "hal/jpeg.h"
#include "video_msi.h"
#include "scale_msi/scale3_normal_msi.h"
struct msi *scale3_msi_pic_thumb(const char *name, uint8_t only, uint32_t normal_magic, uint32_t thumb_magic);
extern struct msi *jpg_decode_msi(const char *name);
extern struct msi *jpg_decode_msg_msi(const char *name, uint16_t out_w, uint16_t out_h, uint16_t step_w, uint16_t step_h, uint32_t filter);
extern struct msi *jpg_thumb_msi_init(const char *msi_name, uint16_t filter, uint8_t thumb_stype);
void scale_from_soft_to_jpg(struct scale_device *scale_dev, uint32 yuvbuf_addr, uint32 s_w, uint32 s_h, uint32 d_w, uint32 d_h);
// 过滤类型,因为缩略图的stype一定大于FSYPTE_INVALID
static uint8_t filter(void *f, uint8_t recv_type)
{
struct framebuff *fb = (struct framebuff *) f;
uint8_t res = 1;
if ((fb->mtype == F_JPG || fb->mtype == F_JPG_NODE) && fb->stype == recv_type)
{
res = 0;
}
return res;
}
/****************************************************************************************************************************
* 缩略图生成绑定
* thumb_msi_name->R_THUMB_DECODE_MSG->S_JPG_DECODE->R_GEN420_THUMB_JPG(接收yuv数据,通过gen420去编码,生成图片)
* ^ |
* | |(将jpg图片传递会给thumb_msi_name去保存)
* | V
* ----------------------------------------------------------
*
* R_GEN420_THUMB_JPG:既做接收也做发送,先接收yuv,kick gen420去编码,然后接收生成的jpg的图片,将jpg图片转发给thumb_msi_name去保存
***************************************************************************************************************************/
// 拍照大分辨率的的缩略图初始化
struct msi *gen_over_dpi_thumb_init(const char *thumb_msi_name, uint32_t *magic, uint8_t jpg_num)
{
uint32_t thumb_magic = 0;
struct msi *gen420_jpg_msi;
gen420_jpg_msi = gen420_jpg_msi_init(R_GEN420_THUMB_JPG_OVER_DPI, jpg_num, FSTYPE_OVER_DPI_THUMB_JPG, JPG_LOCK_GEN420_THUBM_ENCODE_OVER_DPI, GEN420_QUEUE_THUMB_JPEG_OVER_DPI, NULL, filter);
do
{
thumb_magic ^= os_jiffies();
thumb_magic ^= (uint32_t) gen420_jpg_msi;
} while (!thumb_magic);
struct msi *thumb_msi = thumb_over_dpi_msi_init(thumb_msi_name, 0, FSTYPE_OVER_DPI_THUMB_JPG, thumb_magic);
if (gen420_jpg_msi && thumb_msi)
{
msi_do_cmd(gen420_jpg_msi, MSI_CMD_JPG_RECODE, MSI_JPG_RECODE_MAGIC, thumb_magic);
// gen420编码完成后,需要将mjpg给到thumb_msi去保存(通过类型判断)
msi_add_output(gen420_jpg_msi, NULL, thumb_msi->name);
// thumb_over_dpi将yuv给到gen420去编码(通过类型判断)
msi_add_output(thumb_msi, NULL, gen420_jpg_msi->name);
// 将缩略图给到写卡线程
msi_add_output(thumb_msi, NULL, R_FILE_MSI);
}
if (magic)
{
*magic = thumb_magic;
}
return thumb_msi;
}
// 拍照大分辨率的图片初始化
struct msi *gen_over_dpi_init(const char *thumb_msi_name, uint32_t *magic, uint8_t jpg_num)
{
// normal_magic与thumb_magic正常不能一样,这里没有专门去判断
uint32_t normal_magic = 0;
struct msi *scale1_jpg_msi = scale1_jpg_msi_init(R_SCALE1_JPG_RECODE, jpg_num, FSTYPE_OVER_DPI_JPG, JPG_LOCK_SCALE1_ENCODE, 0, filter, 0);
do
{
normal_magic ^= os_jiffies();
normal_magic ^= (uint32_t) scale1_jpg_msi;
} while (!normal_magic);
struct msi *normal_jpg_msi = thumb_over_dpi_msi_init(SR_OVER_DPI_JPG, 1, FSTYPE_OVER_DPI_JPG, normal_magic);
if (scale1_jpg_msi && normal_jpg_msi)
{
msi_do_cmd(scale1_jpg_msi, MSI_CMD_JPG_RECODE, MSI_JPG_RECODE_MAGIC, normal_magic);
// gen420编码完成后,需要将mjpg给到thumb_msi去保存(通过类型判断)
msi_add_output(scale1_jpg_msi, NULL, normal_jpg_msi->name);
// thumb_over_dpi将yuv给到gen420去编码(通过类型判断)
msi_add_output(normal_jpg_msi, NULL, scale1_jpg_msi->name);
// 将缩略图给到写卡线程
msi_add_output(normal_jpg_msi, NULL, R_FILE_MSI);
}
if (magic)
{
*magic = normal_magic;
}
return normal_jpg_msi;
}
void gen_thumb_normal_yuv(struct msi *normal_jpg_msi, struct msi *thumb_msi, uint32_t normal_magic, uint32_t thumb_magic)
{
struct msi *scale3_msi = scale3_msi_pic_thumb(S_SCALE3_OVER_DPI, 0, normal_magic, thumb_magic);
if (scale3_msi)
{
if (normal_jpg_msi)
{
msi_add_output(scale3_msi, NULL, normal_jpg_msi->name);
}
if (thumb_msi)
{
msi_add_output(scale3_msi, NULL, thumb_msi->name);
}
}
}
// 只能调用一次,因为内部很多msi的名称都是固定的,如果需要复用,需要将内部实现调整
void takephoto_with_thumb_over_dpi_init(const char *thumb_msi_name, uint8_t jpg_num)
{
uint32_t thumb_magic = 0, normal_magic = 0;
struct msi *thumb_msi = NULL;
struct msi *normal_jpg_msi = NULL;
// 缩略图
thumb_msi = gen_over_dpi_thumb_init(thumb_msi_name, &thumb_magic, jpg_num);
// 大分辨照片
normal_jpg_msi = gen_over_dpi_init(thumb_msi_name, &normal_magic, jpg_num);
// 生成对应照片与缩略图的yuv
gen_thumb_normal_yuv(normal_jpg_msi, thumb_msi, normal_magic, thumb_magic);
}
/********************************************************************************************
* 以下接口是专门做给拇指相机,接口定义暂时这样:(仅仅考虑单镜头)
* common_takephoto_over_dpi_init:初始化scale1相关,注意,这个是专门在带屏的时候使用
* common_takephoto_api:启动拍照使用,需要scale3_normal_msi2,参考takephoto_ui.c
*******************************************************************************************/
#define NORMAL_MAGIC 0x123456
#define THUMB_MAGIC 0x654321
void common_takephoto_over_dpi_init(uint8_t jpg_num)
{
struct msi *scale1_jpg_msi = scale1_jpg_msi_init(R_SCALE1_JPG_RECODE, jpg_num, FSTYPE_OVER_DPI_JPG, JPG_LOCK_SCALE1_ENCODE, 0, filter, 0);
struct msi *normal_jpg_msi = thumb_over_dpi_msi_init(SR_OVER_DPI_JPG, 1, FSTYPE_OVER_DPI_JPG, NORMAL_MAGIC);
if (scale1_jpg_msi && normal_jpg_msi)
{
msi_do_cmd(scale1_jpg_msi, MSI_CMD_JPG_RECODE, MSI_JPG_RECODE_MAGIC, NORMAL_MAGIC);
// gen420编码完成后,需要将mjpg给到thumb_msi去保存(通过类型判断)
msi_add_output(scale1_jpg_msi, NULL, normal_jpg_msi->name);
// thumb_over_dpi将yuv给到gen420去编码(通过类型判断)
msi_add_output(normal_jpg_msi, NULL, scale1_jpg_msi->name);
// 将缩略图给到写卡线程
msi_add_output(normal_jpg_msi, NULL, R_FILE_MSI);
}
struct msi *gen420_jpg_msi =
gen420_jpg_msi_init(R_GEN420_THUMB_JPG_OVER_DPI, jpg_num, FSTYPE_OVER_DPI_THUMB_JPG, JPG_LOCK_GEN420_THUBM_ENCODE_OVER_DPI, GEN420_QUEUE_THUMB_JPEG_OVER_DPI, NULL, filter);
struct msi *thumb_msi = thumb_over_dpi_msi_init(SR_OVER_DPI_THUMB_JPG, 0, FSTYPE_OVER_DPI_THUMB_JPG, THUMB_MAGIC);
if (gen420_jpg_msi && thumb_msi)
{
msi_do_cmd(gen420_jpg_msi, MSI_CMD_JPG_RECODE, MSI_JPG_RECODE_MAGIC, THUMB_MAGIC);
// gen420编码完成后,需要将mjpg给到thumb_msi去保存(通过类型判断)
msi_add_output(gen420_jpg_msi, NULL, thumb_msi->name);
// thumb_over_dpi将yuv给到gen420去编码(通过类型判断)
msi_add_output(thumb_msi, NULL, gen420_jpg_msi->name);
// 将缩略图给到写卡线程
msi_add_output(thumb_msi, NULL, R_FILE_MSI);
}
}
// 同时生成缩略图,如果不需要缩略图,thumb_w=0或者thumb_h=0
// 注意normal_w=0或者normal_h=0,表示获取跟镜头一致的分辨率yuv
void common_takephoto_over_dpi_api(struct msi *scale3_msi, uint16_t normal_w, uint16_t noraml_h, uint16_t thumb_w, uint16_t thumb_h)
{
struct scale3_normal_cmd_s cmd;
gettimeofday(&cmd.t, NULL);
cmd.w = normal_w;
cmd.h = noraml_h;
cmd.magic = 0x123456;
cmd.force_type = YUV_ARG_TAKEPHOTO;
msi_do_cmd(scale3_msi, MSI_CMD_SCALE3_NORMAL, MSI_SCLAE3_NORMAL_ADD_DPI, (uint32_t) &cmd);
if (thumb_w && thumb_h)
{
cmd.w = thumb_w;
cmd.h = thumb_h;
cmd.magic = 0x654321;
cmd.force_type = YUV_ARG_TAKEPHOTO;
msi_do_cmd(scale3_msi, MSI_CMD_SCALE3_NORMAL, MSI_SCLAE3_NORMAL_ADD_DPI, (uint32_t) &cmd);
}
}