| Index: webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h
 | 
| diff --git a/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h b/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h
 | 
| index 2be8779d62a9615fe3d5a8079645101638f9e870..744c66a69e718c025b6187e5aa32afdbebc8cb3c 100644
 | 
| --- a/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h
 | 
| +++ b/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h
 | 
| @@ -13,15 +13,21 @@
 | 
|  #define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SIMULCAST_ENCODER_ADAPTER_H_
 | 
|  
 | 
|  #include <memory>
 | 
| +#include <stack>
 | 
|  #include <string>
 | 
| +#include <utility>
 | 
|  #include <vector>
 | 
|  
 | 
| +#include "webrtc/base/atomicops.h"
 | 
| +#include "webrtc/base/sequenced_task_checker.h"
 | 
|  #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
 | 
|  
 | 
|  namespace webrtc {
 | 
|  
 | 
|  class SimulcastRateAllocator;
 | 
|  
 | 
| +// TODO(brandtr): Remove this class and replace its use with a
 | 
| +// WebRtcVideoEncoderFactory.
 | 
|  class VideoEncoderFactory {
 | 
|   public:
 | 
|    virtual VideoEncoder* Create() = 0;
 | 
| @@ -31,14 +37,16 @@ class VideoEncoderFactory {
 | 
|  
 | 
|  // SimulcastEncoderAdapter implements simulcast support by creating multiple
 | 
|  // webrtc::VideoEncoder instances with the given VideoEncoderFactory.
 | 
| -// All the public interfaces are expected to be called from the same thread,
 | 
| -// e.g the encoder thread.
 | 
| +// The object is created and destroyed on the worker thread, but all public
 | 
| +// interfaces should be called from the encoder task queue.
 | 
|  class SimulcastEncoderAdapter : public VP8Encoder {
 | 
|   public:
 | 
| +  // TODO(brandtr): Make it clear that the ownership of |factory| is transferred
 | 
| +  // by only accepting a std::unique_ptr<VideoEncoderFactory> here.
 | 
|    explicit SimulcastEncoderAdapter(VideoEncoderFactory* factory);
 | 
|    virtual ~SimulcastEncoderAdapter();
 | 
|  
 | 
| -  // Implements VideoEncoder
 | 
| +  // Implements VideoEncoder.
 | 
|    int Release() override;
 | 
|    int InitEncode(const VideoCodec* inst,
 | 
|                   int number_of_cores,
 | 
| @@ -67,47 +75,50 @@ class SimulcastEncoderAdapter : public VP8Encoder {
 | 
|  
 | 
|   private:
 | 
|    struct StreamInfo {
 | 
| -    StreamInfo()
 | 
| -        : encoder(NULL),
 | 
| -          callback(NULL),
 | 
| -          width(0),
 | 
| -          height(0),
 | 
| -          key_frame_request(false),
 | 
| -          send_stream(true) {}
 | 
|      StreamInfo(VideoEncoder* encoder,
 | 
| -               EncodedImageCallback* callback,
 | 
| +               std::unique_ptr<EncodedImageCallback> callback,
 | 
|                 uint16_t width,
 | 
|                 uint16_t height,
 | 
|                 bool send_stream)
 | 
|          : encoder(encoder),
 | 
| -          callback(callback),
 | 
| +          callback(std::move(callback)),
 | 
|            width(width),
 | 
|            height(height),
 | 
|            key_frame_request(false),
 | 
|            send_stream(send_stream) {}
 | 
| -    // Deleted by SimulcastEncoderAdapter::Release().
 | 
| +    // Deleted by SimulcastEncoderAdapter::DestroyStoredEncoders().
 | 
|      VideoEncoder* encoder;
 | 
| -    EncodedImageCallback* callback;
 | 
| +    std::unique_ptr<EncodedImageCallback> callback;
 | 
|      uint16_t width;
 | 
|      uint16_t height;
 | 
|      bool key_frame_request;
 | 
|      bool send_stream;
 | 
|    };
 | 
|  
 | 
| -  // Populate the codec settings for each stream.
 | 
| -  void PopulateStreamCodec(const webrtc::VideoCodec* inst,
 | 
| -                           int stream_index,
 | 
| -                           uint32_t start_bitrate_kbps,
 | 
| -                           bool highest_resolution_stream,
 | 
| -                           webrtc::VideoCodec* stream_codec);
 | 
| +  // Populate the codec settings for each simulcast stream.
 | 
| +  static void PopulateStreamCodec(const webrtc::VideoCodec& inst,
 | 
| +                                  int stream_index,
 | 
| +                                  uint32_t start_bitrate_kbps,
 | 
| +                                  bool highest_resolution_stream,
 | 
| +                                  webrtc::VideoCodec* stream_codec);
 | 
|  
 | 
|    bool Initialized() const;
 | 
|  
 | 
| -  std::unique_ptr<VideoEncoderFactory> factory_;
 | 
| +  void DestroyStoredEncoders();
 | 
| +
 | 
| +  volatile int inited_;  // Accessed atomically.
 | 
| +  const std::unique_ptr<VideoEncoderFactory> factory_;
 | 
|    VideoCodec codec_;
 | 
|    std::vector<StreamInfo> streaminfos_;
 | 
|    EncodedImageCallback* encoded_complete_callback_;
 | 
|    std::string implementation_name_;
 | 
| +
 | 
| +  // Used for checking the single-threaded access of the encoder interface.
 | 
| +  rtc::SequencedTaskChecker encoder_queue_;
 | 
| +
 | 
| +  // Store encoders in between calls to Release and InitEncode, so they don't
 | 
| +  // have to be recreated. Remaining encoders are destroyed by the destructor.
 | 
| +  std::stack<VideoEncoder*> stored_encoders_;
 | 
|  };
 | 
|  
 | 
|  }  // namespace webrtc
 | 
| 
 |