| Index: media/cast/cast_sender_impl.cc
|
| diff --git a/media/cast/cast_sender_impl.cc b/media/cast/cast_sender_impl.cc
|
| index 1a97ae4c343a526bdd1e0228cb624125486e55b6..c461d351b6770299b67cad45f3a13b429baf6448 100644
|
| --- a/media/cast/cast_sender_impl.cc
|
| +++ b/media/cast/cast_sender_impl.cc
|
| @@ -12,17 +12,13 @@
|
| namespace media {
|
| namespace cast {
|
|
|
| -// The LocalFrameInput class posts all incoming frames; audio and video to the
|
| -// main cast thread for processing.
|
| -// This make the cast sender interface thread safe.
|
| -class LocalFrameInput : public FrameInput {
|
| +// The LocalVideoFrameInput class posts all incoming video frames to the main
|
| +// cast thread for processing.
|
| +class LocalVideoFrameInput : public VideoFrameInput {
|
| public:
|
| - LocalFrameInput(scoped_refptr<CastEnvironment> cast_environment,
|
| - base::WeakPtr<AudioSender> audio_sender,
|
| - base::WeakPtr<VideoSender> video_sender)
|
| - : cast_environment_(cast_environment),
|
| - audio_sender_(audio_sender),
|
| - video_sender_(video_sender) {}
|
| + LocalVideoFrameInput(scoped_refptr<CastEnvironment> cast_environment,
|
| + base::WeakPtr<VideoSender> video_sender)
|
| + : cast_environment_(cast_environment), video_sender_(video_sender) {}
|
|
|
| virtual void InsertRawVideoFrame(
|
| const scoped_refptr<media::VideoFrame>& video_frame,
|
| @@ -35,6 +31,26 @@ class LocalFrameInput : public FrameInput {
|
| capture_time));
|
| }
|
|
|
| + protected:
|
| + virtual ~LocalVideoFrameInput() {}
|
| +
|
| + private:
|
| + friend class base::RefCountedThreadSafe<LocalVideoFrameInput>;
|
| +
|
| + scoped_refptr<CastEnvironment> cast_environment_;
|
| + base::WeakPtr<VideoSender> video_sender_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(LocalVideoFrameInput);
|
| +};
|
| +
|
| +// The LocalAudioFrameInput class posts all incoming audio frames to the main
|
| +// cast thread for processing. Therefore frames can be inserted from any thread.
|
| +class LocalAudioFrameInput : public AudioFrameInput {
|
| + public:
|
| + LocalAudioFrameInput(scoped_refptr<CastEnvironment> cast_environment,
|
| + base::WeakPtr<AudioSender> audio_sender)
|
| + : cast_environment_(cast_environment), audio_sender_(audio_sender) {}
|
| +
|
| virtual void InsertAudio(const AudioBus* audio_bus,
|
| const base::TimeTicks& recorded_time,
|
| const base::Closure& done_callback) OVERRIDE {
|
| @@ -48,96 +64,71 @@ class LocalFrameInput : public FrameInput {
|
| }
|
|
|
| protected:
|
| - virtual ~LocalFrameInput() {}
|
| + virtual ~LocalAudioFrameInput() {}
|
|
|
| private:
|
| - friend class base::RefCountedThreadSafe<LocalFrameInput>;
|
| + friend class base::RefCountedThreadSafe<LocalAudioFrameInput>;
|
|
|
| scoped_refptr<CastEnvironment> cast_environment_;
|
| base::WeakPtr<AudioSender> audio_sender_;
|
| - base::WeakPtr<VideoSender> video_sender_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(LocalFrameInput);
|
| + DISALLOW_COPY_AND_ASSIGN(LocalAudioFrameInput);
|
| };
|
|
|
| -CastSender* CastSender::CreateCastSender(
|
| +scoped_ptr<CastSender> CastSender::Create(
|
| scoped_refptr<CastEnvironment> cast_environment,
|
| - const AudioSenderConfig* audio_config,
|
| - const VideoSenderConfig* video_config,
|
| - const scoped_refptr<GpuVideoAcceleratorFactories>& gpu_factories,
|
| - const CastInitializationCallback& initialization_status,
|
| transport::CastTransportSender* const transport_sender) {
|
| CHECK(cast_environment);
|
| - return new CastSenderImpl(cast_environment,
|
| - audio_config,
|
| - video_config,
|
| - gpu_factories,
|
| - initialization_status,
|
| - transport_sender);
|
| + return scoped_ptr<CastSender>(
|
| + new CastSenderImpl(cast_environment, transport_sender));
|
| }
|
|
|
| CastSenderImpl::CastSenderImpl(
|
| scoped_refptr<CastEnvironment> cast_environment,
|
| - const AudioSenderConfig* audio_config,
|
| - const VideoSenderConfig* video_config,
|
| - const scoped_refptr<GpuVideoAcceleratorFactories>& gpu_factories,
|
| - const CastInitializationCallback& initialization_status,
|
| transport::CastTransportSender* const transport_sender)
|
| - : initialization_callback_(initialization_status),
|
| - packet_receiver_(
|
| - base::Bind(&CastSenderImpl::ReceivedPacket, base::Unretained(this))),
|
| - cast_environment_(cast_environment),
|
| + : cast_environment_(cast_environment),
|
| + transport_sender_(transport_sender),
|
| weak_factory_(this) {
|
| CHECK(cast_environment);
|
| - CHECK(audio_config || video_config);
|
| -
|
| - base::WeakPtr<AudioSender> audio_sender_ptr;
|
| - base::WeakPtr<VideoSender> video_sender_ptr;
|
| -
|
| - if (audio_config) {
|
| - CHECK(audio_config->use_external_encoder ||
|
| - cast_environment->HasAudioEncoderThread());
|
| -
|
| - audio_sender_.reset(
|
| - new AudioSender(cast_environment, *audio_config, transport_sender));
|
| - ssrc_of_audio_sender_ = audio_config->incoming_feedback_ssrc;
|
| - audio_sender_ptr = audio_sender_->AsWeakPtr();
|
| -
|
| - CastInitializationStatus status = audio_sender_->InitializationResult();
|
| - if (status != STATUS_INITIALIZED || !video_config) {
|
| - if (status == STATUS_INITIALIZED && !video_config) {
|
| - // Audio only.
|
| - frame_input_ = new LocalFrameInput(
|
| - cast_environment, audio_sender_ptr, video_sender_ptr);
|
| - }
|
| - cast_environment->PostTask(
|
| - CastEnvironment::MAIN,
|
| - FROM_HERE,
|
| - base::Bind(&CastSenderImpl::InitializationResult,
|
| - weak_factory_.GetWeakPtr(),
|
| - status));
|
| - return;
|
| - }
|
| - }
|
| - if (video_config) {
|
| - CHECK(video_config->use_external_encoder ||
|
| - cast_environment->HasVideoEncoderThread());
|
| -
|
| - video_sender_.reset(
|
| - new VideoSender(cast_environment,
|
| - *video_config,
|
| - gpu_factories,
|
| - base::Bind(&CastSenderImpl::InitializationResult,
|
| - weak_factory_.GetWeakPtr()),
|
| - transport_sender));
|
| - video_sender_ptr = video_sender_->AsWeakPtr();
|
| - ssrc_of_video_sender_ = video_config->incoming_feedback_ssrc;
|
| +}
|
| +
|
| +void CastSenderImpl::InitializeAudio(
|
| + const AudioSenderConfig& audio_config,
|
| + const CastInitializationCallback& cast_initialization_cb) {
|
| + DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
|
| + CHECK(audio_config.use_external_encoder ||
|
| + cast_environment_->HasAudioEncoderThread());
|
| +
|
| + audio_sender_.reset(
|
| + new AudioSender(cast_environment_, audio_config, transport_sender_));
|
| +
|
| + CastInitializationStatus status = audio_sender_->InitializationResult();
|
| +
|
| + if (status == STATUS_AUDIO_INITIALIZED) {
|
| + ssrc_of_audio_sender_ = audio_config.incoming_feedback_ssrc;
|
| + audio_frame_input_ =
|
| + new LocalAudioFrameInput(cast_environment_, audio_sender_->AsWeakPtr());
|
| }
|
| - frame_input_ =
|
| - new LocalFrameInput(cast_environment, audio_sender_ptr, video_sender_ptr);
|
| + cast_initialization_cb.Run(status);
|
| +}
|
|
|
| - // Handing over responsibility to call NotifyInitialization to the
|
| - // video sender.
|
| +void CastSenderImpl::InitializeVideo(
|
| + const VideoSenderConfig& video_config,
|
| + const CastInitializationCallback& cast_initialization_cb,
|
| + const scoped_refptr<GpuVideoAcceleratorFactories>& gpu_factories) {
|
| + DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
|
| + CHECK(video_config.use_external_encoder ||
|
| + cast_environment_->HasVideoEncoderThread());
|
| +
|
| + video_sender_.reset(new VideoSender(cast_environment_,
|
| + video_config,
|
| + gpu_factories,
|
| + cast_initialization_cb,
|
| + transport_sender_));
|
| +
|
| + ssrc_of_video_sender_ = video_config.incoming_feedback_ssrc;
|
| + video_frame_input_ =
|
| + new LocalVideoFrameInput(cast_environment_, video_sender_->AsWeakPtr());
|
| }
|
|
|
| CastSenderImpl::~CastSenderImpl() {}
|
| @@ -203,16 +194,17 @@ void CastSenderImpl::ReceivedPacket(scoped_ptr<Packet> packet) {
|
| }
|
| }
|
|
|
| -scoped_refptr<FrameInput> CastSenderImpl::frame_input() { return frame_input_; }
|
| +scoped_refptr<AudioFrameInput> CastSenderImpl::audio_frame_input() {
|
| + return audio_frame_input_;
|
| +}
|
|
|
| -transport::PacketReceiverCallback CastSenderImpl::packet_receiver() {
|
| - return packet_receiver_;
|
| - return base::Bind(&CastSenderImpl::ReceivedPacket, base::Unretained(this));
|
| +scoped_refptr<VideoFrameInput> CastSenderImpl::video_frame_input() {
|
| + return video_frame_input_;
|
| }
|
|
|
| -void CastSenderImpl::InitializationResult(CastInitializationStatus status)
|
| - const {
|
| - initialization_callback_.Run(status);
|
| +transport::PacketReceiverCallback CastSenderImpl::packet_receiver() {
|
| + return base::Bind(&CastSenderImpl::ReceivedPacket,
|
| + weak_factory_.GetWeakPtr());
|
| }
|
|
|
| } // namespace cast
|
|
|