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

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: Rebase 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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 buffer_queue_.clear(); 117 buffer_queue_.clear();
118 last_packet_timestamp_ = kNoTimestamp(); 118 last_packet_timestamp_ = kNoTimestamp();
119 } 119 }
120 120
121 void FFmpegDemuxerStream::Stop() { 121 void FFmpegDemuxerStream::Stop() {
122 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop()); 122 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop());
123 base::AutoLock auto_lock(lock_); 123 base::AutoLock auto_lock(lock_);
124 buffer_queue_.clear(); 124 buffer_queue_.clear();
125 for (ReadQueue::iterator it = read_queue_.begin(); 125 for (ReadQueue::iterator it = read_queue_.begin();
126 it != read_queue_.end(); ++it) { 126 it != read_queue_.end(); ++it) {
127 it->Run(scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer())); 127 it->Run(DemuxerStream::kOk,
128 scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer()));
128 } 129 }
129 read_queue_.clear(); 130 read_queue_.clear();
130 stopped_ = true; 131 stopped_ = true;
131 } 132 }
132 133
133 base::TimeDelta FFmpegDemuxerStream::duration() { 134 base::TimeDelta FFmpegDemuxerStream::duration() {
134 return duration_; 135 return duration_;
135 } 136 }
136 137
137 DemuxerStream::Type FFmpegDemuxerStream::type() { 138 DemuxerStream::Type FFmpegDemuxerStream::type() {
138 return type_; 139 return type_;
139 } 140 }
140 141
141 void FFmpegDemuxerStream::Read(const ReadCB& read_cb) { 142 void FFmpegDemuxerStream::Read(const ReadCB& read_cb) {
142 DCHECK(!read_cb.is_null()); 143 DCHECK(!read_cb.is_null());
143 144
144 base::AutoLock auto_lock(lock_); 145 base::AutoLock auto_lock(lock_);
145 // Don't accept any additional reads if we've been told to stop. 146 // Don't accept any additional reads if we've been told to stop.
146 // The demuxer_ may have been destroyed in the pipleine thread. 147 // The demuxer_ may have been destroyed in the pipleine thread.
147 // 148 //
148 // TODO(scherkus): it would be cleaner if we replied with an error message. 149 // TODO(scherkus): it would be cleaner if we replied with an error message.
149 if (stopped_) { 150 if (stopped_) {
150 read_cb.Run(scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer())); 151 read_cb.Run(DemuxerStream::kOk,
152 scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer()));
151 return; 153 return;
152 } 154 }
153 155
154 // Buffers are only queued when there are no pending reads. 156 // Buffers are only queued when there are no pending reads.
155 DCHECK(buffer_queue_.empty() || read_queue_.empty()); 157 DCHECK(buffer_queue_.empty() || read_queue_.empty());
156 158
157 if (buffer_queue_.empty()) { 159 if (buffer_queue_.empty()) {
158 demuxer_->message_loop()->PostTask(FROM_HERE, base::Bind( 160 demuxer_->message_loop()->PostTask(FROM_HERE, base::Bind(
159 &FFmpegDemuxerStream::ReadTask, this, read_cb)); 161 &FFmpegDemuxerStream::ReadTask, this, read_cb));
160 return; 162 return;
161 } 163 }
162 164
163 // Send the oldest buffer back. 165 // Send the oldest buffer back.
164 scoped_refptr<DecoderBuffer> buffer = buffer_queue_.front(); 166 scoped_refptr<DecoderBuffer> buffer = buffer_queue_.front();
165 buffer_queue_.pop_front(); 167 buffer_queue_.pop_front();
166 read_cb.Run(buffer); 168 read_cb.Run(DemuxerStream::kOk, buffer);
167 } 169 }
168 170
169 void FFmpegDemuxerStream::ReadTask(const ReadCB& read_cb) { 171 void FFmpegDemuxerStream::ReadTask(const ReadCB& read_cb) {
170 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop()); 172 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop());
171 173
172 base::AutoLock auto_lock(lock_); 174 base::AutoLock auto_lock(lock_);
173 // Don't accept any additional reads if we've been told to stop. 175 // Don't accept any additional reads if we've been told to stop.
174 // 176 //
175 // TODO(scherkus): it would be cleaner if we replied with an error message. 177 // TODO(scherkus): it would be cleaner if we replied with an error message.
176 if (stopped_) { 178 if (stopped_) {
177 read_cb.Run(scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer())); 179 read_cb.Run(DemuxerStream::kOk,
180 scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer()));
178 return; 181 return;
179 } 182 }
180 183
181 // Enqueue the callback and attempt to satisfy it immediately. 184 // Enqueue the callback and attempt to satisfy it immediately.
182 read_queue_.push_back(read_cb); 185 read_queue_.push_back(read_cb);
183 FulfillPendingRead(); 186 FulfillPendingRead();
184 187
185 // Check if there are still pending reads, demux some more. 188 // Check if there are still pending reads, demux some more.
186 if (!read_queue_.empty()) { 189 if (!read_queue_.empty()) {
187 demuxer_->PostDemuxTask(); 190 demuxer_->PostDemuxTask();
188 } 191 }
189 } 192 }
190 193
191 void FFmpegDemuxerStream::FulfillPendingRead() { 194 void FFmpegDemuxerStream::FulfillPendingRead() {
192 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop()); 195 DCHECK_EQ(MessageLoop::current(), demuxer_->message_loop());
193 lock_.AssertAcquired(); 196 lock_.AssertAcquired();
194 if (buffer_queue_.empty() || read_queue_.empty()) { 197 if (buffer_queue_.empty() || read_queue_.empty()) {
195 return; 198 return;
196 } 199 }
197 200
198 // Dequeue a buffer and pending read pair. 201 // Dequeue a buffer and pending read pair.
199 scoped_refptr<DecoderBuffer> buffer = buffer_queue_.front(); 202 scoped_refptr<DecoderBuffer> buffer = buffer_queue_.front();
200 ReadCB read_cb(read_queue_.front()); 203 ReadCB read_cb(read_queue_.front());
201 buffer_queue_.pop_front(); 204 buffer_queue_.pop_front();
202 read_queue_.pop_front(); 205 read_queue_.pop_front();
203 206
204 // Execute the callback. 207 // Execute the callback.
205 read_cb.Run(buffer); 208 read_cb.Run(DemuxerStream::kOk, buffer);
206 } 209 }
207 210
208 void FFmpegDemuxerStream::EnableBitstreamConverter() { 211 void FFmpegDemuxerStream::EnableBitstreamConverter() {
209 // Called by hardware decoder to require different bitstream converter. 212 // Called by hardware decoder to require different bitstream converter.
210 // Currently we assume that converter is determined by codec_id; 213 // Currently we assume that converter is determined by codec_id;
211 DCHECK(stream_); 214 DCHECK(stream_);
212 DCHECK_EQ(stream_->codec->codec_id, CODEC_ID_H264); 215 DCHECK_EQ(stream_->codec->codec_id, CODEC_ID_H264);
213 bitstream_converter_.reset( 216 bitstream_converter_.reset(
214 new FFmpegH264ToAnnexBBitstreamConverter(stream_->codec)); 217 new FFmpegH264ToAnnexBBitstreamConverter(stream_->codec));
215 } 218 }
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 } else if (audio) { 727 } else if (audio) {
725 buffered = audio->GetBufferedRanges(); 728 buffered = audio->GetBufferedRanges();
726 } else if (video) { 729 } else if (video) {
727 buffered = video->GetBufferedRanges(); 730 buffered = video->GetBufferedRanges();
728 } 731 }
729 for (size_t i = 0; i < buffered.size(); ++i) 732 for (size_t i = 0; i < buffered.size(); ++i)
730 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); 733 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i));
731 } 734 }
732 735
733 } // namespace media 736 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/ffmpeg_audio_decoder_unittest.cc ('k') | media/filters/ffmpeg_demuxer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698