| Index: content/common/gpu/media/dxva_video_decode_accelerator_win.h
|
| diff --git a/content/common/gpu/media/dxva_video_decode_accelerator_win.h b/content/common/gpu/media/dxva_video_decode_accelerator_win.h
|
| index aa606383efc322a1c8bf9f5b5e33ac289ae02bc8..ea16eb4b8b59b480349432a6788a35b3bb18597c 100644
|
| --- a/content/common/gpu/media/dxva_video_decode_accelerator_win.h
|
| +++ b/content/common/gpu/media/dxva_video_decode_accelerator_win.h
|
| @@ -44,6 +44,41 @@ typedef HRESULT (WINAPI* CreateDXGIDeviceManager)(
|
|
|
| namespace content {
|
|
|
| +// Provides functionality to detect H.264 stream configuration changes.
|
| +// TODO(ananta)
|
| +// Move this to a common place so that all VDA's can use this.
|
| +class H264ConfigChangeDetector {
|
| + public:
|
| + H264ConfigChangeDetector();
|
| + ~H264ConfigChangeDetector();
|
| +
|
| + // Detects stream configuration changes.
|
| + // Returns false on failure.
|
| + bool DetectConfig(const uint8_t* stream, unsigned int size);
|
| +
|
| + bool config_changed() const {
|
| + return config_changed_;
|
| + }
|
| +
|
| + private:
|
| + // These fields are used to track the SPS/PPS in the H.264 bitstream and
|
| + // are eventually compared against the SPS/PPS in the bitstream to detect
|
| + // a change.
|
| + int last_sps_id_;
|
| + std::vector<uint8_t> last_sps_;
|
| + int last_pps_id_;
|
| + std::vector<uint8_t> last_pps_;
|
| + // Set to true if we detect a stream configuration change.
|
| + bool config_changed_;
|
| + // We want to indicate configuration changes only after we see IDR slices.
|
| + // This flag tracks that we potentially have a configuration change which
|
| + // we want to honor after we see an IDR slice.
|
| + bool pending_config_changed_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(H264ConfigChangeDetector);
|
| +};
|
| +
|
| +
|
| // Class to provide a DXVA 2.0 based accelerator using the Microsoft Media
|
| // foundation APIs via the VideoDecodeAccelerator interface.
|
| // This class lives on a single thread and DCHECKs that it is never accessed
|
| @@ -179,7 +214,7 @@ class CONTENT_EXPORT DXVAVideoDecodeAccelerator
|
| typedef std::map<int32_t, linked_ptr<DXVAPictureBuffer>> OutputBuffers;
|
|
|
| // Tells the client to dismiss the stale picture buffers passed in.
|
| - void DismissStaleBuffers();
|
| + void DismissStaleBuffers(bool force);
|
|
|
| // Called after the client indicates we can recycle a stale picture buffer.
|
| void DeferredDismissStaleBuffer(int32_t picture_buffer_id);
|
| @@ -192,10 +227,6 @@ class CONTENT_EXPORT DXVAVideoDecodeAccelerator
|
| // the decoder thread. Thread safe.
|
| State GetState();
|
|
|
| - // Worker function for the Decoder Reset functionality. Executes on the
|
| - // decoder thread and queues tasks on the main thread as needed.
|
| - void ResetHelper();
|
| -
|
| // Starts the thread used for decoding.
|
| void StartDecoderThread();
|
|
|
| @@ -264,6 +295,19 @@ class CONTENT_EXPORT DXVAVideoDecodeAccelerator
|
| int width,
|
| int height);
|
|
|
| + // Checks if the resolution, bitrate etc of the stream changed. We do this
|
| + // by keeping track of the SPS/PPS frames and if they change we assume
|
| + // that the configuration changed.
|
| + // Returns S_OK or S_FALSE on succcess.
|
| + // The |config_changed| parameter is set to true if we detect a change in the
|
| + // stream.
|
| + HRESULT CheckConfigChanged(IMFSample* sample, bool* config_changed);
|
| +
|
| + // Called when we detect a stream configuration change. We reinitialize the
|
| + // decoder here.
|
| + void ConfigChanged(const Config& config,
|
| + const base::win::ScopedComPtr<IMFSample>& input_sample);
|
| +
|
| // To expose client callbacks from VideoDecodeAccelerator.
|
| media::VideoDecodeAccelerator::Client* client_;
|
|
|
| @@ -403,6 +447,16 @@ class CONTENT_EXPORT DXVAVideoDecodeAccelerator
|
| // Function pointer for the MFCreateDXGIDeviceManager API.
|
| static CreateDXGIDeviceManager create_dxgi_device_manager_;
|
|
|
| + // The media foundation H.264 decoder has problems handling changes like
|
| + // resolution change, bitrate change etc. If we reinitialize the decoder
|
| + // when these changes occur then, the decoder works fine. The
|
| + // H264ConfigChangeDetector class provides functionality to check if the
|
| + // stream configuration changed.
|
| + H264ConfigChangeDetector config_change_detector_;
|
| +
|
| + // Contains the initialization parameters for the video.
|
| + Config config_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(DXVAVideoDecodeAccelerator);
|
| };
|
|
|
|
|