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

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

Issue 165733002: Add DecryptingDemuxerStream::Stop(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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/decrypting_demuxer_stream.h" 5 #include "media/filters/decrypting_demuxer_stream.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 read_cb_ = BindToCurrentLoop(read_cb); 68 read_cb_ = BindToCurrentLoop(read_cb);
69 state_ = kPendingDemuxerRead; 69 state_ = kPendingDemuxerRead;
70 demuxer_stream_->Read( 70 demuxer_stream_->Read(
71 base::Bind(&DecryptingDemuxerStream::DecryptBuffer, weak_this_)); 71 base::Bind(&DecryptingDemuxerStream::DecryptBuffer, weak_this_));
72 } 72 }
73 73
74 void DecryptingDemuxerStream::Reset(const base::Closure& closure) { 74 void DecryptingDemuxerStream::Reset(const base::Closure& closure) {
75 DVLOG(2) << __FUNCTION__ << " - state: " << state_; 75 DVLOG(2) << __FUNCTION__ << " - state: " << state_;
76 DCHECK(task_runner_->BelongsToCurrentThread()); 76 DCHECK(task_runner_->BelongsToCurrentThread());
77 DCHECK(state_ != kUninitialized) << state_; 77 DCHECK(state_ != kUninitialized) << state_;
78 DCHECK(state_ != kStopped) << state_;
78 DCHECK(reset_cb_.is_null()); 79 DCHECK(reset_cb_.is_null());
79 80
80 reset_cb_ = BindToCurrentLoop(closure); 81 reset_cb_ = BindToCurrentLoop(closure);
81 82
83 // TODO(xhwang): This should not happen. Remove it, DCHECK against the
84 // condition and clean up related tests.
82 if (state_ == kDecryptorRequested) { 85 if (state_ == kDecryptorRequested) {
83 DCHECK(!init_cb_.is_null()); 86 DCHECK(!init_cb_.is_null());
84 set_decryptor_ready_cb_.Run(DecryptorReadyCB()); 87 set_decryptor_ready_cb_.Run(DecryptorReadyCB());
85 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); 88 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT);
86 DoReset(); 89 DoReset();
87 return; 90 return;
88 } 91 }
89 92
90 decryptor_->CancelDecrypt(GetDecryptorStreamType()); 93 decryptor_->CancelDecrypt(GetDecryptorStreamType());
91 94
92 // Reset() cannot complete if the read callback is still pending. 95 // Reset() cannot complete if the read callback is still pending.
93 // Defer the resetting process in this case. The |reset_cb_| will be fired 96 // Defer the resetting process in this case. The |reset_cb_| will be fired
94 // after the read callback is fired - see DoDecryptBuffer() and 97 // after the read callback is fired - see DoDecryptBuffer() and
95 // DoDeliverBuffer(). 98 // DoDeliverBuffer().
96 if (state_ == kPendingDemuxerRead || state_ == kPendingDecrypt) { 99 if (state_ == kPendingDemuxerRead || state_ == kPendingDecrypt) {
97 DCHECK(!read_cb_.is_null()); 100 DCHECK(!read_cb_.is_null());
98 return; 101 return;
99 } 102 }
100 103
101 if (state_ == kWaitingForKey) { 104 if (state_ == kWaitingForKey) {
102 DCHECK(!read_cb_.is_null()); 105 DCHECK(!read_cb_.is_null());
103 pending_buffer_to_decrypt_ = NULL; 106 pending_buffer_to_decrypt_ = NULL;
104 base::ResetAndReturn(&read_cb_).Run(kAborted, NULL); 107 base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
105 } 108 }
106 109
107 DCHECK(read_cb_.is_null()); 110 DCHECK(read_cb_.is_null());
108 DoReset(); 111 DoReset();
109 } 112 }
110 113
114 void DecryptingDemuxerStream::Stop(const base::Closure& closure) {
115 DVLOG(2) << __FUNCTION__ << " - state: " << state_;
116 DCHECK(task_runner_->BelongsToCurrentThread());
117 DCHECK(state_ != kUninitialized) << state_;
118
119 // Invalidate all weak pointers so that pending callbacks won't fire.
ddorwin 2014/02/14 04:17:59 ...so that callbacks won't be fired into this obje
xhwang 2014/02/14 18:47:26 Done.
120 weak_factory_.InvalidateWeakPtrs();
121
122 // At this point the render thread is likely paused (in WebMediaPlayerImpl's
123 // Destroy()), so running |closure| can't wait for anything that requires the
124 // render thread to process messages to complete (such as PPAPI methods).
125 if (decryptor_) {
126 // Clear the callback.
127 decryptor_->RegisterNewKeyCB(GetDecryptorStreamType(),
ddorwin 2014/02/14 04:17:59 Per the discussion in PS1, maybe we should remove
xhwang 2014/02/14 18:47:26 Added TODO since we also need to clean up other De
128 Decryptor::NewKeyCB());
129 decryptor_->CancelDecrypt(GetDecryptorStreamType());
130 decryptor_ = NULL;
131 }
132 if (!set_decryptor_ready_cb_.is_null())
133 base::ResetAndReturn(&set_decryptor_ready_cb_).Run(DecryptorReadyCB());
134 if (!init_cb_.is_null())
135 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT);
136 if (!read_cb_.is_null())
137 base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
138 if (!reset_cb_.is_null())
139 base::ResetAndReturn(&reset_cb_).Run();
140 pending_buffer_to_decrypt_ = NULL;
141
142 state_ = kStopped;
143 BindToCurrentLoop(closure).Run();
144 }
145
111 AudioDecoderConfig DecryptingDemuxerStream::audio_decoder_config() { 146 AudioDecoderConfig DecryptingDemuxerStream::audio_decoder_config() {
112 DCHECK(state_ != kUninitialized && state_ != kDecryptorRequested) << state_; 147 DCHECK(state_ != kUninitialized && state_ != kDecryptorRequested) << state_;
113 CHECK_EQ(demuxer_stream_->type(), AUDIO); 148 CHECK_EQ(demuxer_stream_->type(), AUDIO);
114 return audio_config_; 149 return audio_config_;
115 } 150 }
116 151
117 VideoDecoderConfig DecryptingDemuxerStream::video_decoder_config() { 152 VideoDecoderConfig DecryptingDemuxerStream::video_decoder_config() {
118 DCHECK(state_ != kUninitialized && state_ != kDecryptorRequested) << state_; 153 DCHECK(state_ != kUninitialized && state_ != kDecryptorRequested) << state_;
119 CHECK_EQ(demuxer_stream_->type(), VIDEO); 154 CHECK_EQ(demuxer_stream_->type(), VIDEO);
120 return video_config_; 155 return video_config_;
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 break; 389 break;
355 } 390 }
356 391
357 default: 392 default:
358 NOTREACHED(); 393 NOTREACHED();
359 return; 394 return;
360 } 395 }
361 } 396 }
362 397
363 } // namespace media 398 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698