| 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 <memory> | 8 #include <memory> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 } | 244 } |
| 245 | 245 |
| 246 MEDIA_LOG(INFO, media_log) << "FFmpegDemuxer: created video stream, config " | 246 MEDIA_LOG(INFO, media_log) << "FFmpegDemuxer: created video stream, config " |
| 247 << video_config->AsHumanReadableString(); | 247 << video_config->AsHumanReadableString(); |
| 248 } | 248 } |
| 249 | 249 |
| 250 return base::WrapUnique(new FFmpegDemuxerStream( | 250 return base::WrapUnique(new FFmpegDemuxerStream( |
| 251 demuxer, stream, std::move(audio_config), std::move(video_config))); | 251 demuxer, stream, std::move(audio_config), std::move(video_config))); |
| 252 } | 252 } |
| 253 | 253 |
| 254 static void UnmarkEndOfStream(AVFormatContext* format_context) { | 254 static void UnmarkEndOfStreamAndClearError(AVFormatContext* format_context) { |
| 255 format_context->pb->eof_reached = 0; | 255 format_context->pb->eof_reached = 0; |
| 256 format_context->pb->error = 0; |
| 256 } | 257 } |
| 257 | 258 |
| 258 // | 259 // |
| 259 // FFmpegDemuxerStream | 260 // FFmpegDemuxerStream |
| 260 // | 261 // |
| 261 FFmpegDemuxerStream::FFmpegDemuxerStream( | 262 FFmpegDemuxerStream::FFmpegDemuxerStream( |
| 262 FFmpegDemuxer* demuxer, | 263 FFmpegDemuxer* demuxer, |
| 263 AVStream* stream, | 264 AVStream* stream, |
| 264 std::unique_ptr<AudioDecoderConfig> audio_config, | 265 std::unique_ptr<AudioDecoderConfig> audio_config, |
| 265 std::unique_ptr<VideoDecoderConfig> video_config) | 266 std::unique_ptr<VideoDecoderConfig> video_config) |
| (...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 } | 774 } |
| 774 } | 775 } |
| 775 | 776 |
| 776 // Have capacity? Ask for more! | 777 // Have capacity? Ask for more! |
| 777 if (HasAvailableCapacity() && !end_of_stream_) { | 778 if (HasAvailableCapacity() && !end_of_stream_) { |
| 778 demuxer_->NotifyCapacityAvailable(); | 779 demuxer_->NotifyCapacityAvailable(); |
| 779 } | 780 } |
| 780 } | 781 } |
| 781 | 782 |
| 782 bool FFmpegDemuxerStream::HasAvailableCapacity() { | 783 bool FFmpegDemuxerStream::HasAvailableCapacity() { |
| 783 // TODO(scherkus): Remove this return and reenable time-based capacity | 784 // Try to have two second's worth of encoded data per stream. |
| 784 // after our data sources support canceling/concurrent reads, see | 785 const base::TimeDelta kCapacity = base::TimeDelta::FromSeconds(2); |
| 785 // http://crbug.com/165762 for details. | |
| 786 #if 1 | |
| 787 return !read_cb_.is_null(); | |
| 788 #else | |
| 789 // Try to have one second's worth of encoded data per stream. | |
| 790 const base::TimeDelta kCapacity = base::TimeDelta::FromSeconds(1); | |
| 791 return buffer_queue_.IsEmpty() || buffer_queue_.Duration() < kCapacity; | 786 return buffer_queue_.IsEmpty() || buffer_queue_.Duration() < kCapacity; |
| 792 #endif | |
| 793 } | 787 } |
| 794 | 788 |
| 795 size_t FFmpegDemuxerStream::MemoryUsage() const { | 789 size_t FFmpegDemuxerStream::MemoryUsage() const { |
| 796 return buffer_queue_.data_size(); | 790 return buffer_queue_.data_size(); |
| 797 } | 791 } |
| 798 | 792 |
| 799 TextKind FFmpegDemuxerStream::GetTextKind() const { | 793 TextKind FFmpegDemuxerStream::GetTextKind() const { |
| 800 DCHECK_EQ(type_, DemuxerStream::TEXT); | 794 DCHECK_EQ(type_, DemuxerStream::TEXT); |
| 801 | 795 |
| 802 if (stream_->disposition & AV_DISPOSITION_CAPTIONS) | 796 if (stream_->disposition & AV_DISPOSITION_CAPTIONS) |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 928 stream->Abort(); | 922 stream->Abort(); |
| 929 } | 923 } |
| 930 | 924 |
| 931 // It's important to invalidate read/seek completion callbacks to avoid any | 925 // It's important to invalidate read/seek completion callbacks to avoid any |
| 932 // errors that occur because of the data source abort. | 926 // errors that occur because of the data source abort. |
| 933 weak_factory_.InvalidateWeakPtrs(); | 927 weak_factory_.InvalidateWeakPtrs(); |
| 934 data_source_->Abort(); | 928 data_source_->Abort(); |
| 935 | 929 |
| 936 // Aborting the read may cause EOF to be marked, undo this. | 930 // Aborting the read may cause EOF to be marked, undo this. |
| 937 blocking_task_runner_->PostTask( | 931 blocking_task_runner_->PostTask( |
| 938 FROM_HERE, base::Bind(&UnmarkEndOfStream, glue_->format_context())); | 932 FROM_HERE, |
| 933 base::Bind(&UnmarkEndOfStreamAndClearError, glue_->format_context())); |
| 939 pending_read_ = false; | 934 pending_read_ = false; |
| 940 | 935 |
| 941 // TODO(dalecurtis): We probably should report PIPELINE_ERROR_ABORT here | 936 // TODO(dalecurtis): We probably should report PIPELINE_ERROR_ABORT here |
| 942 // instead to avoid any preroll work that may be started upon return, but | 937 // instead to avoid any preroll work that may be started upon return, but |
| 943 // currently the PipelineImpl does not know how to handle this. | 938 // currently the PipelineImpl does not know how to handle this. |
| 944 if (!pending_seek_cb_.is_null()) | 939 if (!pending_seek_cb_.is_null()) |
| 945 base::ResetAndReturn(&pending_seek_cb_).Run(PIPELINE_OK); | 940 base::ResetAndReturn(&pending_seek_cb_).Run(PIPELINE_OK); |
| 946 } | 941 } |
| 947 | 942 |
| 948 void FFmpegDemuxer::Stop() { | 943 void FFmpegDemuxer::Stop() { |
| (...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1839 | 1834 |
| 1840 void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) { | 1835 void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) { |
| 1841 DCHECK(task_runner_->BelongsToCurrentThread()); | 1836 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 1842 for (const auto& stream : streams_) { | 1837 for (const auto& stream : streams_) { |
| 1843 if (stream) | 1838 if (stream) |
| 1844 stream->SetLiveness(liveness); | 1839 stream->SetLiveness(liveness); |
| 1845 } | 1840 } |
| 1846 } | 1841 } |
| 1847 | 1842 |
| 1848 } // namespace media | 1843 } // namespace media |
| OLD | NEW |