Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(222)

Side by Side Diff: media/cast/test/sender.cc

Issue 236123003: Cast: Provide more meaningful stats. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Test application that simulates a cast sender - Data can be either generated 5 // Test application that simulates a cast sender - Data can be either generated
6 // or read from a file. 6 // or read from a file.
7 7
8 #include "base/at_exit.h" 8 #include "base/at_exit.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
11 #include "base/files/scoped_file.h" 11 #include "base/files/scoped_file.h"
12 #include "base/json/json_writer.h"
12 #include "base/logging.h" 13 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
14 #include "base/threading/thread.h" 15 #include "base/threading/thread.h"
15 #include "base/time/default_tick_clock.h" 16 #include "base/time/default_tick_clock.h"
17 #include "base/values.h"
16 #include "media/base/video_frame.h" 18 #include "media/base/video_frame.h"
17 #include "media/cast/cast_config.h" 19 #include "media/cast/cast_config.h"
18 #include "media/cast/cast_environment.h" 20 #include "media/cast/cast_environment.h"
19 #include "media/cast/cast_sender.h" 21 #include "media/cast/cast_sender.h"
20 #include "media/cast/logging/encoding_event_subscriber.h" 22 #include "media/cast/logging/encoding_event_subscriber.h"
21 #include "media/cast/logging/log_serializer.h" 23 #include "media/cast/logging/log_serializer.h"
22 #include "media/cast/logging/logging_defines.h" 24 #include "media/cast/logging/logging_defines.h"
23 #include "media/cast/logging/proto/raw_events.pb.h" 25 #include "media/cast/logging/proto/raw_events.pb.h"
26 #include "media/cast/logging/receiver_time_offset_estimator_impl.h"
27 #include "media/cast/logging/stats_event_subscriber.h"
24 #include "media/cast/test/utility/audio_utility.h" 28 #include "media/cast/test/utility/audio_utility.h"
25 #include "media/cast/test/utility/default_config.h" 29 #include "media/cast/test/utility/default_config.h"
26 #include "media/cast/test/utility/input_builder.h" 30 #include "media/cast/test/utility/input_builder.h"
27 #include "media/cast/test/utility/video_utility.h" 31 #include "media/cast/test/utility/video_utility.h"
28 #include "media/cast/transport/cast_transport_defines.h" 32 #include "media/cast/transport/cast_transport_defines.h"
29 #include "media/cast/transport/cast_transport_sender.h" 33 #include "media/cast/transport/cast_transport_sender.h"
30 #include "media/cast/transport/transport/udp_transport.h" 34 #include "media/cast/transport/transport/udp_transport.h"
31 #include "ui/gfx/size.h" 35 #include "ui/gfx/size.h"
32 36
33 namespace media { 37 namespace media {
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 370
367 net::IPEndPoint CreateUDPAddress(std::string ip_str, int port) { 371 net::IPEndPoint CreateUDPAddress(std::string ip_str, int port) {
368 net::IPAddressNumber ip_number; 372 net::IPAddressNumber ip_number;
369 CHECK(net::ParseIPLiteralToNumber(ip_str, &ip_number)); 373 CHECK(net::ParseIPLiteralToNumber(ip_str, &ip_number));
370 return net::IPEndPoint(ip_number, port); 374 return net::IPEndPoint(ip_number, port);
371 } 375 }
372 376
373 void DumpLoggingData(const media::cast::proto::LogMetadata& log_metadata, 377 void DumpLoggingData(const media::cast::proto::LogMetadata& log_metadata,
374 const media::cast::FrameEventMap& frame_events, 378 const media::cast::FrameEventMap& frame_events,
375 const media::cast::PacketEventMap& packet_events, 379 const media::cast::PacketEventMap& packet_events,
376 bool compress, 380 bool compress,
miu 2014/04/17 02:14:14 Remove this argument if it is unused. Or, did you
imcheng 2014/04/17 19:19:06 The arg has been removed in another CL.
377 base::ScopedFILE log_file) { 381 base::ScopedFILE log_file) {
378 VLOG(0) << "Frame map size: " << frame_events.size(); 382 VLOG(0) << "Frame map size: " << frame_events.size();
379 VLOG(0) << "Packet map size: " << packet_events.size(); 383 VLOG(0) << "Packet map size: " << packet_events.size();
380 384
381 scoped_ptr<char[]> event_log(new char[media::cast::kMaxSerializedLogBytes]); 385 scoped_ptr<char[]> event_log(new char[media::cast::kMaxSerializedLogBytes]);
382 int event_log_bytes; 386 int event_log_bytes;
383 if (!media::cast::SerializeEvents(log_metadata, 387 if (!media::cast::SerializeEvents(log_metadata,
384 frame_events, 388 frame_events,
385 packet_events, 389 packet_events,
386 compress, 390 true,
387 media::cast::kMaxSerializedLogBytes, 391 media::cast::kMaxSerializedLogBytes,
388 event_log.get(), 392 event_log.get(),
389 &event_log_bytes)) { 393 &event_log_bytes)) {
390 VLOG(0) << "Failed to serialize events."; 394 VLOG(0) << "Failed to serialize events.";
391 return; 395 return;
392 } 396 }
393 397
394 VLOG(0) << "Events serialized length: " << event_log_bytes; 398 VLOG(0) << "Events serialized length: " << event_log_bytes;
395 399
396 int ret = fwrite(event_log.get(), 1, event_log_bytes, log_file.get()); 400 int ret = fwrite(event_log.get(), 1, event_log_bytes, log_file.get());
(...skipping 30 matching lines...) Expand all
427 audio_event_subscriber->GetEventsAndReset( 431 audio_event_subscriber->GetEventsAndReset(
428 &log_metadata, &frame_events, &packet_events); 432 &log_metadata, &frame_events, &packet_events);
429 433
430 DumpLoggingData(log_metadata, 434 DumpLoggingData(log_metadata,
431 frame_events, 435 frame_events,
432 packet_events, 436 packet_events,
433 compress, 437 compress,
434 audio_log_file.Pass()); 438 audio_log_file.Pass());
435 } 439 }
436 440
441 void WriteStats(
miu 2014/04/17 02:14:14 naming: This method does more than just write the
imcheng 2014/04/17 19:19:06 Done. Also renamed the method above.
442 const scoped_refptr<media::cast::CastEnvironment>& cast_environment,
443 scoped_ptr<media::cast::StatsEventSubscriber> video_event_subscriber,
444 scoped_ptr<media::cast::StatsEventSubscriber> audio_event_subscriber,
445 scoped_ptr<media::cast::ReceiverTimeOffsetEstimatorImpl> estimator) {
446 cast_environment->Logging()->RemoveRawEventSubscriber(
447 video_event_subscriber.get());
448 cast_environment->Logging()->RemoveRawEventSubscriber(
449 audio_event_subscriber.get());
450 cast_environment->Logging()->RemoveRawEventSubscriber(estimator.get());
451
452 scoped_ptr<base::DictionaryValue> stats = video_event_subscriber->GetStats();
453 std::string json;
454 base::JSONWriter::WriteWithOptions(
455 stats.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
456 VLOG(0) << "Video stats: " << json;
457
458 stats = audio_event_subscriber->GetStats();
459 json.clear();
460 base::JSONWriter::WriteWithOptions(
461 stats.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
462 VLOG(0) << "Audio stats: " << json;
463 }
464
437 } // namespace 465 } // namespace
438 466
439 int main(int argc, char** argv) { 467 int main(int argc, char** argv) {
440 base::AtExitManager at_exit; 468 base::AtExitManager at_exit;
441 CommandLine::Init(argc, argv); 469 CommandLine::Init(argc, argv);
442 InitLogging(logging::LoggingSettings()); 470 InitLogging(logging::LoggingSettings());
443 base::Thread test_thread("Cast sender test app thread"); 471 base::Thread test_thread("Cast sender test app thread");
444 base::Thread audio_thread("Cast audio encoder thread"); 472 base::Thread audio_thread("Cast audio encoder thread");
445 base::Thread video_thread("Cast video encoder thread"); 473 base::Thread video_thread("Cast video encoder thread");
446 test_thread.Start(); 474 test_thread.Start();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 cast_sender->video_frame_input(); 541 cast_sender->video_frame_input();
514 scoped_ptr<media::cast::SendProcess> send_process( 542 scoped_ptr<media::cast::SendProcess> send_process(
515 new media::cast::SendProcess(test_thread.message_loop_proxy(), 543 new media::cast::SendProcess(test_thread.message_loop_proxy(),
516 cast_environment->Clock(), 544 cast_environment->Clock(),
517 video_config, 545 video_config,
518 audio_frame_input, 546 audio_frame_input,
519 video_frame_input)); 547 video_frame_input));
520 548
521 // Set up event subscribers. 549 // Set up event subscribers.
522 int logging_duration = media::cast::GetLoggingDuration(); 550 int logging_duration = media::cast::GetLoggingDuration();
551 scoped_ptr<media::cast::ReceiverTimeOffsetEstimatorImpl> offset_estimator(
552 new media::cast::ReceiverTimeOffsetEstimatorImpl);
553 cast_environment->Logging()->AddRawEventSubscriber(offset_estimator.get());
554
523 scoped_ptr<media::cast::EncodingEventSubscriber> video_event_subscriber; 555 scoped_ptr<media::cast::EncodingEventSubscriber> video_event_subscriber;
524 scoped_ptr<media::cast::EncodingEventSubscriber> audio_event_subscriber; 556 scoped_ptr<media::cast::EncodingEventSubscriber> audio_event_subscriber;
557 scoped_ptr<media::cast::StatsEventSubscriber> video_stats_subscriber(
558 new media::cast::StatsEventSubscriber(media::cast::VIDEO_EVENT,
559 cast_environment->Clock(),
560 offset_estimator.get()));
561 scoped_ptr<media::cast::StatsEventSubscriber> audio_stats_subscriber(
562 new media::cast::StatsEventSubscriber(media::cast::AUDIO_EVENT,
563 cast_environment->Clock(),
564 offset_estimator.get()));
565 cast_environment->Logging()->AddRawEventSubscriber(
566 video_stats_subscriber.get());
567 cast_environment->Logging()->AddRawEventSubscriber(
568 audio_stats_subscriber.get());
525 if (logging_duration > 0) { 569 if (logging_duration > 0) {
526 bool compress = media::cast::CompressLogs(); 570 bool compress = media::cast::CompressLogs();
527 std::string video_log_file_name( 571 std::string video_log_file_name(
528 media::cast::GetVideoLogFileDestination(compress)); 572 media::cast::GetVideoLogFileDestination(compress));
529 std::string audio_log_file_name( 573 std::string audio_log_file_name(
530 media::cast::GetAudioLogFileDestination(compress)); 574 media::cast::GetAudioLogFileDestination(compress));
531 video_event_subscriber.reset(new media::cast::EncodingEventSubscriber( 575 video_event_subscriber.reset(new media::cast::EncodingEventSubscriber(
532 media::cast::VIDEO_EVENT, 10000)); 576 media::cast::VIDEO_EVENT, 10000));
533 audio_event_subscriber.reset(new media::cast::EncodingEventSubscriber( 577 audio_event_subscriber.reset(new media::cast::EncodingEventSubscriber(
534 media::cast::AUDIO_EVENT, 10000)); 578 media::cast::AUDIO_EVENT, 10000));
(...skipping 17 matching lines...) Expand all
552 io_message_loop.message_loop_proxy()->PostDelayedTask( 596 io_message_loop.message_loop_proxy()->PostDelayedTask(
553 FROM_HERE, 597 FROM_HERE,
554 base::Bind(&WriteLogsToFileAndStopSubscribing, 598 base::Bind(&WriteLogsToFileAndStopSubscribing,
555 cast_environment, 599 cast_environment,
556 base::Passed(&video_event_subscriber), 600 base::Passed(&video_event_subscriber),
557 base::Passed(&audio_event_subscriber), 601 base::Passed(&audio_event_subscriber),
558 base::Passed(&video_log_file), 602 base::Passed(&video_log_file),
559 base::Passed(&audio_log_file), 603 base::Passed(&audio_log_file),
560 compress), 604 compress),
561 base::TimeDelta::FromSeconds(logging_duration)); 605 base::TimeDelta::FromSeconds(logging_duration));
606
607 io_message_loop.message_loop_proxy()->PostDelayedTask(
608 FROM_HERE,
609 base::Bind(&WriteStats,
610 cast_environment,
611 base::Passed(&video_stats_subscriber),
612 base::Passed(&audio_stats_subscriber),
613 base::Passed(&offset_estimator)),
614 base::TimeDelta::FromSeconds(logging_duration));
562 } 615 }
563 616
564 test_thread.message_loop_proxy()->PostTask( 617 test_thread.message_loop_proxy()->PostTask(
565 FROM_HERE, 618 FROM_HERE,
566 base::Bind(&media::cast::SendProcess::SendFrame, 619 base::Bind(&media::cast::SendProcess::SendFrame,
567 base::Unretained(send_process.get()))); 620 base::Unretained(send_process.get())));
568 621
569 io_message_loop.Run(); 622 io_message_loop.Run();
570 623
571 return 0; 624 return 0;
572 } 625 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698