@@ -8,7 +8,6 @@ std::unique_ptr<webrtc::VideoEncoder> V4L2H264Encoder::Create(Args args) {
88
99V4L2H264Encoder::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
4441int32_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 ¶meters) {
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