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

Side by Side Diff: media/filters/ffmpeg_demuxer.cc

Issue 10669022: Add status parameter to DemuxerStream::ReadCB (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix seek_tester build buster Created 8 years, 5 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/filters/ffmpeg_demuxer.h" 5 #include "media/filters/ffmpeg_demuxer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 buffer_queue_.clear(); 118 buffer_queue_.clear();
119 last_packet_timestamp_ = kNoTimestamp(); 119 last_packet_timestamp_ = kNoTimestamp();
120 } 120 }
121 121
122 void FFmpegDemuxerStream::Stop() { 122 void FFmpegDemuxerStream::Stop() {
123 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop()); 123 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop());
124 base::AutoLock auto_lock(lock_); 124 base::AutoLock auto_lock(lock_);
125 buffer_queue_.clear(); 125 buffer_queue_.clear();
126 for (ReadQueue::iterator it = read_queue_.begin(); 126 for (ReadQueue::iterator it = read_queue_.begin();
127 it != read_queue_.end(); ++it) { 127 it != read_queue_.end(); ++it) {
128 it->Run(scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer())); 128 it->Run(DemuxerStream::kOk,
129 scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer()));
129 } 130 }
130 read_queue_.clear(); 131 read_queue_.clear();
131 stopped_ = true; 132 stopped_ = true;
132 } 133 }
133 134
134 base::TimeDelta FFmpegDemuxerStream::duration() { 135 base::TimeDelta FFmpegDemuxerStream::duration() {
135 return duration_; 136 return duration_;
136 } 137 }
137 138
138 DemuxerStream::Type FFmpegDemuxerStream::type() { 139 DemuxerStream::Type FFmpegDemuxerStream::type() {
139 return type_; 140 return type_;
140 } 141 }
141 142
142 void FFmpegDemuxerStream::Read(const ReadCB& read_cb) { 143 void FFmpegDemuxerStream::Read(const ReadCB& read_cb) {
143 DCHECK(!read_cb.is_null()); 144 DCHECK(!read_cb.is_null());
144 145
145 base::AutoLock auto_lock(lock_); 146 base::AutoLock auto_lock(lock_);
146 // Don't accept any additional reads if we've been told to stop. 147 // Don't accept any additional reads if we've been told to stop.
147 // The demuxer_ may have been destroyed in the pipleine thread. 148 // The demuxer_ may have been destroyed in the pipleine thread.
148 // 149 //
149 // TODO(scherkus): it would be cleaner if we replied with an error message. 150 // TODO(scherkus): it would be cleaner if we replied with an error message.
150 if (stopped_) { 151 if (stopped_) {
151 read_cb.Run(scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer())); 152 read_cb.Run(DemuxerStream::kOk,
153 scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer()));
152 return; 154 return;
153 } 155 }
154 156
155 // Buffers are only queued when there are no pending reads. 157 // Buffers are only queued when there are no pending reads.
156 DCHECK(buffer_queue_.empty() || read_queue_.empty()); 158 DCHECK(buffer_queue_.empty() || read_queue_.empty());
157 159
158 if (buffer_queue_.empty()) { 160 if (buffer_queue_.empty()) {
159 demuxer_->message_loop()->PostTask(FROM_HERE, base::Bind( 161 demuxer_->message_loop()->PostTask(FROM_HERE, base::Bind(
160 &FFmpegDemuxerStream::ReadTask, this, read_cb)); 162 &FFmpegDemuxerStream::ReadTask, this, read_cb));
161 return; 163 return;
162 } 164 }
163 165
164 // Send the oldest buffer back. 166 // Send the oldest buffer back.
165 scoped_refptr<DecoderBuffer> buffer = buffer_queue_.front(); 167 scoped_refptr<DecoderBuffer> buffer = buffer_queue_.front();
166 buffer_queue_.pop_front(); 168 buffer_queue_.pop_front();
167 read_cb.Run(buffer); 169 read_cb.Run(DemuxerStream::kOk, buffer);
168 } 170 }
169 171
170 void FFmpegDemuxerStream::ReadTask(const ReadCB& read_cb) { 172 void FFmpegDemuxerStream::ReadTask(const ReadCB& read_cb) {
171 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop()); 173 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop());
172 174
173 base::AutoLock auto_lock(lock_); 175 base::AutoLock auto_lock(lock_);
174 // Don't accept any additional reads if we've been told to stop. 176 // Don't accept any additional reads if we've been told to stop.
175 // 177 //
176 // TODO(scherkus): it would be cleaner if we replied with an error message. 178 // TODO(scherkus): it would be cleaner if we replied with an error message.
177 if (stopped_) { 179 if (stopped_) {
178 read_cb.Run(scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer())); 180 read_cb.Run(DemuxerStream::kOk,
181 scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer()));
179 return; 182 return;
180 } 183 }
181 184
182 // Enqueue the callback and attempt to satisfy it immediately. 185 // Enqueue the callback and attempt to satisfy it immediately.
183 read_queue_.push_back(read_cb); 186 read_queue_.push_back(read_cb);
184 FulfillPendingRead(); 187 FulfillPendingRead();
185 188
186 // Check if there are still pending reads, demux some more. 189 // Check if there are still pending reads, demux some more.
187 if (!read_queue_.empty()) { 190 if (!read_queue_.empty()) {
188 demuxer_->PostDemuxTask(); 191 demuxer_->PostDemuxTask();
189 } 192 }
190 } 193 }
191 194
192 void FFmpegDemuxerStream::FulfillPendingRead() { 195 void FFmpegDemuxerStream::FulfillPendingRead() {
193 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop()); 196 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop());
194 lock_.AssertAcquired(); 197 lock_.AssertAcquired();
195 if (buffer_queue_.empty() || read_queue_.empty()) { 198 if (buffer_queue_.empty() || read_queue_.empty()) {
196 return; 199 return;
197 } 200 }
198 201
199 // Dequeue a buffer and pending read pair. 202 // Dequeue a buffer and pending read pair.
200 scoped_refptr<DecoderBuffer> buffer = buffer_queue_.front(); 203 scoped_refptr<DecoderBuffer> buffer = buffer_queue_.front();
201 ReadCB read_cb(read_queue_.front()); 204 ReadCB read_cb(read_queue_.front());
202 buffer_queue_.pop_front(); 205 buffer_queue_.pop_front();
203 read_queue_.pop_front(); 206 read_queue_.pop_front();
204 207
205 // Execute the callback. 208 // Execute the callback.
206 read_cb.Run(buffer); 209 read_cb.Run(DemuxerStream::kOk, buffer);
207 } 210 }
208 211
209 void FFmpegDemuxerStream::EnableBitstreamConverter() { 212 void FFmpegDemuxerStream::EnableBitstreamConverter() {
210 // Called by hardware decoder to require different bitstream converter. 213 // Called by hardware decoder to require different bitstream converter.
211 // Currently we assume that converter is determined by codec_id; 214 // Currently we assume that converter is determined by codec_id;
212 DCHECK(stream_); 215 DCHECK(stream_);
213 216
214 if (stream_->codec->codec_id == CODEC_ID_H264) { 217 if (stream_->codec->codec_id == CODEC_ID_H264) {
215 // Use Chromium bitstream converter in case of H.264 218 // Use Chromium bitstream converter in case of H.264
216 bitstream_converter_.reset( 219 bitstream_converter_.reset(
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 } else if (audio) { 738 } else if (audio) {
736 buffered = audio->GetBufferedRanges(); 739 buffered = audio->GetBufferedRanges();
737 } else if (video) { 740 } else if (video) {
738 buffered = video->GetBufferedRanges(); 741 buffered = video->GetBufferedRanges();
739 } 742 }
740 for (size_t i = 0; i < buffered.size(); ++i) 743 for (size_t i = 0; i < buffered.size(); ++i)
741 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); 744 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i));
742 } 745 }
743 746
744 } // namespace media 747 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698