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

Side by Side Diff: media/gpu/dxva_video_decode_accelerator_win.cc

Issue 2065323002: Fix the frame freezing issue observed during a config change in the H.264 decoder on Windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git cl format Created 4 years, 6 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
« no previous file with comments | « media/gpu/dxva_video_decode_accelerator_win.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/gpu/dxva_video_decode_accelerator_win.h" 5 #include "media/gpu/dxva_video_decode_accelerator_win.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #if !defined(OS_WIN) 9 #if !defined(OS_WIN)
10 #error This file should only be built on Windows. 10 #error This file should only be built on Windows.
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 codec_(media::kUnknownVideoCodec), 585 codec_(media::kUnknownVideoCodec),
586 decoder_thread_("DXVAVideoDecoderThread"), 586 decoder_thread_("DXVAVideoDecoderThread"),
587 pending_flush_(false), 587 pending_flush_(false),
588 share_nv12_textures_(gpu_preferences.enable_zero_copy_dxgi_video), 588 share_nv12_textures_(gpu_preferences.enable_zero_copy_dxgi_video),
589 use_dx11_(false), 589 use_dx11_(false),
590 use_keyed_mutex_(false), 590 use_keyed_mutex_(false),
591 dx11_video_format_converter_media_type_needs_init_(true), 591 dx11_video_format_converter_media_type_needs_init_(true),
592 using_angle_device_(false), 592 using_angle_device_(false),
593 enable_accelerated_vpx_decode_( 593 enable_accelerated_vpx_decode_(
594 gpu_preferences.enable_accelerated_vpx_decode), 594 gpu_preferences.enable_accelerated_vpx_decode),
595 processing_config_changed_(false),
595 weak_this_factory_(this) { 596 weak_this_factory_(this) {
596 weak_ptr_ = weak_this_factory_.GetWeakPtr(); 597 weak_ptr_ = weak_this_factory_.GetWeakPtr();
597 memset(&input_stream_info_, 0, sizeof(input_stream_info_)); 598 memset(&input_stream_info_, 0, sizeof(input_stream_info_));
598 memset(&output_stream_info_, 0, sizeof(output_stream_info_)); 599 memset(&output_stream_info_, 0, sizeof(output_stream_info_));
599 } 600 }
600 601
601 DXVAVideoDecodeAccelerator::~DXVAVideoDecodeAccelerator() { 602 DXVAVideoDecodeAccelerator::~DXVAVideoDecodeAccelerator() {
602 client_ = NULL; 603 client_ = NULL;
603 } 604 }
604 605
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 PLATFORM_FAILURE, ); 921 PLATFORM_FAILURE, );
921 922
922 bool inserted = 923 bool inserted =
923 output_picture_buffers_ 924 output_picture_buffers_
924 .insert(std::make_pair(buffers[buffer_index].id(), picture_buffer)) 925 .insert(std::make_pair(buffers[buffer_index].id(), picture_buffer))
925 .second; 926 .second;
926 DCHECK(inserted); 927 DCHECK(inserted);
927 } 928 }
928 929
929 ProcessPendingSamples(); 930 ProcessPendingSamples();
930 if (pending_flush_) { 931 if (pending_flush_ || processing_config_changed_) {
931 decoder_thread_task_runner_->PostTask( 932 decoder_thread_task_runner_->PostTask(
932 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal, 933 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
933 base::Unretained(this))); 934 base::Unretained(this)));
934 } 935 }
935 } 936 }
936 937
937 void DXVAVideoDecodeAccelerator::ReusePictureBuffer(int32_t picture_buffer_id) { 938 void DXVAVideoDecodeAccelerator::ReusePictureBuffer(int32_t picture_buffer_id) {
938 TRACE_EVENT0("media", "DXVAVideoDecodeAccelerator::ReusePictureBuffer"); 939 TRACE_EVENT0("media", "DXVAVideoDecodeAccelerator::ReusePictureBuffer");
939 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); 940 DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
940 941
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1013 weak_this_factory_.GetWeakPtr(), 1014 weak_this_factory_.GetWeakPtr(),
1014 picture_buffer_id, count + 1), 1015 picture_buffer_id, count + 1),
1015 base::TimeDelta::FromMilliseconds(kFlushDecoderSurfaceTimeoutMs)); 1016 base::TimeDelta::FromMilliseconds(kFlushDecoderSurfaceTimeoutMs));
1016 return; 1017 return;
1017 } 1018 }
1018 RETURN_AND_NOTIFY_ON_FAILURE(picture_buffer->ReusePictureBuffer(), 1019 RETURN_AND_NOTIFY_ON_FAILURE(picture_buffer->ReusePictureBuffer(),
1019 "Failed to reuse picture buffer", 1020 "Failed to reuse picture buffer",
1020 PLATFORM_FAILURE, ); 1021 PLATFORM_FAILURE, );
1021 1022
1022 ProcessPendingSamples(); 1023 ProcessPendingSamples();
1023 if (pending_flush_) { 1024 if (pending_flush_ || processing_config_changed_) {
1024 decoder_thread_task_runner_->PostTask( 1025 decoder_thread_task_runner_->PostTask(
1025 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal, 1026 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
1026 base::Unretained(this))); 1027 base::Unretained(this)));
1027 } 1028 }
1028 } 1029 }
1029 1030
1030 void DXVAVideoDecodeAccelerator::Flush() { 1031 void DXVAVideoDecodeAccelerator::Flush() {
1031 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); 1032 DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
1032 1033
1033 DVLOG(1) << "DXVAVideoDecodeAccelerator::Flush"; 1034 DVLOG(1) << "DXVAVideoDecodeAccelerator::Flush";
1034 1035
1035 State state = GetState(); 1036 State state = GetState();
1036 RETURN_AND_NOTIFY_ON_FAILURE((state == kNormal || state == kStopped), 1037 RETURN_AND_NOTIFY_ON_FAILURE((state == kNormal || state == kStopped),
1037 "Unexpected decoder state: " << state, 1038 "Unexpected decoder state: " << state,
1038 ILLEGAL_STATE, ); 1039 ILLEGAL_STATE, );
1039 1040
1040 SetState(kFlushing); 1041 SetState(kFlushing);
1041 1042
1042 pending_flush_ = true; 1043 pending_flush_ = true;
1043 1044
1045 // If we receive a flush while processing a video stream config change, then
1046 // we treat this as a regular flush, i.e we process queued decode packets,
1047 // etc.
1048 // We are resetting the processing_config_changed_ flag here which means that
1049 // we won't be tearing down the decoder instance and recreating it to handle
1050 // the changed configuration. The expectation here is that after the decoder
1051 // is drained it should be able to handle a changed configuration.
1052 // TODO(ananta)
1053 // If a flush is sufficient to get the decoder to process video stream config
1054 // changes correctly, then we don't need to tear down the decoder instance
1055 // and recreate it. Check if this is indeed the case.
1056 processing_config_changed_ = false;
1057
1044 decoder_thread_task_runner_->PostTask( 1058 decoder_thread_task_runner_->PostTask(
1045 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal, 1059 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
1046 base::Unretained(this))); 1060 base::Unretained(this)));
1047 } 1061 }
1048 1062
1049 void DXVAVideoDecodeAccelerator::Reset() { 1063 void DXVAVideoDecodeAccelerator::Reset() {
1050 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); 1064 DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
1051 1065
1052 DVLOG(1) << "DXVAVideoDecodeAccelerator::Reset"; 1066 DVLOG(1) << "DXVAVideoDecodeAccelerator::Reset";
1053 1067
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
1841 d3d11_query_.Release(); 1855 d3d11_query_.Release();
1842 multi_threaded_.Release(); 1856 multi_threaded_.Release();
1843 dx11_video_format_converter_media_type_needs_init_ = true; 1857 dx11_video_format_converter_media_type_needs_init_ = true;
1844 } else { 1858 } else {
1845 d3d9_.Release(); 1859 d3d9_.Release();
1846 d3d9_device_ex_.Release(); 1860 d3d9_device_ex_.Release();
1847 device_manager_.Release(); 1861 device_manager_.Release();
1848 query_.Release(); 1862 query_.Release();
1849 } 1863 }
1850 } 1864 }
1851 1865 sent_drain_message_ = false;
1852 SetState(kUninitialized); 1866 SetState(kUninitialized);
1853 } 1867 }
1854 1868
1855 void DXVAVideoDecodeAccelerator::NotifyInputBufferRead(int input_buffer_id) { 1869 void DXVAVideoDecodeAccelerator::NotifyInputBufferRead(int input_buffer_id) {
1856 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); 1870 DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
1857 if (client_) 1871 if (client_)
1858 client_->NotifyEndOfBitstreamBuffer(input_buffer_id); 1872 client_->NotifyEndOfBitstreamBuffer(input_buffer_id);
1859 } 1873 }
1860 1874
1861 void DXVAVideoDecodeAccelerator::NotifyFlushDone() { 1875 void DXVAVideoDecodeAccelerator::NotifyFlushDone() {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1918 "Failed to get buffer id associated with sample", ); 1932 "Failed to get buffer id associated with sample", );
1919 client_->NotifyEndOfBitstreamBuffer(input_buffer_id); 1933 client_->NotifyEndOfBitstreamBuffer(input_buffer_id);
1920 } 1934 }
1921 pending_input_buffers_.clear(); 1935 pending_input_buffers_.clear();
1922 } 1936 }
1923 1937
1924 void DXVAVideoDecodeAccelerator::DecodePendingInputBuffers() { 1938 void DXVAVideoDecodeAccelerator::DecodePendingInputBuffers() {
1925 TRACE_EVENT0("media", 1939 TRACE_EVENT0("media",
1926 "DXVAVideoDecodeAccelerator::DecodePendingInputBuffers"); 1940 "DXVAVideoDecodeAccelerator::DecodePendingInputBuffers");
1927 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); 1941 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread());
1942 DCHECK(!processing_config_changed_);
1943
1928 State state = GetState(); 1944 State state = GetState();
1929 RETURN_AND_NOTIFY_ON_FAILURE((state != kUninitialized), 1945 RETURN_AND_NOTIFY_ON_FAILURE((state != kUninitialized),
1930 "Invalid state: " << state, ILLEGAL_STATE, ); 1946 "Invalid state: " << state, ILLEGAL_STATE, );
1931 1947
1932 if (pending_input_buffers_.empty() || OutputSamplesPresent()) 1948 if (pending_input_buffers_.empty() || OutputSamplesPresent())
1933 return; 1949 return;
1934 1950
1935 PendingInputs pending_input_buffers_copy; 1951 PendingInputs pending_input_buffers_copy;
1936 std::swap(pending_input_buffers_, pending_input_buffers_copy); 1952 std::swap(pending_input_buffers_, pending_input_buffers_copy);
1937 1953
1938 for (PendingInputs::iterator it = pending_input_buffers_copy.begin(); 1954 for (PendingInputs::iterator it = pending_input_buffers_copy.begin();
1939 it != pending_input_buffers_copy.end(); ++it) { 1955 it != pending_input_buffers_copy.end(); ++it) {
1940 DecodeInternal(*it); 1956 DecodeInternal(*it);
1941 } 1957 }
1942 } 1958 }
1943 1959
1944 void DXVAVideoDecodeAccelerator::FlushInternal() { 1960 void DXVAVideoDecodeAccelerator::FlushInternal() {
1945 TRACE_EVENT0("media", "DXVAVideoDecodeAccelerator::FlushInternal"); 1961 TRACE_EVENT0("media", "DXVAVideoDecodeAccelerator::FlushInternal");
1946 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); 1962 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread());
1947 1963
1948 // We allow only one output frame to be present at any given time. If we have 1964 // We allow only one output frame to be present at any given time. If we have
1949 // an output frame, then we cannot complete the flush at this time. 1965 // an output frame, then we cannot complete the flush at this time.
1950 if (OutputSamplesPresent()) 1966 if (OutputSamplesPresent())
1951 return; 1967 return;
1952 1968
1953 // First drain the pending input because once the drain message is sent below, 1969 // First drain the pending input because once the drain message is sent below,
1954 // the decoder will ignore further input until it's drained. 1970 // the decoder will ignore further input until it's drained.
1955 if (!pending_input_buffers_.empty()) { 1971 // If we are processing a video configuration change, then we should just
1972 // the drain the decoder.
1973 if (!processing_config_changed_ && !pending_input_buffers_.empty()) {
1956 decoder_thread_task_runner_->PostTask( 1974 decoder_thread_task_runner_->PostTask(
1957 FROM_HERE, 1975 FROM_HERE,
1958 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, 1976 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers,
1959 base::Unretained(this))); 1977 base::Unretained(this)));
1960 decoder_thread_task_runner_->PostTask( 1978 decoder_thread_task_runner_->PostTask(
1961 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal, 1979 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
1962 base::Unretained(this))); 1980 base::Unretained(this)));
1963 return; 1981 return;
1964 } 1982 }
1965 1983
1966 { 1984 {
1967 base::AutoLock lock(decoder_lock_); 1985 base::AutoLock lock(decoder_lock_);
1968 if (!sent_drain_message_) { 1986 if (!sent_drain_message_) {
1969 RETURN_AND_NOTIFY_ON_FAILURE(SendMFTMessage(MFT_MESSAGE_COMMAND_DRAIN, 0), 1987 RETURN_AND_NOTIFY_ON_FAILURE(SendMFTMessage(MFT_MESSAGE_COMMAND_DRAIN, 0),
1970 "Failed to send drain message", 1988 "Failed to send drain message",
1971 PLATFORM_FAILURE, ); 1989 PLATFORM_FAILURE, );
1972 sent_drain_message_ = true; 1990 sent_drain_message_ = true;
1973 } 1991 }
1974 } 1992 }
1975 1993
1976 // Attempt to retrieve an output frame from the decoder. If we have one, 1994 // Attempt to retrieve an output frame from the decoder. If we have one,
1977 // return and proceed when the output frame is processed. If we don't have a 1995 // return and proceed when the output frame is processed. If we don't have a
1978 // frame then we are done. 1996 // frame then we are done.
1979 DoDecode(); 1997 DoDecode();
1980 if (OutputSamplesPresent()) 1998 if (OutputSamplesPresent())
1981 return; 1999 return;
1982 2000
1983 SetState(kFlushing); 2001 if (!processing_config_changed_) {
2002 SetState(kFlushing);
1984 2003
1985 main_thread_task_runner_->PostTask( 2004 main_thread_task_runner_->PostTask(
1986 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::NotifyFlushDone, 2005 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::NotifyFlushDone,
1987 weak_this_factory_.GetWeakPtr())); 2006 weak_this_factory_.GetWeakPtr()));
2007 } else {
2008 processing_config_changed_ = false;
2009 main_thread_task_runner_->PostTask(
2010 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::ConfigChanged,
2011 weak_this_factory_.GetWeakPtr(), config_));
2012 }
1988 2013
1989 SetState(kNormal); 2014 SetState(kNormal);
1990 } 2015 }
1991 2016
1992 void DXVAVideoDecodeAccelerator::DecodeInternal( 2017 void DXVAVideoDecodeAccelerator::DecodeInternal(
1993 const base::win::ScopedComPtr<IMFSample>& sample) { 2018 const base::win::ScopedComPtr<IMFSample>& sample) {
1994 TRACE_EVENT0("media", "DXVAVideoDecodeAccelerator::DecodeInternal"); 2019 TRACE_EVENT0("media", "DXVAVideoDecodeAccelerator::DecodeInternal");
1995 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); 2020 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread());
1996 2021
1997 if (GetState() == kUninitialized) 2022 if (GetState() == kUninitialized)
1998 return; 2023 return;
1999 2024
2000 if (OutputSamplesPresent() || !pending_input_buffers_.empty()) { 2025 if (OutputSamplesPresent() || !pending_input_buffers_.empty()) {
2001 pending_input_buffers_.push_back(sample); 2026 pending_input_buffers_.push_back(sample);
2002 return; 2027 return;
2003 } 2028 }
2004 2029
2005 // Check if the resolution, bit rate, etc changed in the stream. If yes we 2030 // Check if the resolution, bit rate, etc changed in the stream. If yes we
2006 // reinitialize the decoder to ensure that the stream decodes correctly. 2031 // reinitialize the decoder to ensure that the stream decodes correctly.
2007 bool config_changed = false; 2032 bool config_changed = false;
2008 2033
2009 HRESULT hr = CheckConfigChanged(sample.get(), &config_changed); 2034 HRESULT hr = CheckConfigChanged(sample.get(), &config_changed);
2010 RETURN_AND_NOTIFY_ON_HR_FAILURE(hr, "Failed to check video stream config", 2035 RETURN_AND_NOTIFY_ON_HR_FAILURE(hr, "Failed to check video stream config",
2011 PLATFORM_FAILURE, ); 2036 PLATFORM_FAILURE, );
2012 2037
2038 processing_config_changed_ = config_changed;
2039
2013 if (config_changed) { 2040 if (config_changed) {
2014 pending_input_buffers_.push_back(sample); 2041 pending_input_buffers_.push_back(sample);
2015 main_thread_task_runner_->PostTask( 2042 FlushInternal();
2016 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::ConfigChanged,
2017 weak_this_factory_.GetWeakPtr(), config_));
2018 return; 2043 return;
2019 } 2044 }
2020 2045
2021 if (!inputs_before_decode_) { 2046 if (!inputs_before_decode_) {
2022 TRACE_EVENT_ASYNC_BEGIN0("gpu", "DXVAVideoDecodeAccelerator.Decoding", 2047 TRACE_EVENT_ASYNC_BEGIN0("gpu", "DXVAVideoDecodeAccelerator.Decoding",
2023 this); 2048 this);
2024 } 2049 }
2025 inputs_before_decode_++; 2050 inputs_before_decode_++;
2026 2051
2027 hr = decoder_->ProcessInput(0, sample.get(), 0); 2052 hr = decoder_->ProcessInput(0, sample.get(), 0);
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
2249 PLATFORM_FAILURE, ); 2274 PLATFORM_FAILURE, );
2250 2275
2251 NotifyPictureReady(picture_buffer->id(), input_buffer_id); 2276 NotifyPictureReady(picture_buffer->id(), input_buffer_id);
2252 2277
2253 { 2278 {
2254 base::AutoLock lock(decoder_lock_); 2279 base::AutoLock lock(decoder_lock_);
2255 if (!pending_output_samples_.empty()) 2280 if (!pending_output_samples_.empty())
2256 pending_output_samples_.pop_front(); 2281 pending_output_samples_.pop_front();
2257 } 2282 }
2258 2283
2259 if (pending_flush_) { 2284 if (pending_flush_ || processing_config_changed_) {
2260 decoder_thread_task_runner_->PostTask( 2285 decoder_thread_task_runner_->PostTask(
2261 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal, 2286 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
2262 base::Unretained(this))); 2287 base::Unretained(this)));
2263 return; 2288 return;
2264 } 2289 }
2265 decoder_thread_task_runner_->PostTask( 2290 decoder_thread_task_runner_->PostTask(
2266 FROM_HERE, 2291 FROM_HERE,
2267 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, 2292 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers,
2268 base::Unretained(this))); 2293 base::Unretained(this)));
2269 } 2294 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2301 PLATFORM_FAILURE, ); 2326 PLATFORM_FAILURE, );
2302 2327
2303 NotifyPictureReady(picture_buffer->id(), input_buffer_id); 2328 NotifyPictureReady(picture_buffer->id(), input_buffer_id);
2304 2329
2305 { 2330 {
2306 base::AutoLock lock(decoder_lock_); 2331 base::AutoLock lock(decoder_lock_);
2307 if (!pending_output_samples_.empty()) 2332 if (!pending_output_samples_.empty())
2308 pending_output_samples_.pop_front(); 2333 pending_output_samples_.pop_front();
2309 } 2334 }
2310 2335
2311 if (pending_flush_) { 2336 if (pending_flush_ || processing_config_changed_) {
2312 decoder_thread_task_runner_->PostTask( 2337 decoder_thread_task_runner_->PostTask(
2313 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal, 2338 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
2314 base::Unretained(this))); 2339 base::Unretained(this)));
2315 return; 2340 return;
2316 } 2341 }
2317 decoder_thread_task_runner_->PostTask( 2342 decoder_thread_task_runner_->PostTask(
2318 FROM_HERE, 2343 FROM_HERE,
2319 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, 2344 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers,
2320 base::Unretained(this))); 2345 base::Unretained(this)));
2321 } 2346 }
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
2658 SetState(kConfigChange); 2683 SetState(kConfigChange);
2659 Invalidate(); 2684 Invalidate();
2660 Initialize(config_, client_); 2685 Initialize(config_, client_);
2661 decoder_thread_task_runner_->PostTask( 2686 decoder_thread_task_runner_->PostTask(
2662 FROM_HERE, 2687 FROM_HERE,
2663 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, 2688 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers,
2664 base::Unretained(this))); 2689 base::Unretained(this)));
2665 } 2690 }
2666 2691
2667 } // namespace media 2692 } // namespace media
OLDNEW
« no previous file with comments | « media/gpu/dxva_video_decode_accelerator_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698