Skip to content

Commit 632ef26

Browse files
committed
refactor: use buffer properties to determine DMA, drop arg-based control
1 parent 2849433 commit 632ef26

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

src/codecs/v4l2/v4l2_h264_encoder.cpp

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ std::unique_ptr<webrtc::VideoEncoder> V4L2H264Encoder::Create(Args args) {
88

99
V4L2H264Encoder::V4L2H264Encoder(Args args)
1010
: fps_adjuster_(args.fps),
11-
is_dma_(!args.no_adaptive),
1211
bitrate_adjuster_(.85, 1),
1312
callback_(nullptr) {}
1413

@@ -26,8 +25,6 @@ int32_t V4L2H264Encoder::InitEncode(const webrtc::VideoCodec *codec_settings,
2625
return WEBRTC_VIDEO_CODEC_ERROR;
2726
}
2827

29-
encoder_ = V4L2Encoder::Create(width_, height_, V4L2_PIX_FMT_YUV420, is_dma_);
30-
3128
return WEBRTC_VIDEO_CODEC_OK;
3229
}
3330

@@ -43,14 +40,13 @@ int32_t V4L2H264Encoder::Release() {
4340

4441
int32_t V4L2H264Encoder::Encode(const webrtc::VideoFrame &frame,
4542
const std::vector<webrtc::VideoFrameType> *frame_types) {
46-
if (frame_types) {
47-
if ((*frame_types)[0] == webrtc::VideoFrameType::kVideoFrameKey) {
48-
V4L2Util::SetExtCtrl(encoder_->GetFd(), V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME, 1);
49-
} else if ((*frame_types)[0] == webrtc::VideoFrameType::kEmptyFrame) {
50-
return WEBRTC_VIDEO_CODEC_OK;
51-
}
43+
if (!frame_types) {
44+
return WEBRTC_VIDEO_CODEC_NO_OUTPUT;
5245
}
5346

47+
if ((*frame_types)[0] == webrtc::VideoFrameType::kEmptyFrame) {
48+
return WEBRTC_VIDEO_CODEC_OK;
49+
}
5450
rtc::scoped_refptr<webrtc::VideoFrameBuffer> frame_buffer = frame.video_frame_buffer();
5551

5652
V4L2Buffer src_buffer;
@@ -67,6 +63,14 @@ int32_t V4L2H264Encoder::Encode(const webrtc::VideoFrame &frame,
6763
src_buffer.length = i420_buffer_size;
6864
}
6965

66+
if (!encoder_) {
67+
encoder_ = V4L2Encoder::Create(width_, height_, V4L2_PIX_FMT_YUV420, src_buffer.dmafd > 0);
68+
}
69+
70+
if ((*frame_types)[0] == webrtc::VideoFrameType::kVideoFrameKey) {
71+
V4L2Util::SetExtCtrl(encoder_->GetFd(), V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME, 1);
72+
}
73+
7074
encoder_->EmplaceBuffer(src_buffer, [this, frame](V4L2Buffer &encoded_buffer) {
7175
SendFrame(frame, encoded_buffer);
7276
});
@@ -81,6 +85,9 @@ void V4L2H264Encoder::SetRates(const RateControlParameters &parameters) {
8185
bitrate_adjuster_.SetTargetBitrateBps(parameters.bitrate.get_sum_bps());
8286
fps_adjuster_ = parameters.framerate_fps;
8387

88+
if (!encoder_) {
89+
return;
90+
}
8491
encoder_->SetFps(fps_adjuster_);
8592
encoder_->SetBitrate(bitrate_adjuster_.GetAdjustedBitrateBps());
8693
}
@@ -89,8 +96,7 @@ webrtc::VideoEncoder::EncoderInfo V4L2H264Encoder::GetEncoderInfo() const {
8996
EncoderInfo info;
9097
info.supports_native_handle = true;
9198
info.is_hardware_accelerated = true;
92-
info.implementation_name =
93-
std::string("V4L2 H264 Hardware Encoder") + (is_dma_ ? "(DMA)" : "(M2M)");
99+
info.implementation_name = "Raspberry Pi V4L2 H264 Hardware Encoder";
94100
return info;
95101
}
96102

0 commit comments

Comments
 (0)