emotion: better handling of gstreamer samsung backend.

SVN revision: 63172
This commit is contained in:
Cedric BAIL 2011-09-04 21:12:34 +00:00
parent d88567f49f
commit d6c8e07236
2 changed files with 34 additions and 16 deletions

View File

@ -1514,6 +1514,18 @@ _eos_sync_fct(GstBus *bus __UNUSED__, GstMessage *msg, gpointer data)
gst_element_state_get_name(new_state));
break;
}
case GST_MESSAGE_WARNING:
{
GError *error;
gchar *debug;
gst_message_parse_warning(msg, &error, &debug);
WRN("WARNING from element %s: %s\n", GST_OBJECT_NAME(msg->src), error->message);
WRN("Debugging info: %s\n", (debug) ? debug : "none");
g_error_free(error);
g_free(debug);
break;
}
default:
WRN("bus say: %s [%i - %s]",
GST_MESSAGE_SRC_NAME(msg),

View File

@ -212,13 +212,15 @@ _evas_video_st12_multiplane(unsigned char *evas_data, const unsigned char *gst_d
}
for (j = 0; j < ((h / 2) / 16) / 2; j++, i++)
rows[i] = mp_buf->uaddr[1] + j * w * 2 * 16;
{
rows[i] = mp_buf->uaddr[1] + j * w * 2 * 16 * 2;
}
if (((h / 2) / 16) % 2)
rows[i] = mp_buf->uaddr[0] + j * w * 2 * 16;
rows[i] = mp_buf->uaddr[1] + j * w * 2 * 16 * 2;
}
static void
_evas_video_st12(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h, unsigned int output_height __UNUSED__)
_evas_video_st12(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w __UNUSED__, unsigned int h, unsigned int output_height __UNUSED__)
{
const SCMN_IMGB *imgb = (const SCMN_IMGB *) gst_data;
const unsigned char **rows;
@ -227,17 +229,17 @@ _evas_video_st12(unsigned char *evas_data, const unsigned char *gst_data, unsign
rows = (const unsigned char **)evas_data;
for (i = 0; i < (h / 32) / 2; i++)
rows[i] = imgb->uaddr[0] + i * w * 2 * 32;
rows[i] = imgb->uaddr[0] + i * imgb->stride[0] * 2 * 32;
if ((h / 32) % 2)
{
rows[i] = imgb->uaddr[0] + i * w * 2 * 32;
rows[i] = imgb->uaddr[0] + i * imgb->stride[0] * 2 * 32;
i++;
}
for (j = 0; j < ((h / 2) / 16) / 2; j++, i++)
rows[i] = imgb->uaddr[1] + j * w * 2 * 16;
if (((h / 2) / 16) % 2)
rows[i] = imgb->uaddr[1] + j * w * 2 * 16;
for (j = 0; j < (unsigned int) imgb->elevation[1] / 32 / 2; j++, i++)
rows[i] = imgb->uaddr[1] + j * imgb->stride[1] * 32 * 2;
if ((imgb->elevation[1] / 32) % 2)
rows[i++] = imgb->uaddr[1] + j * imgb->stride[1] * 32 * 2;
}
static const struct {
@ -565,6 +567,7 @@ evas_video_sink_preroll(GstBaseSink* bsink, GstBuffer* buffer)
caps = GST_BUFFER_CAPS(buffer);
structure = gst_caps_get_structure (caps, 0);
gst_structure_get_boolean(structure, "multiplane", &is_multiplane);
gst_caps_unref(caps);
if (is_multiplane)
priv->func = _evas_video_st12_multiplane;
@ -618,6 +621,7 @@ evas_video_sink_render(GstBaseSink* bsink, GstBuffer* buffer)
caps = GST_BUFFER_CAPS(buffer);
structure = gst_caps_get_structure (caps, 0);
gst_structure_get_boolean(structure, "multiplane", &is_multiplane);
gst_caps_unref(caps);
if (is_multiplane)
priv->func = _evas_video_st12_multiplane;
@ -689,12 +693,16 @@ evas_video_sink_samsung_main_render(void *data)
gst_data = (const guint8 *) imgb;
}
INF("sink main render [%i, %i] - [%i, %i]", priv->width, priv->height, stride, elevation);
evas_object_geometry_get(priv->o, NULL, NULL, &w, &h);
INF("sink main render [%i, %i] - [%i, %i] => [%i, %i] - [%i, %i]",
priv->width, priv->height,
stride, elevation,
w, h,
stride * w / priv->width, elevation * h / priv->height);
evas_object_image_alpha_set(priv->o, 0);
evas_object_image_colorspace_set(priv->o, priv->eformat);
evas_object_image_size_set(priv->o, stride, elevation);
evas_object_geometry_get(priv->o, NULL, NULL, &w, &h);
evas_object_image_fill_set(priv->o, 0, 0, stride * w / priv->width, elevation * h / priv->height);
evas_data = evas_object_image_data_get(priv->o, 1);
@ -722,9 +730,6 @@ evas_video_sink_samsung_main_render(void *data)
_emotion_video_pos_update(send->ev->obj, send->ev->position, vstream->length_time);
_emotion_frame_resize(send->ev->obj, priv->width, priv->height, send->ev->ratio);
if (priv->last_buffer) gst_buffer_unref(priv->last_buffer);
priv->last_buffer = gst_buffer_ref(buffer);
exit_point:
emotion_gstreamer_buffer_free(send);
@ -985,7 +990,6 @@ gstreamer_video_sink_new(Emotion_Gstreamer_Video *ev,
#define GST_PLAY_FLAG_NATIVE_VIDEO (1 << 6)
#define GST_PLAY_FLAG_DOWNLOAD (1 << 7)
#define GST_PLAY_FLAG_BUFFERING (1 << 8)
g_object_set(G_OBJECT(sink), "evas-object", obj, NULL);
g_object_set(G_OBJECT(sink), "ev", ev, NULL);
@ -993,10 +997,12 @@ gstreamer_video_sink_new(Emotion_Gstreamer_Video *ev,
evas_object_image_pixels_get_callback_set(obj, NULL, NULL);
g_object_get(G_OBJECT(playbin), "flags", &flags, NULL);
g_object_set(G_OBJECT(playbin), "flags", flags | GST_PLAY_FLAG_NATIVE_VIDEO | GST_PLAY_FLAG_DOWNLOAD | GST_PLAY_FLAG_BUFFERING, NULL);
g_object_set(G_OBJECT(playbin), "flags", flags | GST_PLAY_FLAG_NATIVE_VIDEO | GST_PLAY_FLAG_DOWNLOAD, NULL);
g_object_set(G_OBJECT(playbin), "video-sink", sink, NULL);
g_object_set(G_OBJECT(playbin), "uri", uri, NULL);
evas_object_image_pixels_get_callback_set(obj, NULL, NULL);
ev->pipeline = playbin;
ev->sink = sink;
ev->threads = eina_list_append(ev->threads,