Index: chrome/renderer/extensions/webrtc_native_handler.cc |
diff --git a/chrome/renderer/extensions/webrtc_native_handler.cc b/chrome/renderer/extensions/webrtc_native_handler.cc |
index 2695ff7531d22dbe038a85430fec6299ac7ad3df..dfc9c40a02a2cb6099226f44be88a7f2c298d16c 100644 |
--- a/chrome/renderer/extensions/webrtc_native_handler.cc |
+++ b/chrome/renderer/extensions/webrtc_native_handler.cc |
@@ -4,6 +4,8 @@ |
#include "chrome/renderer/extensions/webrtc_native_handler.h" |
+#include <functional> |
+ |
#include "base/logging.h" |
#include "chrome/common/extensions/api/webrtc_cast_send_transport.h" |
#include "chrome/common/extensions/api/webrtc_cast_udp_transport.h" |
@@ -17,6 +19,7 @@ |
using content::V8ValueConverter; |
// Extension types. |
+using extensions::api::webrtc_cast_send_transport::CodecSpecificParams; |
using extensions::api::webrtc_cast_send_transport::RtpCaps; |
using extensions::api::webrtc_cast_send_transport::RtpParams; |
using extensions::api::webrtc_cast_send_transport::RtpPayloadParams; |
@@ -32,30 +35,119 @@ const char kInvalidUdpParams[] = "Invalid UDP params"; |
const char kInvalidRtpCaps[] = "Invalid value for RTP caps"; |
const char kInvalidRtpParams[] = "Invalid value for RTP params"; |
const char kUnableToConvertArgs[] = "Unable to convert arguments"; |
-const char kUnableToConvertCaps[] = "Unable to convert caps"; |
const char kUnableToConvertParams[] = "Unable to convert params"; |
// These helper methods are used to convert between Extension API |
// types and Cast types. |
-bool ToCastRtpCaps(const RtpCaps& ext_caps, CastRtpCaps* cast_caps) { |
- NOTIMPLEMENTED(); |
- return true; |
+void ToCastCodecSpecificParams(const CodecSpecificParams& ext_params, |
+ CastCodecSpecificParams* cast_params) { |
+ cast_params->key = ext_params.key; |
+ cast_params->value = ext_params.value; |
+} |
+ |
+void FromCastCodecSpecificParams(const CastCodecSpecificParams& cast_params, |
+ CodecSpecificParams* ext_params) { |
+ ext_params->key = cast_params.key; |
+ ext_params->value = cast_params.value; |
+} |
+ |
+void ToCastRtpPayloadParams(const RtpPayloadParams& ext_params, |
+ CastRtpPayloadParams* cast_params) { |
+ cast_params->payload_type = ext_params.payload_type; |
+ cast_params->codec_name = ext_params.codec_name; |
+ cast_params->ssrc = ext_params.ssrc ? *ext_params.ssrc : 0; |
+ cast_params->clock_rate = ext_params.clock_rate ? *ext_params.clock_rate : 0; |
+ cast_params->min_bitrate = |
+ ext_params.min_bitrate ? *ext_params.min_bitrate : 0; |
+ cast_params->max_bitrate = |
+ ext_params.max_bitrate ? *ext_params.max_bitrate : 0; |
+ cast_params->channels = ext_params.channels ? *ext_params.channels : 0; |
+ cast_params->width = ext_params.width ? *ext_params.width : 0; |
+ cast_params->height = ext_params.height ? *ext_params.height : 0; |
+ for (size_t i = 0; i < ext_params.codec_specific_params.size(); ++i) { |
+ CastCodecSpecificParams cast_codec_params; |
+ ToCastCodecSpecificParams(*ext_params.codec_specific_params[i], |
+ &cast_codec_params); |
+ cast_params->codec_specific_params.push_back(cast_codec_params); |
+ } |
} |
-bool FromCastRtpCaps(const CastRtpCaps& cast_caps, RtpCaps* ext_caps) { |
- NOTIMPLEMENTED(); |
- return true; |
+void FromCastRtpPayloadParams(const CastRtpPayloadParams& cast_params, |
+ RtpPayloadParams* ext_params) { |
+ ext_params->payload_type = cast_params.payload_type; |
+ ext_params->codec_name = cast_params.codec_name; |
+ if (cast_params.ssrc) |
+ ext_params->ssrc.reset(new int(cast_params.ssrc)); |
+ if (cast_params.clock_rate) |
+ ext_params->clock_rate.reset(new int(cast_params.clock_rate)); |
+ if (cast_params.min_bitrate) |
+ ext_params->min_bitrate.reset(new int(cast_params.min_bitrate)); |
+ if (cast_params.max_bitrate) |
+ ext_params->max_bitrate.reset(new int(cast_params.max_bitrate)); |
+ if (cast_params.channels) |
+ ext_params->channels.reset(new int(cast_params.channels)); |
+ if (cast_params.width) |
+ ext_params->width.reset(new int(cast_params.width)); |
+ if (cast_params.height) |
+ ext_params->height.reset(new int(cast_params.height)); |
+ for (size_t i = 0; i < cast_params.codec_specific_params.size(); ++i) { |
+ linked_ptr<CodecSpecificParams> ext_codec_params( |
+ new CodecSpecificParams()); |
+ FromCastCodecSpecificParams(cast_params.codec_specific_params[i], |
+ ext_codec_params.get()); |
+ ext_params->codec_specific_params.push_back(ext_codec_params); |
+ } |
} |
-bool ToCastRtpParams(const RtpParams& ext_params, CastRtpParams* cast_params) { |
- NOTIMPLEMENTED(); |
- return true; |
+void ToCastRtpCaps(const RtpCaps& ext_caps, CastRtpCaps* cast_caps) { |
+ std::copy(ext_caps.rtcp_features.begin(), ext_caps.rtcp_features.end(), |
+ cast_caps->rtcp_features.begin()); |
+ std::copy(ext_caps.fec_mechanisms.begin(), ext_caps.fec_mechanisms.end(), |
+ cast_caps->fec_mechanisms.begin()); |
+ for (size_t i = 0; i < ext_caps.payloads.size(); ++i) { |
+ CastRtpPayloadParams cast_payload_params; |
+ ToCastRtpPayloadParams(*ext_caps.payloads[i], &cast_payload_params); |
+ cast_caps->payloads.push_back(cast_payload_params); |
+ } |
} |
-bool FromCastRtpParams(const CastRtpParams& cast_params, |
+void FromCastRtpCaps(const CastRtpCaps& cast_caps, RtpCaps* ext_caps) { |
+ std::copy(cast_caps.rtcp_features.begin(), cast_caps.rtcp_features.end(), |
+ ext_caps->rtcp_features.begin()); |
+ std::copy(cast_caps.fec_mechanisms.begin(), cast_caps.fec_mechanisms.end(), |
+ ext_caps->fec_mechanisms.begin()); |
+ for (size_t i = 0; i < cast_caps.payloads.size(); ++i) { |
+ linked_ptr<RtpPayloadParams> ext_payload_params(new RtpPayloadParams()); |
+ FromCastRtpPayloadParams(cast_caps.payloads[i], ext_payload_params.get()); |
+ ext_caps->payloads.push_back(ext_payload_params); |
+ } |
+} |
+ |
+void ToCastRtpParams(const RtpParams& ext_params, CastRtpParams* cast_params) { |
+ std::copy(ext_params.rtcp_features.begin(), ext_params.rtcp_features.end(), |
+ cast_params->rtcp_features.begin()); |
+ std::copy(ext_params.fec_mechanisms.begin(), ext_params.fec_mechanisms.end(), |
+ cast_params->fec_mechanisms.begin()); |
+ for (size_t i = 0; i < ext_params.payloads.size(); ++i) { |
+ CastRtpPayloadParams cast_payload_params; |
+ ToCastRtpPayloadParams(*ext_params.payloads[i], &cast_payload_params); |
+ cast_params->payloads.push_back(cast_payload_params); |
+ } |
+} |
+ |
+void FromCastRtpParams(const CastRtpParams& cast_params, |
RtpParams* ext_params) { |
- NOTIMPLEMENTED(); |
- return true; |
+ std::copy(cast_params.rtcp_features.begin(), cast_params.rtcp_features.end(), |
+ ext_params->rtcp_features.begin()); |
+ std::copy(cast_params.fec_mechanisms.begin(), |
+ cast_params.fec_mechanisms.end(), |
+ ext_params->fec_mechanisms.begin()); |
+ for (size_t i = 0; i < cast_params.payloads.size(); ++i) { |
+ linked_ptr<RtpPayloadParams> ext_payload_params(new RtpPayloadParams()); |
+ FromCastRtpPayloadParams(cast_params.payloads[i], |
+ ext_payload_params.get()); |
+ ext_params->payloads.push_back(ext_payload_params); |
+ } |
} |
} // namespace |
@@ -162,18 +254,10 @@ void WebRtcNativeHandler::CreateParamsCastSendTransport( |
} |
CastRtpCaps cast_remote_caps; |
- if (!ToCastRtpCaps(*remote_caps, &cast_remote_caps)) { |
- v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
- kUnableToConvertCaps))); |
- return; |
- } |
+ ToCastRtpCaps(*remote_caps, &cast_remote_caps); |
CastRtpParams cast_params = transport->CreateParams(cast_remote_caps); |
RtpParams params; |
- if (!FromCastRtpParams(cast_params, ¶ms)) { |
- v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
- kUnableToConvertParams))); |
- return; |
- } |
+ FromCastRtpParams(cast_params, ¶ms); |
scoped_ptr<base::DictionaryValue> params_value = params.ToValue(); |
v8::Handle<v8::Value> params_v8 = converter->ToV8Value( |
@@ -195,11 +279,7 @@ void WebRtcNativeHandler::GetCapsCastSendTransport( |
CastRtpCaps cast_caps = transport->GetCaps(); |
RtpCaps caps; |
- if (!FromCastRtpCaps(cast_caps, &caps)) { |
- v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
- kUnableToConvertCaps))); |
- return; |
- } |
+ FromCastRtpCaps(cast_caps, &caps); |
scoped_ptr<base::DictionaryValue> caps_value = caps.ToValue(); |
scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
@@ -236,11 +316,7 @@ void WebRtcNativeHandler::StartCastSendTransport( |
} |
CastRtpCaps cast_params; |
- if (!ToCastRtpParams(*params, &cast_params)) { |
- v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
- kUnableToConvertParams))); |
- return; |
- } |
+ ToCastRtpParams(*params, &cast_params); |
transport->Start(cast_params); |
} |