static void _map_data_gl (GstGLContext * context, struct map_data *transfer) { GstGLBaseMemoryAllocatorClass *alloc_class; GstGLBaseMemory *mem = transfer->mem; GstMapInfo *info = transfer->info; alloc_class = GST_GL_BASE_MEMORY_ALLOCATOR_GET_CLASS (transfer->mem->mem.allocator); g_return_if_fail (alloc_class->map != NULL); g_mutex_lock (&mem->lock); GST_CAT_LOG (GST_CAT_GL_BASE_MEMORY, "mapping mem %p flags %04x", mem, info->flags); /* FIXME: validate map flags based on the memory domain */ if (mem->map_count++ == 0) mem->map_flags = info->flags; else { /* assert that the flags are a subset of the first map flags */ g_assert ((((GST_MAP_GL - 1) & info->flags) & mem->map_flags) != 0); GST_CAT_LOG (GST_CAT_GL_BASE_MEMORY, "multiple map no %d flags %04x " "all flags %04x", mem->map_count, info->flags, mem->map_flags); } if ((info->flags & GST_MAP_GL) != (mem->map_flags & GST_MAP_GL)) mem->map_flags |= GST_MAP_GL; if (info->flags & GST_MAP_GL) mem->gl_map_count++; transfer->data = alloc_class->map (transfer->mem, transfer->info, transfer->size); if (transfer->data) { if (info->flags & GST_MAP_GL) { if (info->flags & GST_MAP_WRITE) GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD); GST_MEMORY_FLAG_UNSET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD); } else { if (info->flags & GST_MAP_WRITE) GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD); GST_MEMORY_FLAG_UNSET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD); } } g_mutex_unlock (&mem->lock); }
/** * gst_memory_resize: * @mem: a #GstMemory * @offset: a new offset * @size: a new size * * Resize the memory region. @mem should be writable and offset + size should be * less than the maxsize of @mem. * * #GST_MEMORY_FLAG_ZERO_PREFIXED and #GST_MEMORY_FLAG_ZERO_PADDED will be * cleared when offset or padding is increased respectively. */ void gst_memory_resize (GstMemory * mem, gssize offset, gsize size) { g_return_if_fail (mem != NULL); g_return_if_fail (offset >= 0 || mem->offset >= -offset); g_return_if_fail (size + mem->offset + offset <= mem->maxsize); /* if we increase the prefix, we can't guarantee it is still 0 filled */ if ((offset > 0) && GST_MEMORY_IS_ZERO_PREFIXED (mem)) GST_MEMORY_FLAG_UNSET (mem, GST_MEMORY_FLAG_ZERO_PREFIXED); /* if we increase the padding, we can't guarantee it is still 0 filled */ if ((offset + size < mem->size) && GST_MEMORY_IS_ZERO_PADDED (mem)) GST_MEMORY_FLAG_UNSET (mem, GST_MEMORY_FLAG_ZERO_PADDED); mem->offset += offset; mem->size = size; }
static void _download_transfer (GstGLContext * context, GstGLMemoryPBO * gl_mem) { GstGLBaseMemory *mem = (GstGLBaseMemory *) gl_mem; g_mutex_lock (&mem->lock); if (_read_pixels_to_pbo (gl_mem)) { GST_CAT_TRACE (GST_CAT_GL_MEMORY, "optimistic download of texture %u " "using pbo %u", gl_mem->mem.tex_id, gl_mem->pbo->id); GST_MEMORY_FLAG_UNSET (gl_mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD); } g_mutex_unlock (&mem->lock); }