146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef MEDIA_CAST_RECEIVER_CAST_RECEIVER_IMPL_H_
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define MEDIA_CAST_RECEIVER_CAST_RECEIVER_IMPL_H_
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/ref_counted.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "media/cast/cast_config.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "media/cast/cast_environment.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "media/cast/cast_receiver.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/cast/net/pacing/paced_sender.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "media/cast/receiver/frame_receiver.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace media {
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace cast {
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class AudioDecoder;
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class VideoDecoder;
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// This is a pure owner class that groups all required receiver-related objects
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// together, such as the paced packet sender, audio/video RTP frame receivers,
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// and software decoders (created on-demand).
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class CastReceiverImpl : public CastReceiver {
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CastReceiverImpl(scoped_refptr<CastEnvironment> cast_environment,
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   const FrameReceiverConfig& audio_config,
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   const FrameReceiverConfig& video_config,
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   PacketSender* const packet_sender);
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~CastReceiverImpl();
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // CastReceiver implementation.
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual PacketReceiverCallback packet_receiver() OVERRIDE;
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RequestDecodedAudioFrame(
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const AudioFrameDecodedCallback& callback) OVERRIDE;
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RequestEncodedAudioFrame(
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const ReceiveEncodedFrameCallback& callback) OVERRIDE;
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RequestDecodedVideoFrame(
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const VideoFrameDecodedCallback& callback) OVERRIDE;
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RequestEncodedVideoFrame(
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const ReceiveEncodedFrameCallback& callback) OVERRIDE;
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Forwards |packet| to a specific RTP frame receiver, or drops it if SSRC
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // does not map to one of the receivers.
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void DispatchReceivedPacket(scoped_ptr<Packet> packet);
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Feeds an EncodedFrame into |audio_decoder_|.  RequestDecodedAudioFrame()
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // uses this as a callback for RequestEncodedAudioFrame().
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void DecodeEncodedAudioFrame(
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const AudioFrameDecodedCallback& callback,
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      scoped_ptr<EncodedFrame> encoded_frame);
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Feeds an EncodedFrame into |video_decoder_|.  RequestDecodedVideoFrame()
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // uses this as a callback for RequestEncodedVideoFrame().
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void DecodeEncodedVideoFrame(
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const VideoFrameDecodedCallback& callback,
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      scoped_ptr<EncodedFrame> encoded_frame);
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Receives an AudioBus from |audio_decoder_|, logs the event, and passes the
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // data on by running the given |callback|.  This method is static to ensure
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // it can be called after a CastReceiverImpl instance is destroyed.
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // DecodeEncodedAudioFrame() uses this as a callback for
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // AudioDecoder::DecodeFrame().
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static void EmitDecodedAudioFrame(
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const scoped_refptr<CastEnvironment>& cast_environment,
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const AudioFrameDecodedCallback& callback,
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      uint32 frame_id,
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      uint32 rtp_timestamp,
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const base::TimeTicks& playout_time,
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      scoped_ptr<AudioBus> audio_bus,
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      bool is_continuous);
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Receives a VideoFrame from |video_decoder_|, logs the event, and passes the
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // data on by running the given |callback|.  This method is static to ensure
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // it can be called after a CastReceiverImpl instance is destroyed.
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // DecodeEncodedVideoFrame() uses this as a callback for
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // VideoDecoder::DecodeFrame().
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static void EmitDecodedVideoFrame(
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const scoped_refptr<CastEnvironment>& cast_environment,
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const VideoFrameDecodedCallback& callback,
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      uint32 frame_id,
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      uint32 rtp_timestamp,
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const base::TimeTicks& playout_time,
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const scoped_refptr<VideoFrame>& video_frame,
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      bool is_continuous);
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const scoped_refptr<CastEnvironment> cast_environment_;
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PacedSender pacer_;
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  FrameReceiver audio_receiver_;
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  FrameReceiver video_receiver_;
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Used by DispatchReceivedPacket() to direct packets to the appropriate frame
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // receiver.
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const uint32 ssrc_of_audio_sender_;
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const uint32 ssrc_of_video_sender_;
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Parameters for the decoders that are created on-demand.  The values here
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // might be nonsense if the client of CastReceiverImpl never intends to use
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // the internal software-based decoders.
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int num_audio_channels_;
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int audio_sampling_rate_;
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const Codec audio_codec_;
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const Codec video_codec_;
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Created on-demand to decode frames from |audio_receiver_| into AudioBuses
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // for playback.
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<AudioDecoder> audio_decoder_;
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Created on-demand to decode frames from |video_receiver_| into VideoFrame
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // images for playback.
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<VideoDecoder> video_decoder_;
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CastReceiverImpl);
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace cast
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace media
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // MEDIA_CAST_RECEIVER_CAST_RECEIVER_IMPL_
123