Files
BPI-CM9-Linux/aml-patches/aml-comp/hardware/amlogic/libencoder/0001-encoder-CB1-add-v4l2-tahoe_test.-1-1.patch
T

1347 lines
50 KiB
Diff

From 8c1afe595e98f4aef8320b4c16990256bcd36298 Mon Sep 17 00:00:00 2001
From: "yumei.jia" <yumei.jia@amlogic.com>
Date: Thu, 6 Aug 2026 06:24:22 +0000
Subject: [PATCH] encoder: CB1 add v4l2 tahoe_test. [1/1]
PD#SWPL-284054
Problem:
add v4l2 tahoe_test
Solution:
add v4l2 tahoe_test
Verify:
a9
Change-Id: I2e7464b52943e0cebecb52c7043c8ffcee0d5a4b
Signed-off-by: yumei.jia <yumei.jia@amlogic.com>
---
amvenc/amvenc_lib/amvenc.c | 5 +-
amvenc_tahoe/tahoe_enc/libvptahoe_codec.c | 761 +++++++++++++++++---
amvenc_tahoe/tahoe_enc/libvptahoe_codec.h | 6 +-
amvenc_tahoe/tahoe_enc/libvptahoe_wrapper.c | 110 ++-
amvenc_tahoe/tahoe_enc/tahoe.h | 5 +
amvenc_tahoe/test.c | 129 ++--
6 files changed, 862 insertions(+), 154 deletions(-)
diff --git a/amvenc/amvenc_lib/amvenc.c b/amvenc/amvenc_lib/amvenc.c
index 946523f..57dabfe 100644
--- a/amvenc/amvenc_lib/amvenc.c
+++ b/amvenc/amvenc_lib/amvenc.c
@@ -17,6 +17,7 @@
#define AMVENC_265_DEVICE "/dev/HevcEnc"
#define AMVENC_VERS_DEVICE "/dev/vc8000"
#define AMVENC_TAHOE_DEVICE "/dev/tahoe"
+#define AMVENC_TAHOE_V4L_DEVICE "/dev/video90"
typedef enum amvenc_hw_e {
AMVENC_UNKNOWN,
@@ -133,7 +134,7 @@ int selectHW(amvenc_codec_id_t codec_id, int *hw_type)
VLOG(DEBUG, "amvenc_vers present");
ret = 0;
}
- else if (access(AMVENC_TAHOE_DEVICE, F_OK ) != -1) {
+ else if ((access(AMVENC_TAHOE_DEVICE, F_OK ) != -1) || (access(AMVENC_TAHOE_V4L_DEVICE, F_OK )!= -1)) {
*hw_type = AMVENC_TAHOE;
VLOG(DEBUG, "amvenc_tahoe present");
ret = 0;
@@ -158,7 +159,7 @@ int selectHW(amvenc_codec_id_t codec_id, int *hw_type)
VLOG(DEBUG, "amvenc_vers present");
ret = 0;
}
- else if (access(AMVENC_TAHOE_DEVICE, F_OK ) != -1) {
+ else if ((access(AMVENC_TAHOE_DEVICE, F_OK ) != -1) || (access(AMVENC_TAHOE_V4L_DEVICE, F_OK )!= -1)) {
*hw_type = AMVENC_TAHOE;
VLOG(DEBUG, "amvenc_tahoe present");
ret = 0;
diff --git a/amvenc_tahoe/tahoe_enc/libvptahoe_codec.c b/amvenc_tahoe/tahoe_enc/libvptahoe_codec.c
index af192b8..2740b39 100644
--- a/amvenc_tahoe/tahoe_enc/libvptahoe_codec.c
+++ b/amvenc_tahoe/tahoe_enc/libvptahoe_codec.c
@@ -41,10 +41,371 @@
#include "tahoe_register.h"
#include <string.h>
#include <sys/poll.h>
+#include <linux/videodev2.h>
+#include <linux/v4l2-controls.h>
+#include <errno.h>
#define MAX_FRAME_WINDOW (120)
venc_info_t s_venc_info;
+#include <fcntl.h> // open(), O_RDWR, O_RDONLY...
+#include <unistd.h> // close(), read(), write()
+#include <stdlib.h>
+
+
+struct v4l2_buffer *src_buf_info = NULL;
+struct v4l2_buffer *dst_buf_info = NULL;
+unsigned char **src_buffers = NULL;
+unsigned char **dst_buffers = NULL;
+int *src_buf_lengths = NULL;
+int *dst_buf_lengths = NULL;
+int src_buf_count = 0, dst_buf_count = 0;
+//int frame_count = 0;
+//struct v4l2_buffer src_buf, dst_buf;
+struct timespec ts_start, ts_end;
+#define CLEAR(x) memset(&(x), 0, sizeof(x))
+
+
+void query_and_set_control(int fd, unsigned int id, int value) {
+ struct v4l2_queryctrl query;
+ struct v4l2_control ctrl;
+
+ CLEAR(query);
+ query.id = id;
+
+ if (ioctl(fd, VIDIOC_QUERYCTRL, &query) == 0) {
+ printf("[%s] range: %d - %d, default: %d, step: %d\n",
+ query.name, query.minimum, query.maximum, query.default_value, query.step);
+
+ if (value >= query.minimum && value <= query.maximum) {
+ CLEAR(ctrl);
+ ctrl.id = id;
+ ctrl.value = value;
+ if (ioctl(fd, VIDIOC_S_CTRL, &ctrl) == 0) {
+ printf("[%s] set to %d successfully\n", query.name, value);
+ } else {
+ perror("VIDIOC_S_CTRL failed");
+ }
+ } else {
+ printf("[%s] value %d out of range [%d, %d], skipping\n",
+ query.name, value, query.minimum, query.maximum);
+ }
+ } else {
+ printf("Control 0x%08x not supported\n", id);
+ }
+}
+
+void setup_encoder_params(int fd, handle_t *encode_info) {
+ printf("\n=== Setting up encoder parameters ===\n");
+
+ // GOP
+ query_and_set_control(fd, V4L2_CID_MPEG_VIDEO_GOP_SIZE, encode_info->enc_gop);
+
+ // Bitrate
+ query_and_set_control(fd, V4L2_CID_MPEG_VIDEO_BITRATE, encode_info->enc_bitrate);
+
+ // H.264 Profile
+ if (encode_info->profile == 3 && encode_info->enc_fmt == CODEC_ID_H264)
+ query_and_set_control(fd, V4L2_CID_MPEG_VIDEO_H264_PROFILE, V4L2_MPEG_VIDEO_H264_PROFILE_HIGH);
+//
+// // H.264 Level
+ if (encode_info->enc_fmt == CODEC_ID_H264)
+ query_and_set_control(fd, V4L2_CID_MPEG_VIDEO_H264_LEVEL, V4L2_MPEG_VIDEO_H264_LEVEL_4_0);
+//
+ if (encode_info->profile == 3 && encode_info->enc_fmt == CODEC_ID_H265)
+ query_and_set_control(fd, V4L2_CID_MPEG_VIDEO_HEVC_PROFILE, V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN);
+
+ if (encode_info->enc_fmt == CODEC_ID_H265)
+ query_and_set_control(fd, V4L2_CID_MPEG_VIDEO_HEVC_LEVEL, V4L2_MPEG_VIDEO_HEVC_LEVEL_4);
+// query_and_set_control(fd, V4L2_CID_MPEG_VIDEO_HEVC_TIER_FLAG,
+// V4L2_MPEG_VIDEO_HEVC_TIER_MAIN);
+}
+
+int setup_src_format_mplane(int fd, handle_t *encode_info,int plane_num) {
+ struct v4l2_format fmt;
+ CLEAR(fmt);
+ fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fmt.fmt.pix_mp.width = encode_info->enc_width;
+ fmt.fmt.pix_mp.height = encode_info->enc_height;
+ if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_NV12)
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
+ else if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_NV21)
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV21;
+ else if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_YUV420_PLANAR)
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_YUV420;
+ else if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_RGB888)
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_RGB24;
+ #if 0
+ else if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_RGBA8888)
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_RGBA32;
+ #endif
+ fmt.fmt.pix_mp.field = V4L2_FIELD_NONE;
+ fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_REC709;
+
+ printf("setup_src_format_mplane fmt input:%d\n",encode_info->mfdin_input_fmt);
+ if (encode_info->current_mode == DMA_TYPE) { //dmabuf
+ if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_NV12)
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12M;
+ else if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_NV21)
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV21M;
+ else if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_YUV420_PLANAR)
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_YUV420M;
+ fmt.fmt.pix_mp.num_planes = plane_num;
+ if (1 == fmt.fmt.pix_mp.num_planes) { //rgb rgba?
+ fmt.fmt.pix_mp.plane_fmt[0].bytesperline = encode_info->enc_width;
+ fmt.fmt.pix_mp.plane_fmt[0].sizeimage = encode_info->enc_width * encode_info->enc_height * 3 / 2;
+ }
+ else if (2 == fmt.fmt.pix_mp.num_planes) {
+ fmt.fmt.pix_mp.plane_fmt[0].bytesperline = encode_info->enc_width;
+ fmt.fmt.pix_mp.plane_fmt[0].sizeimage = encode_info->enc_width * encode_info->enc_height;
+
+ fmt.fmt.pix_mp.plane_fmt[1].bytesperline = encode_info->enc_width;
+ fmt.fmt.pix_mp.plane_fmt[1].sizeimage = encode_info->enc_width * encode_info->enc_height / 2;
+ }
+ else if (3 == fmt.fmt.pix_mp.num_planes){
+ fmt.fmt.pix_mp.plane_fmt[0].bytesperline = encode_info->enc_width;
+ fmt.fmt.pix_mp.plane_fmt[0].sizeimage = encode_info->enc_width * encode_info->enc_height;
+
+ fmt.fmt.pix_mp.plane_fmt[1].bytesperline = encode_info->enc_width;
+ fmt.fmt.pix_mp.plane_fmt[1].sizeimage = encode_info->enc_width * encode_info->enc_height / 4;
+
+ fmt.fmt.pix_mp.plane_fmt[2].bytesperline = encode_info->enc_width;
+ fmt.fmt.pix_mp.plane_fmt[2].sizeimage = encode_info->enc_width * encode_info->enc_height / 4;
+ }
+ }
+ else { //mmap
+ fmt.fmt.pix_mp.num_planes = 1;
+ if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_RGB888) {
+ fmt.fmt.pix_mp.plane_fmt[0].bytesperline = encode_info->enc_width * 3;
+ fmt.fmt.pix_mp.plane_fmt[0].sizeimage = encode_info->enc_width * encode_info->enc_height * 3;
+ }
+ else if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_RGBA8888) {
+ fmt.fmt.pix_mp.plane_fmt[0].bytesperline = encode_info->enc_width * 4;
+ fmt.fmt.pix_mp.plane_fmt[0].sizeimage = encode_info->enc_width * encode_info->enc_height * 4;
+ }
+ else {
+ fmt.fmt.pix_mp.plane_fmt[0].bytesperline = encode_info->enc_width;
+ fmt.fmt.pix_mp.plane_fmt[0].sizeimage = encode_info->enc_width * encode_info->enc_height * 3 / 2;
+ }
+ }
+
+ printf("sizeimage:%d %d\n",fmt.fmt.pix_mp.plane_fmt[0].sizeimage,fmt.fmt.pix_mp.plane_fmt[1].sizeimage);
+
+ if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0) {
+ perror("VIDIOC_S_FMT (src) failed");
+ return -1;
+ }
+
+ printf("Source format (MPLANE): %dx%d, pixelformat: %c%c%c%c, planes: %d\n",
+ fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height,
+ fmt.fmt.pix_mp.pixelformat & 0xFF,
+ (fmt.fmt.pix_mp.pixelformat >> 8) & 0xFF,
+ (fmt.fmt.pix_mp.pixelformat >> 16) & 0xFF,
+ (fmt.fmt.pix_mp.pixelformat >> 24) & 0xFF,
+ fmt.fmt.pix_mp.num_planes);
+
+ return 0;
+}
+
+int setup_dst_format_mplane(int fd, handle_t *encode_info) {
+ struct v4l2_format fmt;
+ CLEAR(fmt);
+ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fmt.fmt.pix_mp.width = encode_info->enc_width;
+ fmt.fmt.pix_mp.height = encode_info->enc_height;
+ if (encode_info->enc_fmt == CODEC_ID_H264)
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
+ else if (encode_info->enc_fmt == CODEC_ID_H265)
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_HEVC;
+ fmt.fmt.pix_mp.field = V4L2_FIELD_NONE;
+ fmt.fmt.pix_mp.num_planes = 1;
+ fmt.fmt.pix_mp.plane_fmt[0].sizeimage = 5*1024*1024;
+
+ if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0) {
+ perror("VIDIOC_S_FMT (dst) failed");
+ return -1;
+ }
+
+ printf("Destination format (MPLANE): %dx%d, pixelformat: %c%c%c%c, planes: %d\n",
+ fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height,
+ fmt.fmt.pix_mp.pixelformat & 0xFF,
+ (fmt.fmt.pix_mp.pixelformat >> 8) & 0xFF,
+ (fmt.fmt.pix_mp.pixelformat >> 16) & 0xFF,
+ (fmt.fmt.pix_mp.pixelformat >> 24) & 0xFF,
+ fmt.fmt.pix_mp.num_planes);
+
+ return 0;
+}
+
+int setup_buffers_mplane(int fd, int type, int count,
+ struct v4l2_buffer **buf_info,
+ unsigned char ***buffers,
+ int **buf_lengths,
+ int *num_buffers,enum v4l2_memory memory_type) {
+ struct v4l2_requestbuffers req;
+ CLEAR(req);
+ req.count = count;
+ req.type = type;
+ //req.memory = V4L2_MEMORY_MMAP;
+
+ if (0 != memory_type) {
+ req.memory = memory_type;
+ }
+ else { //by default
+ req.memory = V4L2_MEMORY_MMAP;
+ }
+
+ if (ioctl(fd, VIDIOC_REQBUFS, &req) < 0) {
+ perror("VIDIOC_REQBUFS failed");
+ return -1;
+ }
+
+ *num_buffers = req.count;
+ printf("Allocated %d buffers for type %d\n", req.count, type);
+
+ if (req.count == 0) {
+ printf("No buffers allocated\n");
+ return -1;
+ }
+
+ *buf_info = calloc(req.count, sizeof(struct v4l2_buffer));
+ *buffers = calloc(req.count, sizeof(unsigned char *));
+ *buf_lengths = calloc(req.count, sizeof(int));
+
+ if (!*buf_info || !*buffers || !*buf_lengths) {
+ perror("calloc failed");
+ return -1;
+ }
+
+ for (int i = 0; i < req.count; i++) {
+ struct v4l2_buffer buf;
+ struct v4l2_plane planes[VIDEO_MAX_PLANES];
+
+ CLEAR(buf);
+ buf.type = type;
+ //buf.memory = V4L2_MEMORY_MMAP;
+ buf.index = i;
+ buf.length = VIDEO_MAX_PLANES;
+// buf.m.planes = planes;
+ buf.m.planes = calloc(VIDEO_MAX_PLANES,
+ sizeof(struct v4l2_plane));
+
+ if (0 != memory_type) {
+ buf.memory = memory_type;
+ }
+ else { //by default
+ buf.memory = V4L2_MEMORY_MMAP;
+ }
+
+ if (ioctl(fd, VIDIOC_QUERYBUF, &buf) < 0) {
+ perror("VIDIOC_QUERYBUF failed");
+ return -1;
+ }
+
+ memcpy(&((*buf_info)[i]), &buf, sizeof(struct v4l2_buffer));
+
+ (*buf_lengths)[i] = 0;
+ for (int p = 0; p < buf.length; p++) {
+ int plane_size = buf.m.planes[p].length;
+ (*buf_lengths)[i] += plane_size;
+
+ printf("Buffer %d, plane %d: offset=0x%08x, length=%d\n",
+ i, p, buf.m.planes[p].m.mem_offset, plane_size);
+
+ if ((p == 0) && (buf.memory == V4L2_MEMORY_MMAP)) {
+ (*buffers)[i] = mmap(NULL, plane_size,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED, fd,
+ buf.m.planes[p].m.mem_offset);
+ if ((*buffers)[i] == MAP_FAILED) {
+ perror("mmap failed");
+ return -1;
+ }
+ printf("Buffer %d mapped at %p, size %d\n",
+ i, (*buffers)[i], plane_size);
+ }
+ }
+ }
+
+ return 0;
+}
+
+void detectV4l2Support(handle_t *encode_info) {
+ if ((access("/dev/video90", F_OK ) != -1)) {
+ encode_info->v4l2_enable = true;
+ VLOG(ERR, "v4l2 component present");
+ return;
+ }
+ return;
+}
+
+
+
+int queue_buffer_mplane(int fd, struct v4l2_buffer *buf) {
+ if (ioctl(fd, VIDIOC_QBUF, buf) < 0) {
+ perror("VIDIOC_QBUF failed");
+ return -1;
+ }
+ return 0;
+}
+
+int dequeue_buffer_mplane(int fd, int type, struct v4l2_buffer *buf, struct v4l2_plane *planes,enum v4l2_memory memory_type) {
+// struct v4l2_plane planes[VIDEO_MAX_PLANES];
+ CLEAR(*buf);
+ memset(planes, 0, sizeof(struct v4l2_plane) * VIDEO_MAX_PLANES);
+ buf->type = type;
+ if (0 != memory_type) {
+ buf->memory = memory_type;
+ }
+ else {
+ buf->memory = V4L2_MEMORY_MMAP;
+ }
+ buf->length = VIDEO_MAX_PLANES;
+ buf->m.planes = planes;
+ if (ioctl(fd, VIDIOC_DQBUF, buf) < 0) {
+ if (errno == EAGAIN) {
+ return -EAGAIN;
+ }
+ perror("VIDIOC_DQBUF failed");
+ return -1;
+ }
+
+ return 0;
+}
+
+int stream_on(int fd, int type) {
+ enum v4l2_buf_type buf_type = type;
+ if (ioctl(fd, VIDIOC_STREAMON, &buf_type) < 0) {
+ perror("VIDIOC_STREAMON failed");
+ return -1;
+ }
+ return 0;
+}
+
+int stream_off(int fd, int type) {
+ enum v4l2_buf_type buf_type = type;
+ if (ioctl(fd, VIDIOC_STREAMOFF, &buf_type) < 0) {
+ perror("VIDIOC_STREAMOFF failed");
+ return -1;
+ }
+ return 0;
+}
+
+void print_frame_info(struct v4l2_buffer *buf, const char *tag) {
+ printf("[%s] Buffer %d, type=%d, bytesused=", tag, buf->index, buf->type);
+ if (buf->length > 0 && buf->m.planes) {
+ int total = 0;
+ for (int p = 0; p < buf->length; p++) {
+ total += buf->m.planes[p].bytesused;
+ }
+ printf("%d", total);
+ } else {
+ printf("%d", buf->bytesused);
+ }
+ printf(", flags=0x%x\n", buf->flags);
+}
+
+
int get_header(handle_t *handle, unsigned char *pHeader, unsigned int *pLength)
{
venc_info_t *venc = &s_venc_info;
@@ -116,32 +477,77 @@ int get_header(handle_t *handle, unsigned char *pHeader, unsigned int *pLength)
return 0;
}
+
int get_bsbframe(handle_t *handle, unsigned char *buffer, unsigned int *buf_nal_size, signed char *frame_type)
{
- venc_info_t *venc = &s_venc_info;
- unsigned int esaddr_offset = 0;
- unsigned long esPhyAddr;
- int eslength;
- unsigned long espVirAddr = 0;
- unsigned long slice_header_length = 0;
- int length_cp = 0;
-
- slice_header_length = handle->enc_es.slice_header_length;
- esPhyAddr = handle->enc_es.esPhyAddr;
- eslength = handle->enc_es.eslength;
- esaddr_offset = esPhyAddr - venc->common_buffer[handle->chn_id].phys_addr;
- espVirAddr = venc->common_buffer[handle->chn_id].virt_addr + esaddr_offset;
- VLOG(INFO,"[%s][%d]offset:0x%x\n", __func__, __LINE__, slice_header_length);
- VLOG(INFO,"[%s][%d]esPhyAddr:0x%lx\n", __func__, __LINE__, esPhyAddr);
- VLOG(INFO,"[%s][%d]esaddr_offset:0x%lx\n", __func__, __LINE__, esaddr_offset);
- VLOG(INFO,"[%s][%d]espVirAddr:0x%lx\n", __func__, __LINE__, espVirAddr);
- VLOG(INFO,"[%s][%d]eslength:%d\n", __func__, __LINE__, eslength);
-
- length_cp = ((eslength + 15) >> 4) << 4;
- memcpy(buffer, (const void *)((ulong)espVirAddr), length_cp);
- *buf_nal_size = eslength;
- (*frame_type) = handle->enc_es.frame_type;
- VLOG(INFO,"[%s][%d]buf_nal_size:%d,frame_type:%d\n", __func__, __LINE__,*buf_nal_size,(*frame_type));
+ if (handle->v4l2_enable) {
+ venc_info_t *venc = &s_venc_info;
+ struct v4l2_buffer dst_buf;
+ struct v4l2_plane planes[VIDEO_MAX_PLANES];
+ int ret = -1;
+
+ ret = dequeue_buffer_mplane(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, &dst_buf, planes, 0);
+ while (ret != 0) {
+ usleep(1000);
+ ret = dequeue_buffer_mplane(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, &dst_buf, planes, 0);
+ }
+
+ if (ret == 0) {
+ handle->data_len = 0;
+ if (dst_buf.length > 0 && dst_buf.m.planes) {
+ for (int p = 0; p < dst_buf.length; p++) {
+ handle->data_len += dst_buf.m.planes[p].bytesused;
+ }
+ }
+
+ safe_memcpy(buffer, dst_buffers[dst_buf.index], handle->data_len);
+ if (dst_buf.flags & V4L2_BUF_FLAG_LAST) {
+ printf("End of stream reached\n");
+ }
+
+ if (dst_buf.flags & V4L2_BUF_FLAG_KEYFRAME) {
+ (*frame_type) = 0;
+ }
+ else {
+ (*frame_type) = 1;
+ }
+
+ if (queue_buffer_mplane(venc->venc_fd, &dst_buf) < 0) {
+ printf("queue_buffer_mplane err\n");
+ }
+
+ (*buf_nal_size) = handle->data_len;
+
+ } else if (ret != -EAGAIN) {
+ perror("dequeue dst failed");
+ }
+ }
+ else {
+ venc_info_t *venc = &s_venc_info;
+ unsigned int esaddr_offset = 0;
+ unsigned long esPhyAddr;
+ int eslength;
+ unsigned long espVirAddr = 0;
+ unsigned long slice_header_length = 0;
+ int length_cp = 0;
+
+ slice_header_length = handle->enc_es.slice_header_length;
+ esPhyAddr = handle->enc_es.esPhyAddr;
+ eslength = handle->enc_es.eslength;
+ esaddr_offset = esPhyAddr - venc->common_buffer[handle->chn_id].phys_addr;
+ espVirAddr = venc->common_buffer[handle->chn_id].virt_addr + esaddr_offset;
+ VLOG(INFO,"[%s][%d]offset:0x%x\n", __func__, __LINE__, slice_header_length);
+ VLOG(INFO,"[%s][%d]esPhyAddr:0x%lx\n", __func__, __LINE__, esPhyAddr);
+ VLOG(INFO,"[%s][%d]esaddr_offset:0x%lx\n", __func__, __LINE__, esaddr_offset);
+ VLOG(INFO,"[%s][%d]espVirAddr:0x%lx\n", __func__, __LINE__, espVirAddr);
+ VLOG(INFO,"[%s][%d]eslength:%d\n", __func__, __LINE__, eslength);
+
+ length_cp = ((eslength + 15) >> 4) << 4;
+ memcpy(buffer, (const void *)((ulong)espVirAddr), length_cp);
+ *buf_nal_size = eslength;
+ (*frame_type) = handle->enc_es.frame_type;
+ VLOG(INFO,"[%s][%d]buf_nal_size:%d,frame_type:%d\n", __func__, __LINE__,*buf_nal_size,(*frame_type));
+ }
return 0;
}
@@ -191,10 +597,43 @@ int check_initparam(handle_t handle)
void encoder_open(char *fwfile) {
- venc_init();
- vrisc_reset();
- firmware_load(fwfile);
- firmware_boot();
+// venc_init();
+// vrisc_reset();
+// firmware_load(fwfile);
+// firmware_boot();
+
+ venc_info_t *venc = &s_venc_info;
+ struct v4l2_capability cap;
+
+
+ memset(&s_venc_info, 0x00, sizeof(s_venc_info));
+ s_venc_info.venc_fd = -1;
+
+ venc->venc_fd = open("/dev/video90", O_RDWR);
+ if (venc->venc_fd < 0) {
+ VLOG(INFO,"[VENC] Can't open venc driver. [error=%s]. \n", strerror(errno));
+// return -1;
+ }
+ VLOG(INFO,"open venc fd:%d,&venc:%lx!",venc->venc_fd,(unsigned long)venc);
+
+ if (ioctl(venc->venc_fd, VIDIOC_QUERYCAP, &cap) < 0) {
+ perror("VIDIOC_QUERYCAP failed");
+ close(venc->venc_fd);
+// return -1;
+ }
+ printf("Driver: %s\n", cap.driver);
+ printf("Card: %s\n", cap.card);
+ printf("Bus: %s\n", cap.bus_info);
+ printf("Capabilities: 0x%08x\n", cap.capabilities);
+
+ if (!(cap.capabilities & V4L2_CAP_VIDEO_M2M_MPLANE)) {
+ printf("Device does not support V4L2_CAP_VIDEO_M2M_MPLANE\n");
+ printf("Try using non-mplane version\n");
+ close(venc->venc_fd);
+// return -1;
+ }
+ printf("Device supports M2M MPLANE\n");
+
}
void encoder_unmap(int inst_id) {
@@ -213,41 +652,58 @@ void encoder_close() {
int vl_tahoe_encoder_init(int codec_id, handle_t encode_info) {
// int ret;
-// VPMultiEncHandle* mHandle = (VPMultiEncHandle *) malloc(sizeof(VPMultiEncHandle));
-//
-// if (mHandle == NULL)
-// goto exit;
-// memset(mHandle, 0, sizeof(VPMultiEncHandle));
-// if (!check_qp_tbl(qp_tbl)) {
-// goto exit;
-// }
-//
-// vp5_set_log_level(ERR);
-//
-// ret = initEncParams(mHandle, codec_id, encode_info, qp_tbl);
-// if (ret < 0)
-// goto exit;
-//
-// mHandle->am_enc_handle = AML_MultiEncInitialize(&(mHandle->mEncParams));
-// if (mHandle->am_enc_handle == 0)
-// goto exit;
-// mHandle->mPrependSPSPPSToIDRFrames =
-// encode_info.prepend_spspps_to_idr_frames;
-// mHandle->mSpsPpsHeaderReceived = false;
-// mHandle->mNumInputFrames = -1; // 1st two buffers contain SPS and PPS
-// if (encode_info.strict_rc_window > MAX_FRAME_WINDOW)
-// encode_info.strict_rc_window = MAX_FRAME_WINDOW;
-// mHandle->hist_win_len = encode_info.strict_rc_window;
-// mHandle->hist_skip_thresh = encode_info.strict_rc_skip_thresh;
+ venc_info_t *venc = &s_venc_info;
+
if (check_initparam(encode_info)) {
printf("check_initparam failed\n");
return -1;
}
- vdi_alloc_common_buffer(encode_info.chn_id);
- venc_lock();
- create_channel(encode_info);
- venc_unlock();
+// vdi_alloc_common_buffer(encode_info.chn_id);
+// venc_lock();
+// create_channel(encode_info);
+// venc_unlock();
+
+ setup_encoder_params(venc->venc_fd, &encode_info);
+ if (setup_src_format_mplane(venc->venc_fd, &encode_info, 1) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+
+ if (setup_dst_format_mplane(venc->venc_fd, &encode_info) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+
+ if (setup_buffers_mplane(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, 2,
+ &src_buf_info, &src_buffers, &src_buf_lengths, &src_buf_count, 0) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+
+ if (setup_buffers_mplane(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, 2,
+ &dst_buf_info, &dst_buffers, &dst_buf_lengths, &dst_buf_count, 0) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+
+ for (int i = 0; i < dst_buf_count; i++) {
+ if (queue_buffer_mplane(venc->venc_fd, &dst_buf_info[i]) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+ }
+
+ if (stream_on(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+ if (stream_on(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+ printf("Stream started\n");
+
return 0;
// return (vl_codec_handle_t)mHandle;
@@ -258,6 +714,75 @@ int vl_tahoe_encoder_init(int codec_id, handle_t encode_info) {
// return (vl_codec_handle_t)NULL;
}
+
+int vl_v4l2_switch_to_dmamode( handle_t encode_info,int plane_num) {
+ venc_info_t *venc = &s_venc_info;
+
+ VLOG(ERR,"switch to dmamode!\n");
+
+ stream_off(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
+ stream_off(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
+
+ for (int i = 0; i < src_buf_count; i++) {
+ munmap(src_buffers[i], src_buf_lengths[i]);
+ }
+ for (int i = 0; i < dst_buf_count; i++) {
+ munmap(dst_buffers[i], dst_buf_lengths[i]);
+ }
+
+ free(src_buffers);
+ free(dst_buffers);
+ for (int i = 0; i < src_buf_count; i++) {
+ free(src_buf_info[i].m.planes);
+ }
+ free(src_buf_info);
+ free(dst_buf_info);
+ free(src_buf_lengths);
+ free(dst_buf_lengths);
+
+ setup_encoder_params(venc->venc_fd, &encode_info);
+ if (setup_src_format_mplane(venc->venc_fd, &encode_info, plane_num) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+
+ if (setup_dst_format_mplane(venc->venc_fd, &encode_info) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+
+ if (setup_buffers_mplane(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, 2,
+ &src_buf_info, &src_buffers, &src_buf_lengths, &src_buf_count, V4L2_MEMORY_DMABUF) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+
+ if (setup_buffers_mplane(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, 2,
+ &dst_buf_info, &dst_buffers, &dst_buf_lengths, &dst_buf_count, 0) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+
+ for (int i = 0; i < dst_buf_count; i++) {
+ if (queue_buffer_mplane(venc->venc_fd, &dst_buf_info[i]) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+ }
+
+ if (stream_on(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+ if (stream_on(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
+ close(venc->venc_fd);
+ return -1;
+ }
+ printf("Stream started\n");
+}
+
+
+
int vl_video_encoder_change_bitrate(handle_t *encode_info,
int bitRate)
{
@@ -387,33 +912,85 @@ static int encode_poll(int fd, int timeout) {
return poll(poll_fd, 1, timeout);
}
-int vl_tahoe_encoder_encode(handle_t *encode_info)
+int num = 0;
+bool get_input_buf_forv4l(ulong *pInput,struct v4l2_buffer *src_buf,handle_t *encode_info) {
+ venc_info_t *venc = &s_venc_info;
+ struct v4l2_plane planes[VIDEO_MAX_PLANES];
+ int ret = -1;
+ enum v4l2_memory type;
+
+ if (encode_info->current_mode == 3) {
+ type = V4L2_MEMORY_DMABUF;
+ }
+ else {
+ type = V4L2_MEMORY_MMAP;
+ }
+
+ if (num < 2) {
+ memcpy(src_buf,&src_buf_info[num],sizeof(struct v4l2_buffer));
+ //src_buf = &src_buf_info[num];
+ ret = 0;
+ num++;
+ } else {
+ ret = dequeue_buffer_mplane(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, src_buf, planes, type);
+ while (ret != 0) {
+ usleep(1000);
+ ret = dequeue_buffer_mplane(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, src_buf, planes, type);
+ }
+ }
+ if (ret == 0) {
+ (*pInput) = src_buffers[src_buf->index];
+ return true;
+ }
+ return false;
+}
+
+
+
+int vl_tahoe_encoder_encode(handle_t *encode_info,struct v4l2_buffer *src_buf)
{
- int ret = 0;
+// int ret = 0;
//vdi_debug(encode_info->chn_id);
- venc_lock();
- roi_config(encode_info);
- osd_config(encode_info);
- if (encode_info->cfg_update == 1) {
- dynamic_parameter_set(encode_info);
- encode_info->cfg_update = 0;
- }
- encode_one_frame(encode_info);
- if (encode_poll(s_venc_info.venc_fd, -1) <= 0) {
- VLOG(ERR,"[%s][%d]poll fail\n", __func__, __LINE__);
- return -1;
+// venc_lock();
+// roi_config(encode_info);
+// osd_config(encode_info);
+// if (encode_info->cfg_update == 1) {
+// dynamic_parameter_set(encode_info);
+// encode_info->cfg_update = 0;
+// }
+// encode_one_frame(encode_info);
+// if (encode_poll(s_venc_info.venc_fd, -1) <= 0) {
+// VLOG(ERR,"[%s][%d]poll fail\n", __func__, __LINE__);
+// return -1;
+// }
+// encode_info->enc_es.slice_header_length = venc_read_register(TAHOE_EC_DMA0) & 0x3F;
+// encode_info->enc_es.esPhyAddr = venc_read_register(TAHOE_EC_DMA0) - encode_info->enc_es.slice_header_length;
+// encode_info->enc_es.esPhyAddr |= (((ulong)(venc_read_register(TAHOE_EC_DMA6) & 0x03)) << 32);
+// encode_info->enc_es.eslength = venc_read_register(TAHOE_EC_LENGTH);
+// encode_info->enc_es.frame_type = venc_read_register(OUTPUT_FRAME_TYPE);
+//
+// VLOG(INFO,"es buffer phyaddr:%lx,lsb:%x",encode_info->enc_es.esPhyAddr,(venc_read_register(TAHOE_EC_DMA0) - encode_info->enc_es.slice_header_length));
+//
+// venc_unlock();
+ venc_info_t *venc = &s_venc_info;
+ struct v4l2_buffer dst_buf;
+ struct v4l2_plane planes[VIDEO_MAX_PLANES];
+ int ret = 0;//-1;
+
+ if (encode_info->current_mode == VMALLOC_TYPE) {
+ if (src_buf && (src_buf->length > 0) && src_buf->m.planes) {
+ int y_size = encode_info->enc_width * encode_info->enc_height;
+ int uv_size = (encode_info->enc_width / 2) * (encode_info->enc_height / 2) * 2;
+ src_buf->m.planes[0].bytesused = y_size + uv_size;//一个planes的情况
+ }
}
- encode_info->enc_es.slice_header_length = venc_read_register(TAHOE_EC_DMA0) & 0x3F;
- encode_info->enc_es.esPhyAddr = venc_read_register(TAHOE_EC_DMA0) - encode_info->enc_es.slice_header_length;
- encode_info->enc_es.esPhyAddr |= (((ulong)(venc_read_register(TAHOE_EC_DMA6) & 0x03)) << 32);
- encode_info->enc_es.eslength = venc_read_register(TAHOE_EC_LENGTH);
- encode_info->enc_es.frame_type = venc_read_register(OUTPUT_FRAME_TYPE);
- VLOG(INFO,"es buffer phyaddr:%lx,lsb:%x",encode_info->enc_es.esPhyAddr,(venc_read_register(TAHOE_EC_DMA0) - encode_info->enc_es.slice_header_length));
+ if (queue_buffer_mplane(venc->venc_fd, src_buf) < 0) {
+ printf("queue_buffer_mplane err\n");
+ }
- venc_unlock();
return ret;
}
@@ -428,9 +1005,31 @@ int vl_tahoe_encoder_destroy(handle_t encode_info) {
// free(handle->mSPSPPSData);
// if (handle)
// free(handle);
- venc_lock();
- destroy_channel(encode_info);
- venc_unlock();
+// venc_lock();
+// destroy_channel(encode_info);
+// venc_unlock();
+
+ venc_info_t *venc = &s_venc_info;
+ stream_off(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
+ stream_off(venc->venc_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
+
+ for (int i = 0; i < src_buf_count; i++) {
+ munmap(src_buffers[i], src_buf_lengths[i]);
+ }
+ for (int i = 0; i < dst_buf_count; i++) {
+ munmap(dst_buffers[i], dst_buf_lengths[i]);
+ }
+ free(src_buffers);
+ free(dst_buffers);
+ for (int i = 0; i < src_buf_count; i++) {
+ free(src_buf_info[i].m.planes);
+ }
+ free(src_buf_info);
+ free(dst_buf_info);
+ free(src_buf_lengths);
+ free(dst_buf_lengths);
+
+ close(venc->venc_fd);
return 1;
}
diff --git a/amvenc_tahoe/tahoe_enc/libvptahoe_codec.h b/amvenc_tahoe/tahoe_enc/libvptahoe_codec.h
index 791c3d7..b81f1f5 100644
--- a/amvenc_tahoe/tahoe_enc/libvptahoe_codec.h
+++ b/amvenc_tahoe/tahoe_enc/libvptahoe_codec.h
@@ -34,6 +34,7 @@
#define _VP_CODEC_TAHOE_H_
#include "vp_codec_tahoe.h"
+#include <linux/videodev2.h>
void encoder_open(char *fwfile);
void encoder_close();
@@ -47,11 +48,14 @@ int vl_video_encoder_change_qp(handle_t *encode_info,
int minQpI, int maxQpI, int maxDeltaQp,
int minQpP, int maxQpP,
int minQpB, int maxQpB);
-int vl_tahoe_encoder_encode(handle_t *encode_info);
+int vl_tahoe_encoder_encode(handle_t *encode_info,struct v4l2_buffer *src_buf);
int get_dsframe(handle_t *handle, unsigned char *buffer, unsigned int *buf_nal_size);
int get_bsbframe(handle_t *handle, unsigned char *buffer, unsigned int *buf_nal_size, signed char *frame_type);
int get_header(handle_t *handle, unsigned char *pHeader, unsigned int *pLength);
int check_initparam(handle_t handle);
int vl_tahoe_encoder_generate_header(handle_t *encode_info);
+bool get_input_buf_forv4l(ulong *pInput,struct v4l2_buffer *src_buf, handle_t *encode_info);
+void detectV4l2Support(handle_t *encode_info);
+int vl_v4l2_switch_to_dmamode( handle_t encode_info,int plane_num) ;
#endif
diff --git a/amvenc_tahoe/tahoe_enc/libvptahoe_wrapper.c b/amvenc_tahoe/tahoe_enc/libvptahoe_wrapper.c
index 37f9e51..9303bea 100644
--- a/amvenc_tahoe/tahoe_enc/libvptahoe_wrapper.c
+++ b/amvenc_tahoe/tahoe_enc/libvptahoe_wrapper.c
@@ -45,6 +45,8 @@
#include <string.h>
#include <sys/poll.h>
#include <fcntl.h>
+#include <linux/videodev2.h>
+#include <linux/v4l2-controls.h>
#define FW_STRING_LEN_MAX 256
#define HE_BUF_SIZE 0x100000
@@ -62,7 +64,6 @@ int output_fd_dump = -1;
#endif
-
vl_codec_tahoe_handle_t vt_tahoe_encoder_init(int codec_id, vt_encode_info_t encode_param) {
venc_buffer_t hdBuffer[3] = {0};
char fwfile[FW_STRING_LEN_MAX] = {0};
@@ -130,6 +131,8 @@ vl_codec_tahoe_handle_t vt_tahoe_encoder_init(int codec_id, vt_encode_info_t enc
}*/
snprintf(fwfile, FW_STRING_LEN_MAX, "%s", FW_PATH);
+ detectV4l2Support(encode_info);
+
if (0 == get_cur_instance()) {
VLOG(INFO,"loading fw:%s\n",fwfile);
encoder_open(fwfile);
@@ -158,22 +161,25 @@ vl_codec_tahoe_handle_t vt_tahoe_encoder_init(int codec_id, vt_encode_info_t enc
encode_info->input_buf[0].size = encode_info->enc_width * encode_info->enc_height * 4;//fix me!!!
}
- if (vdi_allocate_dma_memory(&encode_info->input_buf[0]) < 0) {
- VLOG(ERR,"Can not allocat input Buffer in vmalloc mode!\n");
- return -1;
- }
-
- for (i = 0; i < 3; i++) {
- memset(&hdBuffer[i], 0, sizeof(hdBuffer[i]));
- hdBuffer[i].size = HE_BUF_SIZE;
- if (vdi_allocate_dma_memory(&hdBuffer[i]) < 0) {
- printf("Can not allocat hd Buffer chnid %d\n", encode_info->chn_id);
+ if (!encode_info->v4l2_enable) {
+ if (vdi_allocate_dma_memory(&encode_info->input_buf[0]) < 0) {
+ VLOG(ERR,"Can not allocat input Buffer in vmalloc mode!\n");
return -1;
}
- VLOG(INFO,"[%s][%d]hdBuffer[%d].phys_addr:0x%x\n", \
- __func__,__LINE__, i, hdBuffer[i].phys_addr);
- encode_info->header_buf_addr[i] = hdBuffer[i].phys_addr;
+
+ for (i = 0; i < 3; i++) {
+ memset(&hdBuffer[i], 0, sizeof(hdBuffer[i]));
+ hdBuffer[i].size = HE_BUF_SIZE;
+ if (vdi_allocate_dma_memory(&hdBuffer[i]) < 0) {
+ printf("Can not allocat hd Buffer chnid %d\n", encode_info->chn_id);
+ return -1;
+ }
+ VLOG(INFO,"[%s][%d]hdBuffer[%d].phys_addr:0x%x\n", \
+ __func__,__LINE__, i, hdBuffer[i].phys_addr);
+ encode_info->header_buf_addr[i] = hdBuffer[i].phys_addr;
+ }
}
+
#if DUMP_FILE_ENABLE
input_fd_dump = open("/data/tahoe_dump_input.yuv", O_CREAT | O_RDWR | O_TRUNC, 0644);
if (input_fd_dump < 0)
@@ -288,6 +294,7 @@ vt_encoding_metadata_t vt_tahoe_encoder_encode(vl_codec_tahoe_handle_t codec_han
//venc_buffer_t input_buf = {0};
int header_length = 0;
int i = 0;
+ struct v4l2_buffer src_buf;
tahoe_dma_buf_info_t dma_info_map;
memset(&result,0,sizeof(result));
@@ -300,6 +307,12 @@ vt_encoding_metadata_t vt_tahoe_encoder_encode(vl_codec_tahoe_handle_t codec_han
}
if (VMALLOC_TYPE == in_buffer_info->buf_type) {
+ encode_info->current_mode = VMALLOC_TYPE;
+ if (encode_info->v4l2_enable) {
+ if (!get_input_buf_forv4l(&encode_info->input_buf[0].virt_addr,&src_buf,encode_info)) {
+ VLOG(ERR,"get_input_buf_forv4l failed\n");
+ }
+ }
if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_NV12 || encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_NV21 ||
encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_YUV420_PLANAR) {
//need fix
@@ -323,11 +336,21 @@ vt_encoding_metadata_t vt_tahoe_encoder_encode(vl_codec_tahoe_handle_t codec_han
encode_info->buf_stride = encode_info->enc_width; //fix me!!!
VLOG(INFO,"vmalloc mode,input data addr:%x %x %x\n",encode_info->tahoe_enc_pic.inpt_buf_addr[0],encode_info->tahoe_enc_pic.inpt_buf_addr[1],encode_info->tahoe_enc_pic.inpt_buf_addr[2]);
}
- #if 1
else if (DMA_TYPE == in_buffer_info->buf_type) {
- vt_dma_info_t *dma_info;
- dma_info = &(in_buffer_info->buf_info.dma_info);
+ vt_dma_info_t *dma_info;
+ dma_info = &(in_buffer_info->buf_info.dma_info);
+
+ if (encode_info->v4l2_enable && (DMA_TYPE != encode_info->current_mode)) {
+ encode_info->current_mode = DMA_TYPE;
+ vl_v4l2_switch_to_dmamode(*encode_info,dma_info->num_planes);
+ }
+ if (encode_info->v4l2_enable) {
+ if (!get_input_buf_forv4l(&encode_info->input_buf[0].virt_addr,&src_buf,encode_info)) {
+ VLOG(ERR,"get_input_buf_forv4l failed\n");
+ }
+ }
+
if (encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_NV12 || encode_info->mfdin_input_fmt == MFDI_INPUT_FMT_NV21) {
if (dma_info->num_planes != 1 && dma_info->num_planes != 2) {
VLOG(ERR,"invalid num_planes %d\n", dma_info->num_planes);
@@ -371,7 +394,10 @@ vt_encoding_metadata_t vt_tahoe_encoder_encode(vl_codec_tahoe_handle_t codec_han
dma_info_map.fd[i] = dma_info->shared_fd[i];
VLOG(INFO,"instance %d:**shared_fd %d\n", encode_info->chn_id,dma_info->shared_fd[i]);
}
- vdi_config_dma(&dma_info_map);
+
+ if (!encode_info->v4l2_enable) {
+ vdi_config_dma(&dma_info_map);
+ }
VLOG(INFO,"instance %d:dma map num_planes:%d\n",encode_info->chn_id,dma_info_map.num_planes);
encode_info->buf_stride = ((encode_info->enc_width + 15) >> 4) << 4;
@@ -385,15 +411,51 @@ vt_encoding_metadata_t vt_tahoe_encoder_encode(vl_codec_tahoe_handle_t codec_han
encode_info->tahoe_enc_pic.inpt_buf_addr[2] = encode_info->tahoe_enc_pic.inpt_buf_addr[1] +
encode_info->buf_stride * encode_info->enc_height / 4;
}
+
+ if (encode_info->v4l2_enable) {
+ src_buf.m.planes[0].bytesused = encode_info->buf_stride * encode_info->enc_height * 3 / 2;
+ src_buf.m.planes[0].length = encode_info->buf_stride * encode_info->enc_height * 3 / 2;
+ src_buf.m.planes[0].m.fd = dma_info->shared_fd[0];
+ }
}
}
- if (dma_info_map.num_planes > 1 )
+ if (dma_info_map.num_planes > 1 )
encode_info->tahoe_enc_pic.inpt_buf_addr[1]= dma_info_map.phys_addr[1];
if (dma_info_map.num_planes > 2)
encode_info->tahoe_enc_pic.inpt_buf_addr[2]= dma_info_map.phys_addr[2];
+
+ if (encode_info->v4l2_enable && (dma_info_map.num_planes == 2)) {
+ src_buf.m.planes[0].bytesused = encode_info->buf_stride * encode_info->enc_height;
+ src_buf.m.planes[0].length = encode_info->buf_stride * encode_info->enc_height;
+ src_buf.m.planes[0].m.fd = dma_info->shared_fd[0];
+
+ src_buf.m.planes[1].bytesused = encode_info->buf_stride * encode_info->enc_height / 2;
+ src_buf.m.planes[1].m.fd = dma_info->shared_fd[1];
+ src_buf.m.planes[1].length = encode_info->buf_stride * encode_info->enc_height / 2;
+ }
+
+ if (encode_info->v4l2_enable && (dma_info_map.num_planes == 3)) {
+ src_buf.m.planes[0].bytesused = encode_info->buf_stride * encode_info->enc_height;
+ src_buf.m.planes[0].length = encode_info->buf_stride * encode_info->enc_height;
+ src_buf.m.planes[0].m.fd = dma_info->shared_fd[0];
+
+ src_buf.m.planes[1].bytesused = encode_info->buf_stride * encode_info->enc_height / 4;
+ src_buf.m.planes[1].length = encode_info->buf_stride * encode_info->enc_height / 4;
+ src_buf.m.planes[1].m.fd = dma_info->shared_fd[1];
+
+ src_buf.m.planes[2].bytesused = encode_info->buf_stride * encode_info->enc_height / 4;
+ src_buf.m.planes[2].length = encode_info->buf_stride * encode_info->enc_height / 4;
+ src_buf.m.planes[2].m.fd = dma_info->shared_fd[2];
+ }
}
-#endif
- ret = vl_tahoe_encoder_encode(encode_info);
+
+ if (encode_info->v4l2_enable) {
+ ret = vl_tahoe_encoder_encode(encode_info,&src_buf);
+ }
+ else {
+ ret = vl_tahoe_encoder_encode(encode_info, 0);
+ }
+
if (ret < 0) {
VLOG(ERR,"send encode cmd to encoder failed!ret:%d \n",ret);
result.is_valid = 0;
@@ -403,7 +465,9 @@ vt_encoding_metadata_t vt_tahoe_encoder_encode(vl_codec_tahoe_handle_t codec_han
if (0 == encode_info->enc_es.frame_type || 1 == encode_info->enc_es.frame_type) {
VLOG(INFO,"IDR or I frame!!\n");
- vt_tahoe_encoder_generate_header(codec_handle, out, &header_length);
+ if (!encode_info->v4l2_enable) {
+ vt_tahoe_encoder_generate_header(codec_handle, out, &header_length);
+ }
result.is_key_frame = 1;
}
@@ -426,7 +490,7 @@ vt_encoding_metadata_t vt_tahoe_encoder_encode(vl_codec_tahoe_handle_t codec_han
VLOG(INFO,"dump tahoe output file,%d",result.encoded_data_length_in_bytes);
}
#endif
- if (DMA_TYPE == in_buffer_info->buf_type) {
+ if ((DMA_TYPE == in_buffer_info->buf_type) && (!encode_info->v4l2_enable)) {
ret = vdi_unmap_dma(&dma_info_map);
if (ret != 0) {
VLOG(ERR,"vdi_unmap_dma src buffer failed!!\n");
diff --git a/amvenc_tahoe/tahoe_enc/tahoe.h b/amvenc_tahoe/tahoe_enc/tahoe.h
index 7485890..019fa67 100644
--- a/amvenc_tahoe/tahoe_enc/tahoe.h
+++ b/amvenc_tahoe/tahoe_enc/tahoe.h
@@ -270,6 +270,11 @@ typedef struct {
u8 golden_match_flag;
venc_buffer_t input_buf[3];
u8 svc_enable;
+ unsigned char *out;
+ unsigned char *input_yuvbuf;
+ int data_len;
+ unsigned char v4l2_enable;
+ unsigned char current_mode;
} handle_t;
#define TAHOE_REG_BASE_ADDR 0xFE370000
diff --git a/amvenc_tahoe/test.c b/amvenc_tahoe/test.c
index a84455f..9a5bac0 100644
--- a/amvenc_tahoe/test.c
+++ b/amvenc_tahoe/test.c
@@ -504,6 +504,7 @@ static void *encode_thread(void *param)
int frame_num;
int End_status = 0;
int pw = 0;
+ struct v4l2_buffer src_buf;
if (NULL != param)
cfg_encode = (encodecCfgParam *)param;
@@ -634,6 +635,7 @@ static void *encode_thread(void *param)
End_status = -1;
goto exit;
}
+ printf("open success,fd:%d\n",fp);
if (cfg_encode->cfg_upd_enabled) {
fp_cfg = fopen((const char*)cfg_encode->cfg_file, "r");
@@ -709,6 +711,9 @@ static void *encode_thread(void *param)
}
memset(&encode_info, 0, sizeof(handle_t));
+
+ detectV4l2Support(&encode_info);
+
encode_info.init_qp = 30;
encode_info.enc_rc_mode = 2;
encode_info.chn_id = cfg_encode->chnid;
@@ -965,29 +970,31 @@ static void *encode_thread(void *param)
}
}
} else {
- memset(&pFbSrcMem, 0, sizeof(pFbSrcMem));
- pFbSrcMem.size = framesize;
- pFbSrcMem.cached = 1;
+ if (!encode_info.v4l2_enable) {
+ memset(&pFbSrcMem, 0, sizeof(pFbSrcMem));
+ pFbSrcMem.size = framesize;
+ pFbSrcMem.cached = 1;
- if (vdi_allocate_dma_memory(&pFbSrcMem) < 0) {
- printf("Can not allocat dma Buffer chnid %d\n", encode_info.chn_id);
- End_status = -1;
- goto end;
+ if (vdi_allocate_dma_memory(&pFbSrcMem) < 0) {
+ printf("Can not allocat dma Buffer chnid %d\n", encode_info.chn_id);
+ End_status = -1;
+ goto end;
+ }
}
}
//for vps/sps/pps
- for (i = 0; i < 3; i++) {
- memset(&bsBuffer[i], 0, sizeof(bsBuffer[i]));
- bsBuffer[i].size = ENC_STREAM_BUF_SIZE;
- if (vdi_allocate_dma_memory(&bsBuffer[i]) < 0) {
- printf("Can not allocat dma Buffer chnid %d\n", encode_info.chn_id);
- End_status = -1;
- goto end;
- }
- printf("[%s][%d]bsBuffer[%d].phys_addr:0x%x\n", \
- __func__,__LINE__, i, bsBuffer[i].phys_addr);
- }
+// for (i = 0; i < 3; i++) {
+// memset(&bsBuffer[i], 0, sizeof(bsBuffer[i]));
+// bsBuffer[i].size = ENC_STREAM_BUF_SIZE;
+// if (vdi_allocate_dma_memory(&bsBuffer[i]) < 0) {
+// printf("Can not allocat dma Buffer chnid %d\n", encode_info.chn_id);
+// End_status = -1;
+// goto end;
+// }
+// printf("[%s][%d]bsBuffer[%d].phys_addr:0x%x\n", \
+// __func__,__LINE__, i, bsBuffer[i].phys_addr);
+// }
if (!encode_info.buf_stride)
{
@@ -1013,28 +1020,42 @@ static void *encode_thread(void *param)
printf("header buf addr:%lx %lx %lx\n",encode_info.header_buf_addr[0],encode_info.header_buf_addr[1],encode_info.header_buf_addr[2]);
printf("New allocate frame address y:0x%x cb:0x%x cr:0x%x\n",
encode_info.tahoe_enc_pic.inpt_buf_addr[0], encode_info.tahoe_enc_pic.inpt_buf_addr[1], encode_info.tahoe_enc_pic.inpt_buf_addr[2]);
+#if 0
+ encode_info.out = (unsigned char *) malloc(outbuffer_len);
+ if (encode_info.out == NULL) {
+ printf("Can not malloc outbuffer\n");
+ End_status = -1;
+ goto end;
+ }
+ encode_info.input_yuvbuf = (unsigned char *) malloc(framesize);
+ if (encode_info.input_yuvbuf == NULL) {
+ printf("Can not allocat inputBuffer\n");
+ End_status = -1;
+ goto exit;
+ }
+#endif
if (vl_tahoe_encoder_init(encode_info.enc_fmt, encode_info) < 0) {
printf("vl_tahoe_encoder_init failed chnid %d\n", encode_info.chn_id);
End_status = -1;
goto exit;
}
- if (cfg_encode->power_test_enabled) {
- for (pw = 0; pw < POWER_TEST_NUM_MAX; pw++) {
- if (fread(inputBuffer, 1, framesize, fp) != framesize)
- {
- rewind(fp);
- clearerr(fp);
- if (fread(inputBuffer, 1, framesize, fp) != framesize) {
- printf("read input file error!\n");
- End_status = -1;
- goto exit;
- }
- }
- memcpy((void *)((unsigned long)pFbPwSrcMem[pw].virt_addr), inputBuffer, framesize);
- }
- }
+// if (cfg_encode->power_test_enabled) {
+// for (pw = 0; pw < POWER_TEST_NUM_MAX; pw++) {
+// if (fread(inputBuffer, 1, framesize, fp) != framesize)
+// {
+// rewind(fp);
+// clearerr(fp);
+// if (fread(inputBuffer, 1, framesize, fp) != framesize) {
+// printf("read input file error!\n");
+// End_status = -1;
+// goto exit;
+// }
+// }
+// memcpy((void *)((unsigned long)pFbPwSrcMem[pw].virt_addr), inputBuffer, framesize);
+// }
+// }
gettimeofday(&timeStart, NULL);
for (i = 0; i < cfg_encode->num; i++) {
@@ -1051,6 +1072,12 @@ static void *encode_thread(void *param)
encode_info.tahoe_enc_pic.inpt_buf_addr[2] = pFbPwSrcMem[pw].phys_addr + (encode_info.buf_stride * encode_info.enc_height * 5 / 4);
}
} else {
+ if (encode_info.v4l2_enable) {
+ if (!get_input_buf_forv4l(&pFbSrcMem.virt_addr,&src_buf,&encode_info)) {
+ VLOG(ERR,"get_input_buf_forv4l failed\n");
+ }
+ }
+
if (fread(inputBuffer, 1, framesize, fp) != framesize)
{
rewind(fp);
@@ -1062,6 +1089,7 @@ static void *encode_thread(void *param)
}
}
memcpy((void *)((unsigned long)pFbSrcMem.virt_addr), inputBuffer, framesize);
+
}
if (cfg_encode->osd_enabled) {
@@ -1090,27 +1118,34 @@ static void *encode_thread(void *param)
encode_info.poc = 0;
if (encode_info.enc_frame_type == FRAME_TYPE_IDR || encode_info.enc_frame_type == FRAME_TYPE_I)
{
- vl_tahoe_encoder_generate_header(&encode_info);
- ret = get_header(&encode_info, outbuffer, (unsigned int *)&dataLength);
- if (ret == 0) {
- write(outfd, (unsigned char *) outbuffer, dataLength);
+ if (!encode_info.v4l2_enable) {
+ vl_tahoe_encoder_generate_header(&encode_info);
+ ret = get_header(&encode_info, outbuffer, (unsigned int *)&dataLength);
+ if (ret == 0) {
+ write(outfd, (unsigned char *) outbuffer, dataLength);
+ }
}
}
- vl_tahoe_encoder_encode(&encode_info);
+ if (encode_info.v4l2_enable) {
+ vl_tahoe_encoder_encode(&encode_info,&src_buf);
+ }
+ else {
+ vl_tahoe_encoder_encode(&encode_info,0);
+ }
+
ret = get_bsbframe(&encode_info, outbuffer, (unsigned int *)&dataLength, &frame_type);
gettimeofday(&writeStart, NULL);
if (ret == 0) {
- write(outfd, (unsigned char *) outbuffer,
- dataLength);
- }
- if (cfg_encode->ds_enabled) {
- ret = get_dsframe(&encode_info, outbuffer, (unsigned int *)&dataLength);
- if (ret == 0) {
- write(dsfd, (unsigned char *) outbuffer,
- dataLength);
- }
+ write(outfd, outbuffer, dataLength);
}
+// if (cfg_encode->ds_enabled) {
+// ret = get_dsframe(&encode_info, outbuffer, (unsigned int *)&dataLength);
+// if (ret == 0) {
+// write(dsfd, (unsigned char *) outbuffer,
+// dataLength);
+// }
+// }
gettimeofday(&writeEnd, NULL);
frameWriteTime = uTimeDiff(writeEnd, writeStart);
ioTime += frameWriteTime;
--
2.43.2