#define GST_TYPE_EVASPIXMAPSINK_ROTATE_ANGLE (gst_evaspixmapsink_rotate_angle_get_type())
#define GST_TYPE_EVASPIXMAPSINK_DISPLAY_GEOMETRY_METHOD (gst_evaspixmapsink_display_geometry_method_get_type())
#define SIZE_FOR_UPDATE_VISIBILITY sizeof(gchar)
-#define EPIPE_REQUEST_LIMIT 20
+#define EPIPE_REQUEST_LIMIT 2
static GType
gst_evaspixmapsink_flip_get_type (void)
GstVideoInfo * info);
static void drm_close_gem (GstEvasPixmapSink * evaspixmapsink,
unsigned int gem_handle);
-static void
-gst_evaspixmapsink_xpixmap_fillblack (tbm_bufmgr bufmgr, Display * disp,
- Pixmap pixmap);
-static GstFlowReturn gst_evaspixmapsink_epipe_reset (GstEvasPixmapSink *
- evaspixmapsink);
#ifdef DUMP_IMG
int util_write_rawdata (const char *file, const void *data, unsigned int size);
int g_cnt = 0;
surf.data.x11.pixmap = evaspixmapsink->xpixmap[idx]->pixmap;
evas_object_image_native_surface_set (evaspixmapsink->eo, &surf);
evaspixmapsink->do_link = FALSE;
- evaspixmapsink->last_updated_idx = idx;
} else {
GST_WARNING_OBJECT (evaspixmapsink, "pixmap is NULL..");
return;
}
-
- /* flush previous pool */
- for (i = 0; i < NUM_OF_PREV_PIXMAP; i++) {
- if (evaspixmapsink->prev[i]->pixmap || evaspixmapsink->prev[i]->gc
- || evaspixmapsink->prev[i]->damage)
+ for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) {
+ if (evaspixmapsink->xpixmap[i]->prev_pixmap
+ && evaspixmapsink->xpixmap[i]->prev_gc
+ && evaspixmapsink->prev_damage[i]) {
GST_LOG_OBJECT (evaspixmapsink,
"Free pixmap(%ld), gc(%p), destroy previous damage(%ld)",
- evaspixmapsink->prev[i]->pixmap,
- evaspixmapsink->prev[i]->gc, evaspixmapsink->prev[i]->damage);
- g_mutex_lock (&evaspixmapsink->x_lock);
- if (evaspixmapsink->prev[i]->pixmap)
+ evaspixmapsink->xpixmap[i]->prev_pixmap,
+ evaspixmapsink->xpixmap[i]->prev_gc,
+ evaspixmapsink->prev_damage[i]);
+ g_mutex_lock (&evaspixmapsink->x_lock);
XFreePixmap (evaspixmapsink->xcontext->disp,
- evaspixmapsink->prev[i]->pixmap);
- if (evaspixmapsink->prev[i]->gc)
- XFreeGC (evaspixmapsink->xcontext->disp, evaspixmapsink->prev[i]->gc);
- if (evaspixmapsink->prev[i]->damage)
+ evaspixmapsink->xpixmap[i]->prev_pixmap);
+ XFreeGC (evaspixmapsink->xcontext->disp,
+ evaspixmapsink->xpixmap[i]->prev_gc);
XDamageDestroy (evaspixmapsink->xcontext->disp,
- evaspixmapsink->prev[i]->damage);
-
- XSync (evaspixmapsink->xcontext->disp, FALSE);
- evaspixmapsink->prev[i]->pixmap = 0;
- evaspixmapsink->prev[i]->gc = NULL;
- evaspixmapsink->prev[i]->damage = 0;
- g_mutex_unlock (&evaspixmapsink->x_lock);
- }
- int ret = GST_FLOW_OK;
- ret = gst_evaspixmapsink_epipe_reset (evaspixmapsink);
- if (ret != GST_FLOW_OK) {
- GST_ERROR_OBJECT (evaspixmapsink,
- "evas epipe reset ret=%d, need to check", ret);
- return GST_STATE_CHANGE_FAILURE;
+ evaspixmapsink->prev_damage[i]);
+ XSync (evaspixmapsink->xcontext->disp, FALSE);
+ g_mutex_unlock (&evaspixmapsink->x_lock);
+ evaspixmapsink->xpixmap[i]->prev_pixmap = 0;
+ evaspixmapsink->xpixmap[i]->prev_gc = 0;
+ evaspixmapsink->prev_damage[i] = 0;
+ }
}
if (evaspixmapsink->visible
&& !evas_object_visible_get (evaspixmapsink->eo)) {
xpixmap = evaspixmapsink->xpixmap[idx];
if (xpixmap->pixmap) {
- GST_LOG ("last_update_idx (%d)", evaspixmapsink->last_updated_idx);
if (evaspixmapsink->last_updated_idx != idx) {
Evas_Native_Surface surf;
surf.version = EVAS_NATIVE_SURFACE_VERSION;
evas_object_image_native_surface_set (evaspixmapsink->eo, &surf);
GST_LOG_OBJECT (evaspixmapsink,
"update, native_surface_set of xpixmap[%d]", idx);
- xpixmap = evaspixmapsink->xpixmap[evaspixmapsink->last_updated_idx];
- if (xpixmap->ref > 0 && xpixmap->damaged_time > 0) {
- xpixmap->ref--;
+ if (evaspixmapsink->last_updated_idx == -1) {
xpixmap->damaged_time = 0;
GST_INFO_OBJECT (evaspixmapsink,
- "last updated pixmap[%d] ref-count DECREASED : pixmap(%ld), refcount(%d), damaged_time(%d), idx(%d)",
- evaspixmapsink->last_updated_idx, xpixmap->pixmap, xpixmap->ref,
- xpixmap->damaged_time);
+ "this is the first time to request to update(do not DECREASE ref-count) : pixmap(%ld), refcount(%d), damaged_time(%d), idx(%d)",
+ xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time, idx);
} else {
- GST_LOG
- ("skip decreasing refcount : pixmap(%ld), refcount(%d), damaged_time(%d), idx(%d)",
- xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time,
- evaspixmapsink->last_updated_idx);
+ xpixmap = evaspixmapsink->xpixmap[evaspixmapsink->last_updated_idx];
+ if (xpixmap->ref > 0 && xpixmap->damaged_time > 0) {
+ xpixmap->ref--;
+ xpixmap->damaged_time = 0;
+ GST_INFO_OBJECT (evaspixmapsink,
+ "pixmap ref-count DECREASED : pixmap(%ld), refcount(%d), damaged_time(%d), idx(%d)",
+ xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time,
+ evaspixmapsink->last_updated_idx);
+ } else {
+ GST_LOG
+ ("skip decreasing refcount : pixmap(%ld), refcount(%d), damaged_time(%d), idx(%d)",
+ xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time,
+ evaspixmapsink->last_updated_idx);
+ }
}
evaspixmapsink->last_updated_idx = idx;
- GST_LOG ("last_update_idx (%d)", evaspixmapsink->last_updated_idx);
}
evas_object_image_fill_set (evaspixmapsink->eo, 0, 0, evaspixmapsink->w,
int w = 0;
int h = 0;
- int ret = GST_FLOW_OK;
#ifdef COMPARE_RATIO
float former_ratio = 0;
float ratio = 0;
#endif
}
- ret = gst_evaspixmapsink_epipe_reset (evaspixmapsink);
- if (ret != GST_FLOW_OK) {
- GST_ERROR_OBJECT (evaspixmapsink,
- "evas epipe reset ret=%d, need to check", ret);
- return GST_STATE_CHANGE_FAILURE;
- }
-
- if (GST_STATE (evaspixmapsink) >= GST_STATE_PAUSED) {
- g_mutex_lock (&evaspixmapsink->flow_lock);
- gst_evaspixmap_buffer_put (evaspixmapsink, evaspixmapsink->evas_pixmap_buf);
- g_mutex_unlock (&evaspixmapsink->flow_lock);
- }
+ gst_evaspixmap_buffer_put (evaspixmapsink, evaspixmapsink->evas_pixmap_buf);
GST_DEBUG_OBJECT (evaspixmapsink, "[END]");
}
GstEvasPixmapSink *evaspixmapsink;
+ GST_DEBUG_OBJECT (evaspixmapsink, "Destroying buffer");
+
evaspixmapsink = evaspixmapbuf->evaspixmapsink;
if (G_UNLIKELY (evaspixmapsink == NULL)) {
goto no_sink;
}
- GST_DEBUG_OBJECT (evaspixmapsink, "Destroying buffer");
g_return_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink));
evaspixmapbuf->height);
GST_LOG_OBJECT (evaspixmapsink, "aligned size %dx%d",
evaspixmapsink->aligned_width, evaspixmapsink->aligned_height);
- if (!evaspixmapsink->is_zero_copy_format) {
- GST_INFO_OBJECT (evaspixmapsink,
- "it is not zero copy format. set size of caps.");
+ if (evaspixmapsink->aligned_width == 0 || evaspixmapsink->aligned_height == 0) {
+ GST_INFO_OBJECT (evaspixmapsink, "aligned size is zero. set size of caps.");
evaspixmapsink->aligned_width = evaspixmapbuf->width;
evaspixmapsink->aligned_height = evaspixmapbuf->height;
}
- if (evaspixmapsink->aligned_width == 0 || evaspixmapsink->aligned_height == 0) {
- GST_ERROR ("wrong size information");
- goto beach_unlocked;
- }
evaspixmapbuf->im_format =
gst_evaspixmapsink_get_format_from_info (evaspixmapsink->xcontext,
int idx = 0;
GstXPixmap *xpixmap = NULL;
int i = 0;
- int (*handler) (Display *, XErrorEvent *) = NULL;
/* We take the flow_lock. If expose is in there we don't want to run
concurrently from the data flow thread */
+ g_mutex_lock (&evaspixmapsink->flow_lock);
if (G_UNLIKELY (evaspixmapsink->xpixmap[idx] == NULL)) {
GST_WARNING_OBJECT (evaspixmapsink, "xpixmap is NULL. Skip buffer_put.");
+ g_mutex_unlock (&evaspixmapsink->flow_lock);
return FALSE;
}
if (evaspixmapsink->visible == FALSE) {
GST_WARNING_OBJECT (evaspixmapsink, "visible is FALSE. Skip buffer_put.");
+ g_mutex_unlock (&evaspixmapsink->flow_lock);
return TRUE;
}
if (!evaspixmapbuf) {
GST_WARNING_OBJECT (evaspixmapsink,
"evaspixmapbuf is NULL. Skip buffer_put.");
+ g_mutex_unlock (&evaspixmapsink->flow_lock);
return TRUE;
}
g_mutex_lock (&evaspixmapsink->pixmap_ref_lock);
GST_LOG_OBJECT (evaspixmapsink,
"Could not find a pixmap with idle state, skip buffer_put.");
g_mutex_unlock (&evaspixmapsink->pixmap_ref_lock);
+ g_mutex_unlock (&evaspixmapsink->flow_lock);
return TRUE;
}
}
evaspixmapsink->result_prev.w, evaspixmapsink->result_prev.h, result.w,
result.h);
for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) {
- DRI2CreateDrawable (evaspixmapsink->xcontext->disp,
- evaspixmapsink->xpixmap[i]->pixmap);
- gst_evaspixmapsink_xpixmap_fillblack (evaspixmapsink->bufmgr_for_black,
- evaspixmapsink->xcontext->disp, evaspixmapsink->xpixmap[i]->pixmap);
- DRI2DestroyDrawable (evaspixmapsink->xcontext->disp,
- evaspixmapsink->xpixmap[i]->pixmap);
+ XFillRectangle (evaspixmapsink->xcontext->disp,
+ evaspixmapsink->xpixmap[i]->pixmap, evaspixmapsink->xpixmap[i]->gc, 0,
+ 0, evaspixmapsink->xpixmap[i]->width,
+ evaspixmapsink->xpixmap[i]->height);
GST_LOG_OBJECT (evaspixmapsink,
"fill black to xpixmap[%ld] with size(w:%d,h:%d)",
evaspixmapsink->xpixmap[i]->pixmap, evaspixmapsink->xpixmap[i]->width,
if (src_input.h % 2 == 1) {
src_input.h += 1;
}
- error_caught = FALSE;
- handler = XSetErrorHandler (gst_evaspixmapsink_handle_xerror);
GST_LOG_OBJECT (evaspixmapsink,
- "screen[%dx%d],pixmap[%d,%d,%dx%d],idx(%d)[%ld],method[%d],rotate[%d],src[%dx%d],dst[%d,%d,%dx%d],input[%d,%d,%dx%d],result[%d,%d,%dx%d]",
+ "screen[%dx%d],pixmap[%d,%d,%dx%d],method[%d],rotate[%d],src[%dx%d],dst[%d,%d,%dx%d],input[%d,%d,%dx%d],result[%d,%d,%dx%d]",
evaspixmapsink->scr_w, evaspixmapsink->scr_h,
evaspixmapsink->xpixmap[idx]->x, evaspixmapsink->xpixmap[idx]->y,
evaspixmapsink->xpixmap[idx]->width,
evaspixmapsink->xpixmap[idx]->height,
- idx, evaspixmapsink->xpixmap[idx]->pixmap,
evaspixmapsink->display_geometry_method, rotate, src_origin.w,
src_origin.h, dst.x, dst.y, dst.w, dst.h, src_input.x, src_input.y,
src_input.w, src_input.h, result.x, result.y, result.w, result.h);
GST_WARNING_OBJECT (evaspixmapsink,
"visible is FALSE. skip this image...");
}
- XSync (evaspixmapsink->xcontext->disp, FALSE);
- if (ret != Success || error_caught) {
- GST_WARNING ("putimage error");
- if (evaspixmapsink->xpixmap[idx]->ref > 0) {
- evaspixmapsink->xpixmap[idx]->ref--;
- evaspixmapsink->xpixmap[idx]->damaged_time = 0;
- GST_INFO_OBJECT (evaspixmapsink,
- "pixmap ref-count DECREASED : pixmap(%ld), refcount(%d), damaged_time(%d), idx(%d)",
- evaspixmapsink->xpixmap[idx]->pixmap,
- evaspixmapsink->xpixmap[idx]->ref,
- evaspixmapsink->xpixmap[idx]->damaged_time,
- evaspixmapsink->last_updated_idx);
- }
- }
- /* Reset error handler */
- if (handler) {
- error_caught = FALSE;
- XSetErrorHandler (handler);
- }
} else
#endif /* HAVE_XSHM */
{
XSync (evaspixmapsink->xcontext->disp, FALSE);
g_mutex_unlock (&evaspixmapsink->x_lock);
+ g_mutex_unlock (&evaspixmapsink->flow_lock);
return TRUE;
/* Preview area is not updated before other UI is updated in the screen. */
XSetForeground (evaspixmapsink->xcontext->disp, xpixmap->gc,
evaspixmapsink->xcontext->black);
- DRI2CreateDrawable (evaspixmapsink->xcontext->disp, xpixmap->pixmap);
- gst_evaspixmapsink_xpixmap_fillblack (evaspixmapsink->bufmgr_for_black,
- evaspixmapsink->xcontext->disp, xpixmap->pixmap);
- DRI2DestroyDrawable (evaspixmapsink->xcontext->disp, xpixmap->pixmap);
+ XFillRectangle (evaspixmapsink->xcontext->disp, xpixmap->pixmap, xpixmap->gc,
+ evaspixmapsink->render_rect.x, evaspixmapsink->render_rect.y,
+ evaspixmapsink->render_rect.w, evaspixmapsink->render_rect.h);
XSync (evaspixmapsink->xcontext->disp, FALSE);
evaspixmapsink->video_width, evaspixmapsink->video_height);
GST_INFO_OBJECT (evaspixmapsink, "Use aligned width,height[%dx%d]",
evaspixmapsink->aligned_width, evaspixmapsink->aligned_height);
- evaspixmapsink->is_zero_copy_format = TRUE;
break;
default:
GST_INFO_OBJECT (evaspixmapsink, "Use original width,height of caps");
- evaspixmapsink->is_zero_copy_format = FALSE;
break;
}
evaspixmapsink->evas_pixmap_buf =
if (evaspixmapsink->evas_pixmap_buf->xvimage->data) {
img_data =
- (XV_PUTIMAGE_DATA_PTR) evaspixmapsink->evas_pixmap_buf->xvimage->
- data;
+ (XV_PUTIMAGE_DATA_PTR) evaspixmapsink->evas_pixmap_buf->
+ xvimage->data;
XV_PUTIMAGE_INIT_DATA (img_data);
mem = gst_buffer_peek_memory (buf, 1);
img_data->bo[2]);
/* export bo */
if (img_data->bo[0]) {
- img_data->YBuf = tbm_bo_export ((tbm_bo) img_data->bo[0]);
+ img_data->YBuf = tbm_bo_export((tbm_bo)img_data->bo[0]);
}
if (img_data->bo[1]) {
- img_data->CbBuf = tbm_bo_export ((tbm_bo) img_data->bo[1]);
+ img_data->CbBuf = tbm_bo_export((tbm_bo)img_data->bo[1]);
}
if (img_data->bo[2]) {
- img_data->CrBuf = tbm_bo_export ((tbm_bo) img_data->bo[2]);
+ img_data->CrBuf = tbm_bo_export((tbm_bo)img_data->bo[2]);
}
if (mm_video_buf->type != MM_VIDEO_BUFFER_TYPE_TBM_BO) {
mm_video_buf->type = MM_VIDEO_BUFFER_TYPE_TBM_BO;
if (mm_video_buf && g_cnt < 20)
input_dump (mm_video_buf);
#endif
- g_mutex_lock (&evaspixmapsink->flow_lock);
if (!gst_evaspixmap_buffer_put (evaspixmapsink,
evaspixmapsink->evas_pixmap_buf)) {
- g_mutex_unlock (&evaspixmapsink->flow_lock);
goto no_pixmap;
}
- g_mutex_unlock (&evaspixmapsink->flow_lock);
return GST_FLOW_OK;
if ((peer = gst_pad_get_peer (GST_VIDEO_SINK_PAD (evaspixmapsink)))) {
GstEvent *event;
- GstVideoRectangle src = { 0, };
- GstVideoRectangle dst = { 0, };
- GstVideoRectangle result = { 0, };
-
+ GstVideoRectangle src, dst, result;
gdouble x, y, xscale = 1.0, yscale = 1.0;
event = gst_event_new_navigation (structure);
/* We calculate scaling using the original video frames geometry to include
pixel aspect ratio scaling. */
- if (result.w != 0)
- xscale = (gdouble) evaspixmapsink->video_width / result.w;
- if (result.h != 0)
- yscale = (gdouble) evaspixmapsink->video_height / result.h;
+ xscale = (gdouble) evaspixmapsink->video_width / result.w;
+ yscale = (gdouble) evaspixmapsink->video_height / result.h;
/* Converting pointer coordinates to the non scaled geometry */
if (gst_structure_get_double (structure, "pointer_x", &x)) {
guint xw = 0;
guint xh = 0;
int i = 0;
- int j = 0;
- int empty = -1;
- gboolean full = TRUE;
XGCValues gc_values_black;
gc_values_black.foreground = 0xff000000;
if (evaspixmapsink->need_to_fill_black) {
for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) {
g_mutex_lock (&evaspixmapsink->x_lock);
- DRI2CreateDrawable (evaspixmapsink->xcontext->disp,
- evaspixmapsink->xpixmap[i]->pixmap);
- gst_evaspixmapsink_xpixmap_fillblack
- (evaspixmapsink->bufmgr_for_black,
- evaspixmapsink->xcontext->disp,
- evaspixmapsink->xpixmap[i]->pixmap);
- DRI2DestroyDrawable (evaspixmapsink->xcontext->disp,
- evaspixmapsink->xpixmap[i]->pixmap);
+ XFillRectangle (evaspixmapsink->xcontext->disp,
+ evaspixmapsink->xpixmap[i]->pixmap,
+ evaspixmapsink->xpixmap[i]->gc, 0, 0,
+ evaspixmapsink->xpixmap[i]->width,
+ evaspixmapsink->xpixmap[i]->height);
GST_LOG_OBJECT (evaspixmapsink,
"fill black to xpixmap[%ld] with size(w:%d,h:%d)",
evaspixmapsink->xpixmap[i]->pixmap,
}
goto GO_OUT_OF_FUNC;
}
+ evaspixmapsink->need_to_fill_black = FALSE;
GST_INFO_OBJECT (evaspixmapsink, "creation pixmap_id[%d]:%ld success", i,
pixmap_id[i]);
GST_DEBUG_OBJECT (evaspixmapsink,
"evas_object_width(%d),evas_object_height(%d),pixmap:%ld,depth:%d",
evas_object_width, evas_object_height, pixmap_id[i],
DefaultDepth (dpy, DefaultScreen (dpy)));
- DRI2CreateDrawable (evaspixmapsink->xcontext->disp, pixmap_id[i]);
- gst_evaspixmapsink_xpixmap_fillblack
- (evaspixmapsink->bufmgr_for_black,
- evaspixmapsink->xcontext->disp, pixmap_id[i]);
- DRI2DestroyDrawable (evaspixmapsink->xcontext->disp, pixmap_id[i]);
}
- evaspixmapsink->need_to_fill_black = FALSE;
}
- /* keep previous pixmap id */
for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) {
if (evaspixmapsink->xpixmap[i]->pixmap
&& pixmap_id[i] != evaspixmapsink->xpixmap[i]->pixmap) {
g_mutex_unlock (&evaspixmapsink->x_lock);
g_mutex_lock (&evaspixmapsink->pixmap_ref_lock);
- /* find empty spaces */
- for (j = 0; j < NUM_OF_PREV_PIXMAP; j++) {
- if (!evaspixmapsink->prev[j]->pixmap) {
- empty = j;
- full = FALSE;
- break;
- }
- }
- if (full || empty == -1)
- GST_ERROR ("previous pixmap pool is full");
- else {
- evaspixmapsink->prev[empty]->pixmap =
- evaspixmapsink->xpixmap[i]->pixmap;
- evaspixmapsink->prev[empty]->gc = evaspixmapsink->xpixmap[i]->gc;
- evaspixmapsink->prev[empty]->damage = evaspixmapsink->damage[i];
- GST_LOG ("saved %ld %p %ld",
- evaspixmapsink->prev[empty]->pixmap,
- evaspixmapsink->prev[empty]->gc,
- evaspixmapsink->prev[empty]->damage);
+
+ /* If we reset another pixmap, do below */
+ if (evaspixmapsink->xpixmap[i]->prev_pixmap) {
+ GST_LOG_OBJECT (evaspixmapsink,
+ "Free pixmap(%ld), gc(%p), destroy previous damage(%ld)",
+ evaspixmapsink->xpixmap[i]->prev_pixmap,
+ evaspixmapsink->xpixmap[i]->prev_gc,
+ evaspixmapsink->prev_damage[i]);
+ g_mutex_lock (&evaspixmapsink->x_lock);
+ XFreePixmap (evaspixmapsink->xcontext->disp,
+ evaspixmapsink->xpixmap[i]->prev_pixmap);
+ XFreeGC (evaspixmapsink->xcontext->disp,
+ evaspixmapsink->xpixmap[i]->prev_gc);
+ XDamageDestroy (evaspixmapsink->xcontext->disp,
+ evaspixmapsink->prev_damage[i]);
+ XSync (evaspixmapsink->xcontext->disp, FALSE);
+ g_mutex_unlock (&evaspixmapsink->x_lock);
+ evaspixmapsink->prev_damage[i] = 0;
}
+ evaspixmapsink->xpixmap[i]->prev_pixmap =
+ evaspixmapsink->xpixmap[i]->pixmap;
+ evaspixmapsink->xpixmap[i]->prev_gc = evaspixmapsink->xpixmap[i]->gc;
evaspixmapsink->xpixmap[i]->pixmap = 0;
evaspixmapsink->xpixmap[i]->ref = 0;
evaspixmapsink->xpixmap[i]->damaged_time = 0;
evaspixmapsink->xpixmap[i]->height = xh;
/* Create XDamage */
+ if (evaspixmapsink->damage[i]) {
+ evaspixmapsink->prev_damage[i] = evaspixmapsink->damage[i];
+ }
evaspixmapsink->damage[i] =
XDamageCreate (dpy, evaspixmapsink->xpixmap[i]->pixmap,
XDamageReportRawRectangles);
"xpixmap[%d]->(pixmap:%ld,gc:%p), damage[%d]:%ld", i,
evaspixmapsink->xpixmap[i]->pixmap, evaspixmapsink->xpixmap[i]->gc, i,
evaspixmapsink->damage[i]);
+
+ /* Fill blackcolor for the new pixmap */
+ XFillRectangle (evaspixmapsink->xcontext->disp, pixmap_id[i],
+ evaspixmapsink->xpixmap[i]->gc, 0, 0, evaspixmapsink->w,
+ evaspixmapsink->h);
+ GST_LOG_OBJECT (evaspixmapsink,
+ "fill black to xpixmap[%ld] with size(w:%d,h:%d)", pixmap_id[i],
+ evaspixmapsink->w, evaspixmapsink->h);
}
XSync (dpy, FALSE);
"epipe_request_count(%d), skip ecore_pipe_write()",
evaspixmapsink->epipe_request_count);
} else {
- GST_WARNING_OBJECT (evaspixmapsink, ">>>>>ecore_pipe_write()");
ecore_pipe_write (evaspixmapsink->epipe, evaspixmapsink,
sizeof (GstEvasPixmapSink));
evaspixmapsink->epipe_request_count++;
}
}
if (evaspixmapsink->xcontext) {
- g_mutex_lock (&evaspixmapsink->flow_lock);
gst_evaspixmap_buffer_put (evaspixmapsink,
evaspixmapsink->evas_pixmap_buf);
- g_mutex_unlock (&evaspixmapsink->flow_lock);
}
}
break;
GST_INFO_OBJECT (evaspixmapsink, "object hide (forcely)");
g_mutex_unlock (&evaspixmapsink->flow_lock);
} else {
- g_mutex_lock (&evaspixmapsink->flow_lock);
gst_evaspixmap_buffer_put (evaspixmapsink,
evaspixmapsink->evas_pixmap_buf);
- g_mutex_unlock (&evaspixmapsink->flow_lock);
}
} else {
GST_WARNING_OBJECT (evaspixmapsink, "evas image object was not set");
}
static void
-gst_evaspixmapsink_xpixmap_fillblack (tbm_bufmgr bufmgr, Display * disp,
- Pixmap pixmap)
-{
- unsigned int attachments[1] = { DRI2BufferFrontLeft };
- int dri2_out_temp, dri2_out_width, dri2_out_height;
- DRI2Buffer *pDRI2Buffer =
- DRI2GetBuffers (disp, pixmap, &dri2_out_width, &dri2_out_height,
- attachments, 1, &dri2_out_temp);
- if (!pDRI2Buffer)
- GST_ERROR ("failed to get DRI2 buffers for fillblack.");
- else {
- GST_DEBUG ("width=%d height=%d name=%d flags=0x%x", dri2_out_width,
- dri2_out_height, pDRI2Buffer[0].name, pDRI2Buffer[0].flags);
- tbm_bo bo = tbm_bo_import (bufmgr, pDRI2Buffer[0].name);
- memset (tbm_bo_map (bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE).ptr, 0,
- tbm_bo_size (bo));
- tbm_bo_unmap (bo);
- tbm_bo_unref (bo);
- XFree (pDRI2Buffer);
- }
-}
-
-static GstFlowReturn
-gst_evaspixmapsink_epipe_reset (GstEvasPixmapSink * evaspixmapsink)
-{
- if (evaspixmapsink == NULL) {
- GST_ERROR ("handle is NULL");
- return GST_FLOW_ERROR;
- }
-
- if (evaspixmapsink->epipe) {
- GST_DEBUG ("ecore-pipe will be deleted");
- ecore_pipe_del (evaspixmapsink->epipe);
- evaspixmapsink->epipe = NULL;
- }
-
- if (!evaspixmapsink->epipe) {
- evaspixmapsink->epipe =
- ecore_pipe_add ((Ecore_Pipe_Cb) ecore_pipe_callback_handler,
- evaspixmapsink);
- if (!evaspixmapsink->epipe) {
- GST_ERROR ("ecore-pipe create failed");
- return GST_FLOW_ERROR;
- }
- GST_DEBUG ("ecore-pipe create success");
- }
- evaspixmapsink->epipe_request_count = 0;
-
- return GST_FLOW_OK;
-}
-
-static void
gst_evaspixmapsink_reset (GstEvasPixmapSink * evaspixmapsink)
{
FUNCTION_ENTER ();
evaspixmapsink->damage[i] = 0;
}
}
- for (i = 0; i < NUM_OF_PREV_PIXMAP; i++) {
- if (evaspixmapsink->prev[i]->damage) {
- g_mutex_lock (&evaspixmapsink->x_lock);
- GST_DEBUG_OBJECT (evaspixmapsink, "Free damage");
- XDamageDestroy (evaspixmapsink->xcontext->disp,
- evaspixmapsink->prev[i]->damage);
- g_mutex_unlock (&evaspixmapsink->x_lock);
- evaspixmapsink->prev[i]->damage = 0;
- }
- }
if (evaspixmapsink->handler) {
ecore_event_handler_del (evaspixmapsink->handler);
evaspixmapsink->xpixmap[i]);
evaspixmapsink->xpixmap[i] = NULL;
}
- for (i = 0; i < NUM_OF_PREV_PIXMAP; i++) {
- g_mutex_lock (&evaspixmapsink->x_lock);
- if (evaspixmapsink->prev[i]->pixmap) {
- GST_DEBUG_OBJECT (evaspixmapsink, "Free pixmap");
- XFreePixmap (evaspixmapsink->xcontext->disp,
- evaspixmapsink->prev[i]->pixmap);
- evaspixmapsink->prev[i]->pixmap = 0;
- }
- if (evaspixmapsink->prev[i]->gc) {
- GST_DEBUG_OBJECT (evaspixmapsink, "Free gc");
- XFreeGC (evaspixmapsink->xcontext->disp, evaspixmapsink->prev[i]->gc);
- evaspixmapsink->prev[i]->gc = NULL;
- }
- XSync (evaspixmapsink->xcontext->disp, FALSE);
- g_mutex_unlock (&evaspixmapsink->x_lock);
- }
if (evaspixmapsink->eo) {
evas_object_image_native_surface_set (evaspixmapsink->eo, NULL);
evas_object_image_data_set (evaspixmapsink->eo, NULL);
FUNCTION_ENTER ();
GstEvasPixmapSink *evaspixmapsink;
- int i = 0;
evaspixmapsink = GST_EVASPIXMAPSINK (object);
GST_DEBUG_OBJECT (evaspixmapsink, "[START]");
g_free (evaspixmapsink->par);
evaspixmapsink->par = NULL;
}
- for (i = 0; i < NUM_OF_PREV_PIXMAP; i++) {
- g_free (evaspixmapsink->prev[i]);
- }
g_mutex_clear (&evaspixmapsink->x_lock);
g_mutex_clear (&evaspixmapsink->flow_lock);
g_mutex_clear (&evaspixmapsink->pixmap_ref_lock);
- if (evaspixmapsink->bufmgr_for_black)
- tbm_bufmgr_deinit (evaspixmapsink->bufmgr_for_black);
GST_DEBUG_OBJECT (evaspixmapsink, "[END]");
static void
gst_evaspixmapsink_init (GstEvasPixmapSink * evaspixmapsink)
{
- GST_DEBUG_OBJECT (evaspixmapsink, "[START]");
+ FUNCTION_ENTER ();
int i = 0;
evaspixmapsink->display_name = NULL;
evaspixmapsink->xpixmap[i] = NULL;
evaspixmapsink->damage[i] = 0;
}
- for (i = 0; i < NUM_OF_PREV_PIXMAP; i++) {
- evaspixmapsink->prev[i] = NULL;
- }
-
- /* create prev structure */
- for (i = 0; i < NUM_OF_PREV_PIXMAP; i++) {
- /* prev can be created in this function only */
- evaspixmapsink->prev[i] = g_new0 (GstPrevPixmap, 1);
- if (!evaspixmapsink->prev[i]) {
- GST_ERROR_OBJECT (evaspixmapsink, "prev structure is not valid..");
- int j = 0;
- for (j = 0; j < i; j++) {
- g_free (evaspixmapsink->prev[j]);
- }
- }
- }
evaspixmapsink->num_of_pixmaps = NUM_OF_PIXMAP;
evaspixmapsink->evas_pixmap_buf = NULL;
evaspixmapsink->use_origin_size = FALSE;
evaspixmapsink->former_origin_size = FALSE;
evaspixmapsink->last_updated_idx = -1;
- evaspixmapsink->bufmgr_for_black = tbm_bufmgr_init (-1);
- if (!evaspixmapsink->bufmgr_for_black)
- GST_WARNING ("tbm_bufmgr_init is failed");
memset (&evaspixmapsink->src_prev, 0, sizeof (GstVideoRectangle));
memset (&evaspixmapsink->result_prev, 0, sizeof (GstVideoRectangle));
Add XInitThread() before XOpenDisplay() */
if (!XInitThreads ())
GST_WARNING ("FAIL to call XInitThreads()");
-
- GST_DEBUG_OBJECT (evaspixmapsink, "[END]");
}
static void