Index: webrtc/test/fake_encoder.cc |
diff --git a/webrtc/test/fake_encoder.cc b/webrtc/test/fake_encoder.cc |
index ae1788bf6c6e534c885a0b9db0338fd0e85e5a24..46b51b6aa4d233ced77bc34d3a35d1cb617d20aa 100644 |
--- a/webrtc/test/fake_encoder.cc |
+++ b/webrtc/test/fake_encoder.cc |
@@ -12,6 +12,7 @@ |
#include <algorithm> |
+#include "webrtc/base/atomicops.h" |
#include "webrtc/base/checks.h" |
#include "webrtc/modules/video_coding/include/video_codec_interface.h" |
#include "webrtc/system_wrappers/include/sleep.h" |
@@ -225,5 +226,61 @@ int32_t DelayedEncoder::Encode(const VideoFrame& input_image, |
SleepMs(delay_ms); |
return FakeEncoder::Encode(input_image, codec_specific_info, frame_types); |
} |
+ |
+MultiThreadedFakeH264Encoder::MultiThreadedFakeH264Encoder(Clock* clock) |
+ : test::FakeH264Encoder(clock), |
+ current_queue_(0), |
+ queue1_("Queue 1"), |
+ queue2_("Queue 2") {} |
+ |
+MultiThreadedFakeH264Encoder::~MultiThreadedFakeH264Encoder() = default; |
+ |
+class MultiThreadedFakeH264Encoder::EncodeTask : public rtc::QueuedTask { |
+ public: |
+ EncodeTask(MultiThreadedFakeH264Encoder* encoder, |
+ const VideoFrame& input_image, |
+ const CodecSpecificInfo* codec_specific_info, |
+ const std::vector<FrameType>* frame_types) |
+ : encoder_(encoder), |
+ input_image_(input_image), |
+ codec_specific_info_(), |
+ frame_types_(*frame_types) { |
+ if (codec_specific_info) |
+ codec_specific_info_ = *codec_specific_info; |
+ } |
+ |
+ private: |
+ bool Run() override { |
+ encoder_->EncodeCallback(input_image_, &codec_specific_info_, |
+ &frame_types_); |
+ return true; |
+ } |
+ |
+ MultiThreadedFakeH264Encoder* const encoder_; |
+ VideoFrame input_image_; |
+ CodecSpecificInfo codec_specific_info_; |
+ std::vector<FrameType> frame_types_; |
+}; |
+ |
+int32_t MultiThreadedFakeH264Encoder::Encode( |
+ const VideoFrame& input_image, |
+ const CodecSpecificInfo* codec_specific_info, |
+ const std::vector<FrameType>* frame_types) { |
+ int current_queue = rtc::AtomicOps::Increment(¤t_queue_); |
+ rtc::TaskQueue& queue = (current_queue % 2 == 0) ? queue1_ : queue2_; |
+ |
+ queue.PostTask(std::unique_ptr<rtc::QueuedTask>( |
+ new EncodeTask(this, input_image, codec_specific_info, frame_types))); |
+ |
+ return 0; |
+} |
+ |
+int32_t MultiThreadedFakeH264Encoder::EncodeCallback( |
+ const VideoFrame& input_image, |
+ const CodecSpecificInfo* codec_specific_info, |
+ const std::vector<FrameType>* frame_types) { |
+ return FakeH264Encoder::Encode(input_image, codec_specific_info, frame_types); |
+} |
+ |
} // namespace test |
} // namespace webrtc |