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

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

Issue 10447035: Introducing DecoderBuffer and general Buffer cleanup. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Buffer Bonanza! Created 8 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 | 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/chunk_demuxer.h" 5 #include "media/filters/chunk_demuxer.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "media/base/audio_decoder_config.h" 10 #include "media/base/audio_decoder_config.h"
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 { 209 {
210 base::AutoLock auto_lock(lock_); 210 base::AutoLock auto_lock(lock_);
211 buffers_.clear(); 211 buffers_.clear();
212 ChangeState_Locked(WAITING_FOR_SEEK); 212 ChangeState_Locked(WAITING_FOR_SEEK);
213 last_buffer_timestamp_ = kNoTimestamp(); 213 last_buffer_timestamp_ = kNoTimestamp();
214 214
215 std::swap(read_cbs_, read_cbs); 215 std::swap(read_cbs_, read_cbs);
216 } 216 }
217 217
218 for (ReadCBQueue::iterator it = read_cbs.begin(); it != read_cbs.end(); ++it) 218 for (ReadCBQueue::iterator it = read_cbs.begin(); it != read_cbs.end(); ++it)
219 it->Run(scoped_refptr<Buffer>()); 219 it->Run(scoped_refptr<DecoderBuffer>());
220 } 220 }
221 221
222 void ChunkDemuxerStream::Seek(base::TimeDelta time) { 222 void ChunkDemuxerStream::Seek(base::TimeDelta time) {
223 base::AutoLock auto_lock(lock_); 223 base::AutoLock auto_lock(lock_);
224 224
225 DCHECK(read_cbs_.empty()); 225 DCHECK(read_cbs_.empty());
226 226
227 if (state_ == WAITING_FOR_SEEK) { 227 if (state_ == WAITING_FOR_SEEK) {
228 ChangeState_Locked(RETURNING_DATA_FOR_READS); 228 ChangeState_Locked(RETURNING_DATA_FOR_READS);
229 return; 229 return;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 base::TimeDelta end_duration = buffers_.back()->GetDuration(); 318 base::TimeDelta end_duration = buffers_.back()->GetDuration();
319 if (end_duration != kNoTimestamp()) 319 if (end_duration != kNoTimestamp())
320 *end_out += end_duration; 320 *end_out += end_duration;
321 321
322 return true; 322 return true;
323 } 323 }
324 324
325 // Helper function that makes sure |read_cb| runs on |message_loop|. 325 // Helper function that makes sure |read_cb| runs on |message_loop|.
326 static void RunOnMessageLoop(const DemuxerStream::ReadCB& read_cb, 326 static void RunOnMessageLoop(const DemuxerStream::ReadCB& read_cb,
327 MessageLoop* message_loop, 327 MessageLoop* message_loop,
328 const scoped_refptr<Buffer>& buffer) { 328 const scoped_refptr<DecoderBuffer>& buffer) {
329 if (MessageLoop::current() != message_loop) { 329 if (MessageLoop::current() != message_loop) {
330 message_loop->PostTask(FROM_HERE, base::Bind( 330 message_loop->PostTask(FROM_HERE, base::Bind(
331 &RunOnMessageLoop, read_cb, message_loop, buffer)); 331 &RunOnMessageLoop, read_cb, message_loop, buffer));
332 return; 332 return;
333 } 333 }
334 334
335 read_cb.Run(buffer); 335 read_cb.Run(buffer);
336 } 336 }
337 337
338 // DemuxerStream methods. 338 // DemuxerStream methods.
339 void ChunkDemuxerStream::Read(const ReadCB& read_cb) { 339 void ChunkDemuxerStream::Read(const ReadCB& read_cb) {
340 scoped_refptr<Buffer> buffer; 340 scoped_refptr<DecoderBuffer> buffer;
341 341
342 { 342 {
343 base::AutoLock auto_lock(lock_); 343 base::AutoLock auto_lock(lock_);
344 344
345 switch (state_) { 345 switch (state_) {
346 case RETURNING_DATA_FOR_READS: 346 case RETURNING_DATA_FOR_READS:
347 // If we don't have any buffers ready or already have 347 // If we don't have any buffers ready or already have
348 // pending reads, then defer this read. 348 // pending reads, then defer this read.
349 if (buffers_.empty() || !read_cbs_.empty()) { 349 if (buffers_.empty() || !read_cbs_.empty()) {
350 DeferRead_Locked(read_cb); 350 DeferRead_Locked(read_cb);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 while (!buffers_.empty() && !read_cbs_.empty()) { 423 while (!buffers_.empty() && !read_cbs_.empty()) {
424 closures->push_back(base::Bind(read_cbs_.front(), buffers_.front())); 424 closures->push_back(base::Bind(read_cbs_.front(), buffers_.front()));
425 buffers_.pop_front(); 425 buffers_.pop_front();
426 read_cbs_.pop_front(); 426 read_cbs_.pop_front();
427 } 427 }
428 428
429 if (state_ != RECEIVED_EOS || !buffers_.empty() || read_cbs_.empty()) 429 if (state_ != RECEIVED_EOS || !buffers_.empty() || read_cbs_.empty())
430 return; 430 return;
431 431
432 // Push enough EOS buffers to satisfy outstanding Read() requests. 432 // Push enough EOS buffers to satisfy outstanding Read() requests.
433 scoped_refptr<Buffer> end_of_stream_buffer = 433 scoped_refptr<DecoderBuffer> end_of_stream_buffer =
434 StreamParserBuffer::CreateEOSBuffer(); 434 StreamParserBuffer::CreateEOSBuffer();
435 while (!read_cbs_.empty()) { 435 while (!read_cbs_.empty()) {
436 closures->push_back(base::Bind(read_cbs_.front(), end_of_stream_buffer)); 436 closures->push_back(base::Bind(read_cbs_.front(), end_of_stream_buffer));
437 read_cbs_.pop_front(); 437 read_cbs_.pop_front();
438 } 438 }
439 439
440 ChangeState_Locked(RETURNING_EOS_FOR_READS); 440 ChangeState_Locked(RETURNING_EOS_FOR_READS);
441 } 441 }
442 442
443 ChunkDemuxer::ChunkDemuxer(ChunkDemuxerClient* client) 443 ChunkDemuxer::ChunkDemuxer(ChunkDemuxerClient* client)
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 return true; 891 return true;
892 } 892 }
893 893
894 bool ChunkDemuxer::OnKeyNeeded(scoped_array<uint8> init_data, 894 bool ChunkDemuxer::OnKeyNeeded(scoped_array<uint8> init_data,
895 int init_data_size) { 895 int init_data_size) {
896 client_->KeyNeeded(init_data.Pass(), init_data_size); 896 client_->KeyNeeded(init_data.Pass(), init_data_size);
897 return true; 897 return true;
898 } 898 }
899 899
900 } // namespace media 900 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698