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_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 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 CHECK(decode_cb_.is_null()) << "Overlapping decodes are not supported."; | 158 CHECK(decode_cb_.is_null()) << "Overlapping decodes are not supported."; |
159 decode_cb_ = BindToCurrentLoop(decode_cb); | 159 decode_cb_ = BindToCurrentLoop(decode_cb); |
160 | 160 |
161 if (state_ == kError) { | 161 if (state_ == kError) { |
162 base::ResetAndReturn(&decode_cb_).Run(kDecodeError, NULL); | 162 base::ResetAndReturn(&decode_cb_).Run(kDecodeError, NULL); |
163 return; | 163 return; |
164 } | 164 } |
165 | 165 |
166 // Return empty frames if decoding has finished. | 166 // Return empty frames if decoding has finished. |
167 if (state_ == kDecodeFinished) { | 167 if (state_ == kDecodeFinished) { |
168 base::ResetAndReturn(&decode_cb_).Run(kOk, VideoFrame::CreateEmptyFrame()); | 168 base::ResetAndReturn(&decode_cb_).Run(kOk, VideoFrame::CreateEOSFrame()); |
169 return; | 169 return; |
170 } | 170 } |
171 | 171 |
172 DecodeBuffer(buffer); | 172 DecodeBuffer(buffer); |
173 } | 173 } |
174 | 174 |
175 void FFmpegVideoDecoder::Reset(const base::Closure& closure) { | 175 void FFmpegVideoDecoder::Reset(const base::Closure& closure) { |
176 DCHECK(message_loop_->BelongsToCurrentThread()); | 176 DCHECK(message_loop_->BelongsToCurrentThread()); |
177 DCHECK(reset_cb_.is_null()); | 177 DCHECK(reset_cb_.is_null()); |
178 reset_cb_ = BindToCurrentLoop(closure); | 178 reset_cb_ = BindToCurrentLoop(closure); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 state_ = kError; | 264 state_ = kError; |
265 base::ResetAndReturn(&decode_cb_).Run(kDecodeError, NULL); | 265 base::ResetAndReturn(&decode_cb_).Run(kDecodeError, NULL); |
266 return; | 266 return; |
267 } | 267 } |
268 | 268 |
269 if (!video_frame.get()) { | 269 if (!video_frame.get()) { |
270 if (state_ == kFlushCodec) { | 270 if (state_ == kFlushCodec) { |
271 DCHECK(buffer->end_of_stream()); | 271 DCHECK(buffer->end_of_stream()); |
272 state_ = kDecodeFinished; | 272 state_ = kDecodeFinished; |
273 base::ResetAndReturn(&decode_cb_) | 273 base::ResetAndReturn(&decode_cb_) |
274 .Run(kOk, VideoFrame::CreateEmptyFrame()); | 274 .Run(kOk, VideoFrame::CreateEOSFrame()); |
275 return; | 275 return; |
276 } | 276 } |
277 | 277 |
278 base::ResetAndReturn(&decode_cb_).Run(kNotEnoughData, NULL); | 278 base::ResetAndReturn(&decode_cb_).Run(kNotEnoughData, NULL); |
279 return; | 279 return; |
280 } | 280 } |
281 | 281 |
282 base::ResetAndReturn(&decode_cb_).Run(kOk, video_frame); | 282 base::ResetAndReturn(&decode_cb_).Run(kOk, video_frame); |
283 } | 283 } |
284 | 284 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 if (!codec || avcodec_open2(codec_context_.get(), codec, NULL) < 0) { | 379 if (!codec || avcodec_open2(codec_context_.get(), codec, NULL) < 0) { |
380 ReleaseFFmpegResources(); | 380 ReleaseFFmpegResources(); |
381 return false; | 381 return false; |
382 } | 382 } |
383 | 383 |
384 av_frame_.reset(avcodec_alloc_frame()); | 384 av_frame_.reset(avcodec_alloc_frame()); |
385 return true; | 385 return true; |
386 } | 386 } |
387 | 387 |
388 } // namespace media | 388 } // namespace media |
OLD | NEW |