| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_CAST_TEST_RECEIVER_CAST_RECEIVER_IMPL_H_ |
| #define MEDIA_CAST_TEST_RECEIVER_CAST_RECEIVER_IMPL_H_ |
| |
| #include <stdint.h> |
| |
| #include <memory> |
| |
| #include "base/memory/scoped_refptr.h" |
| #include "media/cast/cast_environment.h" |
| #include "media/cast/common/rtp_time.h" |
| #include "media/cast/net/pacing/paced_sender.h" |
| #include "media/cast/test/receiver/cast_receiver.h" |
| #include "media/cast/test/receiver/frame_receiver.h" |
| |
| namespace media { |
| namespace cast { |
| |
| class AudioDecoder; |
| struct EncodedFrame; |
| class VideoDecoder; |
| |
| // This is a pure owner class that groups all required receiver-related objects |
| // together, such as the paced packet sender, audio/video RTP frame receivers, |
| // and software decoders (created on-demand). |
| class CastReceiverImpl final : public CastReceiver { |
| public: |
| CastReceiverImpl(scoped_refptr<CastEnvironment> cast_environment, |
| const FrameReceiverConfig& audio_config, |
| const FrameReceiverConfig& video_config, |
| CastTransport* const transport); |
| |
| CastReceiverImpl(const CastReceiverImpl&) = delete; |
| CastReceiverImpl& operator=(const CastReceiverImpl&) = delete; |
| |
| ~CastReceiverImpl() final; |
| |
| // CastReceiver implementation. |
| void ReceivePacket(std::unique_ptr<Packet> packet) final; |
| void RequestDecodedAudioFrame( |
| const AudioFrameDecodedCallback& callback) final; |
| void RequestDecodedVideoFrame( |
| const VideoFrameDecodedCallback& callback) final; |
| |
| private: |
| // Feeds an EncodedFrame into |audio_decoder_|. RequestDecodedAudioFrame() |
| // uses this as a callback for RequestEncodedAudioFrame(). |
| void DecodeEncodedAudioFrame(const AudioFrameDecodedCallback& callback, |
| std::unique_ptr<EncodedFrame> encoded_frame); |
| |
| // Feeds an EncodedFrame into |video_decoder_|. RequestDecodedVideoFrame() |
| // uses this as a callback for RequestEncodedVideoFrame(). |
| void DecodeEncodedVideoFrame(const VideoFrameDecodedCallback& callback, |
| std::unique_ptr<EncodedFrame> encoded_frame); |
| |
| // Receives an AudioBus from |audio_decoder_|, logs the event, and passes the |
| // data on by running the given |callback|. This method is static to ensure |
| // it can be called after a CastReceiverImpl instance is destroyed. |
| // DecodeEncodedAudioFrame() uses this as a callback for |
| // AudioDecoder::DecodeFrame(). |
| static void EmitDecodedAudioFrame( |
| const scoped_refptr<CastEnvironment>& cast_environment, |
| const AudioFrameDecodedCallback& callback, |
| FrameId frame_id, |
| RtpTimeTicks rtp_timestamp, |
| base::TimeTicks playout_time, |
| std::unique_ptr<AudioBus> audio_bus, |
| bool is_continuous); |
| |
| // Receives a VideoFrame from |video_decoder_|, logs the event, and passes the |
| // data on by running the given |callback|. This method is static to ensure |
| // it can be called after a CastReceiverImpl instance is destroyed. |
| // DecodeEncodedVideoFrame() uses this as a callback for |
| // VideoDecoder::DecodeFrame(). |
| static void EmitDecodedVideoFrame( |
| const scoped_refptr<CastEnvironment>& cast_environment, |
| const VideoFrameDecodedCallback& callback, |
| FrameId frame_id, |
| RtpTimeTicks rtp_timestamp, |
| base::TimeTicks playout_time, |
| scoped_refptr<VideoFrame> video_frame, |
| bool is_continuous); |
| |
| const scoped_refptr<CastEnvironment> cast_environment_; |
| FrameReceiver audio_receiver_; |
| FrameReceiver video_receiver_; |
| |
| // Used by DispatchReceivedPacket() to direct packets to the appropriate frame |
| // receiver. |
| const uint32_t ssrc_of_audio_sender_; |
| const uint32_t ssrc_of_video_sender_; |
| |
| // Parameters for the decoders that are created on-demand. The values here |
| // might be nonsense if the client of CastReceiverImpl never intends to use |
| // the internal software-based decoders. |
| const int num_audio_channels_; |
| const int audio_sampling_rate_; |
| const Codec audio_codec_; |
| const Codec video_codec_; |
| |
| // Created on-demand to decode frames from |audio_receiver_| into AudioBuses |
| // for playback. |
| std::unique_ptr<AudioDecoder> audio_decoder_; |
| |
| // Created on-demand to decode frames from |video_receiver_| into VideoFrame |
| // images for playback. |
| std::unique_ptr<VideoDecoder> video_decoder_; |
| }; |
| |
| } // namespace cast |
| } // namespace media |
| |
| #endif // MEDIA_CAST_TEST_RECEIVER_CAST_RECEIVER_IMPL_H_ |