summaryrefslogtreecommitdiffstats
path: root/media/media_foundation/h264mft.h
diff options
context:
space:
mode:
Diffstat (limited to 'media/media_foundation/h264mft.h')
-rw-r--r--media/media_foundation/h264mft.h117
1 files changed, 117 insertions, 0 deletions
diff --git a/media/media_foundation/h264mft.h b/media/media_foundation/h264mft.h
new file mode 100644
index 0000000..3e60a23
--- /dev/null
+++ b/media/media_foundation/h264mft.h
@@ -0,0 +1,117 @@
+// 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.
+//
+// Decodes H.264 Annex B streams using the Media Foundation H.264 decoder as
+// a standalone Media Foundation Transform (MFT).
+// Note: A single H264Mft instance is only for 1 H.264 video stream only.
+// Inputting streams consisting of more than 1 video to a single instance
+// may result in undefined behavior.
+
+#ifndef MEDIA_MEDIA_FOUNDATION_H264MFT_H_
+#define MEDIA_MEDIA_FOUNDATION_H264MFT_H_
+
+#include <string>
+
+#include <mfidl.h>
+
+#include "base/basictypes.h"
+#include "base/scoped_ptr.h"
+#include "base/scoped_comptr_win.h"
+#include "media/base/video_frame.h"
+
+struct IDirect3DDeviceManager9;
+struct IMFSample;
+struct IMFTransform;
+
+namespace media {
+
+// A decoder that takes samples of Annex B streams then outputs decoded frames.
+class H264Mft {
+ public:
+ enum DecoderOutputState {
+ kOutputOk = 0,
+ kResetOutputStreamFailed,
+ kResetOutputStreamOk,
+ kNeedMoreInput,
+ kNoMoreOutput,
+ kUnspecifiedError,
+ kNoMemory,
+ kOutputSampleError
+ };
+ explicit H264Mft(bool use_dxva);
+ ~H264Mft();
+
+ // Initializes the decoder. |dev_manager| is not required if the decoder does
+ // not use DXVA.
+ // If the other arguments are not known, leave them as 0. They can be
+ // provided to the decoder to try to avoid an initial output format change,
+ // but it is not necessary to have them.
+ bool Init(IDirect3DDeviceManager9* dev_manager,
+ int frame_rate_num, int frame_rate_denom,
+ int width, int height,
+ int aspect_num, int aspect_denom);
+
+ // Sends an Annex B stream to the decoder. The times here should be given
+ // in 100ns units. This creates a IMFSample, copies the stream over to the
+ // sample, and sends the sample to the decoder.
+ // Returns: true if the sample was sent successfully.
+ bool SendInput(uint8* data, int size, int64 timestamp, int64 duration);
+
+ // Tries to get an output sample from the decoder.
+ // Returns: status of the decoder, and if successful, a decoded sample.
+ DecoderOutputState GetOutput(scoped_refptr<VideoFrame>* decoded_frame);
+
+ // Sends a drain message to the decoder to indicate no more input will be
+ // sent. SendInput() should not be called after calling this method.
+ // Returns: true if the drain message was sent successfully.
+ bool SendDrainMessage();
+
+ bool initialized() const { return initialized_; }
+ bool use_dxva() const { return use_dxva_; }
+ bool drain_message_sent() const { return drain_message_sent_; }
+ int in_buffer_size() const { return in_buffer_size_; }
+ int out_buffer_size() const { return out_buffer_size_; }
+ int frames_read() const { return frames_read_; }
+ int frames_decoded() const { return frames_decoded_; }
+ int width() const { return width_; }
+ int height() const { return height_; }
+
+ private:
+ bool InitDecoder(IDirect3DDeviceManager9* dev_manager,
+ int frame_rate_num, int frame_rate_denom,
+ int width, int height,
+ int aspect_num, int aspect_denom);
+ bool CheckDecoderProperties();
+ bool CheckDecoderDxvaSupport();
+ bool SetDecoderD3d9Manager(IDirect3DDeviceManager9* dev_manager);
+ bool SetDecoderMediaTypes(int frame_rate_num, int frame_rate_denom,
+ int width, int height,
+ int aspect_num, int aspect_denom);
+ bool SetDecoderInputMediaType(int frame_rate_num, int frame_rate_denom,
+ int width, int height,
+ int aspect_num, int aspect_denom);
+ bool SetDecoderOutputMediaType(const GUID subtype);
+ bool SendStartMessage();
+ bool GetStreamsInfoAndBufferReqs();
+
+ ScopedComPtr<IMFTransform> decoder_;
+ bool initialized_;
+ bool use_dxva_;
+ bool drain_message_sent_;
+
+ // Minimum input and output buffer sizes as required by the decoder.
+ int in_buffer_size_;
+ int out_buffer_size_;
+ int frames_read_;
+ int frames_decoded_;
+ int width_;
+ int height_;
+ int stride_;
+
+ DISALLOW_COPY_AND_ASSIGN(H264Mft);
+};
+
+} // namespace media
+
+#endif // MEDIA_MF_H264MFT_H_