goto no_window_size;
#ifdef GST_WLSINK_ENHANCEMENT
- sink->display->tbm_need_limit_idx = FALSE;
wlbuffer = gst_buffer_get_wl_buffer (buffer);
if (G_LIKELY (wlbuffer && wlbuffer->display == sink->display)) {
- GST_LOG_OBJECT (sink, "buffer %p has a wl_buffer from our display, " "writing directly", buffer); // s/w codec case
+ GST_LOG_OBJECT (sink, "buffer %p has a wl_buffer from our display, " "writing directly", buffer); //buffer is from our pool and have wl_buffer
GST_INFO ("wl_buffer (%p)", wlbuffer->wlbuffer);
to_render = buffer;
-
#ifdef DUMP_BUFFER
GstMemory *mem;
GstMapInfo mem_info = GST_MAP_INFO_INIT;
GstMemory *mem;
struct wl_buffer *wbuf = NULL;
- GST_LOG_OBJECT (sink, "buffer %p does not have a wl_buffer from our " "display, creating it", buffer); //videotestsrc case , s/w codec too
+ GST_LOG_OBJECT (sink, "buffer %p does not have a wl_buffer from our " "display, creating it", buffer); //buffer is from our pool but have not wl_buffer
mem = gst_buffer_peek_memory (buffer, 0);
if (gst_is_wl_shm_memory (mem)) {
FUNCTION;
wbuf = gst_wl_shm_memory_construct_wl_buffer (mem, sink->display,
&sink->video_info);
- }
- if (wbuf) {
- gst_buffer_add_wl_buffer (buffer, wbuf, sink->display); //careat GstWlBuffer and add gstbuffer, wlbuffer, display and etc
- to_render = buffer;
-
- } else {
+ if (wbuf) {
+ gst_buffer_add_wl_buffer (buffer, wbuf, sink->display); //careat GstWlBuffer and add gstbuffer, wlbuffer, display and etc
+ to_render = buffer;
+ }
+ } else { //buffer is not from our pool and have not wl_buffer
GstMapInfo src;
/* we don't know how to create a wl_buffer directly from the provided
* memory, so we have to copy the data to a memory that we know how
* to handle... */
GST_LOG_OBJECT (sink, "buffer %p is not from our pool", buffer);
- GST_LOG_OBJECT (sink, "buffer %p cannot have a wl_buffer, " "copying", buffer); //omx codec case
+ GST_LOG_OBJECT (sink, "buffer %p cannot have a wl_buffer, " "copying",
+ buffer);
if (sink->USE_TBM && sink->display->is_native_format) {
/* in case of SN12 or ST12 */
gst_buffer_add_wl_buffer (buffer, wbuf, sink->display);
}
- } else if (sink->USE_TBM && !sink->display->is_native_format) {
+ }
- sink->display->tbm_need_limit_idx = TRUE;
+ else if (sink->USE_TBM && !sink->display->is_native_format) {
/* sink->pool always exists (created in set_caps), but it may not
* be active if upstream is not using it */
goto no_wl_buffer;
gst_buffer_add_wl_buffer (to_render, wbuf, sink->display);
+
}
gst_buffer_map (buffer, &src, GST_MAP_READ);
* to handle... */
GST_LOG_OBJECT (sink, "buffer %p is not from our pool", buffer);
- GST_LOG_OBJECT (sink, "buffer %p cannot have a wl_buffer, " "copying", buffer); //omx codec case
+ GST_LOG_OBJECT (sink, "buffer %p cannot have a wl_buffer, " "copying",
+ buffer);
/* sink->pool always exists (created in set_caps), but it may not
* be active if upstream is not using it */
if (!gst_buffer_pool_is_active (sink->pool) &&
gst_mini_object_set_qdata ((GstMiniObject *) gstbuffer,
gst_wl_buffer_qdata_quark (), self, (GDestroyNotify) gstbuffer_disposed);
-
GST_INFO ("GstWlBuffer (%p)", self);
return self;
}
* the compositor is using the buffer and it should not return
* back to the pool and be re-used until the compositor releases it. */
gst_buffer_ref (self->gstbuffer);
+
self->used_by_compositor = TRUE;
}
self->buffers = g_hash_table_new (g_direct_hash, g_direct_equal);
g_mutex_init (&self->buffers_mutex);
#ifdef GST_WLSINK_ENHANCEMENT
- self->tbm_bo_c_idx = 0;
- self->tbm_bo_u_idx = 0;
- self->tbm_need_limit_idx = FALSE;
- self->tbm_bo_max_idx = TBM_BO_MAX_IDX;
+ self->tbm_bo_idx = 0;
#endif
}
struct wayland_tbm_client *tbm_client;
tbm_bufmgr tbm_bufmgr;
tbm_bo tbm_bo[TBM_BO_NUM];
- int tbm_bo_c_idx;
- int tbm_bo_u_idx;
- gboolean tbm_need_limit_idx;
- int tbm_bo_max_idx;
+ int tbm_bo_idx;
tbm_surface_h tsurface;
gboolean USE_TBM;
#ifdef GST_WLSINK_ENHANCEMENT
if (self->display->USE_TBM) {
tbm_bo_handle virtual_addr;
- if (self->display->tbm_need_limit_idx
- && self->display->tbm_bo_c_idx == self->display->tbm_bo_max_idx)
- self->display->tbm_bo_c_idx = 0;
- idx = self->display->tbm_bo_c_idx++;
+ idx = self->display->tbm_bo_idx++;
self->display->tbm_bufmgr =
wayland_tbm_client_get_bufmgr (self->display->tbm_client);
GST_ERROR_OBJECT (self, "get tbm bo handle failed: %s", strerror (errno));
tbm_bo_unref (self->display->tbm_bo[idx]);
self->display->tbm_bo[idx] = NULL;
- self->display->tbm_bo_c_idx--;
+ self->display->tbm_bo_idx--;
return FALSE;
}
gst_memory_init ((GstMemory *) mem, GST_MEMORY_FLAG_NO_SHARE, allocator,
NULL, size, 0, 0, size);
mem->data = virtual_addr.ptr;
+ mem->tbm_bo_ptr = self->display->tbm_bo[idx];
GST_INFO ("mem(%p) mem->data(%p) virtual_addr.ptr(%p) size(%d)", mem,
mem->data, virtual_addr.ptr, size);
} else { /* USE SHM */
/* TODO: make use of the allocation params, if necessary */
- GST_ERROR ("1");
+
/* allocate shm pool */
snprintf (filename, 1024, "%s/%s-%d-%s", g_get_user_runtime_dir (),
"wayland-shm", init++, "XXXXXX");
wayland_tbm_client_create_buffer (display->tbm_client,
display->tsurface);
} else {
- int idx;
- if (display->tbm_need_limit_idx
- && display->tbm_bo_u_idx == display->tbm_bo_max_idx)
- display->tbm_bo_u_idx = 0;
- idx = display->tbm_bo_u_idx++;
width = GST_VIDEO_INFO_WIDTH (info);
height = GST_VIDEO_INFO_HEIGHT (info);
stride = GST_VIDEO_INFO_PLANE_STRIDE (info, 0);
height, stride, gst_wl_tbm_format_to_string (format));
#ifdef DUMP_BUFFER
- virtual_addr = tbm_bo_get_handle (display->tbm_bo[idx], TBM_DEVICE_CPU);
+ virtual_addr = tbm_bo_get_handle (shm_mem->tbm_bo_ptr, TBM_DEVICE_CPU);
if (!virtual_addr.ptr) {
GST_ERROR ("get tbm bo handle failed: %s", strerror (errno));
return FALSE;
ts_info.planes[1].offset = GST_VIDEO_INFO_PLANE_OFFSET (info, 1);
ts_info.planes[2].offset = GST_VIDEO_INFO_PLANE_OFFSET (info, 2);
- GST_INFO ("display->tbm_bo (%p)", display->tbm_bo[idx]);
+ GST_INFO ("tbm_bo (%p)", shm_mem->tbm_bo_ptr);
display->tsurface =
- tbm_surface_internal_create_with_bos (&ts_info, &display->tbm_bo[idx],
+ tbm_surface_internal_create_with_bos (&ts_info, &shm_mem->tbm_bo_ptr,
1);
wbuffer =
wayland_tbm_client_create_buffer (display->tbm_client,
gpointer data;
gint fd;
+#ifdef GST_WLSINK_ENHANCEMENT
+ gpointer tbm_bo_ptr;
+#endif
};
struct _GstWlShmAllocator