Skip to content

Commit 163fb8b

Browse files
committed
feat: add recording support on Jetson
1 parent db51a24 commit 163fb8b

13 files changed

+125
-90
lines changed

src/capturer/libargus_buffer_capturer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ void LibargusBufferCapturer::CaptureImage() {
272272
auto dmabuf = DmaBuffer::fromArgusBuffer(buffer);
273273
int dmabuf_fd = dmabuf->getFd();
274274
frame_buffer_->SetDmaFd(dmabuf_fd);
275+
frame_buffer_->SetTimestamp(dmabuf->getTimeval());
275276

276277
// NV12M to NV12
277278
NvBufSurface *nvbuf = nullptr;

src/capturer/libargus_buffer_capturer.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,28 @@ class DmaBuffer : public ArgusSamples::NvNativeBuffer,
5050

5151
/* Help function to convert Argus Buffer to DmaBuffer */
5252
static DmaBuffer *fromArgusBuffer(Argus::Buffer *buffer) {
53-
Argus::IBuffer *iBuffer = interface_cast<Argus::IBuffer>(buffer);
54-
const DmaBuffer *dmabuf = static_cast<const DmaBuffer *>(iBuffer->getClientData());
53+
Argus::IBuffer *i_buffer = interface_cast<Argus::IBuffer>(buffer);
54+
const DmaBuffer *dmabuf = static_cast<const DmaBuffer *>(i_buffer->getClientData());
5555

5656
return const_cast<DmaBuffer *>(dmabuf);
5757
}
5858

5959
/* Return DMA buffer handle */
6060
int getFd() const { return m_fd; }
6161

62+
/* Get timestamp*/
63+
timeval getTimeval() const {
64+
Argus::IBuffer *i_buffer = interface_cast<Argus::IBuffer>(m_buffer);
65+
auto metadata = i_buffer->getMetadata();
66+
const Argus::ICaptureMetadata *imetadata =
67+
Argus::interface_cast<const Argus::ICaptureMetadata>(metadata);
68+
69+
timeval tv = {};
70+
tv.tv_sec = imetadata->getSensorTimestamp() / 1000000000;
71+
tv.tv_usec = (imetadata->getSensorTimestamp() % 1000000000) / 1000;
72+
return tv;
73+
}
74+
6275
/* Get and set reference to Argus buffer */
6376
void setArgusBuffer(Argus::Buffer *buffer) { m_buffer = buffer; }
6477
Argus::Buffer *getArgusBuffer() const { return m_buffer; }

src/common/v4l2_frame_buffer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ bool V4L2FrameBuffer::SetDmaFd(int fd) {
108108
return true;
109109
}
110110

111+
void V4L2FrameBuffer::SetTimestamp(timeval timestamp) { timestamp_ = timestamp; }
112+
111113
/* Return a new refptr with copied metadata and frame data. */
112114
rtc::scoped_refptr<V4L2FrameBuffer> V4L2FrameBuffer::Clone() const {
113115
auto clone = rtc::make_ref_counted<V4L2FrameBuffer>(width_, height_, size_, format_);

src/common/v4l2_frame_buffer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class V4L2FrameBuffer : public webrtc::VideoFrameBuffer {
3232
V4L2Buffer GetRawBuffer();
3333
int GetDmaFd() const;
3434
bool SetDmaFd(int fd);
35+
void SetTimestamp(timeval timestamp);
3536
rtc::scoped_refptr<V4L2FrameBuffer> Clone() const;
3637

3738
protected:

src/common/v4l2_utils.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,6 @@ struct V4L2Buffer {
2020

2121
V4L2Buffer() = default;
2222

23-
static V4L2Buffer FromRaw(void *start, uint32_t length) {
24-
V4L2Buffer buf;
25-
buf.start = start;
26-
buf.length = length;
27-
return buf;
28-
}
29-
3023
static V4L2Buffer FromV4L2(void *start, const v4l2_buffer &v4l2, uint32_t fmt) {
3124
V4L2Buffer buf;
3225
buf.start = start;

src/recorder/h264_recorder.cpp

Lines changed: 0 additions & 48 deletions
This file was deleted.

src/recorder/h264_recorder.h

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/recorder/openh264_recorder.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "recorder/openh264_recorder.h"
2+
3+
std::unique_ptr<Openh264Recorder> Openh264Recorder::Create(Args config) {
4+
return std::make_unique<Openh264Recorder>(config, "h264_v4l2m2m");
5+
}
6+
7+
Openh264Recorder::Openh264Recorder(Args config, std::string encoder_name)
8+
: VideoRecorder(config, encoder_name) {}
9+
10+
void Openh264Recorder::Encode(rtc::scoped_refptr<V4L2FrameBuffer> frame_buffer) {
11+
if (!encoder_) {
12+
encoder_ = Openh264Encoder::Create(config);
13+
}
14+
15+
auto i420_buffer = frame_buffer->ToI420();
16+
encoder_->Encode(i420_buffer, [this, frame_buffer](uint8_t *encoded_buffer, int size) {
17+
OnEncoded(encoded_buffer, size, frame_buffer->timestamp());
18+
});
19+
}
20+
21+
void Openh264Recorder::ReleaseEncoder() { encoder_.reset(); }

src/recorder/openh264_recorder.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#ifndef OPENH264_RECORDER_H_
2+
#define OPENH264_RECORDER_H_
3+
4+
#include "codecs/h264/openh264_encoder.h"
5+
#include "recorder/video_recorder.h"
6+
7+
class Openh264Recorder : public VideoRecorder {
8+
public:
9+
static std::unique_ptr<Openh264Recorder> Create(Args config);
10+
Openh264Recorder(Args config, std::string encoder_name);
11+
12+
protected:
13+
void ReleaseEncoder() override;
14+
void Encode(rtc::scoped_refptr<V4L2FrameBuffer> frame_buffer) override;
15+
16+
private:
17+
std::unique_ptr<Openh264Encoder> encoder_;
18+
};
19+
20+
#endif

src/recorder/recorder_manager.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
#include "common/logging.h"
1212
#include "common/utils.h"
1313
#include "common/v4l2_frame_buffer.h"
14-
#include "recorder/h264_recorder.h"
14+
#include "recorder/openh264_recorder.h"
15+
#if defined(RPI_PLATFORM)
1516
#include "recorder/raw_h264_recorder.h"
17+
#include "recorder/v4l2_h264_recorder.h"
18+
#endif
1619

1720
const int ROTATION_PERIOD = 60;
1821
const unsigned long MIN_FREE_BYTE = 400 * 1024 * 1024;
@@ -88,11 +91,19 @@ void RecorderManager::CreateVideoRecorder(std::shared_ptr<VideoCapturer> capture
8891
video_recorder = ([this, capturer]() -> std::unique_ptr<VideoRecorder> {
8992
if (config.record_mode == RecordMode::Snapshot) {
9093
return nullptr;
91-
} else if (capturer->format() == V4L2_PIX_FMT_H264) {
94+
}
95+
#if defined(RPI_PLATFORM)
96+
if (capturer->format() == V4L2_PIX_FMT_H264) {
9297
return RawH264Recorder::Create(capturer->config());
93-
} else {
94-
return H264Recorder::Create(capturer->config());
98+
} else if (config.hw_accel) {
99+
return V4L2H264Recorder::Create(capturer->config());
95100
}
101+
#endif
102+
103+
#if defined(JETSON_PLATFORM)
104+
// todo: use jetson hw video encoder
105+
#endif
106+
return Openh264Recorder::Create(capturer->config());
96107
})();
97108
}
98109

0 commit comments

Comments
 (0)