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

Side by Side Diff: media/video/ffmpeg_video_decode_engine.cc

Issue 8341033: Remove DemuxerStream::GetAVStream() once and for all. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: now with cmath Created 9 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 (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/video/ffmpeg_video_decode_engine.h" 5 #include "media/video/ffmpeg_video_decode_engine.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/string_number_conversions.h" 8 #include "base/string_number_conversions.h"
9 #include "base/task.h" 9 #include "base/task.h"
10 #include "media/base/buffers.h" 10 #include "media/base/buffers.h"
(...skipping 23 matching lines...) Expand all
34 avcodec_close(codec_context_); 34 avcodec_close(codec_context_);
35 av_free(codec_context_); 35 av_free(codec_context_);
36 } 36 }
37 } 37 }
38 38
39 void FFmpegVideoDecodeEngine::Initialize( 39 void FFmpegVideoDecodeEngine::Initialize(
40 MessageLoop* message_loop, 40 MessageLoop* message_loop,
41 VideoDecodeEngine::EventHandler* event_handler, 41 VideoDecodeEngine::EventHandler* event_handler,
42 VideoDecodeContext* context, 42 VideoDecodeContext* context,
43 const VideoDecoderConfig& config) { 43 const VideoDecoderConfig& config) {
44 frame_rate_numerator_ = config.frame_rate_numerator();
45 frame_rate_denominator_ = config.frame_rate_denominator();
46
44 // Always try to use three threads for video decoding. There is little reason 47 // Always try to use three threads for video decoding. There is little reason
45 // not to since current day CPUs tend to be multi-core and we measured 48 // not to since current day CPUs tend to be multi-core and we measured
46 // performance benefits on older machines such as P4s with hyperthreading. 49 // performance benefits on older machines such as P4s with hyperthreading.
47 // 50 //
48 // Handling decoding on separate threads also frees up the pipeline thread to 51 // Handling decoding on separate threads also frees up the pipeline thread to
49 // continue processing. Although it'd be nice to have the option of a single 52 // continue processing. Although it'd be nice to have the option of a single
50 // decoding thread, FFmpeg treats having one thread the same as having zero 53 // decoding thread, FFmpeg treats having one thread the same as having zero
51 // threads (i.e., avcodec_decode_video() will execute on the calling thread). 54 // threads (i.e., avcodec_decode_video() will execute on the calling thread).
52 // Yet another reason for having two threads :) 55 // Yet another reason for having two threads :)
53 static const int kDecodeThreads = 2; 56 static const int kDecodeThreads = 2;
54 static const int kMaxDecodeThreads = 16; 57 static const int kMaxDecodeThreads = 16;
55 58
56 // Initialize AVCodecContext structure. 59 // Initialize AVCodecContext structure.
57 codec_context_ = avcodec_alloc_context(); 60 codec_context_ = avcodec_alloc_context();
58 codec_context_->pix_fmt = VideoFormatToPixelFormat(config.format()); 61 VideoDecoderConfigToAVCodecContext(config, codec_context_);
59 codec_context_->codec_type = AVMEDIA_TYPE_VIDEO;
60 codec_context_->codec_id = VideoCodecToCodecID(config.codec());
61 codec_context_->coded_width = config.coded_size().width();
62 codec_context_->coded_height = config.coded_size().height();
63
64 frame_rate_numerator_ = config.frame_rate_numerator();
65 frame_rate_denominator_ = config.frame_rate_denominator();
66
67 if (config.extra_data() != NULL) {
68 codec_context_->extradata_size = config.extra_data_size();
69 codec_context_->extradata = reinterpret_cast<uint8_t*>(
70 av_malloc(config.extra_data_size() + FF_INPUT_BUFFER_PADDING_SIZE));
71 memcpy(codec_context_->extradata, config.extra_data(),
72 config.extra_data_size());
73 memset(codec_context_->extradata + config.extra_data_size(), '\0',
74 FF_INPUT_BUFFER_PADDING_SIZE);
75 }
76 62
77 // Enable motion vector search (potentially slow), strong deblocking filter 63 // Enable motion vector search (potentially slow), strong deblocking filter
78 // for damaged macroblocks, and set our error detection sensitivity. 64 // for damaged macroblocks, and set our error detection sensitivity.
79 codec_context_->error_concealment = FF_EC_GUESS_MVS | FF_EC_DEBLOCK; 65 codec_context_->error_concealment = FF_EC_GUESS_MVS | FF_EC_DEBLOCK;
80 codec_context_->error_recognition = FF_ER_CAREFUL; 66 codec_context_->error_recognition = FF_ER_CAREFUL;
81 67
82 AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); 68 AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id);
83 69
84 // TODO(fbarchard): Improve thread logic based on size / codec. 70 // TODO(fbarchard): Improve thread logic based on size / codec.
85 // TODO(fbarchard): Fix bug affecting video-cookie.html 71 // TODO(fbarchard): Fix bug affecting video-cookie.html
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 DCHECK_EQ(output_eos_reached_, false); 288 DCHECK_EQ(output_eos_reached_, false);
303 pending_input_buffers_++; 289 pending_input_buffers_++;
304 event_handler_->ProduceVideoSample(NULL); 290 event_handler_->ProduceVideoSample(NULL);
305 } 291 }
306 292
307 } // namespace media 293 } // namespace media
308 294
309 // Disable refcounting for this object because this object only lives 295 // Disable refcounting for this object because this object only lives
310 // on the video decoder thread and there's no need to refcount it. 296 // on the video decoder thread and there's no need to refcount it.
311 DISABLE_RUNNABLE_METHOD_REFCOUNT(media::FFmpegVideoDecodeEngine); 297 DISABLE_RUNNABLE_METHOD_REFCOUNT(media::FFmpegVideoDecodeEngine);
OLDNEW
« no previous file with comments | « media/filters/ffmpeg_video_decoder_unittest.cc ('k') | media/video/ffmpeg_video_decode_engine_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698