Files
TAIXIN/sdk/app/video_app/usb_to_recode.c

85 lines
3.3 KiB
C

#include "basic_include.h"
#include "lib/multimedia/msi.h"
#include "stream_define.h"
#include "gen420_hardware_msi.h"
#include "lib/video/dvp/jpeg/jpg.h"
#include "video_msi.h"
/*******************************************
* usb图片增加水印重新编码
*******************************************/
extern struct msi *route_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_decode_msi(const char *name);
extern struct msi *yuv_time_watermark(const char *name, uint8_t filter);
static uint8_t recode_filter(void *f, uint8_t recv_type)
{
struct framebuff *fb = (struct framebuff *) f;
uint8_t res = 1;
if ((fb->mtype == F_JPG) && fb->stype == recv_type)
{
res = 0;
}
return res;
}
void usb_to_recode_init(uint8_t jpg_num)
{
uint32_t magic;
// ROUTE_USB是usb图片获取来源
struct msi *route_m = route_msi(ROUTE_USB);
if (route_m)
{
msi_add_output(route_m, NULL, SR_USB_RECODE_DEOCDE);
}
// 接收USB的图片数据,然后配置需要解码的参数,最后给到硬件去解码
struct msi *decode_msg_msi = jpg_decode_msg_msi(SR_USB_RECODE_DEOCDE, 1280, 720, 1280, 720, FSTYPE_USB_CAM0);
if (decode_msg_msi)
{
// 这里配置特定的类型,就是重新编码后会设置类型,这样应用层是可以进行识别是否为重新编码的,这个可以自定义,但不要和其他
// 已经运行的有冲突,不然可能其他msi接收到重编码的数据
msi_do_cmd(decode_msg_msi, MSI_CMD_DECODE_JPEG_MSG, MSI_JPEG_DECODE_FORCE_TYPE, FSTYPE_JPG_GEN420_REJPG);
msi_add_output(decode_msg_msi, NULL, S_JPG_DECODE);
}
// 把解码模块打开,接收来自SR_USB_RECODE_DEOCDE的数据,解码后,给到水印的msi去添加水印
struct msi *decode_msi = jpg_decode_msi(S_JPG_DECODE);
if (decode_msi)
{
msi_add_output(decode_msi, NULL, SR_YUV_WATERMARK);
}
do
{
magic = os_jiffies();
magic ^= (uint32_t) decode_msg_msi;
} while (!magic);
if (decode_msg_msi && decode_msi)
{
// 设置magic
msi_do_cmd(decode_msg_msi, MSI_CMD_DECODE_JPEG_MSG, MSI_JPEG_DECODE_MAGIC, magic);
msi_add_output(decode_msg_msi, NULL, decode_msi->name);
}
// 水印添加后,将yuv数据给到R_GEN420_JPG_RECODE重新编码,并且仅仅进行过滤类型
struct msi *watermark = yuv_time_watermark(SR_YUV_WATERMARK, FSTYPE_JPG_GEN420_REJPG);
if (watermark)
{
msi_add_output(watermark, NULL, R_GEN420_JPG_RECODE);
}
// 过滤类型,由于从usb过来,由于decode_msg_msi设置了类型,所以这里需要修改
static const uint16_t watermark_filter[] = {FSTYPE_JPG_GEN420_REJPG, FSTYPE_NONE};
struct msi *gen420_jpg_msi = gen420_jpg_msi_init(R_GEN420_JPG_RECODE, jpg_num, FSTYPE_JPG_GEN420_REJPG, JPG_LOCK_GEN420_RECODE, GEN420_QUEUE_JPEG_RECODE, (uint16_t*)watermark_filter, recode_filter);
if (gen420_jpg_msi)
{
// 如果需要默认添加到某个msi,在这里添加,也可以后续在其他地方通过msi_add_output(NULL, R_GEN420_JPG_RECODE, "XXX");的方式添加
msi_do_cmd(gen420_jpg_msi, MSI_CMD_JPG_RECODE, MSI_JPG_RECODE_MAGIC, magic);
}
}