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/vpx_video_decoder.h" | 5 #include "media/filters/vpx_video_decoder.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 LOG(ERROR) << "vpx_codec_dec_init failed, status=" << status; | 252 LOG(ERROR) << "vpx_codec_dec_init failed, status=" << status; |
253 delete context; | 253 delete context; |
254 return NULL; | 254 return NULL; |
255 } | 255 } |
256 return context; | 256 return context; |
257 } | 257 } |
258 | 258 |
259 bool VpxVideoDecoder::ConfigureDecoder(const VideoDecoderConfig& config) { | 259 bool VpxVideoDecoder::ConfigureDecoder(const VideoDecoderConfig& config) { |
260 if (config.codec() != kCodecVP8 && config.codec() != kCodecVP9) | 260 if (config.codec() != kCodecVP8 && config.codec() != kCodecVP9) |
261 return false; | 261 return false; |
262 // Only VP8 videos with alpha are handled by VpxVideoDecoder. Everything else | 262 |
263 // goes to FFmpegVideoDecoder. | 263 // In VP8 videos, only those with alpha are handled by VpxVideoDecoder. All |
| 264 // other VP8 videos go to FFmpegVideoDecoder. |
264 if (config.codec() == kCodecVP8 && config.format() != VideoFrame::YV12A) | 265 if (config.codec() == kCodecVP8 && config.format() != VideoFrame::YV12A) |
265 return false; | 266 return false; |
266 | 267 |
267 CloseDecoder(); | 268 CloseDecoder(); |
268 | 269 |
269 vpx_codec_ = InitializeVpxContext(vpx_codec_, config); | 270 vpx_codec_ = InitializeVpxContext(vpx_codec_, config); |
270 if (!vpx_codec_) | 271 if (!vpx_codec_) |
271 return false; | 272 return false; |
272 | 273 |
273 // We use our own buffers for VP9 so that there is no need to copy data after | 274 // We use our own buffers for VP9 so that there is no need to copy data after |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 DCHECK(task_runner_->BelongsToCurrentThread()); | 348 DCHECK(task_runner_->BelongsToCurrentThread()); |
348 DCHECK_NE(state_, kUninitialized); | 349 DCHECK_NE(state_, kUninitialized); |
349 DCHECK_NE(state_, kDecodeFinished); | 350 DCHECK_NE(state_, kDecodeFinished); |
350 DCHECK_NE(state_, kError); | 351 DCHECK_NE(state_, kError); |
351 DCHECK(!decode_cb_.is_null()); | 352 DCHECK(!decode_cb_.is_null()); |
352 DCHECK(buffer); | 353 DCHECK(buffer); |
353 | 354 |
354 // Transition to kDecodeFinished on the first end of stream buffer. | 355 // Transition to kDecodeFinished on the first end of stream buffer. |
355 if (state_ == kNormal && buffer->end_of_stream()) { | 356 if (state_ == kNormal && buffer->end_of_stream()) { |
356 state_ = kDecodeFinished; | 357 state_ = kDecodeFinished; |
357 output_cb_.Run(VideoFrame::CreateEOSFrame()); | |
358 base::ResetAndReturn(&decode_cb_).Run(kOk); | 358 base::ResetAndReturn(&decode_cb_).Run(kOk); |
359 return; | 359 return; |
360 } | 360 } |
361 | 361 |
362 scoped_refptr<VideoFrame> video_frame; | 362 scoped_refptr<VideoFrame> video_frame; |
363 if (!VpxDecode(buffer, &video_frame)) { | 363 if (!VpxDecode(buffer, &video_frame)) { |
364 state_ = kError; | 364 state_ = kError; |
365 base::ResetAndReturn(&decode_cb_).Run(kDecodeError); | 365 base::ResetAndReturn(&decode_cb_).Run(kDecodeError); |
366 return; | 366 return; |
367 } | 367 } |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 vpx_image->stride[VPX_PLANE_Y], vpx_image->d_h, video_frame->get()); | 507 vpx_image->stride[VPX_PLANE_Y], vpx_image->d_h, video_frame->get()); |
508 return; | 508 return; |
509 } | 509 } |
510 CopyAPlane(vpx_image_alpha->planes[VPX_PLANE_Y], | 510 CopyAPlane(vpx_image_alpha->planes[VPX_PLANE_Y], |
511 vpx_image->stride[VPX_PLANE_Y], | 511 vpx_image->stride[VPX_PLANE_Y], |
512 vpx_image->d_h, | 512 vpx_image->d_h, |
513 video_frame->get()); | 513 video_frame->get()); |
514 } | 514 } |
515 | 515 |
516 } // namespace media | 516 } // namespace media |
OLD | NEW |