// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // MFT H.264 decoder. #ifndef MEDIA_MF_MFT_H264_DECODER_H_ #define MEDIA_MF_MFT_H264_DECODER_H_ #include "build/build_config.h" // For OS_WIN. #if defined(OS_WIN) #include #include #include #include "base/gtest_prod_util.h" #include "base/scoped_comptr_win.h" #include "media/video/video_decode_engine.h" class MessageLoop; namespace media { class MftH264Decoder : public media::VideoDecodeEngine { public: typedef enum { kUninitialized, // un-initialized. kNormal, // normal playing state. kFlushing, // upon received Flush(), before FlushDone() kEosDrain, // upon input EOS received. kStopped, // upon output EOS received. } State; explicit MftH264Decoder(bool use_dxva, HWND draw_window); ~MftH264Decoder(); virtual void Initialize(MessageLoop* message_loop, VideoDecodeEngine::EventHandler* event_handler, VideoDecodeContext* context, const VideoCodecConfig& config); virtual void Uninitialize(); virtual void Flush(); virtual void Seek(); virtual void ConsumeVideoSample(scoped_refptr buffer); virtual void ProduceVideoFrame(scoped_refptr frame); bool use_dxva() const { return use_dxva_; } IDirect3DDevice9* device() const { return device_.get(); } State state() const { return state_; } private: friend class MftH264DecoderTest; FRIEND_TEST_ALL_PREFIXES(MftH264DecoderTest, LibraryInit); // TODO(jiesun): Find a way to move all these to GpuVideoService.. static bool StartupComLibraries(); static void ShutdownComLibraries(); bool CreateD3DDevManager(); bool InitInternal(); bool InitDecoder(); bool CheckDecoderDxvaSupport(); bool SetDecoderMediaTypes(); bool SetDecoderInputMediaType(); bool SetDecoderOutputMediaType(const GUID subtype); bool SendMFTMessage(MFT_MESSAGE_TYPE msg); bool GetStreamsInfoAndBufferReqs(); bool DoDecode(); bool use_dxva_; ScopedComPtr d3d9_; ScopedComPtr device_; ScopedComPtr device_manager_; HWND draw_window_; ScopedComPtr decoder_; MFT_INPUT_STREAM_INFO input_stream_info_; MFT_OUTPUT_STREAM_INFO output_stream_info_; State state_; VideoDecodeEngine::EventHandler* event_handler_; VideoCodecConfig config_; VideoCodecInfo info_; DISALLOW_COPY_AND_ASSIGN(MftH264Decoder); }; } // namespace media #endif // defined(OS_WIN) #endif // MEDIA_MF_MFT_H264_DECODER_H_