| Index: webrtc/test/fake_encoder.cc
|
| diff --git a/webrtc/test/fake_encoder.cc b/webrtc/test/fake_encoder.cc
|
| index ac7144079b6374645b2cc44039b9f77e77ad319b..1db93eb40e36b6ebc87089a6171b438bfdfa907c 100644
|
| --- a/webrtc/test/fake_encoder.cc
|
| +++ b/webrtc/test/fake_encoder.cc
|
| @@ -15,7 +15,6 @@
|
| #include <algorithm>
|
| #include <memory>
|
|
|
| -#include "webrtc/base/atomicops.h"
|
| #include "webrtc/base/checks.h"
|
| #include "webrtc/common_types.h"
|
| #include "webrtc/modules/video_coding/include/video_codec_interface.h"
|
| @@ -36,8 +35,6 @@ FakeEncoder::FakeEncoder(Clock* clock)
|
| }
|
| }
|
|
|
| -FakeEncoder::~FakeEncoder() {}
|
| -
|
| void FakeEncoder::SetMaxBitrate(int max_kbps) {
|
| RTC_DCHECK_GE(max_kbps, -1); // max_kbps == -1 disables it.
|
| rtc::CritScope cs(&crit_sect_);
|
| @@ -254,33 +251,47 @@ EncodedImageCallback::Result FakeH264Encoder::OnEncodedImage(
|
| }
|
|
|
| DelayedEncoder::DelayedEncoder(Clock* clock, int delay_ms)
|
| - : test::FakeEncoder(clock),
|
| - delay_ms_(delay_ms) {}
|
| + : test::FakeEncoder(clock), delay_ms_(delay_ms) {
|
| + // The encoder could be created on a different thread than
|
| + // it is being used on.
|
| + sequence_checker_.Detach();
|
| +}
|
|
|
| void DelayedEncoder::SetDelay(int delay_ms) {
|
| - rtc::CritScope cs(&local_crit_sect_);
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
|
| delay_ms_ = delay_ms;
|
| }
|
|
|
| int32_t DelayedEncoder::Encode(const VideoFrame& input_image,
|
| const CodecSpecificInfo* codec_specific_info,
|
| const std::vector<FrameType>* frame_types) {
|
| - int delay_ms = 0;
|
| - {
|
| - rtc::CritScope cs(&local_crit_sect_);
|
| - delay_ms = delay_ms_;
|
| - }
|
| - SleepMs(delay_ms);
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
|
| +
|
| + 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") {}
|
| + queue1_(nullptr),
|
| + queue2_(nullptr) {
|
| + // The encoder could be created on a different thread than
|
| + // it is being used on.
|
| + sequence_checker_.Detach();
|
| +}
|
| +
|
| +int32_t MultithreadedFakeH264Encoder::InitEncode(const VideoCodec* config,
|
| + int32_t number_of_cores,
|
| + size_t max_payload_size) {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
|
|
|
| -MultithreadedFakeH264Encoder::~MultithreadedFakeH264Encoder() = default;
|
| + queue1_.reset(new rtc::TaskQueue("Queue 1"));
|
| + queue2_.reset(new rtc::TaskQueue("Queue 2"));
|
| +
|
| + return FakeH264Encoder::InitEncode(config, number_of_cores, max_payload_size);
|
| +}
|
|
|
| class MultithreadedFakeH264Encoder::EncodeTask : public rtc::QueuedTask {
|
| public:
|
| @@ -313,13 +324,19 @@ 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_;
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
|
| +
|
| + std::unique_ptr<rtc::TaskQueue>& queue =
|
| + (current_queue_++ % 2 == 0) ? queue1_ : queue2_;
|
| +
|
| + if (!queue) {
|
| + return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
|
| + }
|
|
|
| - queue.PostTask(std::unique_ptr<rtc::QueuedTask>(
|
| + queue->PostTask(std::unique_ptr<rtc::QueuedTask>(
|
| new EncodeTask(this, input_image, codec_specific_info, frame_types)));
|
|
|
| - return 0;
|
| + return WEBRTC_VIDEO_CODEC_OK;
|
| }
|
|
|
| int32_t MultithreadedFakeH264Encoder::EncodeCallback(
|
| @@ -329,5 +346,14 @@ int32_t MultithreadedFakeH264Encoder::EncodeCallback(
|
| return FakeH264Encoder::Encode(input_image, codec_specific_info, frame_types);
|
| }
|
|
|
| +int32_t MultithreadedFakeH264Encoder::Release() {
|
| + RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
|
| +
|
| + queue1_.reset();
|
| + queue2_.reset();
|
| +
|
| + return FakeH264Encoder::Release();
|
| +}
|
| +
|
| } // namespace test
|
| } // namespace webrtc
|
|
|