Partial frame capture API part 4
Wire-up PartialFrameCompressor to VideoStreamEncoder.
Bug: webrtc:10152
Change-Id: I6a3df28e392cf3f47aec1c97abb1d4d73d5f7e2a
Reviewed-on: https://webrtc-review.googlesource.com/c/120409
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26548}
diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc
index ea59b0a..b4b5af5 100644
--- a/video/video_stream_encoder.cc
+++ b/video/video_stream_encoder.cc
@@ -336,6 +336,7 @@
}
// Limit to configured max framerate.
wants.max_framerate_fps = std::min(max_framerate_, wants.max_framerate_fps);
+ wants.partial_frames = true;
return wants;
}
@@ -713,8 +714,24 @@
void VideoStreamEncoder::OnFrame(const VideoFrame& video_frame) {
RTC_DCHECK_RUNS_SERIALIZED(&incoming_frame_race_checker_);
+
+ const VideoFrame::PartialFrameDescription* partial_desc =
+ video_frame.partial_frame_description();
VideoFrame incoming_frame = video_frame;
+ if (video_frame.cache_buffer_for_partial_updates()) {
+ VideoFrameBuffer* input_buffer = video_frame.video_frame_buffer();
+ if (!partial_frame_assembler_.ApplyPartialUpdate(
+ input_buffer, &incoming_frame, partial_desc)) {
+ // Can't apply new image to the cached buffer because of some error.
+ // Nothing sensible to encode.
+ // Detailed error message is already logged by |ApplyPartialUpdate()|.
+ return;
+ }
+ } else {
+ partial_frame_assembler_.Reset();
+ }
+
// Local time in webrtc time base.
int64_t current_time_us = clock_->TimeInMicroseconds();
int64_t current_time_ms = current_time_us / rtc::kNumMicrosecsPerMillisec;
diff --git a/video/video_stream_encoder.h b/video/video_stream_encoder.h
index 577ca5b..0c9cb3c 100644
--- a/video/video_stream_encoder.h
+++ b/video/video_stream_encoder.h
@@ -33,6 +33,7 @@
#include "rtc_base/sequenced_task_checker.h"
#include "rtc_base/task_queue.h"
#include "video/overuse_frame_detector.h"
+#include "video/partial_frame_assembler.h"
namespace webrtc {
@@ -295,6 +296,9 @@
// the worker thread.
std::atomic<int> pending_frame_drops_;
+ PartialFrameAssembler partial_frame_assembler_
+ RTC_GUARDED_BY(incoming_frame_race_checker_);
+
// All public methods are proxied to |encoder_queue_|. It must must be
// destroyed first to make sure no tasks are run that use other members.
rtc::TaskQueue encoder_queue_;