summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorimcheng@chromium.org <imcheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-14 06:33:23 +0000
committerimcheng@chromium.org <imcheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-14 06:33:23 +0000
commita5143efbc8521c9116f9fe36090f4b2e9dd75ec8 (patch)
treea436c633f3b2a21a9fbc5700608ffa9e1117fcd9
parentbf7e9fb112eb09c9c76afe25a6f0c89ae064978f (diff)
downloadchromium_src-a5143efbc8521c9116f9fe36090f4b2e9dd75ec8.zip
chromium_src-a5143efbc8521c9116f9fe36090f4b2e9dd75ec8.tar.gz
chromium_src-a5143efbc8521c9116f9fe36090f4b2e9dd75ec8.tar.bz2
Cast: Add extraData argument to cast streaming api getLogs().
We will use this argument to pass in extra info like system information, experiment tags for the mirror session, and have it attached to the log. Review URL: https://codereview.chromium.org/275213004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@270346 0039d316-1c4b-4281-b951-d872f2087c98
-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 {