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

Side by Side Diff: media/base/android/media_decoder_job.cc

Issue 51613002: Abort MSP::OnPrefetchDone() if just after MSP::Release(). Let seek and config change survive. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address comments and nits from PS6 Created 7 years, 1 month 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/base/android/media_decoder_job.h" 5 #include "media/base/android/media_decoder_job.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/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 received_data_ = data; 60 received_data_ = data;
61 done_cb.Run(); 61 done_cb.Run();
62 } 62 }
63 63
64 void MediaDecoderJob::Prefetch(const base::Closure& prefetch_cb) { 64 void MediaDecoderJob::Prefetch(const base::Closure& prefetch_cb) {
65 DCHECK(ui_loop_->BelongsToCurrentThread()); 65 DCHECK(ui_loop_->BelongsToCurrentThread());
66 DCHECK(on_data_received_cb_.is_null()); 66 DCHECK(on_data_received_cb_.is_null());
67 DCHECK(decode_cb_.is_null()); 67 DCHECK(decode_cb_.is_null());
68 68
69 if (HasData()) { 69 if (HasData()) {
70 DVLOG(1) << __FUNCTION__ << " : using previously received data";
70 ui_loop_->PostTask(FROM_HERE, prefetch_cb); 71 ui_loop_->PostTask(FROM_HERE, prefetch_cb);
71 return; 72 return;
72 } 73 }
73 74
75 DVLOG(1) << __FUNCTION__ << " : requesting data";
74 RequestData(prefetch_cb); 76 RequestData(prefetch_cb);
75 } 77 }
76 78
77 bool MediaDecoderJob::Decode( 79 bool MediaDecoderJob::Decode(
78 const base::TimeTicks& start_time_ticks, 80 const base::TimeTicks& start_time_ticks,
79 const base::TimeDelta& start_presentation_timestamp, 81 const base::TimeDelta& start_presentation_timestamp,
80 const DecoderCallback& callback) { 82 const DecoderCallback& callback) {
81 DCHECK(decode_cb_.is_null()); 83 DCHECK(decode_cb_.is_null());
82 DCHECK(on_data_received_cb_.is_null()); 84 DCHECK(on_data_received_cb_.is_null());
83 DCHECK(ui_loop_->BelongsToCurrentThread()); 85 DCHECK(ui_loop_->BelongsToCurrentThread());
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 DVLOG(1) << __FUNCTION__ << "(" << preroll_timestamp.InSecondsF() << ")"; 129 DVLOG(1) << __FUNCTION__ << "(" << preroll_timestamp.InSecondsF() << ")";
128 DCHECK(ui_loop_->BelongsToCurrentThread()); 130 DCHECK(ui_loop_->BelongsToCurrentThread());
129 DCHECK(!is_decoding()); 131 DCHECK(!is_decoding());
130 132
131 preroll_timestamp_ = preroll_timestamp; 133 preroll_timestamp_ = preroll_timestamp;
132 prerolling_ = true; 134 prerolling_ = true;
133 } 135 }
134 136
135 void MediaDecoderJob::Release() { 137 void MediaDecoderJob::Release() {
136 DCHECK(ui_loop_->BelongsToCurrentThread()); 138 DCHECK(ui_loop_->BelongsToCurrentThread());
139 DVLOG(1) << __FUNCTION__;
137 140
138 // If the decoder job is not waiting for data, and is still decoding, we 141 // If the decoder job is not waiting for data, and is still decoding, we
139 // cannot delete the job immediately. 142 // cannot delete the job immediately.
140 destroy_pending_ = on_data_received_cb_.is_null() && is_decoding(); 143 destroy_pending_ = on_data_received_cb_.is_null() && is_decoding();
141 144
142 request_data_cb_.Reset(); 145 request_data_cb_.Reset();
143 on_data_received_cb_.Reset(); 146 on_data_received_cb_.Reset();
144 decode_cb_.Reset(); 147 decode_cb_.Reset();
145 148
146 if (destroy_pending_) 149 if (destroy_pending_) {
150 DVLOG(1) << __FUNCTION__ << " : delete is pending decode completion";
147 return; 151 return;
152 }
148 153
149 delete this; 154 delete this;
150 } 155 }
151 156
152 MediaCodecStatus MediaDecoderJob::QueueInputBuffer(const AccessUnit& unit) { 157 MediaCodecStatus MediaDecoderJob::QueueInputBuffer(const AccessUnit& unit) {
153 DVLOG(1) << __FUNCTION__; 158 DVLOG(1) << __FUNCTION__;
154 DCHECK(decoder_loop_->BelongsToCurrentThread()); 159 DCHECK(decoder_loop_->BelongsToCurrentThread());
155 TRACE_EVENT0("media", __FUNCTION__); 160 TRACE_EVENT0("media", __FUNCTION__);
156 161
157 int input_buf_index = input_buf_index_; 162 int input_buf_index = input_buf_index_;
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 callback, status, presentation_timestamp); 370 callback, status, presentation_timestamp);
366 ReleaseOutputBuffer(buffer_index, size, render_output, completion_callback); 371 ReleaseOutputBuffer(buffer_index, size, render_output, completion_callback);
367 } 372 }
368 373
369 void MediaDecoderJob::OnDecodeCompleted( 374 void MediaDecoderJob::OnDecodeCompleted(
370 MediaCodecStatus status, const base::TimeDelta& presentation_timestamp, 375 MediaCodecStatus status, const base::TimeDelta& presentation_timestamp,
371 size_t audio_output_bytes) { 376 size_t audio_output_bytes) {
372 DCHECK(ui_loop_->BelongsToCurrentThread()); 377 DCHECK(ui_loop_->BelongsToCurrentThread());
373 378
374 if (destroy_pending_) { 379 if (destroy_pending_) {
380 DVLOG(1) << __FUNCTION__ << " : completing pending deletion";
375 delete this; 381 delete this;
376 return; 382 return;
377 } 383 }
378 384
379 DCHECK(!decode_cb_.is_null()); 385 DCHECK(!decode_cb_.is_null());
380 386
381 // If output was queued for rendering, then we have completed prerolling. 387 // If output was queued for rendering, then we have completed prerolling.
382 if (presentation_timestamp != kNoTimestamp()) 388 if (presentation_timestamp != kNoTimestamp())
383 prerolling_ = false; 389 prerolling_ = false;
384 390
(...skipping 15 matching lines...) Expand all
400 // Do nothing. 406 // Do nothing.
401 break; 407 break;
402 }; 408 };
403 409
404 stop_decode_pending_ = false; 410 stop_decode_pending_ = false;
405 base::ResetAndReturn(&decode_cb_).Run(status, presentation_timestamp, 411 base::ResetAndReturn(&decode_cb_).Run(status, presentation_timestamp,
406 audio_output_bytes); 412 audio_output_bytes);
407 } 413 }
408 414
409 } // namespace media 415 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/base/android/media_source_player.h » ('j') | media/base/android/media_source_player.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698