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