emotion: initial port of emotion to GStreamer 1.0

Some commits to port emotion to GStreamer 1.0 and implement some missing features,
clean up code a bit and fix some bugs on the way.

This works as good as the 0.10 code for me now with the emotion examples,
just the Samsung hardware specific code is commented out. This should be
ported by someone who has such hardware, and also in a clean way now that
GStreamer since 1.0 has features to handle all this properly.

There's still a lot of potential to clean things up and fix many bugs, and also
to implement zerocopy rendering. But those are for later if there's actual
interest in this at all.

Commits:

- Update configure checks and ecore example to GStreamer 1.0
- Initial port of emotion to GStreamer 1.0
- Samsung specific code commented out, should be ported by someone
with the hardware.
- Return GST_FLOW_FLUSHING when the sink is unlocked
- Remove unused GSignal from the sink
- Use GstVideoInfo to store the format details inside the sink
- Add support for pixel-aspect-ratio
- Store video format information in GstVideoInfo for the different video streams
- Use GstAudioInfo to store the audio format information
- Remove some unused defines
- Header cleanup
- Implement initial support for GstNavigation interface
- Implement setting of audio/video channel

Reviewers: cedric

CC: cedric

Differential Revision: https://phab.enlightenment.org/D387

Signed-off-by: Cedric BAIL <cedric.bail@samsung.com>
This commit is contained in:
Sebastian Dröge 2013-12-23 10:50:53 +09:00 committed by Cedric BAIL
parent 574c5c1ba7
commit 9c752106f7
11 changed files with 3729 additions and 9 deletions

View File

