summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/common/extensions/api/cast_streaming_rtp_stream.idl7
-rw-r--r--chrome/renderer/extensions/cast_streaming_native_handler.cc30
-rw-r--r--chrome/renderer/media/cast_rtp_stream.cc5
-rw-r--r--chrome/renderer/media/cast_rtp_stream.h7
-rw-r--r--chrome/renderer/media/cast_session.cc4
-rw-r--r--chrome/renderer/media/cast_session.h6
-rw-r--r--chrome/renderer/media/cast_session_delegate.cc4
-rw-r--r--chrome/renderer/media/cast_session_delegate.h3
-rw-r--r--chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js4
-rw-r--r--chrome/test/data/extensions/api_test/cast_streaming/basics.js2
-rw-r--r--media/cast/logging/proto/raw_events.proto4
11 files changed, 54 insertions, 22 deletions
diff --git a/chrome/common/extensions/api/cast_streaming_rtp_stream.idl b/chrome/common/extensions/api/cast_streaming_rtp_stream.idl
index afada05..e01b998 100644
--- a/chrome/common/extensions/api/cast_streaming_rtp_stream.idl
+++ b/chrome/common/extensions/api/cast_streaming_rtp_stream.idl
@@ -81,7 +81,7 @@ namespace cast.streaming.rtpStream {
// Callback from the <code>getStats</code> method.
// |rawEvents|: dictionary object containing stats recorded for a stream.
// The format can be found at
- // media/cast/logging/stats_converter.cc.
+ // media/cast/logging/stats_event_subscriber.cc.
callback GetStatsCallback = void (object stats);
interface Functions {
@@ -110,9 +110,12 @@ namespace cast.streaming.rtpStream {
// Get raw events for a stream in the current session.
// |streamId|: Stream to get events for.
+ // |extraData|: Extra data to attach to the log, e.g. system info or
+ // experiment tags, in key-value JSON string format.
// |callback|: Called with the raw events.
[nocompile] static void getRawEvents(
- long streamId, GetRawEventsCallback callback);
+ long streamId, optional DOMString extraData,
+ GetRawEventsCallback callback);
// Get stats for a stream in the current session.
// |streamId|: Stream to get stats for.
diff --git a/chrome/renderer/extensions/cast_streaming_native_handler.cc b/chrome/renderer/extensions/cast_streaming_native_handler.cc
index c3fee5b..284ad77 100644
--- a/chrome/renderer/extensions/cast_streaming_native_handler.cc
+++ b/chrome/renderer/extensions/cast_streaming_native_handler.cc
@@ -217,6 +217,8 @@ void CastStreamingNativeHandler::CreateCastSession(
scoped_ptr<CastUdpTransport> udp_transport(
new CastUdpTransport(session));
+ // TODO(imcheng): Use a weak reference to ensure we don't call into an
+ // invalid context when the callback is invoked.
create_callback_.reset(args[2].As<v8::Function>());
base::MessageLoop::current()->PostTask(
@@ -446,23 +448,32 @@ void CastStreamingNativeHandler::ToggleLogging(
void CastStreamingNativeHandler::GetRawEvents(
const v8::FunctionCallbackInfo<v8::Value>& args) {
- CHECK_EQ(2, args.Length());
+ CHECK_EQ(3, args.Length());
CHECK(args[0]->IsInt32());
- CHECK(args[1]->IsFunction());
+ CHECK(args[1]->IsNull() || args[1]->IsString());
+ CHECK(args[2]->IsFunction());
+
const int transport_id = args[0]->ToInt32()->Value();
+ // TODO(imcheng): Use a weak reference to ensure we don't call into an
+ // invalid context when the callback is invoked.
+ linked_ptr<ScopedPersistent<v8::Function> > callback(
+ new ScopedPersistent<v8::Function>(args[2].As<v8::Function>()));
+ std::string extra_data;
+ if (!args[1]->IsNull()) {
+ extra_data = *v8::String::Utf8Value(args[1]);
+ }
+
CastRtpStream* transport = GetRtpStreamOrThrow(transport_id);
if (!transport)
return;
- linked_ptr<extensions::ScopedPersistent<v8::Function> > callback(
- new extensions::ScopedPersistent<v8::Function>);
- callback->reset(args[1].As<v8::Function>());
get_raw_events_callbacks_.insert(std::make_pair(transport_id, callback));
transport->GetRawEvents(
base::Bind(&CastStreamingNativeHandler::CallGetRawEventsCallback,
weak_factory_.GetWeakPtr(),
- transport_id));
+ transport_id),
+ extra_data);
}
void CastStreamingNativeHandler::GetStats(
@@ -475,9 +486,10 @@ void CastStreamingNativeHandler::GetStats(
if (!transport)
return;
- linked_ptr<extensions::ScopedPersistent<v8::Function> > callback(
- new extensions::ScopedPersistent<v8::Function>);
- callback->reset(args[1].As<v8::Function>());
+ // TODO(imcheng): Use a weak reference to ensure we don't call into an
+ // invalid context when the callback is invoked.
+ linked_ptr<ScopedPersistent<v8::Function> > callback(
+ new ScopedPersistent<v8::Function>(args[1].As<v8::Function>()));
get_stats_callbacks_.insert(std::make_pair(transport_id, callback));
transport->GetStats(
diff --git a/chrome/renderer/media/cast_rtp_stream.cc b/chrome/renderer/media/cast_rtp_stream.cc
index 31dd2a7..ca77556 100644
--- a/chrome/renderer/media/cast_rtp_stream.cc
+++ b/chrome/renderer/media/cast_rtp_stream.cc
@@ -518,8 +518,9 @@ void CastRtpStream::ToggleLogging(bool enable) {
}
void CastRtpStream::GetRawEvents(
- const base::Callback<void(scoped_ptr<base::BinaryValue>)>& callback) {
- cast_session_->GetEventLogsAndReset(IsAudio(), callback);
+ const base::Callback<void(scoped_ptr<base::BinaryValue>)>& callback,
+ const std::string& extra_data) {
+ cast_session_->GetEventLogsAndReset(IsAudio(), extra_data, callback);
}
void CastRtpStream::GetStats(
diff --git a/chrome/renderer/media/cast_rtp_stream.h b/chrome/renderer/media/cast_rtp_stream.h
index c54a1a8..f818c88 100644
--- a/chrome/renderer/media/cast_rtp_stream.h
+++ b/chrome/renderer/media/cast_rtp_stream.h
@@ -129,10 +129,11 @@ class CastRtpStream {
// Enables or disables logging for this stream.
void ToggleLogging(bool enable);
- // Get serialized raw events for this stream and invokes |callback|
- // with the result.
+ // Get serialized raw events for this stream with |extra_data| attached,
+ // and invokes |callback| with the result.
void GetRawEvents(
- const base::Callback<void(scoped_ptr<base::BinaryValue>)>& callback);
+ const base::Callback<void(scoped_ptr<base::BinaryValue>)>& callback,
+ const std::string& extra_data);
// Get stats in DictionaryValue format and invokves |callback| with
// the result.
diff --git a/chrome/renderer/media/cast_session.cc b/chrome/renderer/media/cast_session.cc
index 7a89d00..f1ebcaf 100644
--- a/chrome/renderer/media/cast_session.cc
+++ b/chrome/renderer/media/cast_session.cc
@@ -107,12 +107,14 @@ void CastSession::ToggleLogging(bool is_audio, bool enable) {
}
void CastSession::GetEventLogsAndReset(
- bool is_audio, const EventLogsCallback& callback) {
+ bool is_audio, const std::string& extra_data,
+ const EventLogsCallback& callback) {
io_message_loop_proxy_->PostTask(
FROM_HERE,
base::Bind(&CastSessionDelegate::GetEventLogsAndReset,
base::Unretained(delegate_.get()),
is_audio,
+ extra_data,
media::BindToCurrentLoop(callback)));
}
diff --git a/chrome/renderer/media/cast_session.h b/chrome/renderer/media/cast_session.h
index 10f504b..ae68223 100644
--- a/chrome/renderer/media/cast_session.h
+++ b/chrome/renderer/media/cast_session.h
@@ -77,8 +77,10 @@ class CastSession : public base::RefCounted<CastSession> {
void ToggleLogging(bool is_audio, bool enable);
// Returns raw event logs in serialized format for either the audio or video
- // stream since last call and returns result in |callback|.
- void GetEventLogsAndReset(bool is_audio, const EventLogsCallback& callback);
+ // stream since last call and returns result in |callback|. Also attaches
+ // |extra_data| to the log.
+ void GetEventLogsAndReset(bool is_audio,
+ const std::string& extra_data, const EventLogsCallback& callback);
// Returns stats in a DictionaryValue format for either the audio or video
// stream since last call and returns result in |callback|.
diff --git a/chrome/renderer/media/cast_session_delegate.cc b/chrome/renderer/media/cast_session_delegate.cc
index 0314a52..414b7de 100644
--- a/chrome/renderer/media/cast_session_delegate.cc
+++ b/chrome/renderer/media/cast_session_delegate.cc
@@ -120,6 +120,7 @@ void CastSessionDelegate::ToggleLogging(bool is_audio, bool enable) {
void CastSessionDelegate::GetEventLogsAndReset(
bool is_audio,
+ const std::string& extra_data,
const EventLogsCallback& callback) {
DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
@@ -141,6 +142,9 @@ void CastSessionDelegate::GetEventLogsAndReset(
subscriber->GetEventsAndReset(&metadata, &frame_events, &packet_events);
+ if (!extra_data.empty())
+ metadata.set_extra_data(extra_data);
+
scoped_ptr<char[]> serialized_log(new char[media::cast::kMaxSerializedBytes]);
int output_bytes;
bool success = media::cast::SerializeEvents(metadata,
diff --git a/chrome/renderer/media/cast_session_delegate.h b/chrome/renderer/media/cast_session_delegate.h
index f06f557..112b9fe 100644
--- a/chrome/renderer/media/cast_session_delegate.h
+++ b/chrome/renderer/media/cast_session_delegate.h
@@ -80,7 +80,8 @@ class CastSessionDelegate {
create_video_encode_mem_cb);
void ToggleLogging(bool is_audio, bool enable);
- void GetEventLogsAndReset(bool is_audio, const EventLogsCallback& callback);
+ void GetEventLogsAndReset(bool is_audio,
+ const std::string& extra_data, const EventLogsCallback& callback);
void GetStatsAndReset(bool is_audio, const StatsCallback& callback);
protected:
diff --git a/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js b/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js
index e2468e1..1047ed7 100644
--- a/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js
@@ -31,8 +31,8 @@ binding.registerCustomHook(function(bindingsAPI, extensionId) {
natives.ToggleLogging(transportId, enable);
});
apiFunctions.setHandleRequest('getRawEvents',
- function(transportId, callback) {
- natives.GetRawEvents(transportId, callback);
+ function(transportId, extraData, callback) {
+ natives.GetRawEvents(transportId, extraData, callback);
});
apiFunctions.setHandleRequest('getStats',
function(transportId, callback) {
diff --git a/chrome/test/data/extensions/api_test/cast_streaming/basics.js b/chrome/test/data/extensions/api_test/cast_streaming/basics.js
index 1aeb468..da88761 100644
--- a/chrome/test/data/extensions/api_test/cast_streaming/basics.js
+++ b/chrome/test/data/extensions/api_test/cast_streaming/basics.js
@@ -47,9 +47,11 @@ chrome.test.runTests([
stateMachine.onStopped.bind(stateMachine));
stateMachine.onAllStopped =
pass(function(audioId, videoId) {
+ var videoExtraData = JSON.stringify({ "videoExtraData": "100" });
rtpStream.getRawEvents(audioId,
stateMachine.onGotRawEvents.bind(stateMachine, audioId));
rtpStream.getRawEvents(videoId,
+ videoExtraData,
stateMachine.onGotRawEvents.bind(stateMachine, videoId));
}.bind(null, audioId, videoId));
stateMachine.onGotAllLogs =
diff --git a/media/cast/logging/proto/raw_events.proto b/media/cast/logging/proto/raw_events.proto
index 2ffed58..e94aed3 100644
--- a/media/cast/logging/proto/raw_events.proto
+++ b/media/cast/logging/proto/raw_events.proto
@@ -89,6 +89,10 @@ message LogMetadata {
// of the Unix epoch. This is used for relating the timestamps in the events
// to a real time and date.
optional int64 reference_timestamp_ms_at_unix_epoch = 5;
+
+ // Extra data to attach to the log, e.g. system info or
+ // experiment tags, in key-value JSON string format.
+ optional string extra_data = 6;
}
message AggregatedFrameEvent {