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

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

Issue 2746013006: use VideoColorSpace in decoder configuration (Closed)
Patch Set: win fixes Created 3 years, 9 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
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 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 config_changed_ = true; 444 config_changed_ = true;
445 } else { 445 } else {
446 pending_config_changed_ = true; 446 pending_config_changed_ = true;
447 } 447 }
448 } 448 }
449 last_pps_.swap(pps); 449 last_pps_.swap(pps);
450 } 450 }
451 return true; 451 return true;
452 } 452 }
453 453
454 gfx::ColorSpace H264ConfigChangeDetector::current_color_space() const { 454 VideoColorSpace H264ConfigChangeDetector::current_color_space() const {
455 if (!parser_) 455 if (!parser_)
456 return gfx::ColorSpace(); 456 return VideoColorSpace();
457 // TODO(hubbe): Is using last_sps_id_ correct here? 457 // TODO(hubbe): Is using last_sps_id_ correct here?
458 const H264SPS* sps = parser_->GetSPS(last_sps_id_); 458 const H264SPS* sps = parser_->GetSPS(last_sps_id_);
459 if (sps) 459 if (sps)
460 return sps->GetColorSpace(); 460 return sps->GetColorSpace();
461 return gfx::ColorSpace(); 461 return VideoColorSpace();
462 } 462 }
463 463
464 DXVAVideoDecodeAccelerator::PendingSampleInfo::PendingSampleInfo( 464 DXVAVideoDecodeAccelerator::PendingSampleInfo::PendingSampleInfo(
465 int32_t buffer_id, 465 int32_t buffer_id,
466 base::win::ScopedComPtr<IMFSample> sample, 466 base::win::ScopedComPtr<IMFSample> sample,
467 const gfx::ColorSpace& color_space) 467 const gfx::ColorSpace& color_space)
468 : input_buffer_id(buffer_id), 468 : input_buffer_id(buffer_id),
469 picture_buffer_id(-1), 469 picture_buffer_id(-1),
470 color_space(color_space), 470 color_space(color_space),
471 output_sample(sample) {} 471 output_sample(sample) {}
(...skipping 1694 matching lines...) Expand 10 before | Expand all | Expand 10 after
2166 RETURN_AND_NOTIFY_ON_FAILURE(SendMFTMessage(MFT_MESSAGE_COMMAND_DRAIN, 0), 2166 RETURN_AND_NOTIFY_ON_FAILURE(SendMFTMessage(MFT_MESSAGE_COMMAND_DRAIN, 0),
2167 "Failed to send drain message", 2167 "Failed to send drain message",
2168 PLATFORM_FAILURE, ); 2168 PLATFORM_FAILURE, );
2169 sent_drain_message_ = true; 2169 sent_drain_message_ = true;
2170 } 2170 }
2171 } 2171 }
2172 2172
2173 // Attempt to retrieve an output frame from the decoder. If we have one, 2173 // Attempt to retrieve an output frame from the decoder. If we have one,
2174 // return and proceed when the output frame is processed. If we don't have a 2174 // return and proceed when the output frame is processed. If we don't have a
2175 // frame then we are done. 2175 // frame then we are done.
2176 gfx::ColorSpace color_space = config_change_detector_->current_color_space(); 2176 VideoColorSpace color_space = config_change_detector_->current_color_space();
2177 if (!color_space.IsValid()) 2177 if (color_space == VideoColorSpace())
2178 color_space = config_.color_space; 2178 color_space = config_.color_space;
2179 DoDecode(color_space); 2179 DoDecode(color_space.ToGfxColorSpace());
2180 if (OutputSamplesPresent()) 2180 if (OutputSamplesPresent())
2181 return; 2181 return;
2182 2182
2183 if (!processing_config_changed_) { 2183 if (!processing_config_changed_) {
2184 SetState(kFlushing); 2184 SetState(kFlushing);
2185 2185
2186 main_thread_task_runner_->PostTask( 2186 main_thread_task_runner_->PostTask(
2187 FROM_HERE, 2187 FROM_HERE,
2188 base::Bind(&DXVAVideoDecodeAccelerator::NotifyFlushDone, weak_ptr_)); 2188 base::Bind(&DXVAVideoDecodeAccelerator::NotifyFlushDone, weak_ptr_));
2189 } else { 2189 } else {
(...skipping 28 matching lines...) Expand all
2218 PLATFORM_FAILURE, ); 2218 PLATFORM_FAILURE, );
2219 2219
2220 processing_config_changed_ = config_changed; 2220 processing_config_changed_ = config_changed;
2221 2221
2222 if (config_changed) { 2222 if (config_changed) {
2223 pending_input_buffers_.push_back(sample); 2223 pending_input_buffers_.push_back(sample);
2224 FlushInternal(); 2224 FlushInternal();
2225 return; 2225 return;
2226 } 2226 }
2227 2227
2228 gfx::ColorSpace color_space = config_change_detector_->current_color_space(); 2228 VideoColorSpace color_space = config_change_detector_->current_color_space();
2229 if (!color_space.IsValid()) 2229 if (color_space == VideoColorSpace())
2230 color_space = config_.color_space; 2230 color_space = config_.color_space;
2231 2231
2232 if (!inputs_before_decode_) { 2232 if (!inputs_before_decode_) {
2233 TRACE_EVENT_ASYNC_BEGIN0("gpu", "DXVAVideoDecodeAccelerator.Decoding", 2233 TRACE_EVENT_ASYNC_BEGIN0("gpu", "DXVAVideoDecodeAccelerator.Decoding",
2234 this); 2234 this);
2235 } 2235 }
2236 inputs_before_decode_++; 2236 inputs_before_decode_++;
2237 { 2237 {
2238 ScopedExceptionCatcher catcher(using_ms_vp9_mft_); 2238 ScopedExceptionCatcher catcher(using_ms_vp9_mft_);
2239 hr = decoder_->ProcessInput(0, sample.get(), 0); 2239 hr = decoder_->ProcessInput(0, sample.get(), 0);
2240 } 2240 }
2241 // As per msdn if the decoder returns MF_E_NOTACCEPTING then it means that it 2241 // As per msdn if the decoder returns MF_E_NOTACCEPTING then it means that it
2242 // has enough data to produce one or more output samples. In this case the 2242 // has enough data to produce one or more output samples. In this case the
2243 // recommended options are to 2243 // recommended options are to
2244 // 1. Generate new output by calling IMFTransform::ProcessOutput until it 2244 // 1. Generate new output by calling IMFTransform::ProcessOutput until it
2245 // returns MF_E_TRANSFORM_NEED_MORE_INPUT. 2245 // returns MF_E_TRANSFORM_NEED_MORE_INPUT.
2246 // 2. Flush the input data 2246 // 2. Flush the input data
2247 // We implement the first option, i.e to retrieve the output sample and then 2247 // We implement the first option, i.e to retrieve the output sample and then
2248 // process the input again. Failure in either of these steps is treated as a 2248 // process the input again. Failure in either of these steps is treated as a
2249 // decoder failure. 2249 // decoder failure.
2250 if (hr == MF_E_NOTACCEPTING) { 2250 if (hr == MF_E_NOTACCEPTING) {
2251 DoDecode(color_space); 2251 DoDecode(color_space.ToGfxColorSpace());
2252 // If the DoDecode call resulted in an output frame then we should not 2252 // If the DoDecode call resulted in an output frame then we should not
2253 // process any more input until that frame is copied to the target surface. 2253 // process any more input until that frame is copied to the target surface.
2254 if (!OutputSamplesPresent()) { 2254 if (!OutputSamplesPresent()) {
2255 State state = GetState(); 2255 State state = GetState();
2256 RETURN_AND_NOTIFY_ON_FAILURE( 2256 RETURN_AND_NOTIFY_ON_FAILURE(
2257 (state == kStopped || state == kNormal || state == kFlushing), 2257 (state == kStopped || state == kNormal || state == kFlushing),
2258 "Failed to process output. Unexpected decoder state: " << state, 2258 "Failed to process output. Unexpected decoder state: " << state,
2259 PLATFORM_FAILURE, ); 2259 PLATFORM_FAILURE, );
2260 hr = decoder_->ProcessInput(0, sample.get(), 0); 2260 hr = decoder_->ProcessInput(0, sample.get(), 0);
2261 } 2261 }
(...skipping 11 matching lines...) Expand all
2273 decoder_thread_task_runner_->PostTask( 2273 decoder_thread_task_runner_->PostTask(
2274 FROM_HERE, 2274 FROM_HERE,
2275 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, 2275 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers,
2276 base::Unretained(this))); 2276 base::Unretained(this)));
2277 return; 2277 return;
2278 } 2278 }
2279 } 2279 }
2280 RETURN_AND_NOTIFY_ON_HR_FAILURE(hr, "Failed to process input sample", 2280 RETURN_AND_NOTIFY_ON_HR_FAILURE(hr, "Failed to process input sample",
2281 PLATFORM_FAILURE, ); 2281 PLATFORM_FAILURE, );
2282 2282
2283 DoDecode(color_space); 2283 DoDecode(color_space.ToGfxColorSpace());
2284 2284
2285 State state = GetState(); 2285 State state = GetState();
2286 RETURN_AND_NOTIFY_ON_FAILURE( 2286 RETURN_AND_NOTIFY_ON_FAILURE(
2287 (state == kStopped || state == kNormal || state == kFlushing), 2287 (state == kStopped || state == kNormal || state == kFlushing),
2288 "Failed to process output. Unexpected decoder state: " << state, 2288 "Failed to process output. Unexpected decoder state: " << state,
2289 ILLEGAL_STATE, ); 2289 ILLEGAL_STATE, );
2290 2290
2291 LONGLONG input_buffer_id = 0; 2291 LONGLONG input_buffer_id = 0;
2292 RETURN_ON_HR_FAILURE( 2292 RETURN_ON_HR_FAILURE(
2293 sample->GetSampleTime(&input_buffer_id), 2293 sample->GetSampleTime(&input_buffer_id),
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after
2953 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, 2953 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers,
2954 base::Unretained(this))); 2954 base::Unretained(this)));
2955 } 2955 }
2956 2956
2957 uint32_t DXVAVideoDecodeAccelerator::GetTextureTarget() const { 2957 uint32_t DXVAVideoDecodeAccelerator::GetTextureTarget() const {
2958 bool provide_nv12_textures = share_nv12_textures_ || copy_nv12_textures_; 2958 bool provide_nv12_textures = share_nv12_textures_ || copy_nv12_textures_;
2959 return provide_nv12_textures ? GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_2D; 2959 return provide_nv12_textures ? GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_2D;
2960 } 2960 }
2961 2961
2962 } // namespace media 2962 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698