| 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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 | 149 |
| 150 if (!stream) { | 150 if (!stream) { |
| 151 status_cb.Run(PIPELINE_ERROR_DECODE); | 151 status_cb.Run(PIPELINE_ERROR_DECODE); |
| 152 return; | 152 return; |
| 153 } | 153 } |
| 154 | 154 |
| 155 demuxer_stream_ = stream; | 155 demuxer_stream_ = stream; |
| 156 statistics_cb_ = statistics_cb; | 156 statistics_cb_ = statistics_cb; |
| 157 | 157 |
| 158 if (!ConfigureDecoder()) { | 158 if (!ConfigureDecoder()) { |
| 159 status_cb.Run(PIPELINE_ERROR_DECODE); | 159 status_cb.Run(DECODER_ERROR_NOT_SUPPORTED); |
| 160 return; | 160 return; |
| 161 } | 161 } |
| 162 | 162 |
| 163 // Success! | 163 // Success! |
| 164 state_ = kNormal; | 164 state_ = kNormal; |
| 165 status_cb.Run(PIPELINE_OK); | 165 status_cb.Run(PIPELINE_OK); |
| 166 } | 166 } |
| 167 | 167 |
| 168 void FFmpegVideoDecoder::Read(const ReadCB& read_cb) { | 168 void FFmpegVideoDecoder::Read(const ReadCB& read_cb) { |
| 169 // Complete operation asynchronously on different stack of execution as per | 169 // Complete operation asynchronously on different stack of execution as per |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 } | 495 } |
| 496 | 496 |
| 497 bool FFmpegVideoDecoder::ConfigureDecoder() { | 497 bool FFmpegVideoDecoder::ConfigureDecoder() { |
| 498 const VideoDecoderConfig& config = demuxer_stream_->video_decoder_config(); | 498 const VideoDecoderConfig& config = demuxer_stream_->video_decoder_config(); |
| 499 | 499 |
| 500 if (!config.IsValidConfig()) { | 500 if (!config.IsValidConfig()) { |
| 501 DLOG(ERROR) << "Invalid video stream - " << config.AsHumanReadableString(); | 501 DLOG(ERROR) << "Invalid video stream - " << config.AsHumanReadableString(); |
| 502 return false; | 502 return false; |
| 503 } | 503 } |
| 504 | 504 |
| 505 if (config.is_encrypted() && !decryptor_) { |
| 506 DLOG(ERROR) << "Encrypted video stream not supported."; |
| 507 return false; |
| 508 } |
| 509 |
| 505 // Release existing decoder resources if necessary. | 510 // Release existing decoder resources if necessary. |
| 506 ReleaseFFmpegResources(); | 511 ReleaseFFmpegResources(); |
| 507 | 512 |
| 508 // Initialize AVCodecContext structure. | 513 // Initialize AVCodecContext structure. |
| 509 codec_context_ = avcodec_alloc_context3(NULL); | 514 codec_context_ = avcodec_alloc_context3(NULL); |
| 510 VideoDecoderConfigToAVCodecContext(config, codec_context_); | 515 VideoDecoderConfigToAVCodecContext(config, codec_context_); |
| 511 | 516 |
| 512 // Enable motion vector search (potentially slow), strong deblocking filter | 517 // Enable motion vector search (potentially slow), strong deblocking filter |
| 513 // for damaged macroblocks, and set our error detection sensitivity. | 518 // for damaged macroblocks, and set our error detection sensitivity. |
| 514 codec_context_->error_concealment = FF_EC_GUESS_MVS | FF_EC_DEBLOCK; | 519 codec_context_->error_concealment = FF_EC_GUESS_MVS | FF_EC_DEBLOCK; |
| 515 codec_context_->err_recognition = AV_EF_CAREFUL; | 520 codec_context_->err_recognition = AV_EF_CAREFUL; |
| 516 codec_context_->thread_count = GetThreadCount(codec_context_->codec_id); | 521 codec_context_->thread_count = GetThreadCount(codec_context_->codec_id); |
| 517 codec_context_->opaque = this; | 522 codec_context_->opaque = this; |
| 518 codec_context_->flags |= CODEC_FLAG_EMU_EDGE; | 523 codec_context_->flags |= CODEC_FLAG_EMU_EDGE; |
| 519 codec_context_->get_buffer = GetVideoBufferImpl; | 524 codec_context_->get_buffer = GetVideoBufferImpl; |
| 520 codec_context_->release_buffer = ReleaseVideoBufferImpl; | 525 codec_context_->release_buffer = ReleaseVideoBufferImpl; |
| 521 | 526 |
| 522 AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); | 527 AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); |
| 523 if (!codec || avcodec_open2(codec_context_, codec, NULL) < 0) { | 528 if (!codec || avcodec_open2(codec_context_, codec, NULL) < 0) { |
| 524 ReleaseFFmpegResources(); | 529 ReleaseFFmpegResources(); |
| 525 return false; | 530 return false; |
| 526 } | 531 } |
| 527 | 532 |
| 528 av_frame_ = avcodec_alloc_frame(); | 533 av_frame_ = avcodec_alloc_frame(); |
| 529 return true; | 534 return true; |
| 530 } | 535 } |
| 531 | 536 |
| 532 } // namespace media | 537 } // namespace media |
| OLD | NEW |