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

Side by Side Diff: media/cast/framer/framer.cc

Issue 23467003: Added framer to cast. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@rtcp
Patch Set: Created 7 years, 3 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "media/cast/framer/framer.h"
6
7 #include "base/logging.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/stl_util.h"
10
11 namespace media {
12 namespace cast {
13
14 typedef FrameList::const_iterator ConstFrameIterator;
15
16 Framer::Framer(RtpPayloadFeedback* incoming_payload_feedback,
17 uint32 ssrc,
18 bool decoder_faster_than_max_frame_rate,
19 int max_unacked_frames)
20 : decoder_faster_than_max_frame_rate_(decoder_faster_than_max_frame_rate),
21 default_tick_clock_(new base::DefaultTickClock()),
22 clock_(default_tick_clock_.get()) {
23 DCHECK(incoming_payload_feedback) << "Invalid argument";
24 cast_msg_builder_ = new CastMessageBuilder(incoming_payload_feedback,
25 &frame_id_map_,
26 ssrc,
27 decoder_faster_than_max_frame_rate,
28 max_unacked_frames);
29 }
30
31 Framer::~Framer() {
32 delete cast_msg_builder_;
33 }
34
35 void Framer::InsertPacket(const uint8* payload_data,
36 int payload_size,
37 const RtpCastHeader& rtp_header) {
38 bool complete = false;
39 if (!frame_id_map_.InsertPacket(rtp_header, &complete)) return;
40
41 // Does this packet belong to a new frame?
42 FrameList::iterator it = frames_.find(rtp_header.frame_id);
43 if (it == frames_.end()) {
44 // New frame.
45 FrameBuffer* frame_buffer = new FrameBuffer();
46 frame_buffer->InsertPacket(payload_data, payload_size, rtp_header);
47 frames_.insert(
48 std::pair<uint8, FrameBuffer*>(rtp_header.frame_id, frame_buffer));
Alpha Left Google 2013/08/28 00:27:31 Use std::make_pair().
pwestin 2013/08/28 16:40:44 Done.
49 } else {
50 // Insert packet to existing frame buffer.
51 it->second->InsertPacket(payload_data, payload_size, rtp_header);
52 }
53
54 if (complete) {
55 // ACK as soon as possible.
56 cast_msg_builder_->CompleteFrameReceived(rtp_header.frame_id,
57 rtp_header.is_key_frame);
58 }
59 }
60
61 // This does not release the frame.
62 bool Framer::GetEncodedAudioFrame(const base::TimeTicks& timeout,
63 EncodedAudioFrame* audio_frame,
64 uint32* rtp_timestamp,
65 bool* next_frame) {
66 uint8 frame_id;
67 // Find frame id.
68 if (frame_id_map_.NextContinuousFrame(&frame_id)) {
69 // We have our next frame.
70 *next_frame = true;
71 } else {
72 if (WaitForNextFrame(timeout)) return false;
Alpha Left Google 2013/08/28 00:27:31 nit: one space before return.
pwestin 2013/08/28 16:40:44 Done.
73
74 if (!frame_id_map_.NextAudioFrameAllowingMissingFrames(&frame_id)) {
75 return false;
76 }
77 *next_frame = false;
78 }
79
80 ConstFrameIterator it = frames_.find(frame_id);
81 DCHECK(it != frames_.end());
82 if (it == frames_.end()) return false;
Alpha Left Google 2013/08/28 00:27:31 nit: one space before return.
pwestin 2013/08/28 16:40:44 Done.
83
84 return it->second->GetEncodedAudioFrame(audio_frame, rtp_timestamp);
85 }
86
87 // This does not release the frame.
88 bool Framer::GetEncodedVideoFrame(const base::TimeTicks& timeout,
89 EncodedVideoFrame* video_frame,
90 uint32* rtp_timestamp,
91 bool* next_frame) {
92 uint8 frame_id;
93 // Find frame id.
94 if (frame_id_map_.NextContinuousFrame(&frame_id)) {
95 // We have our next frame.
96 *next_frame = true;
97 } else {
98 if (WaitForNextFrame(timeout)) return false;
Alpha Left Google 2013/08/28 00:27:31 nit: one space before return.
pwestin 2013/08/28 16:40:44 Done.
99
100 // Check if we can skip frames when our decoder is too slow.
101 if (!decoder_faster_than_max_frame_rate_) return false;
Alpha Left Google 2013/08/28 00:27:31 nit: one space before return.
pwestin 2013/08/28 16:40:44 Done.
102
103 if (!frame_id_map_.NextVideoFrameAllowingSkippingFrames(&frame_id)) {
104 return false;
105 }
106 *next_frame = false;
107 }
108
109 ConstFrameIterator it = frames_.find(frame_id);
110 DCHECK(it != frames_.end());
111 if (it == frames_.end()) return false;
Alpha Left Google 2013/08/28 00:27:31 nit: one space before return.
pwestin 2013/08/28 16:40:44 Done.
112
113 return it->second->GetEncodedVideoFrame(video_frame, rtp_timestamp);
114 }
115
116 bool Framer::WaitForNextFrame(const base::TimeTicks& timeout) const {
117 base::TimeDelta wait_time = timeout - clock_->NowTicks();
Alpha Left Google 2013/08/28 00:27:31 nit: this looks strange, return should better be m
pwestin 2013/08/28 16:40:44 Done.
118 if (wait_time.InMilliseconds() > 0) return true;
119
120 return false;
121 }
122
123 void Framer::Reset() {
124 frame_id_map_.Clear();
125 STLDeleteValues(&frames_);
126 cast_msg_builder_->Reset();
127 }
128
129 void Framer::ReleaseFrame(uint8 frame_id) {
130 frame_id_map_.RemoveOldFrames(frame_id);
131 EraseKeyAndDeleteValuePtr(&frames_, frame_id);
132
133 // We have a frame - remove all frames with lower frame id.
134 FrameList::iterator it;
135 for (it = frames_.begin(); it != frames_.end(); ) {
136 if (IsOlderFrameId(it->first, frame_id)) {
137 delete it->second;
Alpha Left Google 2013/08/28 00:27:31 Use linked_ptr<> and there's no need to delete man
pwestin 2013/08/28 16:40:44 Done.
138 frames_.erase(it++);
139 } else {
140 ++it;
141 }
142 }
143 }
144
145 bool Framer::TimeToSendNextCastMessage(base::TimeTicks* time_to_send) {
146 return cast_msg_builder_->TimeToSendNextCastMessage(time_to_send);
147 }
148
149 void Framer::SendCastMessage() {
150 cast_msg_builder_->UpdateCastMessage();
151 }
152
153 } // namespace cast
154 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698