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

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

Issue 2305923002: Ensure FFmpegDemuxer WeakPtrs are created on the right thread. (Closed)
Patch Set: Fix. Created 4 years, 3 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
« no previous file with comments | « media/filters/ffmpeg_demuxer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 blocking_thread_("FFmpegDemuxer"), 831 blocking_thread_("FFmpegDemuxer"),
832 pending_read_(false), 832 pending_read_(false),
833 data_source_(data_source), 833 data_source_(data_source),
834 media_log_(media_log), 834 media_log_(media_log),
835 bitrate_(0), 835 bitrate_(0),
836 start_time_(kNoTimestamp), 836 start_time_(kNoTimestamp),
837 text_enabled_(false), 837 text_enabled_(false),
838 duration_known_(false), 838 duration_known_(false),
839 encrypted_media_init_data_cb_(encrypted_media_init_data_cb), 839 encrypted_media_init_data_cb_(encrypted_media_init_data_cb),
840 media_tracks_updated_cb_(media_tracks_updated_cb), 840 media_tracks_updated_cb_(media_tracks_updated_cb),
841 cancel_pending_seek_factory_(this),
841 weak_factory_(this) { 842 weak_factory_(this) {
842 DCHECK(task_runner_.get()); 843 DCHECK(task_runner_.get());
843 DCHECK(data_source_); 844 DCHECK(data_source_);
844 DCHECK(!media_tracks_updated_cb_.is_null()); 845 DCHECK(!media_tracks_updated_cb_.is_null());
845 } 846 }
846 847
847 FFmpegDemuxer::~FFmpegDemuxer() { 848 FFmpegDemuxer::~FFmpegDemuxer() {
848 // NOTE: This class is not destroyed on |task_runner|, so we must ensure that 849 // NOTE: This class is not destroyed on |task_runner|, so we must ensure that
849 // there are no outstanding WeakPtrs by the time we reach here. 850 // there are no outstanding WeakPtrs by the time we reach here.
850 DCHECK(!weak_factory_.HasWeakPtrs()); 851 DCHECK(!weak_factory_.HasWeakPtrs());
851 } 852 }
852 853
853 std::string FFmpegDemuxer::GetDisplayName() const { 854 std::string FFmpegDemuxer::GetDisplayName() const {
854 return "FFmpegDemuxer"; 855 return "FFmpegDemuxer";
855 } 856 }
856 857
857 void FFmpegDemuxer::Initialize(DemuxerHost* host, 858 void FFmpegDemuxer::Initialize(DemuxerHost* host,
858 const PipelineStatusCB& status_cb, 859 const PipelineStatusCB& status_cb,
859 bool enable_text_tracks) { 860 bool enable_text_tracks) {
860 DCHECK(task_runner_->BelongsToCurrentThread()); 861 DCHECK(task_runner_->BelongsToCurrentThread());
861 host_ = host; 862 host_ = host;
862 text_enabled_ = enable_text_tracks; 863 text_enabled_ = enable_text_tracks;
864 weak_this_ = cancel_pending_seek_factory_.GetWeakPtr();
863 865
864 url_protocol_.reset(new BlockingUrlProtocol( 866 url_protocol_.reset(new BlockingUrlProtocol(
865 data_source_, 867 data_source_,
866 BindToCurrentLoop(base::Bind(&FFmpegDemuxer::OnDataSourceError, 868 BindToCurrentLoop(base::Bind(&FFmpegDemuxer::OnDataSourceError,
867 base::Unretained(this))))); 869 base::Unretained(this)))));
868 glue_.reset(new FFmpegGlue(url_protocol_.get())); 870 glue_.reset(new FFmpegGlue(url_protocol_.get()));
869 AVFormatContext* format_context = glue_->format_context(); 871 AVFormatContext* format_context = glue_->format_context();
870 872
871 // Disable ID3v1 tag reading to avoid costly seeks to end of file for data we 873 // Disable ID3v1 tag reading to avoid costly seeks to end of file for data we
872 // don't use. FFmpeg will only read ID3v1 tags if no other metadata is 874 // don't use. FFmpeg will only read ID3v1 tags if no other metadata is
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 for (iter = streams_.begin(); iter != streams_.end(); ++iter) { 942 for (iter = streams_.begin(); iter != streams_.end(); ++iter) {
941 if (*iter) 943 if (*iter)
942 (*iter)->Stop(); 944 (*iter)->Stop();
943 } 945 }
944 946
945 data_source_ = NULL; 947 data_source_ = NULL;
946 948
947 // Invalidate WeakPtrs on |task_runner_|, destruction may happen on another 949 // Invalidate WeakPtrs on |task_runner_|, destruction may happen on another
948 // thread. 950 // thread.
949 weak_factory_.InvalidateWeakPtrs(); 951 weak_factory_.InvalidateWeakPtrs();
952 cancel_pending_seek_factory_.InvalidateWeakPtrs();
950 } 953 }
951 954
952 void FFmpegDemuxer::StartWaitingForSeek(base::TimeDelta seek_time) {} 955 void FFmpegDemuxer::StartWaitingForSeek(base::TimeDelta seek_time) {}
953 956
954 void FFmpegDemuxer::CancelPendingSeek(base::TimeDelta seek_time) { 957 void FFmpegDemuxer::CancelPendingSeek(base::TimeDelta seek_time) {
955 if (task_runner_->BelongsToCurrentThread()) { 958 if (task_runner_->BelongsToCurrentThread()) {
956 AbortPendingReads(); 959 AbortPendingReads();
957 } else { 960 } else {
958 task_runner_->PostTask(FROM_HERE, 961 // Don't use GetWeakPtr() here since we are on the wrong thread.
959 base::Bind(&FFmpegDemuxer::AbortPendingReads, 962 task_runner_->PostTask(
960 weak_factory_.GetWeakPtr())); 963 FROM_HERE, base::Bind(&FFmpegDemuxer::AbortPendingReads, weak_this_));
961 } 964 }
962 } 965 }
963 966
964 void FFmpegDemuxer::Seek(base::TimeDelta time, const PipelineStatusCB& cb) { 967 void FFmpegDemuxer::Seek(base::TimeDelta time, const PipelineStatusCB& cb) {
965 DCHECK(task_runner_->BelongsToCurrentThread()); 968 DCHECK(task_runner_->BelongsToCurrentThread());
966 CHECK(pending_seek_cb_.is_null()); 969 CHECK(pending_seek_cb_.is_null());
967 970
968 // FFmpeg requires seeks to be adjusted according to the lowest starting time. 971 // FFmpeg requires seeks to be adjusted according to the lowest starting time.
969 // Since EnqueuePacket() rebased negative timestamps by the start time, we 972 // Since EnqueuePacket() rebased negative timestamps by the start time, we
970 // must correct the shift here. 973 // must correct the shift here.
(...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after
1752 1755
1753 void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) { 1756 void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) {
1754 DCHECK(task_runner_->BelongsToCurrentThread()); 1757 DCHECK(task_runner_->BelongsToCurrentThread());
1755 for (auto* stream : streams_) { 1758 for (auto* stream : streams_) {
1756 if (stream) 1759 if (stream)
1757 stream->SetLiveness(liveness); 1760 stream->SetLiveness(liveness);
1758 } 1761 }
1759 } 1762 }
1760 1763
1761 } // namespace media 1764 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/ffmpeg_demuxer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698