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 */
1313std::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 ());
0 commit comments