Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/base64.h" | 10 #include "base/base64.h" |
| (...skipping 774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 785 void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) { | 785 void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) { |
| 786 DCHECK(task_runner_->BelongsToCurrentThread()); | 786 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 787 DCHECK(pending_read_); | 787 DCHECK(pending_read_); |
| 788 pending_read_ = false; | 788 pending_read_ = false; |
| 789 | 789 |
| 790 if (!blocking_thread_.IsRunning() || pending_seek_) { | 790 if (!blocking_thread_.IsRunning() || pending_seek_) { |
| 791 return; | 791 return; |
| 792 } | 792 } |
| 793 | 793 |
| 794 if (result < 0) { | 794 if (result < 0) { |
| 795 // Update the duration based on the audio stream if | 795 // Update the duration based on the highest elapsed time across all streams |
| 796 // it was previously unknown http://crbug.com/86830 | 796 // if it was previously unknown. |
| 797 if (!duration_known_) { | 797 if (!duration_known_) { |
| 798 // Search streams for AUDIO one. | 798 base::TimeDelta max_duration; |
| 799 | |
| 799 for (StreamVector::iterator iter = streams_.begin(); | 800 for (StreamVector::iterator iter = streams_.begin(); |
| 800 iter != streams_.end(); | 801 iter != streams_.end(); |
| 801 ++iter) { | 802 ++iter) { |
| 802 if (*iter && (*iter)->type() == DemuxerStream::AUDIO) { | 803 base::TimeDelta duration = (*iter)->GetElapsedTime(); |
| 803 base::TimeDelta duration = (*iter)->GetElapsedTime(); | 804 if (duration != kNoTimestamp() && duration > max_duration) |
|
xhwang
2014/01/04 01:12:38
nit: the check duration != kNoTimestamp() seems re
| |
| 804 if (duration != kNoTimestamp() && duration > base::TimeDelta()) { | 805 max_duration = duration; |
| 805 host_->SetDuration(duration); | 806 } |
| 806 duration_known_ = true; | 807 |
| 807 } | 808 if (max_duration > base::TimeDelta()) { |
| 808 break; | 809 host_->SetDuration(max_duration); |
| 809 } | 810 duration_known_ = true; |
| 810 } | 811 } |
| 811 } | 812 } |
| 812 // If we have reached the end of stream, tell the downstream filters about | 813 // If we have reached the end of stream, tell the downstream filters about |
| 813 // the event. | 814 // the event. |
| 814 StreamHasEnded(); | 815 StreamHasEnded(); |
| 815 return; | 816 return; |
| 816 } | 817 } |
| 817 | 818 |
| 818 // Queue the packet with the appropriate stream. | 819 // Queue the packet with the appropriate stream. |
| 819 DCHECK_GE(packet->stream_index, 0); | 820 DCHECK_GE(packet->stream_index, 0); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 934 } | 935 } |
| 935 for (size_t i = 0; i < buffered.size(); ++i) | 936 for (size_t i = 0; i < buffered.size(); ++i) |
| 936 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); | 937 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); |
| 937 } | 938 } |
| 938 | 939 |
| 939 void FFmpegDemuxer::OnDataSourceError() { | 940 void FFmpegDemuxer::OnDataSourceError() { |
| 940 host_->OnDemuxerError(PIPELINE_ERROR_READ); | 941 host_->OnDemuxerError(PIPELINE_ERROR_READ); |
| 941 } | 942 } |
| 942 | 943 |
| 943 } // namespace media | 944 } // namespace media |
| OLD | NEW |