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

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

Issue 11745012: Handle config change during pending reset correctly in FFmpegVideoDecoder. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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/ffmpeg_video_decoder.h" 5 #include "media/filters/ffmpeg_video_decoder.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 const scoped_refptr<DecoderBuffer>& buffer) { 226 const scoped_refptr<DecoderBuffer>& buffer) {
227 DCHECK(message_loop_->BelongsToCurrentThread()); 227 DCHECK(message_loop_->BelongsToCurrentThread());
228 DCHECK_NE(state_, kDecodeFinished); 228 DCHECK_NE(state_, kDecodeFinished);
229 DCHECK_EQ(status != DemuxerStream::kOk, !buffer) << status; 229 DCHECK_EQ(status != DemuxerStream::kOk, !buffer) << status;
230 230
231 if (state_ == kUninitialized) 231 if (state_ == kUninitialized)
232 return; 232 return;
233 233
234 DCHECK(!read_cb_.is_null()); 234 DCHECK(!read_cb_.is_null());
235 235
236 if (status == DemuxerStream::kConfigChanged) {
237 if (!ConfigureDecoder()) {
238 base::ResetAndReturn(&read_cb_).Run(kDecodeError, NULL);
239 state_ = kDecodeFinished;
acolwell GONE FROM CHROMIUM 2013/01/03 17:53:31 Why is this needed now? The Read() shouldn't be ca
xhwang 2013/01/04 01:28:05 This transition follows the comment on line 298. I
240 if (!reset_cb_.is_null())
241 base::ResetAndReturn(&reset_cb_).Run();
242 return;
243 }
244
245 if (!reset_cb_.is_null()) {
acolwell GONE FROM CHROMIUM 2013/01/03 17:53:31 nit: If you flip the condition here you can reuse
xhwang 2013/01/04 01:28:05 Done.
246 base::ResetAndReturn(&read_cb_).Run(kOk, NULL);
247 DoReset();
248 return;
249 }
250
251 ReadFromDemuxerStream();
252 return;
253 }
254
236 if (!reset_cb_.is_null()) { 255 if (!reset_cb_.is_null()) {
237 base::ResetAndReturn(&read_cb_).Run(kOk, NULL); 256 base::ResetAndReturn(&read_cb_).Run(kOk, NULL);
238 DoReset(); 257 DoReset();
239 return; 258 return;
240 } 259 }
241 260
242 if (status == DemuxerStream::kAborted) { 261 if (status == DemuxerStream::kAborted) {
243 base::ResetAndReturn(&read_cb_).Run(kOk, NULL); 262 base::ResetAndReturn(&read_cb_).Run(kOk, NULL);
244 return; 263 return;
245 } 264 }
246 265
247 if (status == DemuxerStream::kConfigChanged) {
248 if (!ConfigureDecoder()) {
249 base::ResetAndReturn(&read_cb_).Run(kDecodeError, NULL);
250 return;
251 }
252
253 ReadFromDemuxerStream();
254 return;
255 }
256
257 DCHECK_EQ(status, DemuxerStream::kOk); 266 DCHECK_EQ(status, DemuxerStream::kOk);
258 DecodeBuffer(buffer); 267 DecodeBuffer(buffer);
259 } 268 }
260 269
261 void FFmpegVideoDecoder::DecodeBuffer( 270 void FFmpegVideoDecoder::DecodeBuffer(
262 const scoped_refptr<DecoderBuffer>& buffer) { 271 const scoped_refptr<DecoderBuffer>& buffer) {
263 DCHECK(message_loop_->BelongsToCurrentThread()); 272 DCHECK(message_loop_->BelongsToCurrentThread());
264 DCHECK_NE(state_, kUninitialized); 273 DCHECK_NE(state_, kUninitialized);
265 DCHECK_NE(state_, kDecodeFinished); 274 DCHECK_NE(state_, kDecodeFinished);
266 DCHECK(reset_cb_.is_null()); 275 DCHECK(reset_cb_.is_null());
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 if (!codec || avcodec_open2(codec_context_, codec, NULL) < 0) { 451 if (!codec || avcodec_open2(codec_context_, codec, NULL) < 0) {
443 ReleaseFFmpegResources(); 452 ReleaseFFmpegResources();
444 return false; 453 return false;
445 } 454 }
446 455
447 av_frame_ = avcodec_alloc_frame(); 456 av_frame_ = avcodec_alloc_frame();
448 return true; 457 return true;
449 } 458 }
450 459
451 } // namespace media 460 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/filters/ffmpeg_video_decoder_unittest.cc » ('j') | media/filters/ffmpeg_video_decoder_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698