| Index: talk/media/base/mediachannel.h | 
| diff --git a/talk/media/base/mediachannel.h b/talk/media/base/mediachannel.h | 
| index 492f136798a851a61024ad3ea75d3d8fca5bee9c..ed4142969b96e74934b1416d760c3aa08b05e4af 100644 | 
| --- a/talk/media/base/mediachannel.h | 
| +++ b/talk/media/base/mediachannel.h | 
| @@ -138,6 +138,20 @@ static std::string ToStringIfSet(const char* key, const Settable<T>& val) { | 
| return str; | 
| } | 
|  | 
| +template <class T> | 
| +static std::string VectorToString(const std::vector<T>& vals) { | 
| +    std::ostringstream ost; | 
| +    ost << "["; | 
| +    for (size_t i = 0; i < vals.size(); ++i) { | 
| +      if (i > 0) { | 
| +        ost << ", "; | 
| +      } | 
| +      ost << vals[i].ToString(); | 
| +    } | 
| +    ost << "]"; | 
| +    return ost.str(); | 
| +} | 
| + | 
| // Options that can be applied to a VoiceMediaChannel or a VoiceMediaEngine. | 
| // Used to be flags, but that makes it hard to selectively apply options. | 
| // We are moving all of the setting of options to structs like this, | 
| @@ -453,9 +467,6 @@ struct VideoOptions { | 
| struct RtpHeaderExtension { | 
| RtpHeaderExtension() : id(0) {} | 
| RtpHeaderExtension(const std::string& u, int i) : uri(u), id(i) {} | 
| -  std::string uri; | 
| -  int id; | 
| -  // TODO(juberti): SendRecv direction; | 
|  | 
| bool operator==(const RtpHeaderExtension& ext) const { | 
| // id is a reserved word in objective-c. Therefore the id attribute has to | 
| @@ -463,6 +474,19 @@ struct RtpHeaderExtension { | 
| return this->id == ext.id && | 
| uri == ext.uri; | 
| } | 
| + | 
| +  std::string ToString() const { | 
| +    std::ostringstream ost; | 
| +    ost << "{"; | 
| +    ost << "id: , " << id; | 
| +    ost << "uri: " << uri; | 
| +    ost << "}"; | 
| +    return ost.str(); | 
| +  } | 
| + | 
| +  std::string uri; | 
| +  int id; | 
| +  // TODO(juberti): SendRecv direction; | 
| }; | 
|  | 
| // Returns the named header extension if found among all extensions, NULL | 
| @@ -985,6 +1009,45 @@ struct DataMediaInfo { | 
| std::vector<DataReceiverInfo> receivers; | 
| }; | 
|  | 
| +template <class Codec> | 
| +struct RtpParameters { | 
| +  virtual std::string ToString() { | 
| +    std::ostringstream ost; | 
| +    ost << "{"; | 
| +    ost << "codecs: " << VectorToString(codecs) << ", "; | 
| +    ost << "extensions: " << VectorToString(extensions); | 
| +    ost << "}"; | 
| +    return ost.str(); | 
| +  } | 
| + | 
| +  std::vector<Codec> codecs; | 
| +  std::vector<RtpHeaderExtension> extensions; | 
| +  // TODO(pthatcher): Add streams. | 
| +}; | 
| + | 
| +template <class Codec, class Options> | 
| +struct RtpSendParameters : RtpParameters<Codec> { | 
| +  std::string ToString() override { | 
| +    std::ostringstream ost; | 
| +    ost << "{"; | 
| +    ost << "codecs: " << VectorToString(this->codecs) << ", "; | 
| +    ost << "extensions: " << VectorToString(this->extensions) << ", "; | 
| +    ost << "max_bandiwidth_bps: " << max_bandwidth_bps << ", "; | 
| +    ost << "options: " << options.ToString(); | 
| +    ost << "}"; | 
| +    return ost.str(); | 
| +  } | 
| + | 
| +  int max_bandwidth_bps = -1; | 
| +  Options options; | 
| +}; | 
| + | 
| +struct AudioSendParameters : RtpSendParameters<AudioCodec, AudioOptions> { | 
| +}; | 
| + | 
| +struct AudioRecvParameters : RtpParameters<AudioCodec> { | 
| +}; | 
| + | 
| class VoiceMediaChannel : public MediaChannel { | 
| public: | 
| enum Error { | 
| @@ -1010,6 +1073,22 @@ class VoiceMediaChannel : public MediaChannel { | 
|  | 
| VoiceMediaChannel() {} | 
| virtual ~VoiceMediaChannel() {} | 
| +  // TODO(pthatcher): Remove SetSendCodecs, | 
| +  // SetSendRtpHeaderExtensions, SetMaxSendBandwidth, and SetOptions | 
| +  // once all implementations implement SetSendParameters. | 
| +  virtual bool SetSendParameters(const AudioSendParameters& params) { | 
| +    return (SetSendCodecs(params.codecs) && | 
| +            SetSendRtpHeaderExtensions(params.extensions) && | 
| +            SetMaxSendBandwidth(params.max_bandwidth_bps) && | 
| +            SetOptions(params.options)); | 
| +  } | 
| +  // TODO(pthatcher): Remove SetRecvCodecs and | 
| +  // SetRecvRtpHeaderExtensions once all implementations implement | 
| +  // SetRecvParameters. | 
| +  virtual bool SetRecvParameters(const AudioRecvParameters& params) { | 
| +    return (SetRecvCodecs(params.codecs) && | 
| +            SetRecvRtpHeaderExtensions(params.extensions)); | 
| +  } | 
| // Sets the codecs/payload types to be used for incoming media. | 
| virtual bool SetRecvCodecs(const std::vector<AudioCodec>& codecs) = 0; | 
| // Sets the codecs/payload types to be used for outgoing media. | 
| @@ -1065,6 +1144,12 @@ class VoiceMediaChannel : public MediaChannel { | 
| sigslot::signal2<uint32, VoiceMediaChannel::Error> SignalMediaError; | 
| }; | 
|  | 
| +struct VideoSendParameters : RtpSendParameters<VideoCodec, VideoOptions> { | 
| +}; | 
| + | 
| +struct VideoRecvParameters : RtpParameters<VideoCodec> { | 
| +}; | 
| + | 
| class VideoMediaChannel : public MediaChannel { | 
| public: | 
| enum Error { | 
| @@ -1086,6 +1171,22 @@ class VideoMediaChannel : public MediaChannel { | 
| virtual ~VideoMediaChannel() {} | 
| // Allow video channel to unhook itself from an associated voice channel. | 
| virtual void DetachVoiceChannel() = 0; | 
| +  // TODO(pthatcher): Remove SetSendCodecs, | 
| +  // SetSendRtpHeaderExtensions, SetMaxSendBandwidth, and SetOptions | 
| +  // once all implementations implement SetSendParameters. | 
| +  virtual bool SetSendParameters(const VideoSendParameters& params) { | 
| +    return (SetSendCodecs(params.codecs) && | 
| +            SetSendRtpHeaderExtensions(params.extensions) && | 
| +            SetMaxSendBandwidth(params.max_bandwidth_bps) && | 
| +            SetOptions(params.options)); | 
| +  } | 
| +  // TODO(pthatcher): Remove SetRecvCodecs and | 
| +  // SetRecvRtpHeaderExtensions once all implementations implement | 
| +  // SetRecvParameters. | 
| +  virtual bool SetRecvParameters(const VideoRecvParameters& params) { | 
| +    return (SetRecvCodecs(params.codecs) && | 
| +            SetRecvRtpHeaderExtensions(params.extensions)); | 
| +  } | 
| // Sets the codecs/payload types to be used for incoming media. | 
| virtual bool SetRecvCodecs(const std::vector<VideoCodec>& codecs) = 0; | 
| // Sets the codecs/payload types to be used for outgoing media. | 
| @@ -1189,6 +1290,27 @@ struct SendDataParams { | 
|  | 
| enum SendDataResult { SDR_SUCCESS, SDR_ERROR, SDR_BLOCK }; | 
|  | 
| +struct DataOptions { | 
| +  std::string ToString() { | 
| +    return "{}"; | 
| +  } | 
| +}; | 
| + | 
| +struct DataSendParameters : RtpSendParameters<DataCodec, DataOptions> { | 
| +  std::string ToString() { | 
| +    std::ostringstream ost; | 
| +    // Options and extensions aren't used. | 
| +    ost << "{"; | 
| +    ost << "codecs: " << VectorToString(codecs) << ", "; | 
| +    ost << "max_bandiwidth_bps: " << max_bandwidth_bps; | 
| +    ost << "}"; | 
| +    return ost.str(); | 
| +  } | 
| +}; | 
| + | 
| +struct DataRecvParameters : RtpParameters<DataCodec> { | 
| +}; | 
| + | 
| class DataMediaChannel : public MediaChannel { | 
| public: | 
| enum Error { | 
| @@ -1203,6 +1325,19 @@ class DataMediaChannel : public MediaChannel { | 
|  | 
| virtual ~DataMediaChannel() {} | 
|  | 
| +  // TODO(pthatcher): Remove SetSendCodecs, | 
| +  // SetSendRtpHeaderExtensions, SetMaxSendBandwidth, and SetOptions | 
| +  // once all implementations implement SetSendParameters. | 
| +  virtual bool SetSendParameters(const DataSendParameters& params) { | 
| +    return (SetSendCodecs(params.codecs) && | 
| +            SetMaxSendBandwidth(params.max_bandwidth_bps)); | 
| +  } | 
| +  // TODO(pthatcher): Remove SetRecvCodecs and | 
| +  // SetRecvRtpHeaderExtensions once all implementations implement | 
| +  // SetRecvParameters. | 
| +  virtual bool SetRecvParameters(const DataRecvParameters& params) { | 
| +    return SetRecvCodecs(params.codecs); | 
| +  } | 
| virtual bool SetSendCodecs(const std::vector<DataCodec>& codecs) = 0; | 
| virtual bool SetRecvCodecs(const std::vector<DataCodec>& codecs) = 0; | 
|  | 
|  |