mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 09:10:36 +00:00
d1d2acead1
Add custom IMFMediaBuffer and IMF2DBuffer implementation in order to keep track of lifecycle of Media Foundation memory object. By this new implementation, we can pass raw memory of upstream buffer to Media Foundation without copy. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1518>
119 lines
No EOL
4 KiB
C++
119 lines
No EOL
4 KiB
C++
/* GStreamer
|
|
* Copyright (C) 2020 Seungha Yang <seungha@centricular.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef __GST_MF_VIDEO_BUFFER_H__
|
|
#define __GST_MF_VIDEO_BUFFER_H__
|
|
|
|
#include <gst/gst.h>
|
|
#include <gst/video/video.h>
|
|
#include <windows.h>
|
|
#include <mfobjects.h>
|
|
#include <mferror.h>
|
|
#include <mutex>
|
|
|
|
#ifndef __cplusplus
|
|
#error IGstMFVideoBuffer interface doesn't provide C API
|
|
#endif
|
|
|
|
/* Define UUID for QueryInterface() */
|
|
class DECLSPEC_UUID("ce922806-a8a6-4e1e-871f-e0cdd5fc9899")
|
|
IGstMFVideoBuffer : public IMFMediaBuffer, public IMF2DBuffer
|
|
{
|
|
public:
|
|
static HRESULT CreateInstance (GstVideoInfo * info,
|
|
IMFMediaBuffer ** buffer);
|
|
|
|
static HRESULT CreateInstanceWrapped (GstVideoInfo * info,
|
|
BYTE * data,
|
|
DWORD length,
|
|
IMFMediaBuffer ** buffer);
|
|
|
|
/* notify will be called right after this object is destroyed */
|
|
HRESULT SetUserData (gpointer user_data,
|
|
GDestroyNotify notify);
|
|
|
|
HRESULT GetUserData (gpointer * user_data);
|
|
|
|
/* IUnknown interface */
|
|
STDMETHODIMP_ (ULONG) AddRef (void);
|
|
STDMETHODIMP_ (ULONG) Release (void);
|
|
STDMETHODIMP QueryInterface (REFIID riid,
|
|
void ** object);
|
|
|
|
/* IMFMediaBuffer interface
|
|
*
|
|
* Caller of this interface expects returned raw memory layout via Lock()
|
|
* has no padding with default stride. If stored memory layout consists of
|
|
* non-default stride and/or with some padding, then Lock() / Unlock() would
|
|
* cause memory copy therefore.
|
|
* Caller should avoid to use this interface as much as possible
|
|
* if IMF2DBuffer interface available.
|
|
*/
|
|
STDMETHODIMP Lock (BYTE ** buffer,
|
|
DWORD * max_length,
|
|
DWORD * current_length);
|
|
STDMETHODIMP Unlock (void);
|
|
STDMETHODIMP GetCurrentLength (DWORD * length);
|
|
STDMETHODIMP SetCurrentLength (DWORD length);
|
|
STDMETHODIMP GetMaxLength (DWORD * length);
|
|
|
|
/* IMF2DBuffer interface
|
|
*
|
|
* this interface supports any raw memory layout with non-default stride.
|
|
* But more complex layout (padding at bottom for instance) is not supported.
|
|
*/
|
|
STDMETHODIMP Lock2D (BYTE ** buffer,
|
|
LONG * pitch);
|
|
STDMETHODIMP Unlock2D (void);
|
|
STDMETHODIMP GetScanline0AndPitch (BYTE ** buffer,
|
|
LONG * pitch);
|
|
STDMETHODIMP IsContiguousFormat (BOOL * contiguous);
|
|
STDMETHODIMP GetContiguousLength (DWORD * length);
|
|
STDMETHODIMP ContiguousCopyTo (BYTE * dest_buffer,
|
|
DWORD dest_buffer_length);
|
|
STDMETHODIMP ContiguousCopyFrom (const BYTE * src_buffer,
|
|
DWORD src_buffer_length);
|
|
|
|
private:
|
|
IGstMFVideoBuffer (void);
|
|
~IGstMFVideoBuffer (void);
|
|
|
|
HRESULT Initialize (GstVideoInfo * info);
|
|
HRESULT InitializeWrapped (GstVideoInfo * info,
|
|
BYTE * data,
|
|
DWORD length);
|
|
|
|
private:
|
|
volatile ULONG ref_count_;
|
|
DWORD current_len_;
|
|
DWORD contiguous_len_;
|
|
BYTE *data_;
|
|
BYTE *contiguous_data_;
|
|
GstVideoInfo *info_;
|
|
GstVideoInfo *contiguous_info_;
|
|
BOOL contiguous_;
|
|
std::mutex lock_;
|
|
bool locked_;
|
|
bool wrapped_;
|
|
|
|
gpointer user_data_;
|
|
GDestroyNotify notify_;
|
|
};
|
|
|
|
#endif /* __GST_MF_VIDEO_BUFFER_H__ */ |