@ -1796,8 +1796,8 @@ AC_ARG_ENABLE([g-main-loop],
[want_g_main_loop="no"])
AC_ARG_ENABLE([gstreamer],
[AC_HELP_STRING([--disable-gstreamer],
[disable gstreamer support. @<:@default=enabled@:>@])],
[AC_HELP_STRING([--enable-gstreamer],
[enable gstreamer 0.10 support. @<:@default=disabled@:>@])],
[
if test "x${enableval}" = "xyes" ; then
want_gstreamer="yes"
@ -1805,7 +1805,19 @@ AC_ARG_ENABLE([gstreamer],
want_gstreamer="no"
fi
],
[want_gstreamer="yes"])
[want_gstreamer="no"])
AC_ARG_ENABLE([gstreamer1],
[AC_HELP_STRING([--disable-gstreamer1],
[disable gstreamer 1.0 support. @<:@default=enabled@:>@])],
[
if test "x${enableval}" = "xyes" ; then
want_gstreamer1="yes"
else
want_gstreamer1="no"
fi
],
[want_gstreamer1="yes"])
AC_ARG_ENABLE([tizen],
[AC_HELP_STRING([--enable-tizen],
@ -1882,10 +1894,17 @@ if test "x${want_g_main_loop}" = "xyes" ; then
fi
# not EFL_OPTIONAL_DEPEND_PKG() because it's only used for ecore examples
if test "${want_gstreamer1}" = "yes" -a "${want_gstreamer}" = "yes"; then
AC_MSG_ERROR([You can only enable either GStreamer 1.0 or GStreamer 0.10 support])
fi
if test "${want_gstreamer1}" = "yes"; then
PKG_CHECK_MODULES([GSTREAMER], [gstreamer-1.0])
fi
if test "${want_gstreamer}" = "yes"; then
PKG_CHECK_MODULES([GSTREAMER], [gstreamer-0.10])
fi
AM_CONDITIONAL([HAVE_GSTREAMER], [test "${want_gstreamer}" = "yes"])
AM_CONDITIONAL([HAVE_GSTREAMER], [test "${want_gstreamer}" = "yes" -o "${want_gstreamer1}" = "yes"])
EFL_EVAL_PKGS([ECORE])
@ -3663,10 +3682,12 @@ have_gst_xoverlay="no"
EMOTION_MODULE([xine], [${want_xine}])
EMOTION_MODULE([gstreamer], [${want_gstreamer}])
EMOTION_MODULE([gstreamer1], [${want_gstreamer1}])
EMOTION_MODULE([generic], [${want_emotion_generic}])
EFL_ADD_FEATURE([EMOTION], [xine])
EFL_ADD_FEATURE([EMOTION], [gstreamer])
EFL_ADD_FEATURE([EMOTION], [gstreamer1])
EFL_ADD_FEATURE([EMOTION], [generic], [${want_emotion_generic}])
EFL_EVAL_PKGS([EMOTION])

View File

@ -45,6 +45,19 @@ AC_DEFUN([EMOTION_MODULE_DEP_CHECK_GSTREAMER],
fi
])
dnl use: EMOTION_MODULE_DEP_CHECK_GSTREAMER_1(want_static)
dnl where want_engine = yes or static
AC_DEFUN([EMOTION_MODULE_DEP_CHECK_GSTREAMER1],
[dnl
GST_VER=1.0
requirements="gstreamer-1.0 >= ${GST_VER} gstreamer-plugins-base-1.0 >= ${GST_VER} gstreamer-video-1.0 >= ${GST_VER} gstreamer-audio-1.0 >= ${GST_VER} gstreamer-tag-1.0 >= ${GST_VER}"
if test "$1" = "static"; then
EFL_DEPEND_PKG([EMOTION], [EMOTION_MODULE_GSTREAMER1], [${requirements}])
else
PKG_CHECK_MODULES([EMOTION_MODULE_GSTREAMER1], [${requirements}])
fi
])
dnl use: EMOTION_MODULE_DEP_CHECK_GENERIC(want_static)
dnl where want_engine = yes or static
AC_DEFUN([EMOTION_MODULE_DEP_CHECK_GENERIC],

View File

@ -52,7 +52,7 @@ modules_emotion_xine_module_la_LIBTOOLFLAGS = --tag=disable-static
endif
endif
# Gstreamer
# Gstreamer 0.10
EMOTION_GSTREAMER_SOURCES = \
modules/emotion/gstreamer/emotion_gstreamer.h \
modules/emotion/gstreamer/emotion_gstreamer.c \
@ -85,6 +85,39 @@ endif
endif
endif
# Gstreamer 1.0
EMOTION_GSTREAMER1_SOURCES = \
modules/emotion/gstreamer1/emotion_gstreamer.h \
modules/emotion/gstreamer1/emotion_gstreamer.c \
modules/emotion/gstreamer1/emotion_alloc.c \
modules/emotion/gstreamer1/emotion_convert.c \
modules/emotion/gstreamer1/emotion_fakeeos.c \
modules/emotion/gstreamer1/emotion_sink.c
if EMOTION_STATIC_BUILD_GSTREAMER1
lib_emotion_libemotion_la_SOURCES += $(EMOTION_GSTREAMER1_SOURCES)
else
if EMOTION_BUILD_GSTREAMER1
emotionmodulegstreamer1dir = $(libdir)/emotion/modules/gstreamer1/$(MODULE_ARCH)
emotionmodulegstreamer1_LTLIBRARIES = modules/emotion/gstreamer1/module.la
modules_emotion_gstreamer1_module_la_SOURCES = $(EMOTION_GSTREAMER1_SOURCES)
modules_emotion_gstreamer1_module_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl \
@EMOTION_CFLAGS@ \
@EMOTION_MODULE_GSTREAMER1_CFLAGS@
modules_emotion_gstreamer1_module_la_LIBADD = \
@USE_EMOTION_LIBS@ \
@EMOTION_MODULE_GSTREAMER1_LIBS@
modules_emotion_gstreamer1_module_la_DEPENDENCIES = @USE_EMOTION_INTERNAL_LIBS@
modules_emotion_gstreamer1_module_la_LDFLAGS = -module @EFL_LTMODULE_FLAGS@
modules_emotion_gstreamer1_module_la_LIBTOOLFLAGS = --tag=disable-static
if HAVE_ECORE_X
modules_emotion_gstreamer1_module_la_CPPFLAGS += @ECORE_X_CFLAGS@ @ECORE_EVAS_CFLAGS@
modules_emotion_gstreamer1_module_la_LIBADD += @USE_ECORE_X_LIBS@ @USE_ECORE_EVAS_LIBS@
modules_emotion_gstreamer1_module_la_DEPENDENCIES += @USE_ECORE_X_INTERNAL_LIBS@ @USE_ECORE_EVAS_INTERNAL_LIBS@
endif
endif
endif
# Generic
EMOTION_GENERIC_SOURCES = \
modules/emotion/generic/emotion_generic.h \

View File

@ -1,6 +1,13 @@
CC=gcc
if HAVE_GSTREAMER_1
GSTREAMER_DEP="gstreamer-1.0"
else
GSTREAMER_DEP="gstreamer-0.10"
endif
COMMON_FLAGS=`pkg-config --libs --cflags eina,ecore,evas,ecore-evas,ecore-audio,ecore-con,ecore-file, \
eo,evas-software-buffer,gnutls,ecore-imf,ecore-imf-evas,gstreamer-0.10` -lm
eo,evas-software-buffer,gnutls,ecore-imf,ecore-imf-evas,$(GSTREAMER_DEP)` -lm
EXAMPLES= ecore_animator_example \
ecore_audio_custom \

View File

@ -1,4 +1,6 @@
//Compile with:
// gcc -o ecore_pipe_gstreamer_example ecore_pipe_gstreamer_example.c `pkg-config --libs --cflags ecore gstreamer-1.0`
// or
// gcc -o ecore_pipe_gstreamer_example ecore_pipe_gstreamer_example.c `pkg-config --libs --cflags ecore gstreamer-0.10`
#include <gst/gst.h>
@ -98,23 +100,33 @@ new_decoded_pad_cb(GstElement *demuxer,
GstElement *decoder;
GstPad *pad;
GstCaps *caps;
gchar *str;
GstStructure *s;
const gchar *str;
#if GST_CHECK_VERSION(1,0,0)
caps = gst_pad_get_current_caps(new_pad);
#else
caps = gst_pad_get_caps(new_pad);
str = gst_caps_to_string(caps);
#endif
s = gst_caps_get_structure(caps, 0);
str = gst_structure_get_name(s);
if (g_str_has_prefix(str, "video/"))
{
decoder = GST_ELEMENT(user_data);
#if GST_CHECK_VERSION(1,0,0)
pad = gst_element_get_static_pad(decoder, "sink");
#else
pad = gst_element_get_pad(decoder, "sink");
#endif
if (GST_PAD_LINK_FAILED(gst_pad_link(new_pad, pad)))
{
g_warning("Failed to link %s:%s to %s:%s", GST_DEBUG_PAD_NAME(new_pad),
GST_DEBUG_PAD_NAME(pad));
}
gst_object_unref(pad);
}
g_free(str);
gst_caps_unref(caps);
}

View File

@ -0,0 +1,73 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "emotion_gstreamer.h"
Emotion_Gstreamer_Buffer *
emotion_gstreamer_buffer_alloc(EvasVideoSinkPrivate *sink,
GstBuffer *buffer,
Eina_Bool preroll)
{
Emotion_Gstreamer_Buffer *send;
if (!sink->ev) return NULL;
send = malloc(sizeof (Emotion_Gstreamer_Buffer));
if (!send) return NULL;
send->sink = sink;
send->frame = gst_buffer_ref(buffer);
send->preroll = preroll;
send->force = EINA_FALSE;
sink->ev->out++;
send->ev = sink->ev;
return send;
}
void
emotion_gstreamer_buffer_free(Emotion_Gstreamer_Buffer *send)
{
send->ev->in++;
if (send->ev->in == send->ev->out
&& send->ev->threads == NULL
&& send->ev->delete_me)
send->ev->api->del(send->ev);
gst_buffer_unref(send->frame);
free(send);
}
Emotion_Gstreamer_Message *
emotion_gstreamer_message_alloc(Emotion_Gstreamer_Video *ev,
GstMessage *msg)
{
Emotion_Gstreamer_Message *send;
if (!ev) return NULL;
send = malloc(sizeof (Emotion_Gstreamer_Message));
if (!send) return NULL;
ev->out++;
send->ev = ev;
send->msg = gst_message_ref(msg);
return send;
}
void
emotion_gstreamer_message_free(Emotion_Gstreamer_Message *send)
{
send->ev->in++;
if (send->ev->in == send->ev->out
&& send->ev->threads == NULL
&& send->ev->delete_me)
send->ev->api->del(send->ev);
gst_message_unref(send->msg);
free(send);
}

View File

@ -0,0 +1,160 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "emotion_gstreamer.h"
static inline void
_evas_video_bgrx_step(unsigned char *evas_data, const unsigned char *gst_data,
unsigned int w, unsigned int h EINA_UNUSED, unsigned int output_height, unsigned int step)
{
unsigned int x;
unsigned int y;
for (y = 0; y < output_height; ++y)
{
for (x = 0; x < w; x++)
{
evas_data[0] = gst_data[0];
evas_data[1] = gst_data[1];
evas_data[2] = gst_data[2];
evas_data[3] = 255;
gst_data += step;
evas_data += 4;
}
}
}
static void
_evas_video_bgr(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h, unsigned int output_height)
{
_evas_video_bgrx_step(evas_data, gst_data, w, h, output_height, 3);
}
static void
_evas_video_bgrx(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h, unsigned int output_height)
{
_evas_video_bgrx_step(evas_data, gst_data, w, h, output_height, 4);
}
static void
_evas_video_bgra(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h EINA_UNUSED, unsigned int output_height)
{
unsigned int x;
unsigned int y;
for (y = 0; y < output_height; ++y)
{
unsigned char alpha;
for (x = 0; x < w; ++x)
{
alpha = gst_data[3];
evas_data[0] = (gst_data[0] * alpha) / 255;
evas_data[1] = (gst_data[1] * alpha) / 255;
evas_data[2] = (gst_data[2] * alpha) / 255;
evas_data[3] = alpha;
gst_data += 4;
evas_data += 4;
}
}
}
static void
_evas_video_i420(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h, unsigned int output_height)
{
const unsigned char **rows;
unsigned int i, j;
unsigned int rh;
unsigned int stride_y, stride_uv;
rh = output_height;
rows = (const unsigned char **)evas_data;
stride_y = GST_ROUND_UP_4(w);
stride_uv = GST_ROUND_UP_8(w) / 2;
for (i = 0; i < rh; i++)
rows[i] = &gst_data[i * stride_y];
for (j = 0; j < (rh / 2); j++, i++)
rows[i] = &gst_data[h * stride_y + j * stride_uv];
for (j = 0; j < (rh / 2); j++, i++)
rows[i] = &gst_data[h * stride_y +
(rh / 2) * stride_uv +
j * stride_uv];
}
static void
_evas_video_yv12(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h, unsigned int output_height)
{
const unsigned char **rows;
unsigned int i, j;
unsigned int rh;
unsigned int stride_y, stride_uv;
rh = output_height;
rows = (const unsigned char **)evas_data;
stride_y = GST_ROUND_UP_4(w);
stride_uv = GST_ROUND_UP_8(w) / 2;
for (i = 0; i < rh; i++)
rows[i] = &gst_data[i * stride_y];
for (j = 0; j < (rh / 2); j++, i++)
rows[i] = &gst_data[h * stride_y +
(rh / 2) * stride_uv +
j * stride_uv];
for (j = 0; j < (rh / 2); j++, i++)
rows[i] = &gst_data[h * stride_y + j * stride_uv];
}
static void
_evas_video_yuy2(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h EINA_UNUSED, unsigned int output_height)
{
const unsigned char **rows;
unsigned int i;
unsigned int stride;
rows = (const unsigned char **)evas_data;
stride = GST_ROUND_UP_4(w * 2);
for (i = 0; i < output_height; i++)
rows[i] = &gst_data[i * stride];
}
static void
_evas_video_nv12(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h EINA_UNUSED, unsigned int output_height)
{
const unsigned char **rows;
unsigned int i, j;
unsigned int rh;
rh = output_height;
rows = (const unsigned char **)evas_data;
for (i = 0; i < rh; i++)
rows[i] = &gst_data[i * w];
for (j = 0; j < (rh / 2); j++, i++)
rows[i] = &gst_data[rh * w + j * w];
}
const ColorSpace_Format_Convertion colorspace_format_convertion[] = {
{ "I420", GST_VIDEO_FORMAT_I420, EVAS_COLORSPACE_YCBCR422P601_PL, _evas_video_i420, EINA_TRUE },
{ "YV12", GST_VIDEO_FORMAT_YV12, EVAS_COLORSPACE_YCBCR422P601_PL, _evas_video_yv12, EINA_TRUE },
{ "YUY2", GST_VIDEO_FORMAT_YUY2, EVAS_COLORSPACE_YCBCR422601_PL, _evas_video_yuy2, EINA_FALSE },
{ "NV12", GST_VIDEO_FORMAT_NV12, EVAS_COLORSPACE_YCBCR420NV12601_PL, _evas_video_nv12, EINA_TRUE },
{ "BGR", GST_VIDEO_FORMAT_BGR, EVAS_COLORSPACE_ARGB8888, _evas_video_bgr, EINA_FALSE },
{ "BGRx", GST_VIDEO_FORMAT_BGRx, EVAS_COLORSPACE_ARGB8888, _evas_video_bgrx, EINA_FALSE },
{ "BGRA", GST_VIDEO_FORMAT_BGRA, EVAS_COLORSPACE_ARGB8888, _evas_video_bgra, EINA_FALSE },
{ NULL, 0, 0, NULL, 0 }
};

View File

@ -0,0 +1,47 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "emotion_gstreamer.h"
typedef struct _FakeEOSBin
{
GstBin parent;
} FakeEOSBin;
typedef struct _FakeEOSBinClass
{
GstBinClass parent;
} FakeEOSBinClass;
G_DEFINE_TYPE (FakeEOSBin, fakeeos_bin, GST_TYPE_BIN);
static void
fakeeos_bin_handle_message(GstBin * bin, GstMessage * message)
{
/* FakeEOSBin *fakeeos = (FakeEOSBin *)(bin); */
switch (GST_MESSAGE_TYPE(message)) {
case GST_MESSAGE_EOS:
/* what to do here ? just returning at the moment */
return;
default:
break;
}
GST_BIN_CLASS(fakeeos_bin_parent_class)->handle_message(bin, message);
}
static void
fakeeos_bin_class_init(FakeEOSBinClass * klass)
{
GstBinClass *gstbin_class = GST_BIN_CLASS(klass);
gstbin_class->handle_message =
GST_DEBUG_FUNCPTR (fakeeos_bin_handle_message);
}
static void
fakeeos_bin_init(FakeEOSBin *src EINA_UNUSED)
{
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,295 @@
#ifndef __EMOTION_GSTREAMER_H__
#define __EMOTION_GSTREAMER_H__
#include "emotion_modules.h"
#include <unistd.h>
#include <fcntl.h>
#include <Eina.h>
#include <Evas.h>
#include <Ecore.h>
#include <glib.h>
#include <gst/gst.h>
#include <glib-object.h>
#include <gst/video/gstvideosink.h>
#include <gst/video/video.h>
#include <gst/audio/audio.h>
#include <gst/tag/tag.h>
// forcibly disable x overlay window.. broken badly.
#undef HAVE_ECORE_X
#ifdef HAVE_ECORE_X
# include <Ecore_X.h>
# include <gst/video/videooverlay.h>
#endif
typedef void (*Evas_Video_Convert_Cb)(unsigned char *evas_data,
const unsigned char *gst_data,
unsigned int w,
unsigned int h,
unsigned int output_height);
typedef struct _EvasVideoSinkPrivate EvasVideoSinkPrivate;
typedef struct _EvasVideoSink EvasVideoSink;
typedef struct _EvasVideoSinkClass EvasVideoSinkClass;
typedef struct _Emotion_Gstreamer_Video Emotion_Gstreamer_Video;
typedef struct _Emotion_Audio_Stream Emotion_Audio_Stream;
typedef struct _Emotion_Gstreamer_Metadata Emotion_Gstreamer_Metadata;
typedef struct _Emotion_Gstreamer_Buffer Emotion_Gstreamer_Buffer;
typedef struct _Emotion_Gstreamer_Message Emotion_Gstreamer_Message;
typedef struct _Emotion_Video_Stream Emotion_Video_Stream;
struct _Emotion_Video_Stream
{
gdouble length_time;
GstVideoInfo info;
int index;
};
struct _Emotion_Audio_Stream
{
gdouble length_time;
GstAudioInfo info;
};
struct _Emotion_Gstreamer_Metadata
{
char *title;
char *album;
char *artist;
char *genre;
char *comment;
char *year;
char *count;
char *disc_id;
};
struct _Emotion_Gstreamer_Video
{
const Emotion_Engine *api;
/* Gstreamer elements */
GstElement *pipeline;
GstElement *sink;
GstElement *esink;
GstElement *xvsink;
GstElement *tee;
GstElement *convert;
GstPad *eteepad;
GstPad *xvteepad;
GstPad *xvpad;
Eina_List *threads;
/* eos */
GstBus *eos_bus;
/* Strams */
Eina_List *video_streams;
Eina_List *audio_streams;
int video_stream_nbr;
int audio_stream_nbr;
/* We need to keep a copy of the last inserted buffer as evas doesn't copy YUV data around */
GstBuffer *last_buffer;
/* Evas object */
Evas_Object *obj;
/* Characteristics of stream */
double position;
double ratio;
double volume;
volatile int seek_to;
volatile int get_poslen;
Emotion_Gstreamer_Metadata *metadata;
#ifdef HAVE_ECORE_X
Ecore_X_Window win;
#endif
const char *uri;
Emotion_Gstreamer_Buffer *send;
EvasVideoSinkPrivate *sink_data;
Emotion_Vis vis;
int in;
int out;
int frames;
int flapse;
double rtime;
double rlapse;
struct
{
double width;
double height;
} fill;
Eina_Bool play : 1;
Eina_Bool play_started : 1;
Eina_Bool video_mute : 1;
Eina_Bool audio_mute : 1;
Eina_Bool pipeline_parsed : 1;
Eina_Bool delete_me : 1;
Eina_Bool kill_buffer : 1;
Eina_Bool stream : 1;
Eina_Bool priority : 1;
int src_width;
int src_height;
};
struct _EvasVideoSink {
/*< private >*/
GstVideoSink parent;
EvasVideoSinkPrivate *priv;
};
struct _EvasVideoSinkClass {
/*< private >*/
GstVideoSinkClass parent_class;
};
struct _EvasVideoSinkPrivate {
EINA_REFCOUNT;
Evas_Object *o;
Emotion_Gstreamer_Video *ev;
Evas_Video_Convert_Cb func;
GstVideoInfo info;
unsigned int eheight;
Evas_Colorspace eformat;
Eina_Lock m;
Eina_Condition c;
// If this is TRUE all processing should finish ASAP
// This is necessary because there could be a race between
// unlock() and render(), where unlock() wins, signals the
// GCond, then render() tries to render a frame although
// everything else isn't running anymore. This will lead
// to deadlocks because render() holds the stream lock.
//
// Protected by the buffer mutex
Eina_Bool unlocked : 1;
};
struct _Emotion_Gstreamer_Buffer
{
Emotion_Gstreamer_Video *ev;
EvasVideoSinkPrivate *sink;
GstBuffer *frame;
Eina_Bool preroll : 1;
Eina_Bool force : 1;
};
struct _Emotion_Gstreamer_Message
{
Emotion_Gstreamer_Video *ev;
GstMessage *msg;
};
extern Eina_Bool window_manager_video;
extern Eina_Bool debug_fps;
extern int _emotion_gstreamer_log_domain;
extern Eina_Bool _ecore_x_available;
#ifdef DBG
#undef DBG
#endif
#define DBG(...) EINA_LOG_DOM_DBG(_emotion_gstreamer_log_domain, __VA_ARGS__)
#ifdef INF
#undef INF
#endif
#define INF(...) EINA_LOG_DOM_INFO(_emotion_gstreamer_log_domain, __VA_ARGS__)
#ifdef WRN
#undef WRN
#endif
#define WRN(...) EINA_LOG_DOM_WARN(_emotion_gstreamer_log_domain, __VA_ARGS__)
#ifdef ERR
#undef ERR
#endif
#define ERR(...) EINA_LOG_DOM_ERR(_emotion_gstreamer_log_domain, __VA_ARGS__)
#ifdef CRITICAL
#undef CRITICAL
#endif
#define CRITICAL(...) EINA_LOG_DOM_CRIT(_emotion_gstreamer_log_domain, __VA_ARGS__)
#define EVAS_TYPE_VIDEO_SINK evas_video_sink_get_type()
GType fakeeos_bin_get_type(void);
#define EVAS_VIDEO_SINK(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), \
EVAS_TYPE_VIDEO_SINK, EvasVideoSink))
#define EVAS_VIDEO_SINK_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass), \
EVAS_TYPE_VIDEO_SINK, EvasVideoSinkClass))
#define EVAS_IS_VIDEO_SINK(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj), \
EVAS_TYPE_VIDEO_SINK))
#define EVAS_IS_VIDEO_SINK_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), \
EVAS_TYPE_VIDEO_SINK))
#define EVAS_VIDEO_SINK_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), \
EVAS_TYPE_VIDEO_SINK, EvasVideoSinkClass))
#define GST_TYPE_FAKEEOS_BIN fakeeos_bin_get_type()
GstElement *gstreamer_video_sink_new(Emotion_Gstreamer_Video *ev,
Evas_Object *obj,
const char *uri);
gboolean gstreamer_plugin_init(GstPlugin *plugin);
Emotion_Gstreamer_Buffer *emotion_gstreamer_buffer_alloc(EvasVideoSinkPrivate *sink,
GstBuffer *buffer,
Eina_Bool preroll);
void emotion_gstreamer_buffer_free(Emotion_Gstreamer_Buffer *send);
Emotion_Gstreamer_Message *emotion_gstreamer_message_alloc(Emotion_Gstreamer_Video *ev,
GstMessage *msg);
void emotion_gstreamer_message_free(Emotion_Gstreamer_Message *send);
Eina_Bool _emotion_gstreamer_video_pipeline_parse(Emotion_Gstreamer_Video *ev,
Eina_Bool force);
typedef struct _ColorSpace_Format_Convertion ColorSpace_Format_Convertion;
struct _ColorSpace_Format_Convertion
{
const char *name;
GstVideoFormat format;
Evas_Colorspace eformat;
Evas_Video_Convert_Cb func;
Eina_Bool force_height;
};
extern const ColorSpace_Format_Convertion colorspace_format_convertion[];
#endif /* __EMOTION_GSTREAMER_H__ */

File diff suppressed because it is too large Load Diff