Commit 003eb958 authored by luo's avatar luo

[UPDATE]SDK 2.5.0.7.1.2

parent e7645da1
......@@ -41,6 +41,9 @@ rtt-nano-emmc: prepare
scons --useconfig='star_asic_defconfig_emmc'; \
scons -j128 || exit; \
cp rtthread.bin ${ACME_IMG_PF_DIR}/star_app_emmc.bin; \
scons --useconfig='star_asic_defconfig_evb_v24'; \
scons -j16 || exit; \
cp rtthread.bin ${ACME_IMG_PF_DIR}/star_app_evb_v24.bin; \
rtt-nano: rtt-nano-outdoor_ipc rtt-nano-glasses rtt-nano-emmc
@pushd rt-thread-nano/bsp/sa692x/star; \
......@@ -62,9 +65,6 @@ rtt-nano: rtt-nano-outdoor_ipc rtt-nano-glasses rtt-nano-emmc
scons --useconfig='star_asic_defconfig_bc22e'; \
scons -j16 || exit; \
cp rtthread.bin ${ACME_IMG_PF_DIR}/star_app_bc22e.bin; \
scons --useconfig='star_asic_defconfig_evb_v24'; \
scons -j16 || exit; \
cp rtthread.bin ${ACME_IMG_PF_DIR}/star_app_evb_v24.bin; \
popd
linux:
......@@ -188,6 +188,11 @@ pack-emmc:
dd if=${ACME_IMG_PF_DIR}/bootimg-emmc-linux.bin of=${ACME_IMG_PF_DIR}/bootimg-BL2-6920E-0P55-emmc-linux.bin seek=2048 bs=1K conv=notrunc; \
dd if=${ACME_IMG_PF_DIR}/bootimg-BL2-6920E-0P5.bin of=${ACME_IMG_PF_DIR}/bootimg-BL2-6920E-0P5-emmc-linux.bin bs=1K conv=notrunc; \
dd if=${ACME_IMG_PF_DIR}/bootimg-emmc-linux.bin of=${ACME_IMG_PF_DIR}/bootimg-BL2-6920E-0P5-emmc-linux.bin seek=2048 bs=1K conv=notrunc; \
python3 pack_tool.py --type burn --mode 0 --ini burn_pack_ini/linux/burn_pack_evb-v24-linux$${arch_suffix}.ini --image_dir ${ACME_IMG_PF_DIR} --out ${ACME_IMG_PF_DIR}/bootimg-evb-linux.bin --real_size; \
dd if=${ACME_IMG_PF_DIR}/bootimg-BL2-6920E-0P55.bin of=${ACME_IMG_PF_DIR}/bootimg-BL2-6920E-0P55-evb-v24-linux.bin bs=1K conv=notrunc; \
dd if=${ACME_IMG_PF_DIR}/bootimg-evb-linux.bin of=${ACME_IMG_PF_DIR}/bootimg-BL2-6920E-0P55-evb-v24-linux.bin seek=2048 bs=1K conv=notrunc; \
dd if=${ACME_IMG_PF_DIR}/bootimg-BL2-6920E-0P5.bin of=${ACME_IMG_PF_DIR}/bootimg-BL2-6920E-0P5-evb-v24-linux.bin bs=1K conv=notrunc; \
dd if=${ACME_IMG_PF_DIR}/bootimg-evb-linux.bin of=${ACME_IMG_PF_DIR}/bootimg-BL2-6920E-0P5-evb-v24-linux.bin seek=2048 bs=1K conv=notrunc; \
popd
clean:
......
/*
m55-spi: share memory
*/
#include <linux/completion.h>
#include <linux/module.h>
#include <linux/idr.h>
#include <linux/mutex.h>
#include <linux/rpmsg.h>
#include <linux/spi/spi.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/wait.h>
#include "rpmsg_internal.h"
#define SA_SPI_RPMSG_ADR (2047)
#define SA_RPMSG_RESERVED_ADDRESSES (2048)
#define MST_SPI_WR (0<<30)
#define MST_SPI_RD (1<<30)
#define MST_SPI_ADDR_WR(a) (((a)>>2)|MST_SPI_WR)
#define MST_SPI_ADDR_RD(a) (((a)>>2)|MST_SPI_RD)
struct sa_spi_rpmsg
{
struct spi_device *spi;
struct gpio_desc *st_req; //从机有数据发送来时,输入
struct gpio_desc *mt_req; //主机通知从机要开始发数据,输出
struct gpio_desc *st_rxfinish; //从机接收完成
struct gpio_desc *mt_rxfinish; //主机发送完成
struct mutex spi_lock;
struct rpmsg_device rpdev;
struct idr endpoints;
struct mutex endpoints_lock;
wait_queue_head_t tx_wait;
};
struct sa_rpmsg_msg {
u32 src;
u32 dst;
u32 reserved;
u16 len;
u16 flags;
u8 data[];
} __packed;
struct bes_tx_mem_addr{
u32 src_mem_addr;
u32 resv;
};
struct bes_send_hdr{
u32 dst_mem_addr;
struct sa_rpmsg_msg msg;
};
static int __sa_rpdev_spi_send(struct sa_spi_rpmsg *sa_dev, u32 src, u32 dst, void *data, int len)
{
struct bes_send_hdr *send_hdr = NULL;
struct sa_rpmsg_msg *msg = NULL;
u32 spi_len = sizeof(struct bes_send_hdr) + ALIGN(len, 4);
int try = 100;
int ret;
send_hdr = kzalloc(spi_len, GFP_KERNEL);
if(!send_hdr){
return -ENOMEM;
}
send_hdr->dst_mem_addr = MST_SPI_ADDR_WR(0x211353e0);
msg = &send_hdr->msg;
// msg->dst_mem_addr = MST_SPI_ADDR_WR(0x211353e0);
msg->src = src;
msg->dst = dst;
msg->len = ALIGN(len, 4);
memcpy(msg->data, data, len);
mutex_lock(&sa_dev->spi_lock);
gpiod_set_value(sa_dev->mt_req, 0);
//wait slave rq to low
while(try--){
ret = wait_event_timeout(sa_dev->tx_wait, 1 == gpiod_get_value(sa_dev->st_rxfinish), 1000);
if(ret){
break;
}
}
if(try <= 0){
dev_err(&sa_dev->spi->dev, "failed to wait slave rq low\n");
kfree(send_hdr);
mutex_unlock(&sa_dev->spi_lock);
return -ETIMEDOUT;
}
ret = spi_write(sa_dev->spi, send_hdr, spi_len);
gpiod_set_value(sa_dev->mt_req, 1);
mutex_unlock(&sa_dev->spi_lock);
// printk("%s return %x\n", __func__, ret);
// print_hex_dump("KERN_INFO", " ", DUMP_PREFIX_NONE, 16, 1, msg->data, msg->len, true);
kfree(send_hdr);
return ret;
}
static int sa_rpdev_spi_send(struct rpmsg_endpoint *ept, void *data, int len)
{
struct rpmsg_device *rpdev = ept->rpdev;
struct sa_spi_rpmsg *sa_dev = container_of(rpdev, struct sa_spi_rpmsg, rpdev);
return __sa_rpdev_spi_send(sa_dev, ept->addr, ept->addr, data, len);
}
static int sa_rpdev_spi_sendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst)
{
struct rpmsg_device *rpdev = ept->rpdev;
struct sa_spi_rpmsg *sa_dev = container_of(rpdev, struct sa_spi_rpmsg, rpdev);
return __sa_rpdev_spi_send(sa_dev, ept->addr, dst, data, len);
}
static void __sa_ept_release(struct kref *kref)
{
struct rpmsg_endpoint *ept = container_of(kref, struct rpmsg_endpoint,
refcount);
kfree(ept);
}
static void __sa_rpdev_destroy_ept(struct sa_spi_rpmsg *sa_dev, struct rpmsg_endpoint *ept)
{
/* make sure new inbound messages can't find this ept anymore */
mutex_lock(&sa_dev->endpoints_lock);
idr_remove(&sa_dev->endpoints, ept->addr);
mutex_unlock(&sa_dev->endpoints_lock);
/* make sure in-flight inbound messages won't invoke cb anymore */
mutex_lock(&ept->cb_lock);
ept->cb = NULL;
mutex_unlock(&ept->cb_lock);
kref_put(&ept->refcount, __sa_ept_release);
}
static void sa_rpdev_destroy_ept(struct rpmsg_endpoint *ept)
{
struct rpmsg_device *rpdev = ept->rpdev;
struct sa_spi_rpmsg *sa_dev = container_of(rpdev, struct sa_spi_rpmsg, rpdev);
__sa_rpdev_destroy_ept(sa_dev, ept);
}
static const struct rpmsg_endpoint_ops sa_spi_endpoint_ops = {
.destroy_ept = sa_rpdev_destroy_ept,
.send = sa_rpdev_spi_send,
.sendto = sa_rpdev_spi_sendto,
};
static struct rpmsg_endpoint *sa_rpdev_create_ept(struct rpmsg_device *rpdev,
rpmsg_rx_cb_t cb, void *priv,
struct rpmsg_channel_info chinfo)
{
int id_min, id_max, id;
struct rpmsg_endpoint *ept;
struct sa_spi_rpmsg *sa_dev = container_of(rpdev, struct sa_spi_rpmsg, rpdev);
ept = kzalloc(sizeof(*ept), GFP_KERNEL);
if (!ept){
return NULL;
}
kref_init(&ept->refcount);
mutex_init(&ept->cb_lock);
ept->rpdev = rpdev;
ept->cb = cb;
ept->priv = priv;
ept->ops = &sa_spi_endpoint_ops;
/* do we need to allocate a local address ? */
if (chinfo.src == RPMSG_ADDR_ANY) {
id_min = SA_RPMSG_RESERVED_ADDRESSES;
id_max = 0;
} else {
id_min = chinfo.src;
id_max = chinfo.src + 1;
}
mutex_lock(&sa_dev->endpoints_lock);
/* bind the endpoint to an rpmsg address (and allocate one if needed) */
id = idr_alloc(&sa_dev->endpoints, ept, id_min, id_max, GFP_KERNEL);
if (id < 0) {
printk(KERN_ERR "idr_alloc failed: %d\n", id);
goto free_ept;
}
ept->addr = id;
mutex_unlock(&sa_dev->endpoints_lock);
return ept;
free_ept:
mutex_unlock(&sa_dev->endpoints_lock);
kref_put(&ept->refcount, __sa_ept_release);
return NULL;
}
static const struct rpmsg_device_ops sa_rpdev_ops = {
.create_ept = sa_rpdev_create_ept,
};
static void sa_spi_rpdev_release(struct device *dev)
{
return;
}
void spi_write_reg(struct spi_device *spi, u32 regaddr, u32 val)
{
u8 buf[8];
buf[3] = ((MST_SPI_ADDR_WR(regaddr))>>0)&0xFF;
buf[2] = ((MST_SPI_ADDR_WR(regaddr))>>8)&0xFF;
buf[1] = ((MST_SPI_ADDR_WR(regaddr))>>16)&0xFF;
buf[0] = ((MST_SPI_ADDR_WR(regaddr))>>24)&0xFF;
buf[7] = val & 0xFF;
buf[6] = (val >> 8) & 0xFF;
buf[5] = (val >> 16) & 0xFF;
buf[4] = (val >> 24) & 0xFF;
spi_write(spi, buf, 8);
}
int bes_spi_read(struct spi_device *spi, uint32_t mem_off, void *payload, uint32_t len)
{
int ret;
struct bes_tx_mem_addr *bes_tx_mem_addr;
struct spi_transfer xfers[2];
struct spi_message spimsg;
if(len == 0){
return 0;
}
if(len > 16384){
dev_warn(&spi->dev, "msg len too long\n");
return -EINVAL;
}
spi_message_init(&spimsg);
memset(xfers, 0, sizeof(xfers));
bes_tx_mem_addr = kmalloc(sizeof(*bes_tx_mem_addr), GFP_KERNEL);
bes_tx_mem_addr->src_mem_addr = MST_SPI_ADDR_RD(mem_off);
bes_tx_mem_addr->resv = 0;
xfers[0].tx_buf = (void *)bes_tx_mem_addr;
xfers[0].len = sizeof(*bes_tx_mem_addr);
// xfer0.cs_change = 0;
xfers[1].rx_buf = payload;
xfers[1].len = len;
// xfer1.cs_change = 1;
spi_message_add_tail(&xfers[0], &spimsg);
spi_message_add_tail(&xfers[1], &spimsg);
ret = spi_sync(spi, &spimsg);
if(ret){
dev_err(&spi->dev, "spisync failed\n");
}
kfree(bes_tx_mem_addr);
return ret;
}
static irqreturn_t sa_spi_recv_thread(int irq, void *data)
{
struct sa_spi_rpmsg *sa_dev = (struct sa_spi_rpmsg *)data;
int ret;
struct sa_rpmsg_msg msg __attribute__((aligned(16)));
struct rpmsg_endpoint *ept;
struct bes_tx_mem_addr bes_tx_mem_addr;
void *buf;
// static u8 buf[1024] __attribute__((aligned(16)));
gpiod_set_value(sa_dev->mt_rxfinish, 0);
dev_info(&sa_dev->spi->dev, "irq occured\n");
if(gpiod_get_value(sa_dev->mt_req) == 0){
wake_up(&sa_dev->tx_wait);
return IRQ_HANDLED;
}
memset(&msg, 0, sizeof(msg));
mutex_lock(&sa_dev->spi_lock);
bes_tx_mem_addr.src_mem_addr = MST_SPI_ADDR_RD(0x21141be0);
bes_tx_mem_addr.resv = 0;
spi_write_then_read(sa_dev->spi, &bes_tx_mem_addr, sizeof(bes_tx_mem_addr), &msg, sizeof(msg));
// bes_spi_read(sa_dev->spi, 0x21141be0, &msg, sizeof(msg));
buf = kmalloc(ALIGN(msg.len, 4), GFP_KERNEL);
if(!buf){
dev_warn(&sa_dev->spi->dev, "no mem\n");
mutex_unlock(&sa_dev->spi_lock);
return IRQ_HANDLED;
}
// if(msg.len && msg.len < 16384){
// // bes_spi_read(sa_dev->spi, 0x21141be0 + sizeof(msg), buf, msg.len);
// bes_tx_mem_addr.src_mem_addr = MST_SPI_ADDR_RD(0x21141be0 + sizeof(msg));
// bes_tx_mem_addr.resv = 0;
// spi_write_then_read(sa_dev->spi, &bes_tx_mem_addr, sizeof(bes_tx_mem_addr), buf, msg.len);
// } else { //msg.len < 16384
// bes_spi_read(sa_dev->spi, 0x21141be0 + sizeof(msg), buf, msg.len);
// }
bes_spi_read(sa_dev->spi, 0x21141be0 + sizeof(msg), buf, ALIGN(msg.len, 4));
gpiod_set_value(sa_dev->mt_rxfinish, 1);
mutex_unlock(&sa_dev->spi_lock);
// print_hex_dump(KERN_INFO, " [R]HEAD ", DUMP_PREFIX_NONE, 16, 1, &msg, sizeof(msg), true);
// printk(KERN_INFO "msg src: %x, dst: %x, len: %x\n", msg.src, msg.dst, msg.len);
print_hex_dump(KERN_INFO, " [R]DATA ", DUMP_PREFIX_NONE, 16, 1, buf, 24, true);
mutex_lock(&sa_dev->endpoints_lock);
ept = idr_find(&sa_dev->endpoints, msg.dst);
if (ept){
kref_get(&ept->refcount);
}
mutex_unlock(&sa_dev->endpoints_lock);
if (ept) {
/* make sure ept->cb doesn't go away while we use it */
mutex_lock(&ept->cb_lock);
if (ept->cb){
ept->cb(ept->rpdev, buf, msg.len, ept->priv, msg.src);
}
mutex_unlock(&ept->cb_lock);
/* farewell, ept, we don't need you anymore */
kref_put(&ept->refcount, __sa_ept_release);
} else{
dev_warn(&sa_dev->spi->dev, "msg received with no recipient\n");
}
kfree(buf);
return IRQ_HANDLED;
}
static int sa_spi_rpmsg_probe(struct spi_device *spi)
{
struct sa_spi_rpmsg *sa_dev;
struct rpmsg_device *rpdev;
int ret;
int irq;
spi->bits_per_word = 32;
spi->mode = SPI_MODE_3;
ret = spi_setup(spi);
if(ret < 0){
return ret;
}
sa_dev = devm_kzalloc(&spi->dev, sizeof(*sa_dev), GFP_KERNEL);
if(!sa_dev){
return -ENOMEM;
}
spi_set_drvdata(spi, sa_dev);
sa_dev->spi = spi;
sa_dev->mt_rxfinish = devm_gpiod_get(&spi->dev, "mt_rxfinish", GPIOD_OUT_HIGH);
if (IS_ERR(sa_dev->mt_rxfinish)){
return -ENXIO;
}
gpiod_direction_output(sa_dev->mt_rxfinish, 1);
sa_dev->st_rxfinish = devm_gpiod_get(&spi->dev, "st_rxfinish", GPIOD_OUT_HIGH);
if (IS_ERR(sa_dev->st_rxfinish)){
return -ENXIO;
}
gpiod_direction_input(sa_dev->st_rxfinish);
sa_dev->mt_req = devm_gpiod_get(&spi->dev, "mt_req", GPIOD_OUT_HIGH);
if (IS_ERR(sa_dev->mt_req)){
return -ENXIO;
}
gpiod_direction_output(sa_dev->mt_req, 1);
sa_dev->st_req = devm_gpiod_get(&spi->dev, "st_req", GPIOD_OUT_HIGH);
if (IS_ERR(sa_dev->st_req)){
return -ENXIO;
}
gpiod_direction_input(sa_dev->st_req);
irq = gpiod_to_irq(sa_dev->st_req);
if(irq < 0){
return -EIO;
}
disable_irq(irq);
ret = devm_request_threaded_irq(&spi->dev, irq, NULL, sa_spi_recv_thread,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "st_req", sa_dev);
if (ret) {
dev_err(&spi->dev, "failed to request IRQ\n");
return ret;
}
mutex_init(&sa_dev->spi_lock);
idr_init(&sa_dev->endpoints);
mutex_init(&sa_dev->endpoints_lock);
init_waitqueue_head(&sa_dev->tx_wait);
rpdev = &(sa_dev->rpdev);
rpdev->ops = &sa_rpdev_ops;
rpdev->dev.parent = &spi->dev;
rpdev->dev.release = sa_spi_rpdev_release;
rpmsg_chrdev_register_device(rpdev);
enable_irq(irq);
spi_write_reg(spi,0xfffc0004, 0x01);
return 0;
}
static int sa_spi_rpmsg_remove(struct spi_device *spi)
{
struct rpmsg_channel_info chinfo;
struct sa_spi_rpmsg *sa_dev = spi_get_drvdata(spi);
int ret;
chinfo.src = RPMSG_ADDR_ANY;
chinfo.dst = RPMSG_ADDR_ANY;
strcpy(chinfo.name, "rpmsg_chrdev");
ret = rpmsg_unregister_device(&spi->dev, &chinfo);
if(ret){
dev_err(&spi->dev, "failed to unregister rpmsg device\n");
return -1;
}
idr_destroy(&sa_dev->endpoints);
return 0;
}
static const struct of_device_id sa_spi_rpmsg_of_match[] = {
{ .compatible = "acme,spi-rpmsg" },
{}
};
MODULE_DEVICE_TABLE(of, sa_spi_rpmsg_of_match);
static struct spi_driver sa_spi_rpmsg_driver = {
.probe = sa_spi_rpmsg_probe,
.remove = sa_spi_rpmsg_remove,
.driver = {
.name = "acme-spi-rpmsg",
.of_match_table = sa_spi_rpmsg_of_match,
},
};
module_spi_driver(sa_spi_rpmsg_driver);
MODULE_AUTHOR("acme");
MODULE_DESCRIPTION("acme rpmsg over spi driver");
MODULE_LICENSE("GPL v2");
\ No newline at end of file
......@@ -331,6 +331,9 @@ static u32 dw_spi_prepare_cr0(struct dw_spi *dws, struct spi_device *spi)
cr0 |= DWC_SSI_CTRLR0_KEEMBAY_MST;
}
spi_enable_chip(dws, 0);
dw_writel(dws, DW_SPI_CTRLR0, cr0);
spi_enable_chip(dws, 1);
return cr0;
}
......
# 2.5.0.7.1版本0.2
## 发布日期:2025年03月20日
### 更新内容
1. capture和record新增缩略图功能,缩略图支持jpeg和heic格式
# 2.5.0.7.1版本0.1
## 发布日期:2025年03月14日
......
......@@ -55,7 +55,7 @@
"RcMode 0:constQP,1:cbr,2:vbr,3:low latency,4:capped vbr,5:adaptive vbr,7:min br,63:bypass,64:jpeg fxiQP",
"SmartEncoder 0:none,1:roi,2:QP"
],
"CodeType": 1, "Qp": 10, "RcMode": 4,
"CodeType": 1, "Qp": 26, "RcMode": 0,
"Width": 1920, "Height": 1080, "Bitrate": 4096000, "SmartEncoder": 0, "SmartSEI": 0,
"#note-record region": [
"Type 0:image,1:time,2:time and debug info"
......@@ -94,11 +94,13 @@
"capture":
{
"#note": [
"SaveFormat 0:jpeg,1:heif"
"CaptureFormat 0:jpeg,1:heif",
"ThumbFormat 0:jpeg,1:heif"
],
"BokehEnable": 0, "MFNREnable": 0, "HDREnable": 0, "ZSLEnable": 0,
"BeautyEnable": 0, "Strength": 50,
"SaveEnable": 1, "SaveFormat": 1, "SaveFilePath": "/mnt/sdcard"
"CaptureEnable": 1, "CaptureFormat": 1, "CaptureFilePath": "/mnt/sdcard",
"ThumbEnable": 1, "ThumbWidth": 384, "ThumbHeight": 216, "ThumbFormat": 1, "ThumbFilePath": "/mnt/sdcard"
},
"record":
{
......@@ -117,9 +119,11 @@
"VqeEnable": 0,"VqeParamFile": "/acme/bin/vqe.bin"
},
"#note": [
"SaveFormat 0:mp4,1:h265,2:h264,3:jpg"
"RecordFormat 0:mp4,1:h265,2:h264,3:jpg",
"ThumbFormat 0:jpeg,1:heif"
],
"SaveEnable": 1, "SaveFormat": 1, "SaveFilePath": "/mnt/sdcard"
"RecordEnable": 1, "RecordFormat": 1, "RecordFilePath": "/mnt/sdcard",
"ThumbEnable": 0, "ThumbWidth": 384, "ThumbHeight": 216, "ThumbFormat": 0, "ThumbFilePath": "/mnt/sdcard"
},
"svp":
{
......
......@@ -28,23 +28,23 @@
"Qp jpeg:0-100;heif:0-51",
"SmartEncoder 0:none,1:roi,2:qp"
],
"Qp": 10,
"Width": 4032, "Height": 3024, "Bitrate": 2048000, "SmartEncoder": 0, "SmartSEI": 0,
"Qp": 26,
"Width": 4032, "Height": 3024, "Bitrate": 8192000, "SmartEncoder": 0, "SmartSEI": 0,
"#note-record region": [
"Type 0:image,1:time,2:time and debug info"
],
"region": [
{
"#note": [
"Type 0:image,1:timestamp,2:timestamp+mode,3:timestamp+week,4:timestamp+week(EN)"
],
"Enable": 0, "Type": 0,
"X": 32, "Y": 32, "Width": 256, "Height": 128,
"Color0": 16777215, "Color1": 6171602, "Color2": 16745541,
"ImageFile": "/acme/bin/logo256x128.2bpp"
"ImageFile": "/acme/bin/logo256x128.bgra"
},
{
"Enable": 0, "Type": 0,
"X": 32, "Y": 32, "Width": 256, "Height": 128,
"Enable": 1, "Type": 2,
"X":32, "Y": 2896, "Width": 1888, "Height": 48,
"Color0": 16777215, "Color1": 6171602, "Color2": 16745541,
"ImageFile": "/acme/bin/logo256x128.2bpp"
"ImageFile": ""
}
]
},
......@@ -94,11 +94,13 @@
"capture":
{
"#note": [
"SaveFormat 0:jpeg,1:heif"
"CaptureFormat 0:jpeg,1:heif",
"ThumbFormat 0:jpeg,1:heif"
],
"BokehEnable": 0, "MFNREnable": 0, "HDREnable": 0, "ZSLEnable": 0,
"BeautyEnable": 0, "Strength": 50,
"SaveEnable": 1, "SaveFormat": 1, "SaveFilePath": "/mnt/sdcard"
"CaptureEnable": 1, "CaptureFormat": 1, "CaptureFilePath": "/mnt/sdcard",
"ThumbEnable": 1, "ThumbWidth": 384, "ThumbHeight": 216, "ThumbFormat": 1, "ThumbFilePath": "/mnt/sdcard"
},
"record":
{
......@@ -117,9 +119,11 @@
"VqeEnable": 0,"VqeParamFile": "/acme/bin/vqe.bin"
},
"#note": [
"SaveFormat 0:mp4,1:h265,2:h264,3:jpg"
"RecordFormat 0:mp4,1:h265,2:h264,3:jpg",
"ThumbFormat 0:jpeg,1:heif"
],
"SaveEnable": 1, "SaveFormat": 1, "SaveFilePath": "/mnt/sdcard"
"RecordEnable": 1, "RecordFormat": 1, "RecordFilePath": "/mnt/sdcard",
"ThumbEnable": 1, "ThumbWidth": 384, "ThumbHeight": 216, "ThumbFormat": 0, "ThumbFilePath": "/mnt/sdcard"
},
"svp":
{
......
......@@ -94,11 +94,13 @@
"capture":
{
"#note": [
"SaveFormat 0:jpeg,1:heif"
"CaptureFormat 0:jpeg,1:heif",
"ThumbFormat 0:jpeg,1:heif"
],
"BokehEnable": 0, "MFNREnable": 0, "HDREnable": 0, "ZSLEnable": 0,
"BeautyEnable": 0, "Strength": 50,
"SaveEnable": 1, "SaveFormat": 1, "SaveFilePath": "/mnt/sdcard"
"CaptureEnable": 1, "CaptureFormat": 1, "CaptureFilePath": "/mnt/sdcard",
"ThumbEnable": 1, "ThumbWidth": 384, "ThumbHeight": 216, "ThumbFormat": 1, "ThumbFilePath": "/mnt/sdcard"
},
"record":
{
......@@ -117,9 +119,11 @@
"VqeEnable": 0,"VqeParamFile": "/acme/bin/vqe.bin"
},
"#note": [
"SaveFormat 0:mp4,1:h265,2:h264,3:jpg"
"RecordFormat 0:mp4,1:h265,2:h264,3:jpg",
"ThumbFormat 0:jpeg,1:heif"
],
"SaveEnable": 1, "SaveFormat": 1, "SaveFilePath": "/mnt/sdcard"
"RecordEnable": 1, "RecordFormat": 1, "RecordFilePath": "/mnt/sdcard",
"ThumbEnable": 1, "ThumbWidth": 384, "ThumbHeight": 216, "ThumbFormat": 1, "ThumbFilePath": "/mnt/sdcard"
},
"svp":
{
......
......@@ -94,11 +94,13 @@
"capture":
{
"#note": [
"SaveFormat 0:jpeg,1:heif"
"CaptureFormat 0:jpeg,1:heif",
"ThumbFormat 0:jpeg,1:heif"
],
"BokehEnable": 0, "MFNREnable": 0, "HDREnable": 0, "ZSLEnable": 0,
"BeautyEnable": 0, "Strength": 50,
"SaveEnable": 1, "SaveFormat": 1, "SaveFilePath": "/mnt/sdcard"
"CaptureEnable": 1, "CaptureFormat": 1, "CaptureFilePath": "/mnt/sdcard",
"ThumbEnable": 1, "ThumbWidth": 384, "ThumbHeight": 216, "ThumbFormat": 1, "ThumbFilePath": "/mnt/sdcard"
},
"record":
{
......@@ -117,9 +119,11 @@
"VqeEnable": 0,"VqeParamFile": "/acme/bin/vqe.bin"
},
"#note": [
"SaveFormat 0:mp4,1:h265,2:h264,3:jpg"
"RecordFormat 0:mp4,1:h265,2:h264,3:jpg",
"ThumbFormat 0:jpeg,1:heif"
],
"SaveEnable": 1, "SaveFormat": 1, "SaveFilePath": "/mnt/sdcard"
"RecordEnable": 1, "RecordFormat": 1, "RecordFilePath": "/mnt/sdcard",
"ThumbEnable": 1, "ThumbWidth": 384, "ThumbHeight": 216, "ThumbFormat": 1, "ThumbFilePath": "/mnt/sdcard"
},
"svp":
{
......
{
"doc": "media",
"version": "1.0.0.1",
"#note": [
"scene: capture,record,captureaddrecord,visual"
],
"scene": "captureaddrecord",
"video": {
"#note0": [
"SensorType 0:4d10,1:4a10,2:2n10,3:imx681,4:5l10,5:sc535,6:4j10,7:4l10",
"SensorMode 0:linear,1:hdr"
],
"SensorType": 0, "SensorMode": 0,
"#note1": [
"Rotation 0:0,1:90,2:180,3:270",
"FilterColor 0:off,1:pink,2:blue,3:cowboy,4:cyantone,5:prettypure,6:moody"
],
"ViDev": 0, "MaxFps": 15.0, "MinFps": 15.0, "Mirror": 0, "Flip": 0, "Rotation": 0, "PyrOff": 1, "TnrOff": 0, "AinrOff": 0,
"Gdc": 0, "FilterColor": 0, "ViDumpDepth": 1,
"IspFile": [ "/acme/conf/4d10/os04d10_base_Color.bin",
"/acme/conf/4d10/os04d10_4M_Color_Outdoor_diff.bin",
"/acme/conf/4d10/os04d10_4M_Color_Indoor_diff.bin",
"/acme/conf/4d10/os04d10_4M_Color_Aisp_diff.bin",
"/acme/conf/4d10/os04d10_4M_Black_diff.bin",
"/acme/conf/4d10/os04d10_4M_Color_Aisp_diff_Light.bin"],
"AinrFile": "/acme/conf/4d10/aisp_4M.bin",
"ProEnable": 0, "ISO": 100, "AWBCt": 5000, "SportEnable": 0, "MaxIntTime": 30000,
"venc": [
{
"#note-capture channel": [
"Qp jpeg:0-100;heif:0-51",
"SmartEncoder 0:none,1:roi,2:qp"
],
"Qp": 26,
"Width": 2560, "Height": 1440, "Bitrate": 4096000, "SmartEncoder": 0, "SmartSEI": 0,
"#note-record region": [
"Type 0:image,1:time,2:time and debug info"
],
"region": [
{
"Enable": 0, "Type": 0,
"X": 32, "Y": 32, "Width": 256, "Height": 128,
"Color0": 16777215, "Color1": 6171602, "Color2": 16745541,
"ImageFile": "/acme/bin/logo256x128.bgra"
},
{
"Enable": 1, "Type": 2,
"X":32, "Y": 1280, "Width": 1880, "Height": 48,
"Color0": 16777215, "Color1": 6171602, "Color2": 16745541,
"ImageFile": ""
}
]
},
{
"#note-record channel": [
"CodeType 0:h264,1:h265,2:jpeg",
"Qp jpeg:0-100;heif:0-51",
"RcMode 0:constQP,1:cbr,2:vbr,3:low latency,4:capped vbr,5:adaptive vbr,7:min br,63:bypass,64:jpeg fxiQP",
"SmartEncoder 0:none,1:roi,2:QP"
],
"CodeType": 1, "Qp": 26, "RcMode": 2,
"Width": 960, "Height": 720, "Bitrate": 1024000, "SmartEncoder": 0, "SmartSEI": 0,
"#note-record region": [
"Type 0:image,1:time,2:time and debug info"
],
"region": [
{
"Enable": 0, "Type": 0,
"X": 32, "Y": 32, "Width": 256, "Height": 128,
"Color0": 16777215, "Color1": 6171602, "Color2": 16745541,
"ImageFile": "/acme/bin/logo256x128.bgra"
},
{
"Enable": 1, "Type": 2,
"X":32, "Y": 656, "Width": 880, "Height": 48,
"Color0": 16777215, "Color1": 6171602, "Color2": 16745541,
"ImageFile": ""
}
]
}
],
"sd":
{
"#note": [
"SdMode 0:auto,1:manual",
"SceneType 0:outdoor,1:indoor,2:ainr,8:backlight",
"WdrMode 0:linear,1:hdr,2:auto",
"StrategyMode 0:normal,1:blc,2:hs"
],
"SdMode": 0, "SceneType": 0, "WdrMode": 0,
"MaxInttimeEnable": 0, "IntTimeMax": 30000,
"RoiEnable": 0, "X": 0, "Y": 0, "Width": 1920, "Height": 1080,
"StrategyMode": 0, "Strength": 100,
"FlickerEnable": 0, "Frequency": 50
}
},
"capture":
{
"#note": [
"CaptureFormat 0:jpeg,1:heif",
"ThumbFormat 0:jpeg,1:heif"
],
"BokehEnable": 0, "MFNREnable": 0, "HDREnable": 0, "ZSLEnable": 0,
"BeautyEnable": 0, "Strength": 50,
"CaptureEnable": 1, "CaptureFormat": 1, "CaptureFilePath": "/mnt/sdcard",
"ThumbEnable": 1, "ThumbWidth": 384, "ThumbHeight": 216, "ThumbFormat": 1, "ThumbFilePath": "/mnt/sdcard"
},
"record":
{
"EISMode": 0,
"audio":
{
"#note": [
"SampleRate 8000 16000 32000 48000",
"SoundMode 1:mono,2:stereo",
"EncType 0:lcaac,1:g711a,2:g711u,3:pcm"
],
"AudioEnable": 0,
"SampleRate": 16000,
"SoundMode": 1,
"EncType": 0,
"VqeEnable": 0,"VqeParamFile": "/acme/bin/vqe.bin"
},
"#note": [
"RecordFormat 0:mp4,1:h265,2:h264,3:jpg",
"ThumbFormat 0:jpeg,1:heif"
],
"RecordEnable": 1, "RecordFormat": 1, "RecordFilePath": "/mnt/sdcard",
"ThumbEnable": 1, "ThumbWidth": 384, "ThumbHeight": 216, "ThumbFormat": 1, "ThumbFilePath": "/mnt/sdcard"
},
"svp":
{
"OCREnable": 0,
"QRCodeEnable": 0,
"FaceDetEnable": 0,
"PeopleDetEnable": 0,
"SmartAeEnable": 0
}
}
......@@ -8,6 +8,8 @@ copy_files() {
mkdir -p burn_img_emmc
cp 6920_bsp_release/out_images/bootimg-BL2-6920E-*-emmc-linux.bin burn_img_emmc/
cp 6920_bsp_release/out_images/bootimg-BL2-6920E-*-pt2-linux.bin burn_img_emmc/ > /dev/null 2>&1
cp 6920_bsp_release/out_images/bootimg-BL2-6920E-0P5-evb-v24-linux.bin burn_img_emmc/bootimg-BL2-6920E-0P5-emmc-linux-v24.bin
cp 6920_bsp_release/out_images/bootimg-BL2-6920E-0P55-evb-v24-linux.bin burn_img_emmc/bootimg-BL2-6920E-0P55-emmc-linux-v24.bin
fi
if [ "$type" == "nor" ] || [ -z "$type" ]; then
......
No preview for this file type
No preview for this file type
......@@ -858,7 +858,7 @@ int MP4E_add_track(MP4E_mux_t *mux, const MP4E_track_t *track_data)
minimp4_vector_init(&tr->pending_sample, 0);
return ntr;
}
/*
static const unsigned char *next_dsi(const unsigned char *p, const unsigned char *end, int *bytes)
{
if (p < end + 2)
......@@ -868,6 +868,7 @@ static const unsigned char *next_dsi(const unsigned char *p, const unsigned char
} else
return NULL;
}
*/
static int append_mem(minimp4_vector_t *v, const void *mem, int bytes)
{
......@@ -1004,7 +1005,7 @@ static int mp4e_write_fragment_header(MP4E_mux_t *mux, int track_num, int data_b
{
default_sample_duration_present = 0x000008,
default_sample_flags_present = 0x000020,
} e;
};
track_t *tr = ((track_t*)mux->tracks.data) + track_num;
......
......@@ -53,6 +53,13 @@ extern "C" {
#define MEDIA_LTM_SIZE_HEIGHT_MAX (2736)
#define MEDIA_GTM_SIZE_WIDTH_ONLINE_MAX (2880)
#define MEDIA_GTM_SIZE_HEIGHT_ONLINE_MAX (1616)
#define MEDIA_VPSS_GROUP (0)
#define MEDIA_VPSS_CHN (1)
#define MEDIA_VPSS_CHN_THUMB (2)
#define MEDIA_VENC_CAPTURE (0)
#define MEDIA_VENC_RECORD (1)
#define MEDIA_VENC_THUMB (2)
typedef enum {
SA_MEDIA_SCENE_CAPTURE = 0,
SA_MEDIA_SCENE_RECORD = 1,
......@@ -295,6 +302,25 @@ typedef struct {
SA_U32 u32Reserve;
} SA_MEDIA_SVP_CONFIG_S;
typedef struct saMEDIA_HEIF_SINGLE_FRAME_INFO_S {
// input-info
SA_U32 u32ChId;
SA_U32 u32PicWidth;
SA_U32 u32PicHeight;
SA_U32 u32EncWidth;
SA_U32 u32EncHeight;
SA_U32 u32SliceQp;
VENC_CHROMA_MODE_E eChromaMode;
SA_PHYS_ADDR u64PhyAddr;
SA_U8 *pu8VirAddr;
SA_U32 u32Stride;
// output buffer, needs to be allocated externally and passed in
VENC_USER_BUF_S stUserBuf;
} SA_MEDIA_HEIF_SINGLE_FRAME_INFO_S;
typedef enum {
SA_MEDIA_CAPTURE_SAVE_JPEG = 0,
SA_MEDIA_CAPTURE_SAVE_HEIF = 1,
......@@ -306,6 +332,13 @@ typedef struct {
SA_CHAR astrSaveFilePath[128];
} SA_MEDIA_CAPTURE_SAVE_CONFIG_S;
typedef struct {
SA_BOOL bSaveEnable;
SIZE_S stThumbSize;
SA_MEDIA_CAPTURE_SAVE_FORMAT_E enSaveFormat;
SA_CHAR astrSaveFilePath[128];
} SA_MEDIA_THUMB_SAVE_CONFIG_S;
typedef enum {
SA_MEDIA_RECORD_SAVE_MP4 = 0,
SA_MEDIA_RECORD_SAVE_265 = 1,
......@@ -326,12 +359,14 @@ typedef struct {
SA_BOOL bZSLEnable;
SA_MEDIA_BEAUTY_MODE_S stBeautyCfg;
SA_MEDIA_CAPTURE_SAVE_CONFIG_S stSaveCfg;
SA_MEDIA_THUMB_SAVE_CONFIG_S stThumbCfg;
} SA_MEDIA_CAPTURE_CONFIG_S;
typedef struct {
VI_EIS_MODE_E enEISMode;
SA_MEDIA_AUDIO_CONFIG_S stAudioConfig;
SA_MEDIA_RECORD_SAVE_CONFIG_S stSaveCfg;
SA_MEDIA_THUMB_SAVE_CONFIG_S stThumbCfg;
} SA_MEDIA_RECORD_CONFIG_S;
typedef struct {
......@@ -535,11 +570,13 @@ typedef struct {
SA_BOOL bZSLEnable;
SA_MEDIA_BEAUTY_MODE_S stBeautyCfg;
SA_MEDIA_CAPTURE_SAVE_CONFIG_S stSaveCfg;
SA_MEDIA_THUMB_SAVE_CONFIG_S stThumbCfg;
} SA_MEDIA_CAPTURE_ATTR_S;
typedef struct {
VI_EIS_MODE_E enEISMode;
SA_MEDIA_RECORD_SAVE_CONFIG_S stSaveCfg;
SA_MEDIA_THUMB_SAVE_CONFIG_S stThumbCfg;
} SA_MEDIA_RECORD_ATTR_S;
typedef struct {
......@@ -611,7 +648,7 @@ typedef SA_VOID (*SA_HAPI_DUMPCALLBACK)(SA_MEDIA_DUMP_E, VIDEO_FRAME_INFO_S*);
SA_S32 SA_HAPI_MEDIA_GetAttr(SA_MEDIA_SCENE_E enScene, SA_MEDIA_CONFIG_S *pstSceneConfig, SA_MEDIA_ATTR_S *pstMediaAttr);
SA_S32 SA_HAPI_MEDIA_Start(SA_MEDIA_ATTR_S *pstMediaAttr);
SA_S32 SA_HAPI_MEDIA_Stop(SA_MEDIA_ATTR_S *pstMediaAttr);
SA_S32 SA_HAPI_MEDIA_Capture(SA_U8* pStrSavedFilename);
SA_S32 SA_HAPI_MEDIA_Capture(SA_U8* pStrCaptureFilename, SA_U8* pStrThumbFilename);
SA_S32 SA_HAPI_MEDIA_Record(SA_BOOL bEnable);
SA_S32 SA_HAPI_MEDIA_GetVideoStream(VENC_CHN u32VeChn, VENC_STREAM_S *pstStream, SA_S32 s32MilliSec);
SA_S32 SA_HAPI_MEDIA_ReleaseVideoStream(VENC_CHN u32VeChn, VENC_STREAM_S *pstStream);
......
File mode changed from 100644 to 100755
......@@ -53,6 +53,13 @@ extern "C" {
#define MEDIA_LTM_SIZE_HEIGHT_MAX (2736)
#define MEDIA_GTM_SIZE_WIDTH_ONLINE_MAX (2880)
#define MEDIA_GTM_SIZE_HEIGHT_ONLINE_MAX (1616)
#define MEDIA_VPSS_GROUP (0)
#define MEDIA_VPSS_CHN (1)
#define MEDIA_VPSS_CHN_THUMB (2)
#define MEDIA_VENC_CAPTURE (0)
#define MEDIA_VENC_RECORD (1)
#define MEDIA_VENC_THUMB (2)
typedef enum {
SA_MEDIA_SCENE_CAPTURE = 0,
SA_MEDIA_SCENE_RECORD = 1,
......@@ -295,6 +302,25 @@ typedef struct {
SA_U32 u32Reserve;
} SA_MEDIA_SVP_CONFIG_S;
typedef struct saMEDIA_HEIF_SINGLE_FRAME_INFO_S {
// input-info
SA_U32 u32ChId;
SA_U32 u32PicWidth;
SA_U32 u32PicHeight;
SA_U32 u32EncWidth;
SA_U32 u32EncHeight;
SA_U32 u32SliceQp;
VENC_CHROMA_MODE_E eChromaMode;
SA_PHYS_ADDR u64PhyAddr;
SA_U8 *pu8VirAddr;
SA_U32 u32Stride;
// output buffer, needs to be allocated externally and passed in
VENC_USER_BUF_S stUserBuf;
} SA_MEDIA_HEIF_SINGLE_FRAME_INFO_S;
typedef enum {
SA_MEDIA_CAPTURE_SAVE_JPEG = 0,
SA_MEDIA_CAPTURE_SAVE_HEIF = 1,
......@@ -306,6 +332,13 @@ typedef struct {
SA_CHAR astrSaveFilePath[128];
} SA_MEDIA_CAPTURE_SAVE_CONFIG_S;
typedef struct {
SA_BOOL bSaveEnable;
SIZE_S stThumbSize;
SA_MEDIA_CAPTURE_SAVE_FORMAT_E enSaveFormat;
SA_CHAR astrSaveFilePath[128];
} SA_MEDIA_THUMB_SAVE_CONFIG_S;
typedef enum {
SA_MEDIA_RECORD_SAVE_MP4 = 0,
SA_MEDIA_RECORD_SAVE_265 = 1,
......@@ -326,12 +359,14 @@ typedef struct {
SA_BOOL bZSLEnable;
SA_MEDIA_BEAUTY_MODE_S stBeautyCfg;
SA_MEDIA_CAPTURE_SAVE_CONFIG_S stSaveCfg;
SA_MEDIA_THUMB_SAVE_CONFIG_S stThumbCfg;
} SA_MEDIA_CAPTURE_CONFIG_S;
typedef struct {
VI_EIS_MODE_E enEISMode;
SA_MEDIA_AUDIO_CONFIG_S stAudioConfig;
SA_MEDIA_RECORD_SAVE_CONFIG_S stSaveCfg;
SA_MEDIA_THUMB_SAVE_CONFIG_S stThumbCfg;
} SA_MEDIA_RECORD_CONFIG_S;
typedef struct {
......@@ -535,11 +570,13 @@ typedef struct {
SA_BOOL bZSLEnable;
SA_MEDIA_BEAUTY_MODE_S stBeautyCfg;
SA_MEDIA_CAPTURE_SAVE_CONFIG_S stSaveCfg;
SA_MEDIA_THUMB_SAVE_CONFIG_S stThumbCfg;
} SA_MEDIA_CAPTURE_ATTR_S;
typedef struct {
VI_EIS_MODE_E enEISMode;
SA_MEDIA_RECORD_SAVE_CONFIG_S stSaveCfg;
SA_MEDIA_THUMB_SAVE_CONFIG_S stThumbCfg;
} SA_MEDIA_RECORD_ATTR_S;
typedef struct {
......@@ -611,7 +648,7 @@ typedef SA_VOID (*SA_HAPI_DUMPCALLBACK)(SA_MEDIA_DUMP_E, VIDEO_FRAME_INFO_S*);
SA_S32 SA_HAPI_MEDIA_GetAttr(SA_MEDIA_SCENE_E enScene, SA_MEDIA_CONFIG_S *pstSceneConfig, SA_MEDIA_ATTR_S *pstMediaAttr);
SA_S32 SA_HAPI_MEDIA_Start(SA_MEDIA_ATTR_S *pstMediaAttr);
SA_S32 SA_HAPI_MEDIA_Stop(SA_MEDIA_ATTR_S *pstMediaAttr);
SA_S32 SA_HAPI_MEDIA_Capture(SA_U8* pStrSavedFilename);
SA_S32 SA_HAPI_MEDIA_Capture(SA_U8* pStrCaptureFilename, SA_U8* pStrThumbFilename);
SA_S32 SA_HAPI_MEDIA_Record(SA_BOOL bEnable);
SA_S32 SA_HAPI_MEDIA_GetVideoStream(VENC_CHN u32VeChn, VENC_STREAM_S *pstStream, SA_S32 s32MilliSec);
SA_S32 SA_HAPI_MEDIA_ReleaseVideoStream(VENC_CHN u32VeChn, VENC_STREAM_S *pstStream);
......
......@@ -12,7 +12,7 @@ SA_S32 SA_INNER_MEDIA_CAPTURE_GetAttr(SA_MEDIA_CAPTURE_CONFIG_S *pstSceneConfig,
SA_S32 SA_INNER_MEDIA_CAPTURE_Hevc_Convert_Heif(const HEVC_FRAME_INFO_S *pstInput, HEIF_FRAME_INFO_S *pstOutput);
SA_S32 SA_INNER_MEDIA_CAPTURE_EncodeSingleHeif(SA_MEDIA_HEIF_SINGLE_FRAME_INFO_S *pstHeifFrameInfo, SA_S32 s32MilliSec);
#ifdef __cplusplus
#if __cplusplus
......
......@@ -31,6 +31,7 @@ SA_MEDIA_STATUS_INFO_S g_stMediaStatus = {0};
static SA_BOOL g_bOfflineSendThrQuit = SA_FALSE;
static SA_BOOL g_bHapiRuning = SA_FALSE;
static VIDEO_FRAME_INFO_S g_stVpssFrame = {0};
static VIDEO_FRAME_INFO_S g_stThumbFrame = {0};
static VIDEO_FRAME_INFO_S g_stGdcFrame = {0};
static SA_U32 g_u32VpssEncodeCount = 0;
static SA_MEDIA_ATTR_S g_stMediaAttr = {0};
......@@ -53,10 +54,15 @@ static SA_U32 g_u32CaptureFrameId = 0;
static SA_BOOL g_bCaptureFlag = SA_FALSE;
static SA_U32 g_u32RecordId = 0;
static SA_BOOL g_bRecordFlag = SA_FALSE;
static SA_BOOL g_bCaptureThumbFlag = SA_FALSE;
static SA_BOOL g_bRecordThumbFlag = SA_FALSE;
static SA_BOOL g_bRecordTh = SA_FALSE;
static SA_BOOL g_bAudioTh = SA_FALSE;
static HAPI_MEDIA_THREAD_T g_stRecordTh = {0};
static HAPI_MEDIA_THREAD_T g_stAudioTh = {0};
static HAPI_MEDIA_THREAD_T g_stThumbCaptureTh = {0};
static HAPI_MEDIA_THREAD_T g_stThumbRecordTh = {0};
HAPI_MEDIA_MUTEX_T *g_MediaLock = NULL;
static SA_U32 g_u32StableFrameId = 0;
extern SA_BOOL g_bQuickStart;
static HAPI_MEDIA_THREAD_T g_stDumpThread_RAW = {0};
......@@ -72,6 +78,30 @@ static mp4_h26x_writer_t mp4wr;
static SA_U8 g_u8ViDumpDepth = 1;
#define MEDIA_TIME_SCALE_90KHZ 90000 // 指定一个统一时间刻度
#define MEDAI_TIMEOUT 5000
static SA_CHAR g_strCaptureName[256] = {0};
static SA_CHAR g_strRecordName[256] = {0};
static SA_CHAR g_strThumbName[256] = {0};
// #ifdef __linux__
// static struct timeval g_tv = {0};
// #endif
// static SA_U32 g_u32TimeStart = 0;
// static SA_U32 g_u32TimeEnd = 0;
// static SA_U32 SAMPLE_MEDIA_Timer(SA_U32 *u32TimeStart, SA_U32 *u32TimeEnd)
// {
// SA_U32 u32Duration = 0;
// #ifdef __linux__
// gettimeofday(&g_tv, SA_NULL);
// *u32TimeEnd = g_tv.tv_sec * 1000 + g_tv.tv_usec / 1000;
// #else
// *u32TimeEnd = rt_tick_get();
// #endif
// u32Duration = *u32TimeEnd - *u32TimeStart;
// *u32TimeStart = *u32TimeEnd;
// return u32Duration;
// }
static ssize_t get_nal_size(uint8_t *buf, ssize_t size)
{
ssize_t pos = 3;
......@@ -93,6 +123,32 @@ static int write_callback(int64_t offset, const void *buffer, size_t size, void
return fwrite(buffer, 1, size, f) != size;
}
static SA_S32 write_memory_to_file(const SA_VOID *memory, SA_U32 mem_size, const SA_CHAR *filename, const SA_CHAR *mode)
{
FILE *file = NULL;
if (NULL == memory || NULL == filename || NULL == mode) {
HAPI_MEDIA_LOG_E("input param error, memory=%p, filename=%s, mode=%s", memory, filename, mode);
return SA_ERR_VENC_ILLEGAL_PARAM;
}
file = fopen(filename, mode);
if (file == NULL) {
HAPI_MEDIA_LOG_E("fopen %s error", filename);
return SA_ERR_VENC_NOT_PERM;
}
SA_U32 written = fwrite(memory, 1, mem_size, file);
if (written != mem_size) {
fclose(file);
HAPI_MEDIA_LOG_E("fwrite %s error", filename);
return SA_ERR_VENC_NOT_PERM;
}
fclose(file);
return 0;
}
static SA_S32 INNER_MEDIA_MP4Init(MAPI_AUDIO_SOUND_MODE_E enSoundMode, SA_S32 hevcEn, FILE *fout)
{
HAPI_MEDIA_CHECK_PTR(fout);
......@@ -231,6 +287,210 @@ static SA_S32 INNER_MEDIA_MP4VideoWrite(VENC_PACK_S *pstPack, SA_U32 u32Seq, SA_
return s32Ret;
}
static SA_S32 INNER_MEDIA_ThumbVpssStart(SA_MEDIA_THUMB_SAVE_CONFIG_S *pstThumbCfg)
{
HAPI_MEDIA_CHECK_PTR(pstThumbCfg);
SA_S32 s32Ret = SA_SUCCESS;
SA_U32 u32GrpId = g_stMediaAttr.stVpss.astGroup[0].u32GrpId;
SA_U32 u32ChnId = MEDIA_VPSS_CHN_THUMB;
VPSS_CHN_ATTR_S stChnAttr = {0};
SA_U32 u32Fps = g_stMediaAttr.stVpss.astGroup[0].astChannel[MEDIA_VPSS_CHN].stChnAttr.stFrameRate.u32SrcFrameRate;
stChnAttr.u32OutWidth = pstThumbCfg->stThumbSize.u32Width;
stChnAttr.u32OutHeigth = pstThumbCfg->stThumbSize.u32Height;
stChnAttr.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
stChnAttr.enOutDst = VPSS_MEM_OUT;
stChnAttr.u32Depth = 1;
stChnAttr.u32StrideAlign = 8;
stChnAttr.bCdsRound = SA_FALSE;
stChnAttr.bOsdBypass = SA_FALSE;
stChnAttr.bCgcBypass = SA_TRUE;
stChnAttr.enScaleMode = NSCL_MODE_BINNING_SCALE;
stChnAttr.stFrameRate.u32SrcFrameRate = u32Fps;
stChnAttr.stFrameRate.u32DstFrameRate = u32Fps;
stChnAttr.bMdDataEn = SA_FALSE;
stChnAttr.bRaw2lDataEn = SA_FALSE;
stChnAttr.bTextureDataEn = SA_FALSE;
stChnAttr.bSramEn = SA_FALSE;
stChnAttr.bCacheEn = SA_FALSE;
s32Ret = SA_MAPI_VPSS_CreateChn(u32GrpId, u32ChnId, &stChnAttr);
if (s32Ret != SA_SUCCESS) {
HAPI_MEDIA_LOG_E("SA_MAPI_VPSS_CreateChn failed with %#x\n", s32Ret);
return s32Ret;
}
s32Ret = SA_MAPI_VPSS_StartChn(u32GrpId, u32ChnId);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_MAPI_VPSS_StartChn failed with %#x\n", s32Ret);
s32Ret = SA_MAPI_VPSS_DestroyChn(u32GrpId, u32ChnId);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_MAPI_VPSS_DestroyChn failed with %#x\n", s32Ret);
return s32Ret;
}
return s32Ret;
}
return s32Ret;
}
static SA_S32 INNER_MEDIA_ThumbVpssStop(SA_VOID)
{
SA_S32 s32Ret = SA_SUCCESS;
SA_U32 u32GrpId = g_stMediaAttr.stVpss.astGroup[0].u32GrpId;
SA_U32 u32ChnId = MEDIA_VPSS_CHN_THUMB;
s32Ret = SA_MAPI_VPSS_StopChn(u32GrpId, u32ChnId);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_MAPI_VPSS_StopChn failed with %#x\n", s32Ret);
return s32Ret;
}
s32Ret = SA_MAPI_VPSS_DestroyChn(u32GrpId, u32ChnId);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_MAPI_VPSS_DestroyChn failed with %#x\n", s32Ret);
return s32Ret;
}
return s32Ret;
}
static SA_S32 INNER_MEDIA_EncodeThumb(VIDEO_FRAME_INFO_S *pstFrame, SA_MEDIA_SCENE_E *enScene)
{
SA_S32 s32Ret = SA_SUCCESS;
SA_PHYS_ADDR jpegPhysAddr = 0;
SA_VOID *pVirAddr = SA_NULL;
JPEG_SINGLE_FRAME_INFO_S stFrameinfo = {0};
SA_MEDIA_HEIF_SINGLE_FRAME_INFO_S stHeifFrameInfo = {0};
if (((SA_MEDIA_CAPTURE_SAVE_JPEG == g_stMediaAttr.stCapture.stThumbCfg.enSaveFormat) && (SA_MEDIA_SCENE_CAPTURE == *enScene))
|| ((SA_MEDIA_CAPTURE_SAVE_JPEG == g_stMediaAttr.stRecord.stThumbCfg.enSaveFormat) && (SA_MEDIA_SCENE_RECORD == *enScene))) {
s32Ret =SA_MAPI_SYS_MmzAlloc(&jpegPhysAddr, &pVirAddr, "HAPI MEDIA THUMB", pstFrame->stVFrame.u32Width * pstFrame->stVFrame.u32Height / 2, SA_NULL, 0);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_MAPI_SYS_MmzAlloc failed with %#x\n", s32Ret);
return s32Ret;
}
stFrameinfo.u32ChId = MEDIA_VENC_THUMB;
stFrameinfo.u32PicWidth = pstFrame->stVFrame.u32Width;
stFrameinfo.u32PicHeight = pstFrame->stVFrame.u32Height;
stFrameinfo.u32SliceQp = 80;
stFrameinfo.eChromaMode = CHROMA_MODE_4_2_0;
stFrameinfo.u64LumaPhyAddr = pstFrame->stVFrame.PhyAddr[0];
stFrameinfo.u64ChromaPhyAddr = pstFrame->stVFrame.PhyAddr[1];//uv offset
stFrameinfo.pu8LumaVirAddr = pstFrame->stVFrame.pVirAddr[0];
stFrameinfo.pu8ChromaVirAddr = pstFrame->stVFrame.pVirAddr[1];
stFrameinfo.u32LumaStride = pstFrame->stVFrame.u32Stride[0];
stFrameinfo.u32ChromaStride = pstFrame->stVFrame.u32Stride[1];
stFrameinfo.stUserBuf.u64StrPhyAddr = jpegPhysAddr;
stFrameinfo.stUserBuf.pu8Addr = (SA_U8*)pVirAddr;
stFrameinfo.stUserBuf.u32StrBufLen = pstFrame->stVFrame.u32Width * pstFrame->stVFrame.u32Height / 2;
s32Ret = SA_MAPI_VENC_EncodeSingleJpeg(&stFrameinfo, MEDAI_TIMEOUT);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_MAPI_VENC_EncodeSingleJpeg failed with %#x\n", s32Ret);
goto THUMB_FREE;
}
HAPI_MEDIA_MUTEX_LOCK(g_MediaLock);
s32Ret = write_memory_to_file(stFrameinfo.stUserBuf.pu8Addr, stFrameinfo.stUserBuf.u32StrBufLen, g_strThumbName, "wb");
HAPI_MEDIA_MUTEX_UNLOCK(g_MediaLock);
if (s32Ret != SA_SUCCESS) {
HAPI_MEDIA_LOG_E("write_memory_to_file %s failed with %#x!\n", g_strThumbName, s32Ret);
goto THUMB_FREE;
}
}
if (((SA_MEDIA_CAPTURE_SAVE_HEIF == g_stMediaAttr.stCapture.stThumbCfg.enSaveFormat) && (SA_MEDIA_SCENE_CAPTURE == *enScene))
|| ((SA_MEDIA_CAPTURE_SAVE_HEIF == g_stMediaAttr.stRecord.stThumbCfg.enSaveFormat) && (SA_MEDIA_SCENE_RECORD == *enScene))) {
stHeifFrameInfo.u32ChId = MEDIA_VENC_THUMB;
stHeifFrameInfo.u32PicWidth = pstFrame->stVFrame.u32Width;
stHeifFrameInfo.u32PicHeight = pstFrame->stVFrame.u32Height;
stHeifFrameInfo.u32EncWidth = pstFrame->stVFrame.u32Width;
stHeifFrameInfo.u32EncHeight = pstFrame->stVFrame.u32Height;
stHeifFrameInfo.u32SliceQp = 26;
stHeifFrameInfo.eChromaMode = CHROMA_MODE_4_2_0;
stHeifFrameInfo.u64PhyAddr = pstFrame->stVFrame.PhyAddr[0];
stHeifFrameInfo.pu8VirAddr = pstFrame->stVFrame.pVirAddr[0];
stHeifFrameInfo.u32Stride = pstFrame->stVFrame.u32Stride[0];
stHeifFrameInfo.stUserBuf.u32StrBufLen = pstFrame->stVFrame.u32Width * pstFrame->stVFrame.u32Height / 2;
stHeifFrameInfo.stUserBuf.pu8Addr = malloc(stHeifFrameInfo.stUserBuf.u32StrBufLen);
s32Ret = SA_INNER_MEDIA_CAPTURE_EncodeSingleHeif(&stHeifFrameInfo, MEDAI_TIMEOUT);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_INNER_MEDIA_CAPTURE_EncodeSingleHeif failed with %#x\n", s32Ret);
goto THUMB_FREE;
}
HAPI_MEDIA_MUTEX_LOCK(g_MediaLock);
s32Ret = write_memory_to_file(stHeifFrameInfo.stUserBuf.pu8Addr, stHeifFrameInfo.stUserBuf.u32StrBufLen, g_strThumbName, "wb");
HAPI_MEDIA_MUTEX_UNLOCK(g_MediaLock);
if (s32Ret != SA_SUCCESS) {
HAPI_MEDIA_LOG_E("write_memory_to_file %s failed with %#x!\n", g_strThumbName, s32Ret);
goto THUMB_FREE;
}
}
THUMB_FREE:
if (0 != jpegPhysAddr) {
SA_MAPI_SYS_MmzFree(jpegPhysAddr, pVirAddr);
jpegPhysAddr = 0;
pVirAddr = SA_NULL;
}
if (0 != stHeifFrameInfo.stUserBuf.pu8Addr) {
free(stHeifFrameInfo.stUserBuf.pu8Addr);
stHeifFrameInfo.stUserBuf.pu8Addr = 0;
}
return s32Ret;
}
static SA_VOID INNER_MEDIA_ThumbThread(void* p)
{
SA_S32 s32Ret = SA_SUCCESS;
SA_MEDIA_SCENE_E *enScene = (SA_MEDIA_SCENE_E *)p;
if (*enScene > SA_MEDIA_SCENE_RECORD) {
return;
}
if (SA_MEDIA_SCENE_CAPTURE == *enScene) {
s32Ret = INNER_MEDIA_ThumbVpssStart(&g_stMediaAttr.stCapture.stThumbCfg);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("INNER_MEDIA_ThumbVpssStart no frame found!\n");
return;
}
}
if (SA_MEDIA_SCENE_RECORD == *enScene) {
s32Ret = INNER_MEDIA_ThumbVpssStart(&g_stMediaAttr.stRecord.stThumbCfg);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("INNER_MEDIA_ThumbVpssStart no frame found!\n");
return;
}
}
s32Ret = SA_MAPI_VPSS_GetChnFrame(MEDIA_VPSS_GROUP, MEDIA_VPSS_CHN_THUMB, &g_stThumbFrame, MEDAI_TIMEOUT);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_MAPI_VPSS_GetChnFrame no frame found!\n");
goto THUMB_VPSS_STOP;
}
s32Ret = INNER_MEDIA_EncodeThumb(&g_stThumbFrame, enScene);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("INNER_MEDIA_EncodeThumb no frame found!\n");
}
g_bCaptureThumbFlag = SA_TRUE;
s32Ret = SA_MAPI_VPSS_ReleaseChnFrame(MEDIA_VPSS_GROUP, MEDIA_VPSS_CHN_THUMB, &g_stThumbFrame);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_MAPI_VPSS_ReleaseChnFrame thumb no frame found!\n");
}
THUMB_VPSS_STOP:
s32Ret = INNER_MEDIA_ThumbVpssStop();
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("INNER_MEDIA_ThumbVpssStop failed with %#x!\n", s32Ret);
}
}
static SA_VOID INNER_MEDIA_OFFLINE_SEND_GET_VPSS_Thr(void* p)
{
SA_S32 s32Ret = SA_SUCCESS;
......@@ -251,19 +511,19 @@ static SA_VOID INNER_MEDIA_OFFLINE_SEND_GET_VPSS_Thr(void* p)
s32Ret = SA_MAPI_VPSS_GetChnFrame(u32VpssGrp, u32VpssChn, &g_stVpssFrame, MEDAI_TIMEOUT);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_W("SA_MAPI_VPSS_GetChnFrame no frame found!\n");
HAPI_MEDIA_LOG_E("SA_MAPI_VPSS_GetChnFrame no frame found!\n");
continue;
}
while(g_stVpssFrame.stVFrame.u32Seq < g_u32StableFrameId) {
s32Ret = SA_MAPI_VPSS_ReleaseChnFrame(u32VpssGrp, u32VpssChn, &g_stVpssFrame);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_W("SA_MAPI_VPSS_ReleaseChnFrame failed with %#x!\n", s32Ret);
HAPI_MEDIA_LOG_E("SA_MAPI_VPSS_ReleaseChnFrame failed with %#x!\n", s32Ret);
}
s32Ret = SA_MAPI_VPSS_GetChnFrame(u32VpssGrp, u32VpssChn, &g_stVpssFrame, MEDAI_TIMEOUT);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_W("SA_MAPI_VPSS_GetChnFrame no frame found!\n");
HAPI_MEDIA_LOG_E("SA_MAPI_VPSS_GetChnFrame no frame found!\n");
continue;
}
}
......@@ -285,7 +545,7 @@ static SA_VOID INNER_MEDIA_OFFLINE_SEND_GET_VPSS_Thr(void* p)
// HAPI_MEDIA_LOG_I("##########gdcmode:%d hw:%d*%d,stride:%d\n",stWarpParam.enGdcMode,g_stGdcFrame.stVFrame.u32Width,g_stGdcFrame.stVFrame.u32Height,g_stGdcFrame.stVFrame.u32Stride[0]);
s32Ret = SA_MAPI_VI_WarpProcessFrame(&stWarpParam, &g_stVpssFrame, &g_stGdcFrame, MEDAI_TIMEOUT);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_W("SA_MAPI_VI_WarpProcessFrame failed with %#x!\n", s32Ret);
HAPI_MEDIA_LOG_E("SA_MAPI_VI_WarpProcessFrame failed with %#x!\n", s32Ret);
}
// memcpy(&g_stVpssFrame, &g_stGdcFrame, sizeof(VIDEO_FRAME_INFO_S));
}
......@@ -346,6 +606,16 @@ static SA_VOID INNER_MEDIA_OFFLINE_SEND_GET_VPSS_Thr(void* p)
}
}
// static SA_BOOL bCaptureHeif = SA_TRUE;
// if (bCaptureHeif) {
// bCaptureHeif = SA_FALSE;
// extern SA_S32 SA_INNER_MEDIA_CAPTURE_WriteFileSingleHeic(VIDEO_FRAME_INFO_S *pstInputFrameInfo);
// s32Ret = SA_INNER_MEDIA_CAPTURE_WriteFileSingleHeic(&g_stVpssFrame);
// if (SA_SUCCESS != s32Ret) {
// HAPI_MEDIA_LOG_W("SA_INNER_MEDIA_CAPTURE_WriteFileSingleHeic failed with %#x!\n", s32Ret);
// }
// }
s32Ret = SA_MAPI_VPSS_ReleaseChnFrame(u32VpssGrp, u32VpssChn, &g_stVpssFrame);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_W("SA_MAPI_VPSS_ReleaseChnFrame failed with %#x!\n", s32Ret);
......@@ -376,10 +646,6 @@ static SA_VOID INNER_MEDIA_OFFLINE_SEND_Thr(void* p)
HAPI_MEDIA_LOG_I("hapi venc chn %d offline send thread run, vpss %d:%d\n", u32VencChn, u32VpssGrp, u32VpssChn);
while(SA_FALSE == g_bOfflineSendThrQuit && SA_TRUE == g_bHapiRuning) {
HAPI_MEDIA_SEM_WAIT(&g_OfflineSendThrSem[u32VencChn], HAPI_MEDIA_SEM_WAIT_FOREVER);
// if (SA_FALSE == g_bCaptureFlag && SA_FALSE == g_bRecordFlag) {
// HAPI_MEDIA_LOG_I("Waiting vpss wakeup timeout!\n");
// break;
// }
if (SA_TRUE == g_bOfflineSendThrQuit || SA_FALSE == g_bHapiRuning)
break;
if (g_bHapiRuning) {
......@@ -434,7 +700,7 @@ static SA_VOID INNER_MEDIA_OFFLINE_SEND_Thr(void* p)
// HAPI_MEDIA_LOG_I("VENC Chn %d SendFrameEx\n", u32VencChn);
s32Ret = SA_MAPI_VENC_SendFrameEx(u32VencChn, &stUserFrame);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_W("SA_MAPI_VENC_SendFrameEx failed with %#x!\n", s32Ret);
HAPI_MEDIA_LOG_E("SA_MAPI_VENC_SendFrameEx failed with %#x!\n", s32Ret);
}
} else {
// HAPI_MEDIA_LOG_I("VENC Chn %d SendFrame\n", u32VencChn);
......@@ -448,7 +714,7 @@ static SA_VOID INNER_MEDIA_OFFLINE_SEND_Thr(void* p)
}
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_W("SA_MAPI_VENC_SendFrame[%d] failed with %#x!\n", u32VencChn,s32Ret);
HAPI_MEDIA_LOG_E("SA_MAPI_VENC_SendFrame[%d] failed with %#x!\n", u32VencChn,s32Ret);
}
}
......@@ -539,7 +805,7 @@ static SA_VOID INNER_MEDIA_RecordProc(void* p)
SA_S32 s32Ret = SA_SUCCESS;
SA_S32 s32TimeOut = MEDAI_TIMEOUT;//ms
FILE *fdStream = SA_NULL;
SA_CHAR strName[256] = {0};
// SA_CHAR strName[256] = {0};
VENC_STREAM_S *pstRcordStream = SA_NULL;
VENC_PACK_S *pstPack = SA_NULL;
SA_U32 width = 0;
......@@ -547,13 +813,16 @@ static SA_VOID INNER_MEDIA_RecordProc(void* p)
SA_S32 hvenc = 0;
SA_MEDIA_VENC_CHN_ATTR_S *pstVencChnAttr = (SA_MEDIA_VENC_CHN_ATTR_S *)p;
g_bRecordFlag = SA_TRUE;
g_bRecordThumbFlag = SA_FALSE;
SA_BOOL bIdr = SA_FALSE;
SA_MEDIA_SCENE_E enScene = SA_MEDIA_SCENE_RECORD;
SA_BOOL breqIdr = SA_FALSE;
pstRcordStream = HAPI_MEDIA_MALLOC(sizeof(VENC_STREAM_S));
if (SA_NULL == pstRcordStream) {
HAPI_MEDIA_LOG_E("malloc stream failed!\n");
goto RECORD_FLAG_EXIT;
}
memset(pstRcordStream, 0, sizeof(VENC_STREAM_S));
width = pstVencChnAttr->stChnAttr.stVencAttr.u32EncWidth;
height = pstVencChnAttr->stChnAttr.stVencAttr.u32EncHeight;
......@@ -573,21 +842,36 @@ static SA_VOID INNER_MEDIA_RecordProc(void* p)
g_u32RecordId = rt_tick_get();
#endif
if (SA_TRUE == g_stMediaAttr.stRecord.stThumbCfg.bSaveEnable) {
if (SA_MEDIA_CAPTURE_SAVE_JPEG == g_stMediaAttr.stRecord.stThumbCfg.enSaveFormat) {
sprintf(g_strThumbName, "%s/thumb_%dx%d_%d.%s",g_stMediaAttr.stRecord.stThumbCfg.astrSaveFilePath,g_stMediaAttr.stRecord.stThumbCfg.stThumbSize.u32Width,g_stMediaAttr.stRecord.stThumbCfg.stThumbSize.u32Height,g_u32RecordId,"jpg");
}
else if (SA_MEDIA_CAPTURE_SAVE_HEIF == g_stMediaAttr.stRecord.stThumbCfg.enSaveFormat) {
sprintf(g_strThumbName, "%s/thumb_%dx%d_%d.%s",g_stMediaAttr.stRecord.stThumbCfg.astrSaveFilePath,g_stMediaAttr.stRecord.stThumbCfg.stThumbSize.u32Width,g_stMediaAttr.stRecord.stThumbCfg.stThumbSize.u32Height,g_u32RecordId,"heic");
}
}
if (SA_TRUE == g_stMediaAttr.stRecord.stThumbCfg.bSaveEnable
&& SA_FALSE == g_bRecordThumbFlag) {
HAPI_MEDIA_THREAD_INIT(&g_stThumbRecordTh, "MEDIA_THUMB_RECORD", INNER_MEDIA_ThumbThread, &enScene);
g_bRecordThumbFlag = SA_TRUE;
}
if (SA_TRUE == g_stMediaAttr.stRecord.stSaveCfg.bSaveEnable) {
if (SA_MEDIA_RECORD_SAVE_265 == g_stMediaAttr.stRecord.stSaveCfg.enSaveFormat) {
sprintf(strName, "%s/record_%dx%d_%d.%s",g_stMediaAttr.stRecord.stSaveCfg.astrSaveFilePath,width,height,g_u32RecordId,"h265");
sprintf(g_strRecordName, "%s/record_%dx%d_%d.%s",g_stMediaAttr.stRecord.stSaveCfg.astrSaveFilePath,width,height,g_u32RecordId,"h265");
} else if (SA_MEDIA_RECORD_SAVE_264 == g_stMediaAttr.stRecord.stSaveCfg.enSaveFormat) {
sprintf(strName, "%s/record_%dx%d_%d.%s",g_stMediaAttr.stRecord.stSaveCfg.astrSaveFilePath,width,height,g_u32RecordId,"h264");
sprintf(g_strRecordName, "%s/record_%dx%d_%d.%s",g_stMediaAttr.stRecord.stSaveCfg.astrSaveFilePath,width,height,g_u32RecordId,"h264");
} else if (SA_MEDIA_RECORD_SAVE_JPG == g_stMediaAttr.stRecord.stSaveCfg.enSaveFormat) {
sprintf(strName, "%s/record_%dx%d_%d.%s",g_stMediaAttr.stRecord.stSaveCfg.astrSaveFilePath,width,height,g_u32RecordId,"jpg");
sprintf(g_strRecordName, "%s/record_%dx%d_%d.%s",g_stMediaAttr.stRecord.stSaveCfg.astrSaveFilePath,width,height,g_u32RecordId,"jpg");
} else if (SA_MEDIA_RECORD_SAVE_MP4 == g_stMediaAttr.stRecord.stSaveCfg.enSaveFormat) {
sprintf(strName, "%s/record_%dx%d_%d.%s",g_stMediaAttr.stRecord.stSaveCfg.astrSaveFilePath,width,height,g_u32RecordId,"mp4");
sprintf(g_strRecordName, "%s/record_%dx%d_%d.%s",g_stMediaAttr.stRecord.stSaveCfg.astrSaveFilePath,width,height,g_u32RecordId,"mp4");
} else {
HAPI_MEDIA_LOG_E("record save format not support!\n");
goto RECORD_STREAM_EXIT;
}
HAPI_MEDIA_LOG_I("record save path:%s!\n",strName);
fdStream = fopen(strName, "wb");
HAPI_MEDIA_LOG_I("record save path:%s!\n",g_strRecordName);
fdStream = fopen(g_strRecordName, "wb");
if (fdStream == SA_NULL) {
HAPI_MEDIA_LOG_E("create record file failed!\n");
goto RECORD_STREAM_EXIT;
......@@ -626,20 +910,23 @@ static SA_VOID INNER_MEDIA_RecordProc(void* p)
if (g_u32StableFrameId > 0) {
if (pstRcordStream->u32Seq >= (g_u32StableFrameId - 1)) {
if (pstRcordStream->u32Seq == (g_u32StableFrameId - 1)) {
if (SA_FALSE == breqIdr) {
HAPI_MEDIA_LOG_I("RequestIDR Frameid:%d\n",pstRcordStream->u32Seq);
s32Ret = SA_MAPI_VENC_RequestIDR(pstVencChnAttr->u32ChnId, SA_TRUE);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_MAPI_VENC_RequestIDR failed with %#x\n", s32Ret);
goto RECORD_COLSE_FD;
}
breqIdr = SA_TRUE;
} else {
for (SA_U32 u32Index = 0; u32Index < pstRcordStream->u32PackCount; u32Index++) {
pstPack = &pstRcordStream->pstPack[u32Index];
if (SA_NULL != pstPack->pu8Addr && pstPack->u32Len > 0) {
if (SA_NULL != fdStream) {
if ((pstPack->DataType.enH265EType == H265E_NALU_ISLICE)
|| (pstPack->DataType.enH265EType == H265E_NALU_IDRSLICE)) {
if ((pstPack->DataType.enH265EType == H265E_NALU_IDRSLICE)
|| (pstPack->DataType.enH265EType == H265E_NALU_ISLICE)
|| (pstPack->DataType.enH264EType == H264E_NALU_IDRSLICE)
|| (pstPack->DataType.enH264EType == H264E_NALU_ISLICE)) {
HAPI_MEDIA_LOG_I("IDR Frameid:%d\n",pstRcordStream->u32Seq);
bIdr = SA_TRUE;
}
......@@ -670,11 +957,15 @@ static SA_VOID INNER_MEDIA_RecordProc(void* p)
pstPack = &pstRcordStream->pstPack[u32Index];
if (SA_NULL != pstPack->pu8Addr && pstPack->u32Len > 0) {
if (SA_NULL != fdStream) {
if ((pstPack->DataType.enH265EType == H265E_NALU_ISLICE)
|| (pstPack->DataType.enH265EType == H265E_NALU_IDRSLICE)) {
if (SA_NULL != fdStream) {
if ((pstPack->DataType.enH265EType == H265E_NALU_IDRSLICE)
|| (pstPack->DataType.enH265EType == H265E_NALU_ISLICE)
|| (pstPack->DataType.enH264EType == H264E_NALU_IDRSLICE)
|| (pstPack->DataType.enH264EType == H264E_NALU_ISLICE)) {
HAPI_MEDIA_LOG_I("IDR Frameid:%d\n",pstRcordStream->u32Seq);
bIdr = SA_TRUE;
}
}
if (SA_TRUE == bIdr) {
if (SA_MEDIA_RECORD_SAVE_MP4 == g_stMediaAttr.stRecord.stSaveCfg.enSaveFormat) {
s32Ret = INNER_MEDIA_MP4VideoWrite(pstPack, pstRcordStream->u32Seq, pstVencChnAttr->f32Fps);
......@@ -724,7 +1015,9 @@ RECORD_STREAM_EXIT:
RECORD_FLAG_EXIT:
g_bRecordFlag = SA_FALSE;
if (SA_TRUE == g_bRecordThumbFlag) {
HAPI_MEDIA_THREAD_DEINIT(g_stThumbRecordTh);
}
}
static SA_VOID INNER_MEDIA_AudioProc(void* p)
......@@ -930,7 +1223,7 @@ SA_S32 SA_HAPI_MEDIA_GetAttr(SA_MEDIA_SCENE_E enScene, SA_MEDIA_CONFIG_S *pstSce
}
else if (pstSceneConfig->stCaptureConfig.stSaveCfg.enSaveFormat == SA_MEDIA_CAPTURE_SAVE_HEIF) {
pstSceneConfig->stVideoConfig.astVencConfig[0].enEncodeType = VENC_ENCODE_TYPE_H265;
pstSceneConfig->stVideoConfig.astVencConfig[0].enRcMode = VENC_RC_MODE_VBR;
pstSceneConfig->stVideoConfig.astVencConfig[0].enRcMode = VENC_RC_MODE_CONST_QP;
} else {
HAPI_MEDIA_LOG_E("Unsupport stCaptureConfig.stSaveCfg.enSaveFormat %d!\n", pstSceneConfig->stCaptureConfig.stSaveCfg.enSaveFormat);
return SA_ERR_HAPI_MEDIA_NOT_SUPPORT;
......@@ -1070,64 +1363,8 @@ SA_S32 SA_HAPI_MEDIA_Start(SA_MEDIA_ATTR_S *pstMediaAttr)
}
}
INNER_MEDIA_RGN_Sync(&g_stMediaAttr.stRgn);
// HAPI_MEDIA_LOG_I("#######dropframe:%dms\n",SAMPLE_MEDIA_Timer(&g_u32TimeStart, &g_u32TimeEnd));
// s32Ret = SA_MAPI_ISP_GetVDTimeOut(0, ISP_VD_FE_START, 5000);
// if(SA_SUCCESS == s32Ret) {
// //收敛控制
// if (pstMediaAttr->stVin.stSensorAttr.f32Fps == 0) {
// u32DelayTime = 30;
// } else {
// u32DelayTime = (SA_U32)(1000.0 / pstMediaAttr->stVin.stSensorAttr.f32Fps);
// }
// g_u32StableFrameId = 0;
// if (SA_TRUE == g_bQuickStart) {//更新sensor帧号
// expInfo.u32FrameId = 0;
// while(expInfo.u32FrameId < 1) {
// SA_MAPI_ISP_GetExposureInfo(0, &expInfo);
// HAPI_MEDIA_MDELAY(u32DelayTime);
// }
// g_u32StableFrameId = expInfo.u32FrameId;
// while(g_u32StableFrameId == expInfo.u32FrameId) {
// SA_MAPI_ISP_GetExposureInfo(0, &expInfo);
// HAPI_MEDIA_MDELAY(u32DelayTime);
// }
// g_u32StableFrameId = expInfo.u32FrameId;
// }
// if (SA_FAILURE == pstMediaAttr->stVin.stIspAttr.s8DropFramesNum) {
// SA_BOOL bExpstable = SA_FALSE;
// if (SA_TRUE == g_bQuickStart) {
// HAPI_MEDIA_LOG_I("quickStar frameId:%d\n",expInfo.u32FrameId);
// }
// //ae收敛判断
// while(!bExpstable) {
// INNER_MEDIA_GetExpStatus(&bExpstable);
// HAPI_MEDIA_MDELAY(u32DelayTime);
// }
// //tnr收敛判断
// SA_MAPI_ISP_GetExposureInfo(0, &expInfo);
// HAPI_MEDIA_LOG_I("ae stable frameId:%d\n",expInfo.u32FrameId);
// if ((SA_TRUE == pstMediaAttr->stVin.stIspAttr.stIspAttrAll.stTnrAttr.bEnable)
// && (expInfo.u32FrameId < g_u32StableFrameId + pstMediaAttr->stVin.stIspAttr.stIspAttrAll.stTnrAttr.stInitParam.s32MaxStrength)) {
// g_u32StableFrameId = g_u32StableFrameId + pstMediaAttr->stVin.stIspAttr.stIspAttrAll.stTnrAttr.stInitParam.s32MaxStrength;
// } else {
// g_u32StableFrameId = expInfo.u32FrameId;
// }
// HAPI_MEDIA_LOG_I("isp stable frameId:%d\n",g_u32StableFrameId);
// } else {
// g_u32StableFrameId = pstMediaAttr->stVin.stIspAttr.s8DropFramesNum;
// SA_MAPI_ISP_GetExposureInfo(0, &expInfo);
// while(expInfo.u32FrameId < g_u32StableFrameId) {
// SA_MAPI_ISP_GetExposureInfo(0, &expInfo);
// HAPI_MEDIA_MDELAY(u32DelayTime);
// }
// HAPI_MEDIA_LOG_I("drop frameId:%d\n",g_u32StableFrameId);
// }
// }
// HAPI_MEDIA_LOG_I("#######dropframe:%dms\n",SAMPLE_MEDIA_Timer(&g_u32TimeStart, &g_u32TimeEnd));
g_MediaLock = HAPI_MEDIA_MALLOC(sizeof(HAPI_MEDIA_MUTEX_T));
HAPI_MEDIA_MUTEX_INIT(g_MediaLock);
s32Ret = INNER_MEDIA_OFFLINE_SEND_Start();
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("INNER_MEDIA_OFFLINE_SEND_Start failed with %#x!\n", s32Ret);
......@@ -1153,6 +1390,12 @@ VIDEO_START_SD_FAIL:
HAPI_MEDIA_LOG_E("SA_INNER_HAPI_VENC_Stop failed with %#x!\n", s32Ret);
}
if (NULL != g_MediaLock) {
HAPI_MEDIA_MUTEX_DEINIT(g_MediaLock);
HAPI_MEDIA_FREE(g_MediaLock);
g_MediaLock = NULL;
}
return SA_FAILURE;
}
......@@ -1165,6 +1408,7 @@ SA_S32 SA_HAPI_MEDIA_Stop(SA_MEDIA_ATTR_S *pstMediaAttr)
HAPI_MEDIA_LOG_E("INNER_MEDIA_OFFLINE_SEND_Stop failed with %#x!\n", s32Ret);
return s32Ret;
}
s32Ret = SA_INNER_MEDIA_VIDEO_Stop(pstMediaAttr);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_INNER_MEDIA_VIDEO_Stop failed with %#x!\n", s32Ret);
......@@ -1180,48 +1424,28 @@ SA_S32 SA_HAPI_MEDIA_Stop(SA_MEDIA_ATTR_S *pstMediaAttr)
HAPI_MEDIA_LOG_E("SA_INNER_MEDIA_SD_Stop failed with %#x!\n", s32Ret);
return s32Ret;
}
return s32Ret;
}
static SA_S32 write_memory_to_file(const SA_VOID *memory, SA_U32 mem_size, const SA_CHAR *filename, const SA_CHAR *mode)
{
FILE *file = NULL;
if (NULL == memory || NULL == filename || NULL == mode) {
HAPI_MEDIA_LOG_E("input param error, memory=%p, filename=%s, mode=%s", memory, filename, mode);
return SA_ERR_VENC_ILLEGAL_PARAM;
}
file = fopen(filename, mode);
if (file == NULL) {
HAPI_MEDIA_LOG_E("fopen %s error", filename);
return SA_ERR_VENC_NOT_PERM;
if (NULL != g_MediaLock) {
HAPI_MEDIA_MUTEX_DEINIT(g_MediaLock);
HAPI_MEDIA_FREE(g_MediaLock);
g_MediaLock = NULL;
}
SA_U32 written = fwrite(memory, 1, mem_size, file);
if (written != mem_size) {
fclose(file);
HAPI_MEDIA_LOG_E("fwrite %s error", filename);
return SA_ERR_VENC_NOT_PERM;
}
fclose(file);
return 0;
return s32Ret;
}
SA_S32 SA_HAPI_MEDIA_Capture(SA_U8* pStrSavedFilename)
SA_S32 SA_HAPI_MEDIA_Capture(SA_U8* pStrCaptureFilename, SA_U8* pStrThumbFilename)
{
SA_S32 s32Ret = SA_SUCCESS;
SA_S32 s32TimeOut = MEDAI_TIMEOUT;//ms
SA_CHAR strName[256] = {0};
// SA_CHAR strName[256] = {0};
VENC_STREAM_S *pstCaptureStream = SA_NULL;
VENC_PACK_S *pstPack = SA_NULL;
SA_U32 width = 0;
SA_U32 height = 0;
g_bCaptureFlag = SA_TRUE;
SA_S32 s32VencChnCfg = 0;
SA_MEDIA_SCENE_E enScene = SA_MEDIA_SCENE_CAPTURE;
g_bCaptureFlag = SA_TRUE;
g_bCaptureThumbFlag = SA_FALSE;
if (SA_MEDIA_CAPTURE_SAVE_JPEG != g_stMediaAttr.stCapture.stSaveCfg.enSaveFormat
&& SA_MEDIA_CAPTURE_SAVE_HEIF != g_stMediaAttr.stCapture.stSaveCfg.enSaveFormat) {
......@@ -1262,21 +1486,36 @@ SA_S32 SA_HAPI_MEDIA_Capture(SA_U8* pStrSavedFilename)
if (SA_TRUE == g_stMediaAttr.stCapture.stSaveCfg.bSaveEnable) {
if (SA_MEDIA_CAPTURE_SAVE_JPEG == g_stMediaAttr.stCapture.stSaveCfg.enSaveFormat) {
sprintf(strName, "%s/capture_%dx%d_%d.%s",g_stMediaAttr.stCapture.stSaveCfg.astrSaveFilePath,width,height,g_u32CaptureFrameId,"jpg");
HAPI_MEDIA_LOG_I("capture save path:%s!\n",strName);
sprintf(g_strCaptureName, "%s/capture_%dx%d_%d.%s",g_stMediaAttr.stCapture.stSaveCfg.astrSaveFilePath,width,height,g_u32CaptureFrameId,"jpg");
} else if (SA_MEDIA_CAPTURE_SAVE_HEIF == g_stMediaAttr.stCapture.stSaveCfg.enSaveFormat) {
sprintf(g_strCaptureName, "%s/capture_%dx%d_%d.%s",g_stMediaAttr.stCapture.stSaveCfg.astrSaveFilePath,width,height,g_u32CaptureFrameId,"heic");
}
if (SA_NULL != pStrCaptureFilename) {
strcpy((SA_CHAR *)pStrCaptureFilename, g_strCaptureName);
}
else if (SA_MEDIA_CAPTURE_SAVE_HEIF == g_stMediaAttr.stCapture.stSaveCfg.enSaveFormat) {
sprintf(strName, "%s/capture_%dx%d_%d.%s",g_stMediaAttr.stCapture.stSaveCfg.astrSaveFilePath,width,height,g_u32CaptureFrameId,"heic");
}
if (SA_NULL != pStrSavedFilename)
if (SA_TRUE == g_stMediaAttr.stCapture.stThumbCfg.bSaveEnable) {
if (SA_MEDIA_CAPTURE_SAVE_JPEG == g_stMediaAttr.stCapture.stThumbCfg.enSaveFormat) {
sprintf(g_strThumbName, "%s/thumb_%dx%d_%d.%s",g_stMediaAttr.stCapture.stThumbCfg.astrSaveFilePath,g_stMediaAttr.stCapture.stThumbCfg.stThumbSize.u32Width,g_stMediaAttr.stCapture.stThumbCfg.stThumbSize.u32Height,g_u32CaptureFrameId,"jpg");
}
else if (SA_MEDIA_CAPTURE_SAVE_HEIF == g_stMediaAttr.stCapture.stThumbCfg.enSaveFormat) {
sprintf(g_strThumbName, "%s/thumb_%dx%d_%d.%s",g_stMediaAttr.stCapture.stThumbCfg.astrSaveFilePath,g_stMediaAttr.stCapture.stThumbCfg.stThumbSize.u32Width,g_stMediaAttr.stCapture.stThumbCfg.stThumbSize.u32Height,g_u32CaptureFrameId,"heic");
}
if (SA_NULL != pStrThumbFilename)
{
strcpy((SA_CHAR *)pStrSavedFilename, strName);
strcpy((SA_CHAR *)pStrThumbFilename, g_strThumbName);
}
}
pstCaptureStream->u32PackCount = SA_MEDIA_PACK_NUM_MAX;
if (SA_TRUE == g_stMediaAttr.stCapture.stThumbCfg.bSaveEnable
&& SA_FALSE == g_bCaptureThumbFlag) {
HAPI_MEDIA_THREAD_INIT(&g_stThumbCaptureTh, "MEDIA_THUMB_CAPTURE", INNER_MEDIA_ThumbThread, &enScene);
g_bCaptureThumbFlag = SA_TRUE;
}
pstCaptureStream->u32PackCount = SA_MEDIA_PACK_NUM_MAX;
s32Ret = SA_INNER_MEDIA_GetVideoStream(g_stMediaAttr.stVenc.astChannel[s32VencChnCfg].u32ChnId, pstCaptureStream, s32TimeOut);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_HAPI_MEDIA_GetVideoStream(%d) failed with %#x!\n", g_stMediaAttr.stVenc.astChannel[s32VencChnCfg].u32ChnId, s32Ret);
......@@ -1302,13 +1541,15 @@ SA_S32 SA_HAPI_MEDIA_Capture(SA_U8* pStrSavedFilename)
HAPI_MEDIA_LOG_E("%s %d malloc %d failed!\n", __func__, __LINE__, stOutput.u32DataLen);
} else {
memset(stOutput.pucData, 0, stOutput.u32DataLen);
HAPI_MEDIA_MUTEX_LOCK(g_MediaLock);
s32Ret = SA_INNER_MEDIA_CAPTURE_Hevc_Convert_Heif(&stInput, &stOutput);
HAPI_MEDIA_MUTEX_UNLOCK(g_MediaLock);
if (s32Ret != SA_SUCCESS) {
HAPI_MEDIA_LOG_I("SA_MAPI_Hevc_Convert_Heif failed with %#x!\n", s32Ret);
} else {
s32Ret = write_memory_to_file(stOutput.pucData, stOutput.u32DataLen, strName, "wb");
s32Ret = write_memory_to_file(stOutput.pucData, stOutput.u32DataLen, g_strCaptureName, "wb");
if (s32Ret != SA_SUCCESS) {
HAPI_MEDIA_LOG_E("write_memory_to_file %s failed with %#x!\n", strName, s32Ret);
HAPI_MEDIA_LOG_E("write_memory_to_file %s failed with %#x!\n", g_strCaptureName, s32Ret);
goto CAPTURE_RELEASE_STREAM;
}
}
......@@ -1317,9 +1558,11 @@ SA_S32 SA_HAPI_MEDIA_Capture(SA_U8* pStrSavedFilename)
}
}
} else {
s32Ret = write_memory_to_file(pstPack->pu8Addr, pstPack->u32Len, strName, "wb");
HAPI_MEDIA_MUTEX_LOCK(g_MediaLock);
s32Ret = write_memory_to_file(pstPack->pu8Addr, pstPack->u32Len, g_strCaptureName, "wb");
HAPI_MEDIA_MUTEX_UNLOCK(g_MediaLock);
if (s32Ret != SA_SUCCESS) {
HAPI_MEDIA_LOG_E("write_memory_to_file %s failed with %#x!\n", strName, s32Ret);
HAPI_MEDIA_LOG_E("write_memory_to_file %s failed with %#x!\n", g_strCaptureName, s32Ret);
goto CAPTURE_RELEASE_STREAM;
}
}
......@@ -1347,6 +1590,10 @@ CAPTURE_STREAM_EXIT:
CAPTURE_FLAG_EXIT:
g_bCaptureFlag = SA_FALSE;
if (SA_TRUE == g_bCaptureThumbFlag) {
HAPI_MEDIA_THREAD_DEINIT(g_stThumbCaptureTh);
}
return s32Ret;
}
......
......@@ -6,7 +6,7 @@ extern "C" {
#include "sa_hapi_media.h"
#include "sa_inner_hapi_media_comm.h"
#include "sa_mapi_venc.h"
SA_S32 SA_INNER_MEDIA_CAPTURE_GetAttr(SA_MEDIA_CAPTURE_CONFIG_S *pstSceneConfig, SA_MEDIA_ATTR_S *pstMediaAttr)
{
SA_S32 s32Ret = SA_SUCCESS;
......@@ -19,7 +19,7 @@ SA_S32 SA_INNER_MEDIA_CAPTURE_GetAttr(SA_MEDIA_CAPTURE_CONFIG_S *pstSceneConfig,
pstMediaAttr->stCapture.bZSLEnable = pstSceneConfig->bZSLEnable;
memcpy(&pstMediaAttr->stCapture.stBeautyCfg, &pstSceneConfig->stBeautyCfg, sizeof(SA_MEDIA_BEAUTY_MODE_S));
memcpy(&pstMediaAttr->stCapture.stSaveCfg, &pstSceneConfig->stSaveCfg, sizeof(SA_MEDIA_CAPTURE_SAVE_CONFIG_S));
memcpy(&pstMediaAttr->stCapture.stThumbCfg, &pstSceneConfig->stThumbCfg, sizeof(SA_MEDIA_THUMB_SAVE_CONFIG_S));
return s32Ret;
}
......@@ -32,23 +32,7 @@ typedef struct {
SA_U8* buffer;
} StreamBuffer;
#if 0
static void write_uint64_be(StreamBuffer* fp, SA_U64 value)
{
SA_U8 bytes[8];
bytes[0] = (value >> 56) & 0xFF;
bytes[1] = (value >> 48) & 0xFF;
bytes[2] = (value >> 40) & 0xFF;
bytes[3] = (value >> 32) & 0xFF;
bytes[4] = (value >> 24) & 0xFF;
bytes[5] = (value >> 16) & 0xFF;
bytes[6] = (value >> 8) & 0xFF;
bytes[7] = value & 0xFF;
memcpy(fp->buffer + fp->pos, bytes, 8);
fp->len += 8;
fp->pos += 8;
}
#endif
static void write_uint32_be(StreamBuffer* fp, SA_U32 value)
{
......@@ -59,11 +43,6 @@ static void write_uint32_be(StreamBuffer* fp, SA_U32 value)
bytes[3] = value & 0xFF;
memcpy(fp->buffer + fp->pos, bytes, 4);
// HAPI_MEDIA_LOG_I("%s %d, fp->pos:%d\n", __func__, __LINE__, fp->pos);
// for (int i = 0; i < 4; i++) {
// HAPI_MEDIA_LOG_I("%s %d %d %x %x\n", __func__, __LINE__, i, bytes[i], *(fp->buffer + fp->pos + i));
// }
fp->len += 4;
fp->pos += 4;
}
......@@ -76,11 +55,6 @@ static void write_uint16_be(StreamBuffer* fp, SA_U16 value)
bytes[1] = value & 0xFF;
memcpy(fp->buffer + fp->pos, bytes, 2);
// HAPI_MEDIA_LOG_I("%s %d, fp->pos:%d\n", __func__, __LINE__, fp->pos);
// for (int i = 0; i < 2; i++) {
// HAPI_MEDIA_LOG_I("%s %d %d %x %x\n", __func__, __LINE__, i, bytes[i], *(fp->buffer + fp->pos + i));
// }
fp->len += 2;
fp->pos += 2;
}
......@@ -148,17 +122,24 @@ static void update_box_size(StreamBuffer* fp, SA_U32 pos)
static void write_ftyp_box(StreamBuffer* fp)
{
SA_U32 box_size = 20;
SA_U32 box_size = 32;
SA_CHAR box_type[5] = "ftyp";
SA_CHAR major_brand[5] = "mif1";
SA_CHAR heic_type[5] = "heic";
SA_U32 minor_version = 0;
SA_CHAR compatible_brands[5] = "mif1";
SA_CHAR miaf_type[5] = "miaf";
SA_CHAR MiHB_type[5] = "MiHB";
write_uint32_be(fp, box_size);
write_bytes(fp, box_type, 4);
write_bytes(fp, major_brand, 4);
write_bytes(fp, heic_type, 4);
write_uint32_be(fp, minor_version);
write_bytes(fp, compatible_brands, 4);
write_bytes(fp, heic_type, 4);
write_bytes(fp, miaf_type, 4);
write_bytes(fp, MiHB_type, 4);
}
......@@ -171,13 +152,13 @@ static void write_hdlr_box(StreamBuffer* fp)
SA_U32 flags = 0;
SA_CHAR handler_type[5] = "pict";
SA_U32 reserved[3] = { 0 };
SA_CHAR name[] = "GPAC pict Handler";
// SA_CHAR name[] = "acme pict Handler";
write_uint32_be(fp, flags);
write_bytes(fp, handler_type, 4);
for (SA_S32 i = 0; i < 3; i++)
write_uint32_be(fp, reserved[i]);
write_bytes(fp, name, (SA_S32)strlen(name) + 1);
// write_bytes(fp, (SA_U8 *)name, (int)strlen(name) + 1);
update_box_size(fp, pos);
}
......@@ -211,7 +192,7 @@ static void write_iloc_box(StreamBuffer* fp)
SA_U16 item_count = 1;
SA_U16 item_id = 1;
// SA_U16 construction_method = 0;
SA_U16 data_reference_index = 0;
SA_U32 base_offset = 0;
SA_U16 extent_count = 1;
......@@ -366,7 +347,8 @@ static void write_hvcC_box(StreamBuffer* fp, SA_S32 count, SA_U8** nal, SA_S32*
}
static void write_pixi_box(StreamBuffer* fp) {
static void write_pixi_box(StreamBuffer* fp)
{
SA_U32 pos = get_cur_pos(fp);
write_box_header(fp, "pixi", 0, 0);
......@@ -382,7 +364,8 @@ static void write_pixi_box(StreamBuffer* fp) {
}
static void write_ipco_box(StreamBuffer* fp, SA_S32 width, SA_S32 height, SA_S32 count, SA_U8** nal, SA_S32* size) {
static void write_ipco_box(StreamBuffer* fp, SA_S32 width, SA_S32 height, SA_S32 count, SA_U8** nal, SA_S32* size)
{
SA_U32 pos = get_cur_pos(fp);
write_box(fp, "ipco");
......@@ -396,7 +379,8 @@ static void write_ipco_box(StreamBuffer* fp, SA_S32 width, SA_S32 height, SA_S32
}
static void write_ipma_box(StreamBuffer* fp) {
static void write_ipma_box(StreamBuffer* fp)
{
SA_U32 pos = get_cur_pos(fp);
write_box_header(fp, "ipma", 0, 0);
......@@ -418,7 +402,8 @@ static void write_ipma_box(StreamBuffer* fp) {
}
static void write_iprp_box(StreamBuffer* fp, SA_S32 width, SA_S32 height, SA_S32 count, SA_U8** nal, SA_S32* size) {
static void write_iprp_box(StreamBuffer* fp, SA_S32 width, SA_S32 height, SA_S32 count, SA_U8** nal, SA_S32* size)
{
SA_U32 pos = get_cur_pos(fp);
write_box(fp, "iprp");
......@@ -430,7 +415,8 @@ static void write_iprp_box(StreamBuffer* fp, SA_S32 width, SA_S32 height, SA_S32
}
static void write_meta_box(StreamBuffer* fp, SA_S32 width, SA_S32 height, SA_S32 count, SA_U8** nal, SA_S32* size) {
static void write_meta_box(StreamBuffer* fp, SA_S32 width, SA_S32 height, SA_S32 count, SA_U8** nal, SA_S32* size)
{
SA_U32 pos = get_cur_pos(fp);
SA_U32 box_size = 12;
......@@ -451,13 +437,13 @@ static void write_meta_box(StreamBuffer* fp, SA_S32 width, SA_S32 height, SA_S32
}
static void write_mdat_box(StreamBuffer* fp, SA_U8* nal, SA_S32 size) {
static void write_mdat_box(StreamBuffer* fp, SA_U8* nal, SA_S32 size)
{
SA_U32 pos = get_cur_pos(fp);
write_box(fp, "mdat");
SA_U32 base_offset = 0;
// SA_U8 base_offset_size = 4;
base_offset = fp->pos;
fp->pos = g_base_offset_pos;
......@@ -559,8 +545,8 @@ SA_S32 SA_INNER_MEDIA_CAPTURE_Hevc_Convert_Heif(const HEVC_FRAME_INFO_S *pstInpu
}
}
SA_S32 width = pstInput->u32Width; // 640
SA_S32 height = pstInput->u32Height; // 360
SA_S32 width = pstInput->u32Width;
SA_S32 height = pstInput->u32Height;
SA_U8* nal[128] = { NULL };
SA_S32 nal_size[128] = { 0 };
......@@ -590,10 +576,193 @@ SA_S32 SA_INNER_MEDIA_CAPTURE_Hevc_Convert_Heif(const HEVC_FRAME_INFO_S *pstInpu
convert_hevc2heic(&buffer, width, height, nal_count, nal, nal_size);
pstOutput->u32DataLen = buffer.len;
HAPI_MEDIA_LOG_I("convert_hevc2heic done!\n");
HAPI_MEDIA_LOG_I("Hevc_Convert_Heif done!\n");
return s32Ret;
}
// #define HEIF_DEBUG
#ifdef HEIF_DEBUG
static SA_S32 write_memory_to_file(const SA_VOID *memory, SA_U32 mem_size, const SA_CHAR *filename, const SA_CHAR *mode)
{
FILE *file = NULL;
if (NULL == memory || NULL == filename || NULL == mode) {
HAPI_MEDIA_LOG_E("input param error, memory=%p, filename=%s, mode=%s", memory, filename, mode);
return SA_ERR_VENC_ILLEGAL_PARAM;
}
file = fopen(filename, mode);
if (file == NULL) {
HAPI_MEDIA_LOG_E("fopen %s error", filename);
return SA_ERR_VENC_NOT_PERM;
}
SA_U32 written = fwrite(memory, 1, mem_size, file);
if (written != mem_size) {
fclose(file);
HAPI_MEDIA_LOG_E("fwrite %s error", filename);
return SA_ERR_VENC_NOT_PERM;
}
fclose(file);
return 0;
}
#endif
extern HAPI_MEDIA_MUTEX_T *g_MediaLock;
SA_S32 SA_INNER_MEDIA_CAPTURE_EncodeSingleHeif(SA_MEDIA_HEIF_SINGLE_FRAME_INFO_S *pstHeifFrameInfo, SA_S32 s32MilliSec)
{
SA_S32 ch, ret;
VENC_CHN_ATTR_S stAttr = {
.stRcAttr.eRcMode = VENC_RC_MODE_CONST_QP,
.stRcAttr.stConstQp.u8FrameRate = 1,
.stRcAttr.stConstQp.u8SliceQP = pstHeifFrameInfo->u32SliceQp,
.stVencAttr.eEncType = VENC_ENCODE_TYPE_H265,
.stVencAttr.eChromaMode = pstHeifFrameInfo->eChromaMode,
.stVencAttr.eWorkMode = VENC_WORK_MODE_OFFLINE_SEND,
.stVencAttr.u32PicWidth = pstHeifFrameInfo->u32PicWidth,
.stVencAttr.u32PicHeight = pstHeifFrameInfo->u32PicHeight,
.stVencAttr.u32EncWidth = pstHeifFrameInfo->u32EncWidth,
.stVencAttr.u32EncHeight = pstHeifFrameInfo->u32EncHeight,
.stGopAttr.enGopMode = VENC_GOPMODE_DEFAULT,
.stGopAttr.stDefaultGop.u16GopLen = 0,
.stGopAttr.stDefaultGop.u16FreqIDR = 0,
};
VIDEO_FRAME_INFO_S stFrmInfo = {
.stVFrame.u32Width = pstHeifFrameInfo->u32EncWidth,
.stVFrame.u32Height = pstHeifFrameInfo->u32EncHeight,
.stVFrame.PhyAddr[0] = pstHeifFrameInfo->u64PhyAddr,
.stVFrame.pVirAddr[0] = pstHeifFrameInfo->pu8VirAddr,
.stVFrame.u32Stride[0] = pstHeifFrameInfo->u32Stride,
.stVFrame.u32Seq = 0,
.stVFrame.u64PTS = 1,
.stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420,
};
if (CHROMA_MODE_4_0_0 == pstHeifFrameInfo->eChromaMode) {
stFrmInfo.stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_400;
} else if (CHROMA_MODE_4_0_0 == pstHeifFrameInfo->eChromaMode) {
stFrmInfo.stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_422;
}
VENC_PACK_S pack = {0};
VENC_STREAM_S stream_info = {
.u32PackCount = 1,
.pstPack = &pack,
};
if (0 == pstHeifFrameInfo->stUserBuf.u32StrBufLen){
HAPI_MEDIA_LOG_E("stUserBuf.u32StrBufLen is 0");
ret = SA_ERR_VENC_ILLEGAL_PARAM;
goto exit;
}
if (pstHeifFrameInfo->u32ChId >= VENC_MAX_VENC_CHN){
HAPI_MEDIA_LOG_E("u32ChId:%d >= 4.", pstHeifFrameInfo->u32ChId);
ret = SA_ERR_VENC_ILLEGAL_PARAM;
goto exit;
}
ch = pstHeifFrameInfo->u32ChId;
ret = SA_MAPI_VENC_CreateChn(ch, &stAttr);
if (SA_SUCCESS != ret){
goto exit;
}
ret = SA_MAPI_VENC_SendFrame(ch, &stFrmInfo);
if (SA_SUCCESS != ret){
goto send_fail;
}
ret = SA_MAPI_VENC_GetStream(ch, &stream_info, s32MilliSec);
if (SA_SUCCESS != ret){
goto get_fail;
}
HEVC_FRAME_INFO_S stInput = {0};
stInput.pucData = stream_info.pstPack[0].pu8Addr;
stInput.u32DataLen = stream_info.pstPack[0].u32Len;
stInput.u32Width = stAttr.stVencAttr.u32EncWidth;
stInput.u32Height = stAttr.stVencAttr.u32EncHeight;
#ifdef HEIF_DEBUG
SA_CHAR strName[256] = {0};
sprintf(strName, "/mnt/sdcard/capture_%dx%d.h265", stAttr.stVencAttr.u32EncWidth, stAttr.stVencAttr.u32EncHeight);
write_memory_to_file(stInput.pucData, stInput.u32DataLen, strName, "wb"); // "ab");
#endif
HEIF_FRAME_INFO_S stOutput = {0};
stOutput.u32DataLen = pstHeifFrameInfo->stUserBuf.u32StrBufLen;
stOutput.pucData = pstHeifFrameInfo->stUserBuf.pu8Addr;
HAPI_MEDIA_MUTEX_LOCK(g_MediaLock);
ret = SA_INNER_MEDIA_CAPTURE_Hevc_Convert_Heif(&stInput, &stOutput);
HAPI_MEDIA_MUTEX_UNLOCK(g_MediaLock);
pstHeifFrameInfo->stUserBuf.u32StrBufLen = stOutput.u32DataLen;
ret = SA_MAPI_VENC_ReleaseStream(ch, &stream_info);
if (SA_SUCCESS != ret){
goto get_fail;
}
SA_MAPI_VENC_DestroyChn(ch);
return ret;
get_fail:
send_fail:
SA_MAPI_VENC_DestroyChn(ch);
exit:
return ret;
}
#ifdef HEIF_DEBUG
SA_S32 SA_INNER_MEDIA_CAPTURE_WriteFileSingleHeic(VIDEO_FRAME_INFO_S *pstInputFrameInfo)
{
SA_S32 s32Ret = SA_SUCCESS;
SA_MEDIA_HEIF_SINGLE_FRAME_INFO_S stHeifFrameInfo = {0};
VIDEO_FRAME_INFO_S *pstFrameInfo = pstInputFrameInfo;
stHeifFrameInfo.u32ChId = 3;
stHeifFrameInfo.u32PicWidth = pstFrameInfo->stVFrame.u32Width;
stHeifFrameInfo.u32PicHeight = pstFrameInfo->stVFrame.u32Height;
stHeifFrameInfo.u32EncWidth = pstFrameInfo->stVFrame.u32Width;
stHeifFrameInfo.u32EncHeight = pstFrameInfo->stVFrame.u32Height;
stHeifFrameInfo.u32SliceQp = 26;
stHeifFrameInfo.eChromaMode = CHROMA_MODE_4_2_0;
stHeifFrameInfo.u64PhyAddr = pstFrameInfo->stVFrame.PhyAddr[0];
stHeifFrameInfo.pu8VirAddr = pstFrameInfo->stVFrame.pVirAddr[0];
stHeifFrameInfo.u32Stride = pstFrameInfo->stVFrame.u32Stride[0];
stHeifFrameInfo.stUserBuf.u32StrBufLen = pstFrameInfo->stVFrame.u32Width * pstFrameInfo->stVFrame.u32Height / 2;
stHeifFrameInfo.stUserBuf.pu8Addr = malloc(stHeifFrameInfo.stUserBuf.u32StrBufLen);
s32Ret = SA_INNER_MEDIA_CAPTURE_EncodeSingleHeif(&stHeifFrameInfo, 1000);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_MAPI_VENC_EncodeSingleHeif failed with %#x!\n", s32Ret);
} else {
SA_CHAR strName[256] = {0};
sprintf(strName, "/mnt/sdcard/capture_%dx%d.heic", stHeifFrameInfo.u32EncWidth, stHeifFrameInfo.u32EncHeight);
s32Ret = write_memory_to_file(stHeifFrameInfo.stUserBuf.pu8Addr, stHeifFrameInfo.stUserBuf.u32StrBufLen, strName, "wb"); // "ab");
if (s32Ret != SA_SUCCESS) {
HAPI_MEDIA_LOG_E("write_memory_to_file %s failed with %#x!\n", strName, s32Ret);
}
}
free(stHeifFrameInfo.stUserBuf.pu8Addr);
return s32Ret;
}
#endif
......
......@@ -14,6 +14,7 @@ SA_S32 SA_INNER_MEDIA_RECORD_GetAttr(SA_MEDIA_RECORD_CONFIG_S *pstSceneConfig, S
pstMediaAttr->stRecord.enEISMode = pstSceneConfig->enEISMode;
memcpy(&pstMediaAttr->stRecord.stSaveCfg, &pstSceneConfig->stSaveCfg, sizeof(SA_MEDIA_RECORD_SAVE_CONFIG_S));
memcpy(&pstMediaAttr->stRecord.stThumbCfg, &pstSceneConfig->stThumbCfg, sizeof(SA_MEDIA_THUMB_SAVE_CONFIG_S));
return s32Ret;
}
......
......@@ -553,7 +553,12 @@ SA_S32 INNER_MEDIA_RGN_GetConfig(SA_MEDIA_VIDEO_CONFIG_S *pstSceneConfig, SA_MED
for (j = 0; j < SA_MEDIA_RGN_CHN_MAX; j++) {
pstRegion = &pstVencConfig->astRegion[j];
if (SA_TRUE == pstRegion->bEnable) {
if (VENC_ENCODE_TYPE_JPEG == pstVencChnAttr->stChnAttr.stVencAttr.eEncType) {
pstRgnAttr->astChannel[u32RgnId].bEnable = SA_FALSE;
HAPI_MEDIA_LOG_W("JPEG does not support OSD \n");
} else {
pstRgnAttr->astChannel[u32RgnId].bEnable = SA_TRUE;
}
pstRgnAttr->astChannel[u32RgnId].u32HandleId = u32RgnId;
pstRgnAttr->astChannel[u32RgnId].stRect = pstRegion->stRect;
pstRgnAttr->astChannel[u32RgnId].enType = pstRegion->enType;
......
......@@ -40,11 +40,6 @@ VI_GDC_ATTR_S MEDIA_GDC_PARAM_DEFAULT =
},
};
#define MEDIA_VPSS_CHN (1)
#define MEDIA_VPSS_CHN_THUMB (2)
#define MEDIA_VENC_CAPTURE (0)
#define MEDIA_VENC_RECORD (1)
#ifndef MEDIA_ALIGN_UP
#define MEDIA_ALIGN_UP(x, a) ((((x) + ((a) - 1)) / a) * a)
#endif
......
......@@ -973,6 +973,15 @@ int Inner_Hapi_IcrManualProcess(int isp_pipe) {
HAPI_MUTEX_T g_MutexSei[ISP_DEV_MAX] = {0};
int Inner_Hapi_IcrSdCreat(int isp_pipe)
{
if(NULL == g_stIcrIspExtObj[isp_pipe].pfn_sns_ispext_seticr) {
SA_SNS_ITEM SnsItem = {0};
if(SA_SUCCESS == SA_MAPI_SNS_GetSnsObj(isp_pipe*2, &SnsItem)) {
g_stIcrIspExtObj[isp_pipe].pfn_sns_ispext_sns_rst = SnsItem.pstSnsObj->pstIspExtObj->pfn_sns_ispext_sns_rst;
g_stIcrIspExtObj[isp_pipe].pfn_sns_ispext_seticr = SnsItem.pstSnsObj->pstIspExtObj->pfn_sns_ispext_seticr;
g_stIcrIspExtObj[isp_pipe].pfn_sns_ispext_setlamp = SnsItem.pstSnsObj->pstIspExtObj->pfn_sns_ispext_setlamp;
}
}
if (g_nightMode[isp_pipe] == ICR_NIGHTMODE_BLACK && g_curIcrMode[isp_pipe] == ICR_NIGHT_BLACKWHITE)
isp_icr_ctrl(isp_pipe, ICR_OFF); //黑白夜视模式下如果icr初始值为Night, 初始化状态从黑白开始
else
......@@ -2889,7 +2898,7 @@ static void Inner_Hapi_SD_Thread(void* arg)
isp_pipe = *(int*)arg;
HAPI_LOG_I("Inner_Hapi_SD_Thread Start! isppipe:%d\n",isp_pipe);
usleep(200000);
Inner_Hapi_IcrSdCreat(isp_pipe);
while(g_bSdStart[isp_pipe]){
// HAPI_LOG_I("wpl @@@@@@@@g_hold[%d]@@@@@@@@@@\n",g_hold[isp_pipe]);
while(g_hold[isp_pipe]) {
......@@ -2914,6 +2923,11 @@ static void Inner_Hapi_SD_Thread(void* arg)
i = 0;
continue;
}
if (SA_FALSE == g_bIcrSdCreated[isp_pipe]) {
Inner_Hapi_IcrSdCreat(isp_pipe);//运行一次
}
if(SA_SUCCESS == s32Ret) {
SA_MAPI_ISP_GetExposureInfo(isp_pipe, &expInfo);
......
......@@ -727,10 +727,17 @@ SA_S32 SAMPLE_MEDIA_Load_Config(const SA_CHAR *strConfigFile)
if (SA_TRUE == pstCaptureConfig->stBeautyCfg.bBeautyEnable) {
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstCapture, "Strength", &pstCaptureConfig->stBeautyCfg.u8Strength, 50));
}
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstCapture, "SaveEnable", &pstCaptureConfig->stSaveCfg.bSaveEnable, SA_TRUE));
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstCapture, "CaptureEnable", &pstCaptureConfig->stSaveCfg.bSaveEnable, SA_FALSE));
if (SA_TRUE == pstCaptureConfig->stSaveCfg.bSaveEnable) {
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstCapture, "SaveFormat", &pstCaptureConfig->stSaveCfg.enSaveFormat, SA_MEDIA_CAPTURE_SAVE_JPEG));
MEDIA_JSON_NODE_ASSERT(saJSON_GetString(pstCapture, "SaveFilePath", pstCaptureConfig->stSaveCfg.astrSaveFilePath, SA_TRUE));
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstCapture, "CaptureFormat", &pstCaptureConfig->stSaveCfg.enSaveFormat, SA_MEDIA_CAPTURE_SAVE_JPEG));
MEDIA_JSON_NODE_ASSERT(saJSON_GetString(pstCapture, "CaptureFilePath", pstCaptureConfig->stSaveCfg.astrSaveFilePath, SA_TRUE));
}
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstCapture, "ThumbEnable", &pstCaptureConfig->stThumbCfg.bSaveEnable, SA_FALSE));
if (SA_TRUE == pstCaptureConfig->stThumbCfg.bSaveEnable) {
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstCapture, "ThumbWidth", &pstCaptureConfig->stThumbCfg.stThumbSize.u32Width, 1920));
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstCapture, "ThumbHeight", &pstCaptureConfig->stThumbCfg.stThumbSize.u32Height, 1080));
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstCapture, "ThumbFormat", &pstCaptureConfig->stThumbCfg.enSaveFormat, SA_MEDIA_CAPTURE_SAVE_JPEG));
MEDIA_JSON_NODE_ASSERT(saJSON_GetString(pstCapture, "ThumbFilePath", pstCaptureConfig->stThumbCfg.astrSaveFilePath, SA_TRUE));
}
//end of capture
......@@ -749,10 +756,17 @@ SA_S32 SAMPLE_MEDIA_Load_Config(const SA_CHAR *strConfigFile)
}
}
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstRecord, "SaveEnable", &pstRecordConfig->stSaveCfg.bSaveEnable, SA_TRUE));
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstRecord, "RecordEnable", &pstRecordConfig->stSaveCfg.bSaveEnable, SA_TRUE));
if (SA_TRUE == pstRecordConfig->stSaveCfg.bSaveEnable) {
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstRecord, "SaveFormat", &pstRecordConfig->stSaveCfg.enSaveFormat, SA_MEDIA_RECORD_SAVE_265));
MEDIA_JSON_NODE_ASSERT(saJSON_GetString(pstRecord, "SaveFilePath", pstRecordConfig->stSaveCfg.astrSaveFilePath, SA_TRUE));
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstRecord, "RecordFormat", &pstRecordConfig->stSaveCfg.enSaveFormat, SA_MEDIA_RECORD_SAVE_265));
MEDIA_JSON_NODE_ASSERT(saJSON_GetString(pstRecord, "RecordFilePath", pstRecordConfig->stSaveCfg.astrSaveFilePath, SA_TRUE));
}
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstRecord, "ThumbEnable", &pstRecordConfig->stThumbCfg.bSaveEnable, SA_FALSE));
if (SA_TRUE == pstRecordConfig->stThumbCfg.bSaveEnable) {
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstRecord, "ThumbWidth", &pstRecordConfig->stThumbCfg.stThumbSize.u32Width, 1920));
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstRecord, "ThumbHeight", &pstRecordConfig->stThumbCfg.stThumbSize.u32Height, 1080));
MEDIA_JSON_NODE_ASSERT(saJSON_GetInt(pstRecord, "ThumbFormat", &pstRecordConfig->stThumbCfg.enSaveFormat, SA_MEDIA_CAPTURE_SAVE_JPEG));
MEDIA_JSON_NODE_ASSERT(saJSON_GetString(pstRecord, "ThumbFilePath", pstRecordConfig->stThumbCfg.astrSaveFilePath, SA_TRUE));
}
//end of record
......@@ -1112,7 +1126,7 @@ void SAMPLE_MEDIA_Work(void *p)
if (-1 == g_s32TestMode) {//测试capture/record接口
if (SA_MEDIA_SCENE_CAPTURE == *penSceneEntry) {
for (int i = 0; i < g_s32CaptureNum; i++) {
s32Ret = SA_HAPI_MEDIA_Capture(SA_NULL);
s32Ret = SA_HAPI_MEDIA_Capture(SA_NULL,SA_NULL);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_HAPI_MEDIA_Capture failed with %#x!\n", s32Ret);
goto EXIT_VIDEO_STOP;
......@@ -1129,7 +1143,7 @@ void SAMPLE_MEDIA_Work(void *p)
g_bMediaHapiRun = SA_FALSE;
} else if (SA_MEDIA_SCENE_CAPTURE_RECORD == *penSceneEntry) {
for (int i = 0; i < g_s32CaptureNum; i++) {
s32Ret = SA_HAPI_MEDIA_Capture(SA_NULL);
s32Ret = SA_HAPI_MEDIA_Capture(SA_NULL,SA_NULL);
if (SA_SUCCESS != s32Ret) {
HAPI_MEDIA_LOG_E("SA_HAPI_MEDIA_Capture failed with %#x!\n", s32Ret);
goto EXIT_VIDEO_STOP;
......
......@@ -46,11 +46,8 @@ cat ${ko_dir}/sa6920-ipc-sdk.dtbo >/sys/kernel/config/device-tree/overlays/sdk/d
# anne drivers & audio drivers
model=$(cat /proc/device-tree/model)
echo $model
if echo "$model" | grep -q "v24" ; then
/sbin/insmod ${ko_dir}/snd-soc-sa8901.ko async_probe=1
else
/sbin/insmod ${ko_dir}/snd-soc-sa8900.ko async_probe=1
fi
/sbin/insmod ${ko_dir}/designware_i2s.ko async_probe=1
/sbin/insmod ${ko_dir}/snd-soc-simple-card-utils.ko async_probe=1
/sbin/insmod ${ko_dir}/snd-soc-simple-card.ko async_probe=1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment