1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_RENDERER_MEDIA_CAST_RTP_STREAM_H_ 6 #define CHROME_RENDERER_MEDIA_CAST_RTP_STREAM_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/callback.h" 13 #include "base/memory/ref_counted.h" 14 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/weak_ptr.h" 16 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 17 18 namespace base { 19 class BinaryValue; 20 class DictionaryValue; 21 } 22 23 class CastAudioSink; 24 class CastSession; 25 class CastVideoSink; 26 27 // A key value pair structure for codec specific parameters. 28 struct CastCodecSpecificParams { 29 std::string key; 30 std::string value; 31 32 CastCodecSpecificParams(); 33 ~CastCodecSpecificParams(); 34 }; 35 36 // Defines the basic properties of a payload supported by cast transport. 37 struct CastRtpPayloadParams { 38 // RTP specific field that identifies the content type. 39 int payload_type; 40 41 // Maximum latency in milliseconds. Implemetation tries to keep latency 42 // under this threshold. 43 int max_latency_ms; 44 45 // Minimum latency. 46 // Default value (0) means use max_latency_ms. 47 int min_latency_ms; 48 49 // RTP specific field to identify a stream. 50 int ssrc; 51 52 // RTP specific field to idenfity the feedback stream. 53 int feedback_ssrc; 54 55 // Update frequency of payload sample. 56 int clock_rate; 57 58 // Maximum bitrate in kilobits per second. 59 int max_bitrate; 60 61 // Minimum bitrate in kilobits per second. 62 int min_bitrate; 63 64 // Number of audio channels. 65 int channels; 66 67 // The maximum frame rate. 68 double max_frame_rate; 69 70 // Width and height of the video content. 71 int width; 72 int height; 73 74 // Name of the codec used. 75 std::string codec_name; 76 77 // AES encryption key. 78 std::string aes_key; 79 80 // AES encryption IV mask. 81 std::string aes_iv_mask; 82 83 // List of codec specific parameters. 84 std::vector<CastCodecSpecificParams> codec_specific_params; 85 86 CastRtpPayloadParams(); 87 ~CastRtpPayloadParams(); 88 }; 89 90 // Defines the parameters of a RTP stream. 91 struct CastRtpParams { 92 explicit CastRtpParams(const CastRtpPayloadParams& payload_params); 93 94 // Payload parameters. 95 CastRtpPayloadParams payload; 96 97 // Names of supported RTCP features. 98 std::vector<std::string> rtcp_features; 99 100 CastRtpParams(); 101 ~CastRtpParams(); 102 }; 103 104 // This object represents a RTP stream that encodes and optionally 105 // encrypt audio or video data from a WebMediaStreamTrack. 106 // Note that this object does not actually output packets. It allows 107 // configuration of encoding and RTP parameters and control such a logical 108 // stream. 109 class CastRtpStream { 110 public: 111 typedef base::Callback<void(const std::string&)> ErrorCallback; 112 113 CastRtpStream(const blink::WebMediaStreamTrack& track, 114 const scoped_refptr<CastSession>& session); 115 ~CastRtpStream(); 116 117 // Return parameters currently supported by this stream. 118 std::vector<CastRtpParams> GetSupportedParams(); 119 120 // Return parameters set to this stream. 121 CastRtpParams GetParams(); 122 123 // Begin encoding of media stream and then submit the encoded streams 124 // to underlying transport. 125 // When the stream is started |start_callback| is called. 126 // When the stream is stopped |stop_callback| is called. 127 // When there is an error |error_callback| is called with a message. 128 void Start(const CastRtpParams& params, 129 const base::Closure& start_callback, 130 const base::Closure& stop_callback, 131 const ErrorCallback& error_callback); 132 133 // Stop encoding. 134 void Stop(); 135 136 // Enables or disables logging for this stream. 137 void ToggleLogging(bool enable); 138 139 // Get serialized raw events for this stream with |extra_data| attached, 140 // and invokes |callback| with the result. 141 void GetRawEvents( 142 const base::Callback<void(scoped_ptr<base::BinaryValue>)>& callback, 143 const std::string& extra_data); 144 145 // Get stats in DictionaryValue format and invokves |callback| with 146 // the result. 147 void GetStats(const base::Callback<void( 148 scoped_ptr<base::DictionaryValue>)>& callback); 149 150 private: 151 // Return true if this track is an audio track. Return false if this 152 // track is a video track. 153 bool IsAudio() const; 154 155 void DidEncounterError(const std::string& message); 156 157 blink::WebMediaStreamTrack track_; 158 const scoped_refptr<CastSession> cast_session_; 159 scoped_ptr<CastAudioSink> audio_sink_; 160 scoped_ptr<CastVideoSink> video_sink_; 161 CastRtpParams params_; 162 base::Closure stop_callback_; 163 ErrorCallback error_callback_; 164 165 base::WeakPtrFactory<CastRtpStream> weak_factory_; 166 167 DISALLOW_COPY_AND_ASSIGN(CastRtpStream); 168 }; 169 170 #endif // CHROME_RENDERER_MEDIA_CAST_RTP_STREAM_H_ 171