Skip to content

Commit 3527e35

Browse files
committed
perf: use block linear and nv12 for dma buffers
1 parent f3ea723 commit 3527e35

File tree

3 files changed

+20
-13
lines changed

3 files changed

+20
-13
lines changed

src/capturer/libargus_buffer_capturer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ void LibargusBufferCapturer::RunProducer() {
136136

137137
for (uint32_t i = 0; i < buffer_count_; i++) {
138138
native_buffers_[i] =
139-
DmaBuffer::create(stream_size_, NVBUF_COLOR_FORMAT_NV12, NVBUF_LAYOUT_PITCH);
139+
DmaBuffer::create(stream_size_, NVBUF_COLOR_FORMAT_NV12, NVBUF_LAYOUT_BLOCK_LINEAR);
140140
if (!native_buffers_[i]) {
141141
ERROR_PRINT("Failed to allocate NativeBuffer");
142142
}

src/codecs/jetson/jetson_encoder.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
#include "NvBuffer.h"
77
#include <NvBufSurface.h>
88

9-
const int KEY_FRAME_INTERVAL = 900;
10-
const int BUFFER_NUM = 10;
9+
const int KEY_FRAME_INTERVAL = 256;
10+
const int BUFFER_NUM = 4;
1111

1212
/* Only accept V4L2_PIX_FMT_YUV420M (multi-pnale yuv420) or dma source input */
1313
std::unique_ptr<JetsonEncoder> JetsonEncoder::Create(int width, int height, uint32_t dst_pix_fmt,
@@ -23,7 +23,7 @@ JetsonEncoder::JetsonEncoder(int width, int height, uint32_t dst_pix_fmt, bool i
2323
height_(height),
2424
framerate_(30),
2525
bitrate_bps_(2 * 1024 * 1024),
26-
src_pix_fmt_(V4L2_PIX_FMT_YUV420M),
26+
src_pix_fmt_(V4L2_PIX_FMT_NV12M),
2727
dst_pix_fmt_(dst_pix_fmt),
2828
is_dma_src_(is_dma_src) {}
2929

@@ -67,7 +67,7 @@ bool JetsonEncoder::CreateVideoEncoder() {
6767

6868
if (dst_pix_fmt_ == V4L2_PIX_FMT_H264) {
6969
ret = encoder_->setProfile(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH);
70-
ret = encoder_->setLevel(V4L2_MPEG_VIDEO_H264_LEVEL_4_0); // 4k60fps needs level 5.2
70+
ret = encoder_->setLevel(V4L2_MPEG_VIDEO_H264_LEVEL_5_1); // 4k60fps needs level 5.2
7171
if (ret < 0)
7272
ORIGINATE_ERROR("Could not set encoder level");
7373

@@ -225,12 +225,20 @@ void JetsonEncoder::EmplaceBuffer(V4L2FrameBufferRef frame_buffer,
225225
v4l2_output_buf.index = nv_buffer->index;
226226
}
227227

228+
NvBufSurface *nvbuf_surf = 0;
229+
int ret = NvBufSurfaceFromFd(frame_buffer->GetDmaFd(), (void **)(&nvbuf_surf));
230+
if (ret < 0) {
231+
ERROR_PRINT("Error while calling NvBufSurfaceFromFd");
232+
}
233+
228234
if (is_dma_src_) {
229235
for (int i = 0; i < nv_buffer->n_planes; i++) {
230-
231-
v4l2_output_buf.m.planes[i].m.fd = frame_buffer->GetDmaFd();
232-
/* byteused must be non-zero for a valid buffer */
233-
v4l2_output_buf.m.planes[i].bytesused = 1;
236+
nv_buffer->planes[i].fd = frame_buffer->GetDmaFd();
237+
v4l2_output_buf.m.planes[i].m.fd = nv_buffer->planes[i].fd;
238+
nv_buffer->planes[i].mem_offset = nvbuf_surf->surfaceList[0].planeParams.offset[i];
239+
nv_buffer->planes[i].bytesused =
240+
nv_buffer->planes[i].fmt.stride * nv_buffer->planes[i].fmt.height;
241+
v4l2_output_buf.m.planes[i].bytesused = nv_buffer->planes[i].bytesused;
234242
}
235243
} else {
236244
ConvertI420ToYUV420M(nv_buffer, frame_buffer->ToI420());

src/codecs/jetson/jetson_scaler.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ bool JetsonScaler::PrepareScaledDmaBuffer(int width, int height) {
5555
NvBufSurf::NvCommonAllocateParams cParams;
5656
cParams.width = width;
5757
cParams.height = height;
58-
cParams.layout = NVBUF_LAYOUT_PITCH;
59-
cParams.colorFormat = NVBUF_COLOR_FORMAT_YUV420;
58+
cParams.layout = NVBUF_LAYOUT_BLOCK_LINEAR;
59+
cParams.colorFormat = NVBUF_COLOR_FORMAT_NV12;
6060
cParams.memtag = NvBufSurfaceTag_VIDEO_ENC;
6161
cParams.memType = NVBUF_MEM_SURFACE_ARRAY;
6262

@@ -80,8 +80,7 @@ void JetsonScaler::EmplaceBuffer(V4L2FrameBufferRef frame_buffer,
8080
frame_buffer->GetDmaFd(), dst_dma_fd);
8181
}
8282

83-
auto v4l2_buffer =
84-
V4L2Buffer::FromCapturedPlane(nullptr, 0, dst_dma_fd, 0, V4L2_PIX_FMT_YUV420M);
83+
auto v4l2_buffer = V4L2Buffer::FromCapturedPlane(nullptr, 0, dst_dma_fd, 0, V4L2_PIX_FMT_NV12);
8584
auto scaled_frame_buffer_ = V4L2FrameBuffer::Create(dst_width_, dst_height_, v4l2_buffer);
8685

8786
on_capture(scaled_frame_buffer_);

0 commit comments

Comments
 (0)