Chromium Code Reviews

Side by Side Diff: chrome/browser/media/webrtc_rtp_dump_handler.cc

Issue 264793017: Implements RTP header dumping. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/media/webrtc_rtp_dump_handler.h"
6
7 #include "base/logging.h"
8 #include "base/strings/string_number_conversions.h"
9 #include "base/time/time.h"
10 #include "content/public/browser/browser_thread.h"
11
12 using content::BrowserThread;
13
14 static const size_t kInMemoryBufferSize = 4096;
15
16 WebRtcRtpDumpHandler::WebRtcRtpDumpHandler(const base::FilePath& dump_dir)
17 : dump_dir_(dump_dir),
18 incoming_state_(STATE_NONE),
19 outgoing_state_(STATE_NONE) {}
20
21 WebRtcRtpDumpHandler::~WebRtcRtpDumpHandler() {}
22
23 bool WebRtcRtpDumpHandler::StartDump(const PacketType& type) {
24 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
25 bool succeeded = false;
26 if (type.incoming && incoming_state_ == STATE_NONE) {
27 incoming_state_ = STATE_STARTED;
28 succeeded = true;
29 }
30 if (type.outgoing && outgoing_state_ == STATE_NONE) {
31 outgoing_state_ = STATE_STARTED;
32 succeeded = true;
33 }
34
35 if (succeeded && !dump_writer_) {
36 static const char kDumpFilePrefix[] = "rtpdump_";
37 static const char kDumpFileExtension[] = ".gz";
38
39 std::string dump_id = base::DoubleToString(base::Time::Now().ToDoubleT());
40 dump_path_ = dump_dir_.AppendASCII(std::string(kDumpFilePrefix) + dump_id)
41 .AddExtension(FILE_PATH_LITERAL(kDumpFileExtension));
42
43 dump_buffer_.reset(new talk_base::FifoBuffer(kInMemoryBufferSize));
44 dump_writer_.reset(new cricket::RtpDumpWriter(dump_buffer_.get()));
45 dump_writer_->set_packet_filter(cricket::PF_RTPHEADER);
46 }
47 return succeeded;
48 }
49
50 bool WebRtcRtpDumpHandler::StopDump(const PacketType& type) {
51 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
52 bool succeeded = false;
53 if (type.incoming && incoming_state_ == STATE_STARTED) {
54 incoming_state_ = STATE_STOPPED;
55 succeeded = true;
56 }
57 if (type.outgoing && outgoing_state_ == STATE_STARTED) {
58 outgoing_state_ = STATE_STOPPED;
59 succeeded = true;
60 }
61 return succeeded;
62 }
63
64 bool WebRtcRtpDumpHandler::ReleaseDump(const ReleaseDumpCallback& callback) {
65 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
66 // All types of dumps must have been stopped or not started.
67 if (incoming_state_ == STATE_STARTED ||
68 outgoing_state_ == STATE_STARTED ||
69 (incoming_state_ == STATE_NONE && outgoing_state_ == STATE_NONE))
70 return false;
71
72 incoming_state_ = STATE_NONE;
73 outgoing_state_ = STATE_NONE;
74
75 // TODO: flush the in memory buffer to disk and call |callback|.
76
77 dump_writer_.reset();
78 dump_buffer_.reset();
79
80 return true;
81 }
82
83 void WebRtcRtpDumpHandler::OnIncomingRtpPacket(const uint8* packet,
84 size_t length) {
85 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
86 if (incoming_state_ != STATE_STARTED)
87 return;
88
89 // TODO: check if the buffer is full and compress and flush to disk if so.
90 dump_writer_->WriteRtpPacket(packet, length);
91 }
92
93 void WebRtcRtpDumpHandler::OnOutgoingRtpPacket(const uint8* packet,
94 size_t length) {
95 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
96 if (outgoing_state_ != STATE_STARTED)
97 return;
98
99 // TODO: check if the buffer is full and compress and flush to disk if so.
100 dump_writer_->WriteRtpPacket(packet, length);
101 }
102
OLDNEW

Powered by Google App Engine