diff options
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 { |