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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 #include "media/filters/webvtt_util.h" | 42 #include "media/filters/webvtt_util.h" |
43 #include "media/formats/webm/webm_crypto_helpers.h" | 43 #include "media/formats/webm/webm_crypto_helpers.h" |
44 #include "media/media_features.h" | 44 #include "media/media_features.h" |
45 | 45 |
46 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) | 46 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) |
47 #include "media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.h" | 47 #include "media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.h" |
48 #endif | 48 #endif |
49 | 49 |
50 namespace media { | 50 namespace media { |
51 | 51 |
| 52 namespace { |
| 53 |
| 54 void SetAVStreamDiscard(AVStream* stream, AVDiscard discard) { |
| 55 DCHECK(stream); |
| 56 stream->discard = discard; |
| 57 } |
| 58 |
| 59 } // namespace |
| 60 |
52 static base::Time ExtractTimelineOffset(AVFormatContext* format_context) { | 61 static base::Time ExtractTimelineOffset(AVFormatContext* format_context) { |
53 if (strstr(format_context->iformat->name, "webm") || | 62 if (strstr(format_context->iformat->name, "webm") || |
54 strstr(format_context->iformat->name, "matroska")) { | 63 strstr(format_context->iformat->name, "matroska")) { |
55 const AVDictionaryEntry* entry = | 64 const AVDictionaryEntry* entry = |
56 av_dict_get(format_context->metadata, "creation_time", NULL, 0); | 65 av_dict_get(format_context->metadata, "creation_time", NULL, 0); |
57 | 66 |
58 base::Time timeline_offset; | 67 base::Time timeline_offset; |
59 | 68 |
60 // FFmpegDemuxerTests assume base::Time::FromUTCString() is used here. | 69 // FFmpegDemuxerTests assume base::Time::FromUTCString() is used here. |
61 if (entry != NULL && entry->value != NULL && | 70 if (entry != NULL && entry->value != NULL && |
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 return video_rotation_; | 738 return video_rotation_; |
730 } | 739 } |
731 | 740 |
732 bool FFmpegDemuxerStream::IsEnabled() const { | 741 bool FFmpegDemuxerStream::IsEnabled() const { |
733 DCHECK(task_runner_->BelongsToCurrentThread()); | 742 DCHECK(task_runner_->BelongsToCurrentThread()); |
734 return is_enabled_; | 743 return is_enabled_; |
735 } | 744 } |
736 | 745 |
737 void FFmpegDemuxerStream::SetEnabled(bool enabled, base::TimeDelta timestamp) { | 746 void FFmpegDemuxerStream::SetEnabled(bool enabled, base::TimeDelta timestamp) { |
738 DCHECK(task_runner_->BelongsToCurrentThread()); | 747 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 748 DCHECK(demuxer_); |
| 749 DCHECK(demuxer_->ffmpeg_task_runner()); |
739 if (enabled == is_enabled_) | 750 if (enabled == is_enabled_) |
740 return; | 751 return; |
741 | 752 |
742 is_enabled_ = enabled; | 753 is_enabled_ = enabled; |
743 av_stream()->discard = enabled ? AVDISCARD_DEFAULT : AVDISCARD_ALL; | 754 demuxer_->ffmpeg_task_runner()->PostTask( |
| 755 FROM_HERE, base::Bind(&SetAVStreamDiscard, av_stream(), |
| 756 enabled ? AVDISCARD_DEFAULT : AVDISCARD_ALL)); |
744 if (is_enabled_) { | 757 if (is_enabled_) { |
745 waiting_for_keyframe_ = true; | 758 waiting_for_keyframe_ = true; |
746 } | 759 } |
747 if (!is_enabled_ && !read_cb_.is_null()) { | 760 if (!is_enabled_ && !read_cb_.is_null()) { |
748 DVLOG(1) << "Read from disabled stream, returning EOS"; | 761 DVLOG(1) << "Read from disabled stream, returning EOS"; |
749 base::ResetAndReturn(&read_cb_).Run(kOk, DecoderBuffer::CreateEOSBuffer()); | 762 base::ResetAndReturn(&read_cb_).Run(kOk, DecoderBuffer::CreateEOSBuffer()); |
750 } | 763 } |
751 if (!stream_status_change_cb_.is_null()) | 764 if (!stream_status_change_cb_.is_null()) |
752 stream_status_change_cb_.Run(this, is_enabled_, timestamp); | 765 stream_status_change_cb_.Run(this, is_enabled_, timestamp); |
753 } | 766 } |
(...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 | 1881 |
1869 void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) { | 1882 void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) { |
1870 DCHECK(task_runner_->BelongsToCurrentThread()); | 1883 DCHECK(task_runner_->BelongsToCurrentThread()); |
1871 for (const auto& stream : streams_) { | 1884 for (const auto& stream : streams_) { |
1872 if (stream) | 1885 if (stream) |
1873 stream->SetLiveness(liveness); | 1886 stream->SetLiveness(liveness); |
1874 } | 1887 } |
1875 } | 1888 } |
1876 | 1889 |
1877 } // namespace media | 1890 } // namespace media |
OLD | NEW |