return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
}
-
-static void
-ecore_evas_post_render_callback_handler(Ecore_Evas *ee)
-{
- int temp_time = 0;
- int i = 0;
- guint idx = 0;
- GstXPixmap *xpixmap = NULL;
-
- GstEvasPixmapSink *evaspixmapsink = ecore_evas_data_get (ee, "evaspixmapsink_handle");
- if (!evaspixmapsink) {
- GST_WARNING ("could not get an evaspixmapsink handle");
- return;
- }
- if (evaspixmapsink->last_updated_idx == -1) {
- GST_WARNING_OBJECT (evaspixmapsink, "last_updated_id = -1, skip it");
- return;
- }
-
- GST_DEBUG_OBJECT (evaspixmapsink, "[START] Ecore_Evas(0x%x), Evas_Object(0x%x)", ee, evaspixmapsink->eo);
-
- MMTA_ACUM_ITEM_BEGIN("evaspixmapsink - ecore evas post render cb : TOTAL", FALSE);
-
- g_mutex_lock (evaspixmapsink->pixmap_ref_lock);
- /* find a oldest damaged pixmap */
- for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) {
- xpixmap = evaspixmapsink->xpixmap[i];
- if (!xpixmap) {
- g_mutex_unlock (evaspixmapsink->pixmap_ref_lock);
- GST_WARNING_OBJECT (evaspixmapsink, "xpixmap is null..");
- MMTA_ACUM_ITEM_END("evaspixmapsink - ecore evas post render cb : TOTAL", FALSE);
- return;
- }
- if ((xpixmap->ref == 2) && xpixmap->damaged_time) {
- if (temp_time == 0) {
- temp_time = xpixmap->damaged_time;
- idx = i;
- } else {
- if (temp_time > xpixmap->damaged_time) {
- temp_time = xpixmap->damaged_time;
- idx = i;
- }
- }
- }
- }
-
- xpixmap = evaspixmapsink->xpixmap[idx];
- if ((xpixmap->ref == 2) && xpixmap->damaged_time) {
- GST_INFO_OBJECT (evaspixmapsink,"pixmap ref-count DECREASED : pixmap(%d), refcount(%d), damaged_time(%d), idx(%d)",
- xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time, idx);
- xpixmap->ref = 0;
- xpixmap->damaged_time = 0;
- } else {
- GST_LOG_OBJECT (evaspixmapsink, "There's nothing to update");
- }
-
- g_mutex_unlock (evaspixmapsink->pixmap_ref_lock);
-
- MMTA_ACUM_ITEM_END("evaspixmapsink - ecore evas post render cb : TOTAL", FALSE);
-
- GST_DEBUG_OBJECT (evaspixmapsink, "[END]");
- return;
-}
-
-
static void
ecore_pipe_callback_handler (void *data, void *buffer, unsigned int nbyte)
{
/* find a oldest damaged pixmap */
int temp_time = 0;
for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) {
- xpixmap = evaspixmapsink->xpixmap[i];
- if (xpixmap->ref == 1 && xpixmap->damaged_time) {
- if (temp_time == 0) {
- temp_time = xpixmap->damaged_time;
- idx = i;
- } else {
- if (temp_time > xpixmap->damaged_time) {
+ if (evaspixmapsink->last_updated_idx == i) {
+ continue;
+ } else {
+ xpixmap = evaspixmapsink->xpixmap[i];
+ if (xpixmap->ref > 0 && xpixmap->damaged_time) {
+ if (temp_time == 0) {
temp_time = xpixmap->damaged_time;
idx = i;
+ } else {
+ if (temp_time > xpixmap->damaged_time) {
+ temp_time = xpixmap->damaged_time;
+ idx = i;
+ }
}
}
}
}
xpixmap = evaspixmapsink->xpixmap[idx];
- if (xpixmap->damaged_time == 0 || xpixmap->ref > 1) {
- GST_WARNING_OBJECT (evaspixmapsink,"skip update.. idx[%d] : damaged_time[%d], ref[%d]",idx, xpixmap->damaged_time, xpixmap->ref);
- } else {
- if (xpixmap->pixmap) {
- if (evaspixmapsink->last_updated_idx != idx) {
- Evas_Native_Surface surf;
- surf.version = EVAS_NATIVE_SURFACE_VERSION;
- surf.type = EVAS_NATIVE_SURFACE_X11;
- surf.data.x11.visual = ecore_x_default_visual_get(ecore_x_display_get(), ecore_x_default_screen_get());
- surf.data.x11.pixmap = xpixmap->pixmap;
- if (evaspixmapsink->eo) {
- evas_object_image_native_surface_set(evaspixmapsink->eo, NULL);
- }
- __ta__("evaspixmapsink - ecore thread cb : _native_surface_set", evas_object_image_native_surface_set(evaspixmapsink->eo, &surf); );
- GST_LOG_OBJECT (evaspixmapsink,"update, native_surface_set of xpixmap[%d]",idx);
- evaspixmapsink->last_updated_idx = idx;
+ if (xpixmap->pixmap) {
+ if (evaspixmapsink->last_updated_idx != idx) {
+ Evas_Native_Surface surf;
+ surf.version = EVAS_NATIVE_SURFACE_VERSION;
+ surf.type = EVAS_NATIVE_SURFACE_X11;
+ surf.data.x11.visual = ecore_x_default_visual_get(ecore_x_display_get(), ecore_x_default_screen_get());
+ surf.data.x11.pixmap = xpixmap->pixmap;
+ if (evaspixmapsink->eo) {
+ evas_object_image_native_surface_set(evaspixmapsink->eo, NULL);
}
- xpixmap->ref++;
+ __ta__("evaspixmapsink - ecore thread cb : _native_surface_set", evas_object_image_native_surface_set(evaspixmapsink->eo, &surf); );
+ GST_LOG_OBJECT (evaspixmapsink,"update, native_surface_set of xpixmap[%d]",idx);
+ if (evaspixmapsink->last_updated_idx == -1) {
+ xpixmap->damaged_time = 0;
+ GST_INFO_OBJECT (evaspixmapsink,"this is the first time to request to update : pixmap(%d), refcount(%d), damaged_time(%d), idx(%d)",
+ xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time, idx);
+ } else {
+ xpixmap = evaspixmapsink->xpixmap[evaspixmapsink->last_updated_idx];
+ xpixmap->ref--;
+ xpixmap->damaged_time = 0;
+ GST_INFO_OBJECT (evaspixmapsink,"pixmap ref-count DECREASED : pixmap(%d), refcount(%d), damaged_time(%d), idx(%d)",
+ xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time, evaspixmapsink->last_updated_idx);
+ }
+ evaspixmapsink->last_updated_idx = idx;
+ }
- MMTA_ACUM_ITEM_BEGIN("evaspixmapsink evas_object_image update", FALSE);
- evas_object_image_pixels_dirty_set (evaspixmapsink->eo, 1);
- evas_object_image_fill_set(evaspixmapsink->eo, 0, 0, evaspixmapsink->w, evaspixmapsink->h);
- evas_object_image_data_update_add(evaspixmapsink->eo, 0, 0, evaspixmapsink->w, evaspixmapsink->h);
- MMTA_ACUM_ITEM_END("evaspixmapsink evas_object_image update", FALSE);
+ MMTA_ACUM_ITEM_BEGIN("evaspixmapsink evas_object_image update", FALSE);
+ evas_object_image_pixels_dirty_set (evaspixmapsink->eo, 1);
+ evas_object_image_fill_set(evaspixmapsink->eo, 0, 0, evaspixmapsink->w, evaspixmapsink->h);
+ evas_object_image_data_update_add(evaspixmapsink->eo, 0, 0, evaspixmapsink->w, evaspixmapsink->h);
+ MMTA_ACUM_ITEM_END("evaspixmapsink evas_object_image update", FALSE);
- GST_LOG_OBJECT (evaspixmapsink,"request to update : pixmap idx(%d), ref(%d)", idx, xpixmap->ref);
- } else {
- GST_ERROR_OBJECT (evaspixmapsink,"pixmap is NULL..");
- g_mutex_unlock (evaspixmapsink->pixmap_ref_lock);
- return;
- }
+ //GST_LOG_OBJECT (evaspixmapsink,"request to update : pixmap idx(%d), ref(%d)", idx, xpixmap->ref);
+ } else {
+ GST_ERROR_OBJECT (evaspixmapsink,"pixmap is NULL..");
+ g_mutex_unlock (evaspixmapsink->pixmap_ref_lock);
+ return;
}
}
g_mutex_unlock (evaspixmapsink->pixmap_ref_lock);
{
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));
no_sink:
{
- GST_WARNING_OBJECT (evaspixmapsink,"no sink found");
+ GST_WARNING ("no sink found");
return;
}
}
int rotate = 0;
int ret = 0;
int idx = 0;
+ GstXPixmap *xpixmap = NULL;
MMTA_ACUM_ITEM_BEGIN("evaspixmapsink evaspixmap_buffer_put()", FALSE);
return TRUE;
}
- /* check whether if a pixmap buffer is available, or wait here */
- gboolean wait = TRUE;
- int timeout_count = 3 * 1; /* 3 frames */
- GstXPixmap *xpixmap = NULL;
- do {
- for (idx = 0; idx < evaspixmapsink->num_of_pixmaps; idx++) {
- g_mutex_lock (evaspixmapsink->pixmap_ref_lock);
- if (idx <= evaspixmapsink->last_damaged_pixmap_idx) {
- if (evaspixmapsink->last_damaged_pixmap_idx == evaspixmapsink->num_of_pixmaps - 1) {
- /* do nothing */
- } else {
- g_mutex_unlock (evaspixmapsink->pixmap_ref_lock);
- continue;
- }
- }
+ for (idx = 0; idx < evaspixmapsink->num_of_pixmaps; idx++) {
+ g_mutex_lock (evaspixmapsink->pixmap_ref_lock);
+ if (idx == evaspixmapsink->last_updated_idx) {
+ g_mutex_unlock (evaspixmapsink->pixmap_ref_lock);
+ continue;
+ } else {
xpixmap = evaspixmapsink->xpixmap[idx];
if (xpixmap->ref == 0 && xpixmap->damaged_time == 0) {
xpixmap->ref++;
- wait = FALSE;
- GST_INFO_OBJECT (evaspixmapsink, "found an available pixmap(%d) : xpixmap[%d]", xpixmap->pixmap, idx);
+ GST_LOG_OBJECT (evaspixmapsink, "found an available pixmap(%d) : xpixmap[%d]", xpixmap->pixmap, idx);
GST_INFO_OBJECT (evaspixmapsink,"pixmap ref-count INCREASED : pixmap(%d), refcount(%d)", xpixmap->pixmap, xpixmap->ref);
g_mutex_unlock (evaspixmapsink->pixmap_ref_lock);
break;
}
g_mutex_unlock (evaspixmapsink->pixmap_ref_lock);
}
- if (wait) {
- GST_WARNING_OBJECT (evaspixmapsink, "wait until a pixmap is available");
- /* wait */
- g_usleep (G_USEC_PER_SEC / 30);
- timeout_count--;
- //timeout_count = 0;
- if (timeout_count == 0) {
- GST_WARNING_OBJECT (evaspixmapsink, "TIME OUT..");
- g_mutex_unlock(evaspixmapsink->flow_lock);
- return FALSE;
- }
- }
- } while (wait);
+ }
+ if (idx == evaspixmapsink->num_of_pixmaps) {
+ GST_LOG_OBJECT (evaspixmapsink, "Could not find a pixmap with idle state, skip buffer_put." );
+ g_mutex_unlock(evaspixmapsink->flow_lock);
+ return TRUE;
+ }
gst_evaspixmapsink_xpixmap_update_geometry(evaspixmapsink, idx);
if(xpixmap->pixmap) {
GST_LOG_OBJECT (evaspixmapsink,"Free pixmap(%d)", xpixmap->pixmap);
XFreePixmap(evaspixmapsink->xcontext->disp, xpixmap->pixmap);
- xpixmap->pixmap = NULL;
+ xpixmap->pixmap = 0;
}
if (xpixmap->gc) {
}
GST_LOG_OBJECT (evaspixmapsink,"event_handler : got a damage event for pixmap(%d), refcount(%d), damaged_time(%d)",
xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time);
- evaspixmapsink->last_damaged_pixmap_idx = i;
g_mutex_unlock(evaspixmapsink->pixmap_ref_lock);
__ta__("evaspixmapsink ecore_pipe_write", ecore_pipe_write(evaspixmapsink->epipe, evaspixmapsink, sizeof(GstEvasPixmapSink)););
static void
gst_evaspixmapsink_manage_event_thread (GstEvasPixmapSink *evaspixmapsink)
{
- GThread *thread = NULL;
-
/* don't start the thread too early */
if (evaspixmapsink->xcontext == NULL) {
GST_ERROR_OBJECT (evaspixmapsink,"xcontext is NULL..");
GST_WARNING_OBJECT (evaspixmapsink,"could not create image");
return GST_FLOW_ERROR;
}
- no_pixmap:
- {
- /* No Pixmap available to put our image into */
- GST_WARNING_OBJECT (evaspixmapsink,"could not output image - no pixmap");
- return GST_FLOW_ERROR;
- }
}
static gboolean
if ((peer = gst_pad_get_peer (GST_VIDEO_SINK_PAD (evaspixmapsink)))) {
GstEvent *event;
- GstVideoRectangle src, dst, result;
+ GstVideoRectangle result;
gdouble x, y, xscale = 1.0, yscale = 1.0;
event = gst_event_new_navigation (structure);
int evas_object_height = 0;
int pixmap_width = 0;
int pixmap_height = 0;
- int xw = 0;
- int xh = 0;
+ unsigned int xw = 0;
+ unsigned int xh = 0;
int i = 0;
GST_DEBUG_OBJECT (evaspixmapsink,"[START]");
GST_LOG_OBJECT (evaspixmapsink,"Free pixmap(%d)", evaspixmapsink->xpixmap[i]->pixmap);
XFreePixmap(dpy, evaspixmapsink->xpixmap[i]->pixmap);
- evaspixmapsink->xpixmap[i]->pixmap = NULL;
+ evaspixmapsink->xpixmap[i]->pixmap = 0;
evaspixmapsink->xpixmap[i]->ref = 0;
evaspixmapsink->xpixmap[i]->damaged_time = 0;
GST_WARNING_OBJECT (evaspixmapsink,"xpixmap[%d]->(pixmap:%d,gc:%p), damage[%d]:%d",
i, evaspixmapsink->xpixmap[i]->pixmap, evaspixmapsink->xpixmap[i]->gc, i, evaspixmapsink->damage[i]);
}
- evaspixmapsink->last_damaged_pixmap_idx = -1;
XSync(dpy, FALSE);
case PROP_PIXMAP_WIDTH:
{
/* To do : code related to pixmap re-link */
- GST_WARNING_OBJECT (evaspixmapsink, "Not supported");
+ GST_LOG_OBJECT (evaspixmapsink, "Not supported");
break;
}
case PROP_PIXMAP_HEIGHT:
{
/* To do : code related to pixmap re-link */
- GST_WARNING_OBJECT (evaspixmapsink, "Not supported");
+ GST_LOG_OBJECT (evaspixmapsink, "Not supported");
break;
}
case PROP_DISPLAY_GEOMETRY_METHOD:
case PROP_EVAS_OBJECT:
{
Evas_Object *eo = g_value_get_pointer (value);
- Ecore_Evas *ee = NULL;
- Evas *e = NULL;
if ( is_evas_image_object (eo)) {
if (!evaspixmapsink->epipe) {
evaspixmapsink->epipe = ecore_pipe_add (ecore_pipe_callback_handler, evaspixmapsink);
/* add evas object callbacks on a new evas image object */
evas_object_event_callback_add (evaspixmapsink->eo, EVAS_CALLBACK_DEL, evas_callback_del_event, evaspixmapsink);
evas_object_event_callback_add (evaspixmapsink->eo, EVAS_CALLBACK_RESIZE, evas_callback_resize_event, evaspixmapsink);
- e = evas_object_evas_get(eo);
- if (!e) {
- GST_ERROR_OBJECT (evaspixmapsink,"could not get evas(0x%x) from evas image object(0x%x)",e, eo);
- } else {
- ee = ecore_evas_ecore_evas_get(e);
- if (!ee) {
- GST_ERROR_OBJECT (evaspixmapsink,"could not get ecore_evas(0x%x)",ee);
- } else {
- evaspixmapsink->ee = ee;
- ecore_evas_data_set (evaspixmapsink->ee, "evaspixmapsink_handle", evaspixmapsink);
- ecore_evas_callback_post_render_set(ee, ecore_evas_post_render_callback_handler);
- GST_INFO_OBJECT (evaspixmapsink,"ecore_evas_callback_post_render_set() success, Ecore_Evas(0x%x), Evas_Object(0x%x)", ee, eo);
- }
- }
GST_INFO_OBJECT (evaspixmapsink,"Evas Image Object(%x) is set", evaspixmapsink->eo);
}
} else {
break;
case PROP_PIXMAP_WIDTH:
{
- GST_WARNING_OBJECT (evaspixmapsink, "Not supported");
+ GST_LOG_OBJECT (evaspixmapsink, "Not supported");
break;
}
case PROP_PIXMAP_HEIGHT:
{
- GST_WARNING_OBJECT (evaspixmapsink, "Not supported");
+ GST_LOG_OBJECT (evaspixmapsink, "Not supported");
break;
}
case PROP_DISPLAY_GEOMETRY_METHOD:
ecore_pipe_del (evaspixmapsink->epipe);
evaspixmapsink->epipe = NULL;
}
- if (evaspixmapsink->ee) {
- ecore_evas_callback_post_render_set(evaspixmapsink->ee, NULL);
- }
GST_DEBUG_OBJECT (evaspixmapsink,"[END]");
evaspixmapsink->aligned_height = 0;
evaspixmapsink->stop_video = FALSE;
evaspixmapsink->eo = NULL;
- evaspixmapsink->ee = NULL;
evaspixmapsink->epipe = NULL;
evaspixmapsink->do_link = FALSE;
evaspixmapsink->flip = DEF_DISPLAY_FLIP;
evaspixmapsink->previous_origin_size = FALSE;
evaspixmapsink->num_of_pixmaps = NUM_OF_PIXMAP;
- evaspixmapsink->last_damaged_pixmap_idx = -1;
MMTA_INIT();
}