gboolean gst_imx_vpu_framebuffer_array_set_framebuffer_in_gstbuffer(GstImxVpuFramebufferArray *framebuffer_array, GstBuffer *buffer, ImxVpuFramebuffer *framebuffer) { GstVideoMeta *video_meta; GstImxVpuFramebufferMeta *vpu_meta; GstImxPhysMemMeta *phys_mem_meta; GstImxPhysMemory *memory; video_meta = gst_buffer_get_video_meta(buffer); if (video_meta == NULL) { GST_ERROR("buffer with pointer %p has no video metadata", (gpointer)buffer); return FALSE; } vpu_meta = GST_IMX_VPU_FRAMEBUFFER_META_GET(buffer); if (vpu_meta == NULL) { GST_ERROR("buffer with pointer %p has no VPU metadata", (gpointer)buffer); return FALSE; } phys_mem_meta = GST_IMX_PHYS_MEM_META_GET(buffer); if (phys_mem_meta == NULL) { GST_ERROR("buffer with pointer %p has no phys mem metadata", (gpointer)buffer); return FALSE; } { gsize x_padding = 0, y_padding = 0; if (framebuffer_array->framebuffer_sizes.aligned_frame_width > video_meta->width) x_padding = framebuffer_array->framebuffer_sizes.aligned_frame_width - video_meta->width; if (framebuffer_array->framebuffer_sizes.aligned_frame_height > video_meta->height) y_padding = framebuffer_array->framebuffer_sizes.aligned_frame_height - video_meta->height; vpu_meta->framebuffer = framebuffer; phys_mem_meta->phys_addr = (gst_imx_phys_addr_t)imx_vpu_dma_buffer_get_physical_address(framebuffer->dma_buffer); phys_mem_meta->x_padding = x_padding; phys_mem_meta->y_padding = y_padding; GST_LOG("setting phys mem meta for buffer with pointer %p: phys addr %" GST_IMX_PHYS_ADDR_FORMAT " x/y padding %" G_GSIZE_FORMAT "/%" G_GSIZE_FORMAT, (gpointer)buffer, phys_mem_meta->phys_addr, phys_mem_meta->x_padding, phys_mem_meta->y_padding); } memory = gst_imx_vpu_framebuffer_array_get_gst_phys_memory(framebuffer); /* remove any existing memory blocks */ gst_buffer_remove_all_memory(buffer); /* and append the new memory block * the memory is ref'd to prevent deallocation when it is later removed * (either because this function is called again, or because the buffer * is deallocated); refcount is 1 already at this point, since the memory * is ref'd inside the framebuffer array, and unref'd when the array is * shut down */ gst_buffer_append_memory(buffer, gst_memory_ref((GstMemory *)memory)); return TRUE; }
static void gst_droid_buffer_pool_reset_buffer (GstBufferPool * pool, GstBuffer * buffer) { GstDroidBufferPool *dpool = GST_DROID_BUFFER_POOL (pool); gst_buffer_remove_all_memory (buffer); GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_TAG_MEMORY); g_mutex_lock (&dpool->lock); ++dpool->num_buffers; GST_DEBUG_OBJECT (dpool, "num buffers: %d", dpool->num_buffers); g_cond_signal (&dpool->cond); g_mutex_unlock (&dpool->lock); return GST_BUFFER_POOL_CLASS (parent_class)->reset_buffer (pool, buffer); }
static GstFlowReturn gst_imx_v4l2_buffer_pool_acquire_buffer(GstBufferPool *bpool, GstBuffer **buffer, G_GNUC_UNUSED GstBufferPoolAcquireParams *params) { GstImxV4l2BufferPool *pool = GST_IMX_V4L2_BUFFER_POOL(bpool); struct v4l2_buffer vbuffer; GstBuffer *buf; GstImxV4l2Meta *meta; if (GST_BUFFER_POOL_IS_FLUSHING(bpool)) return GST_FLOW_FLUSHING; memset(&vbuffer, 0, sizeof(vbuffer)); vbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vbuffer.memory = V4L2_MEMORY_MMAP; if (ioctl(GST_IMX_FD_OBJECT_GET_FD(pool->fd_obj_v4l), VIDIOC_DQBUF, &vbuffer) < 0) { GST_ERROR_OBJECT(pool, "VIDIOC_DQBUF failed: %s", g_strerror(errno)); return GST_FLOW_ERROR; } buf = pool->buffers[vbuffer.index]; GST_DEBUG_OBJECT(pool, "dqbuf %u %p", vbuffer.index, (gpointer)buf); pool->buffers[vbuffer.index] = NULL; g_assert(buf); meta = GST_IMX_V4L2_META_GET(buf); g_assert(meta); gst_buffer_remove_all_memory(buf); gst_buffer_append_memory(buf, gst_memory_new_wrapped(0, meta->mem, meta->vbuffer.length, 0, vbuffer.bytesused, NULL, NULL)); GST_BUFFER_TIMESTAMP(buf) = GST_TIMEVAL_TO_TIME(vbuffer.timestamp); *buffer = buf; return GST_FLOW_OK; }