mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-30 04:00:37 +00:00
640a65bf96
volatile is not sufficient to provide atomic guarantees and real atomics should be used instead. GCC 11 has started warning about using volatile with atomic operations. https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1719 Discovered in https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/868 Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2098>
119 lines
4 KiB
C++
119 lines
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:
|
|
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__ */
|