@@ -143,8 +143,7 @@ void V4L2Capturer::CaptureImage() {
143143 return ;
144144 }
145145
146- V4L2Buffer buffer ((uint8_t *)capture_.buffers [buf.index ].start , buf.bytesused , buf.flags ,
147- buf.timestamp );
146+ auto buffer = V4L2Buffer::FromV4L2 ((uint8_t *)capture_.buffers [buf.index ].start , buf, format_);
148147 NextBuffer (buffer);
149148
150149 if (!V4L2Util::QueueBuffer (fd_, &buf)) {
@@ -162,35 +161,32 @@ rtc::scoped_refptr<webrtc::I420BufferInterface> V4L2Capturer::GetI420Frame() {
162161}
163162
164163void V4L2Capturer::NextBuffer (V4L2Buffer &buffer) {
165- if (hw_accel_) {
166- // hardware encoding
164+ if (hw_accel_ && format_ == V4L2_PIX_FMT_H264 ) {
165+ has_first_keyframe_ = (buffer. flags & V4L2_BUF_FLAG_KEYFRAME) != 0 ;
167166 if (!has_first_keyframe_) {
168- has_first_keyframe_ = (buffer. flags & V4L2_BUF_FLAG_KEYFRAME) != 0 ;
167+ return ;
169168 }
169+ }
170170
171- if (IsCompressedFormat ()) {
172- decoder_->EmplaceBuffer (buffer, [this ](V4L2Buffer decoded_buffer) {
173- frame_buffer_ =
174- V4L2FrameBuffer::Create (width_, height_, decoded_buffer, V4L2_PIX_FMT_YUV420);
175- NextFrameBuffer (frame_buffer_);
176- });
177- } else {
178- frame_buffer_ = V4L2FrameBuffer::Create (width_, height_, buffer, format_);
179- NextFrameBuffer (frame_buffer_);
180- }
171+ if (!hw_accel_ && format_ == V4L2_PIX_FMT_H264) {
172+ INFO_PRINT (" Software decoding H264 camera source is not supported." );
173+ exit (EXIT_FAILURE);
174+ }
175+
176+ if (hw_accel_ && IsCompressedFormat ()) {
177+ decoder_->EmplaceBuffer (buffer, [this , buffer](V4L2Buffer &decoded_buffer) {
178+ // hw decoder doesn't output timestamps.
179+ decoded_buffer.timestamp = buffer.timestamp ;
180+ HandleDecodedBuffer (decoded_buffer);
181+ });
181182 } else {
182- // software decoding
183- if (format_ != V4L2_PIX_FMT_H264) {
184- frame_buffer_ = V4L2FrameBuffer::Create (width_, height_, buffer, format_);
185- NextFrameBuffer (frame_buffer_);
186- } else {
187- // todo: h264 decoding
188- INFO_PRINT (" Software decoding h264 camera source is not support now." );
189- exit (1 );
190- }
183+ HandleDecodedBuffer (buffer);
191184 }
185+ }
192186
193- NextRawBuffer (buffer);
187+ void V4L2Capturer::HandleDecodedBuffer (V4L2Buffer &buffer) {
188+ frame_buffer_ = V4L2FrameBuffer::Create (width_, height_, buffer);
189+ NextFrameBuffer (frame_buffer_);
194190}
195191
196192void V4L2Capturer::StartCapture () {
0 commit comments