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

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

Issue 289483003: Cast: Only ACK decodable frames (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. 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 #include "media/cast/framer/framer.h" 5 #include "media/cast/framer/framer.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 8
9 namespace media { 9 namespace media {
10 namespace cast { 10 namespace cast {
11 11
12 typedef FrameList::const_iterator ConstFrameIterator; 12 typedef FrameList::const_iterator ConstFrameIterator;
13 13
14 Framer::Framer(base::TickClock* clock, 14 Framer::Framer(base::TickClock* clock,
15 RtpPayloadFeedback* incoming_payload_feedback, 15 RtpPayloadFeedback* incoming_payload_feedback,
16 uint32 ssrc, 16 uint32 ssrc,
17 bool decoder_faster_than_max_frame_rate, 17 bool decoder_faster_than_max_frame_rate,
18 int max_unacked_frames) 18 int max_unacked_frames)
19 : decoder_faster_than_max_frame_rate_(decoder_faster_than_max_frame_rate), 19 : decoder_faster_than_max_frame_rate_(decoder_faster_than_max_frame_rate),
20 cast_msg_builder_( 20 cast_msg_builder_(
21 new CastMessageBuilder(clock, 21 new CastMessageBuilder(clock,
22 incoming_payload_feedback, 22 incoming_payload_feedback,
23 &frame_id_map_, 23 &frame_id_map_,
imcheng 2014/05/14 20:11:24 I have limited context from just looking at this f
hubbe 2014/05/14 21:46:16 That does seem like a good idea, but is out of sco
24 ssrc, 24 ssrc,
25 decoder_faster_than_max_frame_rate, 25 decoder_faster_than_max_frame_rate,
26 max_unacked_frames)) { 26 max_unacked_frames)) {
27 DCHECK(incoming_payload_feedback) << "Invalid argument"; 27 DCHECK(incoming_payload_feedback) << "Invalid argument";
28 } 28 }
29 29
30 Framer::~Framer() {} 30 Framer::~Framer() {}
31 31
32 bool Framer::InsertPacket(const uint8* payload_data, 32 bool Framer::InsertPacket(const uint8* payload_data,
33 size_t payload_size, 33 size_t payload_size,
(...skipping 17 matching lines...) Expand all
51 if (it == frames_.end()) { 51 if (it == frames_.end()) {
52 // New frame. 52 // New frame.
53 linked_ptr<FrameBuffer> frame_buffer(new FrameBuffer()); 53 linked_ptr<FrameBuffer> frame_buffer(new FrameBuffer());
54 frame_buffer->InsertPacket(payload_data, payload_size, rtp_header); 54 frame_buffer->InsertPacket(payload_data, payload_size, rtp_header);
55 frames_.insert(std::make_pair(rtp_header.frame_id, frame_buffer)); 55 frames_.insert(std::make_pair(rtp_header.frame_id, frame_buffer));
56 } else { 56 } else {
57 // Insert packet to existing frame buffer. 57 // Insert packet to existing frame buffer.
58 it->second->InsertPacket(payload_data, payload_size, rtp_header); 58 it->second->InsertPacket(payload_data, payload_size, rtp_header);
59 } 59 }
60 60
61 bool complete = (packet_type == kNewPacketCompletingFrame); 61 return packet_type == kNewPacketCompletingFrame;
62 if (complete) {
63 // ACK as soon as possible.
64 VLOG(2) << "Complete frame " << static_cast<int>(rtp_header.frame_id);
65 cast_msg_builder_->CompleteFrameReceived(rtp_header.frame_id,
66 rtp_header.is_key_frame);
67 }
68 return complete;
69 } 62 }
70 63
71 // This does not release the frame. 64 // This does not release the frame.
72 bool Framer::GetEncodedAudioFrame(transport::EncodedAudioFrame* audio_frame, 65 bool Framer::GetEncodedAudioFrame(transport::EncodedAudioFrame* audio_frame,
73 bool* next_frame) { 66 bool* next_frame) {
74 uint32 frame_id; 67 uint32 frame_id;
75 // Find frame id. 68 // Find frame id.
76 if (frame_id_map_.NextContinuousFrame(&frame_id)) { 69 if (frame_id_map_.NextContinuousFrame(&frame_id)) {
77 // We have our next frame. 70 // We have our next frame.
78 *next_frame = true; 71 *next_frame = true;
79 } else { 72 } else {
80 if (!frame_id_map_.NextAudioFrameAllowingMissingFrames(&frame_id)) { 73 if (!frame_id_map_.NextAudioFrameAllowingMissingFrames(&frame_id)) {
81 return false; 74 return false;
82 } 75 }
83 *next_frame = false; 76 *next_frame = false;
84 } 77 }
85 78
79 if (next_frame) {
80 VLOG(2) << "ACK frame " << frame_id;
81 cast_msg_builder_->CompleteFrameReceived(frame_id);
82 }
83
86 ConstFrameIterator it = frames_.find(frame_id); 84 ConstFrameIterator it = frames_.find(frame_id);
87 DCHECK(it != frames_.end()); 85 DCHECK(it != frames_.end());
88 if (it == frames_.end()) 86 if (it == frames_.end())
89 return false; 87 return false;
90 88
91 return it->second->GetEncodedAudioFrame(audio_frame); 89 return it->second->GetEncodedAudioFrame(audio_frame);
92 } 90 }
93 91
94 // This does not release the frame. 92 // This does not release the frame.
95 bool Framer::GetEncodedVideoFrame(transport::EncodedVideoFrame* video_frame, 93 bool Framer::GetEncodedVideoFrame(transport::EncodedVideoFrame* video_frame,
96 bool* next_frame) { 94 bool* next_frame,
95 bool* have_multiple_decodable_frames) {
96 *have_multiple_decodable_frames = frame_id_map_.HaveMultipleDecodableFrames();
97
97 uint32 frame_id; 98 uint32 frame_id;
98 // Find frame id. 99 // Find frame id.
99 if (frame_id_map_.NextContinuousFrame(&frame_id)) { 100 if (frame_id_map_.NextContinuousFrame(&frame_id)) {
100 // We have our next frame. 101 // We have our next frame.
101 *next_frame = true; 102 *next_frame = true;
102 } else { 103 } else {
103 // Check if we can skip frames when our decoder is too slow. 104 // Check if we can skip frames when our decoder is too slow.
104 if (!decoder_faster_than_max_frame_rate_) 105 if (!decoder_faster_than_max_frame_rate_)
105 return false; 106 return false;
106 107
107 if (!frame_id_map_.NextVideoFrameAllowingSkippingFrames(&frame_id)) { 108 if (!frame_id_map_.NextVideoFrameAllowingSkippingFrames(&frame_id)) {
108 return false; 109 return false;
109 } 110 }
110 *next_frame = false; 111 *next_frame = false;
111 } 112 }
112 113
114 if (next_frame) {
imcheng 2014/05/14 20:11:24 *next_frame
hubbe 2014/05/14 21:46:16 Done (so much for test coverage)
115 VLOG(2) << "ACK frame " << frame_id;
116 cast_msg_builder_->CompleteFrameReceived(frame_id);
117 }
118
113 ConstFrameIterator it = frames_.find(frame_id); 119 ConstFrameIterator it = frames_.find(frame_id);
114 DCHECK(it != frames_.end()); 120 DCHECK(it != frames_.end());
115 if (it == frames_.end()) 121 if (it == frames_.end())
116 return false; 122 return false;
117 123
118 return it->second->GetEncodedVideoFrame(video_frame); 124 return it->second->GetEncodedVideoFrame(video_frame);
119 } 125 }
120 126
121 void Framer::Reset() { 127 void Framer::Reset() {
122 frame_id_map_.Clear(); 128 frame_id_map_.Clear();
(...skipping 22 matching lines...) Expand all
145 } 151 }
146 152
147 bool Framer::TimeToSendNextCastMessage(base::TimeTicks* time_to_send) { 153 bool Framer::TimeToSendNextCastMessage(base::TimeTicks* time_to_send) {
148 return cast_msg_builder_->TimeToSendNextCastMessage(time_to_send); 154 return cast_msg_builder_->TimeToSendNextCastMessage(time_to_send);
149 } 155 }
150 156
151 void Framer::SendCastMessage() { cast_msg_builder_->UpdateCastMessage(); } 157 void Framer::SendCastMessage() { cast_msg_builder_->UpdateCastMessage(); }
152 158
153 } // namespace cast 159 } // namespace cast
154 } // namespace media 160 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698