diff --git a/subprojects/gstreamer/gst/gstbuffer.h b/subprojects/gstreamer/gst/gstbuffer.h index 3de019c520..74f21c378c 100644 --- a/subprojects/gstreamer/gst/gstbuffer.h +++ b/subprojects/gstreamer/gst/gstbuffer.h @@ -813,6 +813,11 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBufferPool, gst_object_unref) * } * ``` * + * #GstMapInfo cannot be used with g_auto() because it is ambiguous whether it + * needs to be unmapped using gst_buffer_unmap() or gst_memory_unmap(). + * + * See also #GstMemoryMapInfo. + * * Since: 1.22 */ typedef GstMapInfo GstBufferMapInfo; diff --git a/subprojects/gstreamer/gst/gstmemory.h b/subprojects/gstreamer/gst/gstmemory.h index cf84de28ad..5da72d656c 100644 --- a/subprojects/gstreamer/gst/gstmemory.h +++ b/subprojects/gstreamer/gst/gstmemory.h @@ -205,6 +205,10 @@ typedef enum { * * A structure containing the result of a map operation such as * gst_memory_map(). It contains the data and size. + * + * #GstMapInfo cannot be used with g_auto() because it is ambiguous whether it + * needs to be unmapped using gst_buffer_unmap() or gst_memory_unmap(). Instead, + * #GstBufferMapInfo and #GstMemoryMapInfo can be used in that case. */ typedef struct { GstMemory *memory; @@ -385,6 +389,39 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstMemory, gst_memory_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAllocator, gst_object_unref) +/** + * GstMemoryMapInfo: (skip): + * + * Alias for #GstMapInfo to be used with g_auto(): + * ```c + * void my_func(GstMemory *mem) + * { + * g_auto(GstMemoryMapInfo) map = GST_MAP_INFO_INIT; + * if (!gst_memory_map(mem, &map, GST_MAP_READWRITE)) + * return; + * ... + * // No need to call gst_memory_unmap() + * } + * ``` + * + * #GstMapInfo cannot be used with g_auto() because it is ambiguous whether it + * needs to be unmapped using gst_buffer_unmap() or gst_memory_unmap(). + * + * See also #GstBufferMapInfo. + * + * Since: 1.22 + */ +typedef GstMapInfo GstMemoryMapInfo; + +static inline void _gst_memory_map_info_clear(GstMemoryMapInfo *info) +{ + if (G_LIKELY (info->memory)) { + gst_memory_unmap (info->memory, info); + } +} + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GstMemoryMapInfo, _gst_memory_map_info_clear) + G_END_DECLS #endif /* __GST_MEMORY_H__ */