X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmodules%2Fgstreamer%2Femotion_sink.c;h=b21f95b5f66bd418e544810d981223f62e1d7c1c;hb=9c68e84ae2ba2a611799715746289c024870647d;hp=5ed548ae144f50538ae856cf418e50d3021acdeb;hpb=f026ff453b1d12d24995e62d008080fb00d8c67a;p=framework%2Fuifw%2Femotion.git diff --git a/src/modules/gstreamer/emotion_sink.c b/src/modules/gstreamer/emotion_sink.c index 5ed548a..b21f95b 100644 --- a/src/modules/gstreamer/emotion_sink.c +++ b/src/modules/gstreamer/emotion_sink.c @@ -4,7 +4,7 @@ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS(GST_VIDEO_CAPS_YUV("{ I420, YV12, YUY2 }") ";" + GST_STATIC_CAPS(GST_VIDEO_CAPS_YUV("{ I420, YV12, YUY2, NV12, ST12, TM12 }") ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_BGRA)); GST_DEBUG_CATEGORY_STATIC(evas_video_sink_debug); @@ -183,45 +183,73 @@ gboolean evas_video_sink_set_caps(GstBaseSink *bsink, GstCaps *caps) { EvasVideoSink* sink; EvasVideoSinkPrivate* priv; + GstStructure *structure; GstVideoFormat format; + guint32 fourcc; int width; int height; sink = EVAS_VIDEO_SINK(bsink); priv = sink->priv; - if (G_UNLIKELY(!gst_video_format_parse_caps(caps, &format, &width, &height))) { - ERR("Unable to parse caps."); - return FALSE; - } + if (!gst_video_format_parse_caps(caps, &format, &width, &height)) + { + ERR("Unable to parse caps."); + return FALSE; + } priv->width = width; priv->height = height; - printf("%p format :", priv->o); - switch (format) + structure = gst_caps_get_structure(caps, 0); + + if (gst_structure_get_fourcc(structure, "format", &fourcc)) { - case GST_VIDEO_FORMAT_I420: priv->eformat = EVAS_COLORSPACE_YCBCR422P601_PL; - printf ("I420\n"); - break; - case GST_VIDEO_FORMAT_YV12: priv->eformat = EVAS_COLORSPACE_YCBCR422P601_PL; - printf ("YV12\n"); - break; - case GST_VIDEO_FORMAT_YUY2: priv->eformat = EVAS_COLORSPACE_YCBCR422601_PL; - printf("YUY2\n"); - break; - case GST_VIDEO_FORMAT_BGR: priv->eformat = EVAS_COLORSPACE_ARGB8888; - printf ("BGR\n"); - break; - case GST_VIDEO_FORMAT_BGRx: priv->eformat = EVAS_COLORSPACE_ARGB8888; - printf ("BGRx\n"); - break; - case GST_VIDEO_FORMAT_BGRA: priv->eformat = EVAS_COLORSPACE_ARGB8888; - printf ("BGRA\n"); - break; - default: - ERR("unsupported : %d\n", format); - return FALSE; + switch (fourcc) + { + case GST_MAKE_FOURCC('I', '4', '2', '0'): + priv->eformat = EVAS_COLORSPACE_YCBCR422P601_PL; + printf ("I420\n"); + break; + case GST_MAKE_FOURCC('Y', 'V', '1', '2'): + priv->eformat = EVAS_COLORSPACE_YCBCR422P601_PL; + printf ("YV12\n"); + break; + case GST_MAKE_FOURCC('Y', 'U', 'Y', '2'): + priv->eformat = EVAS_COLORSPACE_YCBCR422601_PL; + printf("YUY2\n"); + break; + case GST_MAKE_FOURCC('N', 'V', '1', '2'): + priv->eformat = EVAS_COLORSPACE_YCBCR420NV12601_PL; + printf("NV12\n"); + break; + case GST_MAKE_FOURCC('S', 'T', '1', '2'): + case GST_MAKE_FOURCC('T', 'M', '1', '2'): + priv->eformat = EVAS_COLORSPACE_YCBCR420TM12601_PL; + printf("ST12\n"); + break; + default: + goto test_format; + } + } + else + { + test_format: + switch (format) + { + case GST_VIDEO_FORMAT_BGR: priv->eformat = EVAS_COLORSPACE_ARGB8888; + printf ("BGR\n"); + break; + case GST_VIDEO_FORMAT_BGRx: priv->eformat = EVAS_COLORSPACE_ARGB8888; + printf ("BGRx\n"); + break; + case GST_VIDEO_FORMAT_BGRA: priv->eformat = EVAS_COLORSPACE_ARGB8888; + printf ("BGRA\n"); + break; + default: + ERR("unsupported : %d\n", format); + return FALSE; + } } priv->gformat = format; @@ -509,6 +537,49 @@ evas_video_sink_main_render(void *data) rows[i] = &gst_data[i * priv->width * 2]; break; } + + default: + + switch (priv->eformat) + { + case EVAS_COLORSPACE_YCBCR420NV12601_PL: + { + int i; + const unsigned char **rows; + + evas_object_image_pixels_dirty_set(priv->o, 1); + + rows = (const unsigned char **)evas_data; + + for (i = 0; i < priv->height; i++) + rows[i] = &gst_data[i * priv->width]; + + rows += priv->height; + for (i = 0; i < (priv->height / 2); i++) + rows[i] = &gst_data[priv->height * priv->width + i * priv->width]; + break; + } + case EVAS_COLORSPACE_YCBCR420NV12T601_PL: + { + int i; + const unsigned char **rows; + + evas_object_image_pixels_dirty_set(priv->o, 1); + + rows = (const unsigned char **)evas_data; + + for (i = 0; i < (priv->height / 32) / 2; i++) + rows[i] = &gst_data[i * priv->width * 2 * 32]; + + if ((priv->height / 32) % 2) + rows[i] = &gst_data[i * priv->width * 2 * 32]; + + rows += priv->height; + for (i = 0; i < ((priv->height / 2) / 32) / 2; ++i) + rows[i] = &gst_data[priv->height * priv->width + i * (priv->width / 2) * 2 * 16]; + break; + } + } } evas_object_image_data_update_add(priv->o, 0, 0, priv->width, priv->height);