gmyth-stream/gmemcoder/tests/main.c
author renatofilho
Thu Jun 14 18:22:32 2007 +0100 (2007-06-14)
branchtrunk
changeset 753 8ee634511c1e
parent 615 4fda44a11929
child 754 cb885ee44618
permissions -rw-r--r--
[svn r759] fixed indent using GNU Style
renatofilho@615
     1
#include <sys/stat.h>
renatofilho@615
     2
#include <fcntl.h>
renatofilho@615
     3
#include <unistd.h>
renatofilho@615
     4
#include <string.h>
renatofilho@615
     5
renatofilho@615
     6
#include <gst/gst.h>
renatofilho@752
     7
#include <glib.h>
renatofilho@615
     8
renatofilho@615
     9
renatofilho@615
    10
static GMainLoop *mainloop = NULL;
renatofilho@615
    11
static gint64 d = 0;
renatofilho@615
    12
static gint64 gap = 10;
renatofilho@615
    13
renatofilho@752
    14
typedef enum
renatofilho@752
    15
{
renatofilho@752
    16
  MY_STREAM_TYPE_AUDIO = 0,
renatofilho@752
    17
  MY_STREAM_TYPE_VIDEO = 1
renatofilho@615
    18
} MyStreamType;
renatofilho@615
    19
renatofilho@615
    20
typedef struct _StreamData StreamData;
renatofilho@752
    21
struct _StreamData
renatofilho@752
    22
{
renatofilho@752
    23
  GstElement *bin;
renatofilho@752
    24
  MyStreamType type;
renatofilho@615
    25
};
renatofilho@615
    26
renatofilho@615
    27
static void
renatofilho@752
    28
_stream_decode_pad_added_cb(GstElement * decode,
renatofilho@752
    29
							GstPad * pad, gboolean arg1, gpointer user_data)
renatofilho@615
    30
{
renatofilho@752
    31
  StreamData *data = (StreamData *) user_data;
renatofilho@752
    32
  GstElement *queue;
renatofilho@752
    33
  GstPad *sink_pad;
renatofilho@752
    34
  GstCaps *caps = gst_pad_get_caps(pad);
renatofilho@752
    35
  gchar *str_caps = gst_caps_to_string(caps);
renatofilho@615
    36
renatofilho@752
    37
  g_debug("decode caps: [%d] [%s]", data->type, str_caps);
renatofilho@615
    38
renatofilho@752
    39
  switch (data->type)
renatofilho@752
    40
	{
renatofilho@752
    41
	case MY_STREAM_TYPE_AUDIO:
renatofilho@752
    42
	  g_debug("Audio");
renatofilho@752
    43
	  if (strstr(str_caps, "audio") == NULL)
renatofilho@752
    44
		goto done;
renatofilho@752
    45
	  break;
renatofilho@752
    46
	case MY_STREAM_TYPE_VIDEO:
renatofilho@752
    47
	  g_debug("Video");
renatofilho@752
    48
	  if (strstr(str_caps, "video") == NULL)
renatofilho@752
    49
		goto done;
renatofilho@752
    50
	  break;
renatofilho@752
    51
	}
renatofilho@615
    52
renatofilho@752
    53
  queue = gst_bin_get_by_name(GST_BIN(data->bin), "queue");
renatofilho@752
    54
  sink_pad = gst_element_get_pad(queue, "sink");
renatofilho@615
    55
renatofilho@752
    56
  if (gst_pad_link(pad, sink_pad) != GST_PAD_LINK_OK)
renatofilho@752
    57
	{
renatofilho@752
    58
	  g_warning("Failed to link decode");
renatofilho@752
    59
	}
renatofilho@615
    60
renatofilho@752
    61
  gst_object_unref(queue);
renatofilho@752
    62
  gst_object_unref(sink_pad);
renatofilho@752
    63
 //g_free (data);
renatofilho@752
    64
  g_debug("Linked");
renatofilho@615
    65
renatofilho@615
    66
done:
renatofilho@752
    67
  gst_caps_unref(caps);
renatofilho@752
    68
  g_free(str_caps);
renatofilho@615
    69
}
renatofilho@615
    70
renatofilho@615
    71
renatofilho@752
    72
static GstElement *
renatofilho@752
    73
_create_src_element(const gchar * name,
renatofilho@752
    74
					const gchar * uri, MyStreamType type, guint priority)
renatofilho@615
    75
{
renatofilho@752
    76
  StreamData *data;
renatofilho@752
    77
  GstElement *bin;
renatofilho@752
    78
  GstElement *src;
renatofilho@752
    79
  GstElement *decode;
renatofilho@752
    80
  GstElement *queue;
renatofilho@752
    81
  GstPad *src_pad;
renatofilho@615
    82
renatofilho@752
    83
  GstElement *gnl_src;
renatofilho@615
    84
renatofilho@752
    85
  g_debug("element from uri: %s", uri);
renatofilho@615
    86
renatofilho@752
    87
  bin = gst_bin_new("bin");
renatofilho@752
    88
  src = gst_element_make_from_uri(GST_URI_SRC, uri, "src");
renatofilho@752
    89
  g_return_val_if_fail(src != NULL, NULL);
renatofilho@615
    90
renatofilho@752
    91
  decode = gst_element_factory_make("decodebin", NULL);
renatofilho@752
    92
  g_return_val_if_fail(decode != NULL, NULL);
renatofilho@615
    93
renatofilho@752
    94
  queue = gst_element_factory_make("queue", "queue");
renatofilho@752
    95
  g_return_val_if_fail(queue != NULL, NULL);
renatofilho@615
    96
renatofilho@752
    97
  gst_bin_add_many(GST_BIN(bin), src, decode, queue, NULL);
renatofilho@752
    98
  gst_element_link(src, decode);
renatofilho@615
    99
renatofilho@752
   100
  data = g_new0(StreamData, 1);
renatofilho@752
   101
  data->bin = bin;
renatofilho@752
   102
  data->type = type;
renatofilho@752
   103
  g_debug("Type : %d = %d", type, data->type);
renatofilho@615
   104
renatofilho@752
   105
  g_signal_connect(G_OBJECT(decode), "new-decoded-pad",
renatofilho@752
   106
				   G_CALLBACK(_stream_decode_pad_added_cb), data);
renatofilho@615
   107
renatofilho@615
   108
renatofilho@752
   109
  src_pad = gst_element_get_pad(queue, "src");
renatofilho@752
   110
  g_return_val_if_fail(src_pad != NULL, NULL);
renatofilho@615
   111
renatofilho@752
   112
  gst_element_add_pad(bin, gst_ghost_pad_new("src", src_pad));
renatofilho@615
   113
renatofilho@752
   114
  gst_object_unref(src_pad);
renatofilho@615
   115
renatofilho@752
   116
  gnl_src = gst_element_factory_make("gnlsource", name);
renatofilho@752
   117
  g_return_val_if_fail(gnl_src != NULL, NULL);
renatofilho@752
   118
  gst_bin_add(GST_BIN(gnl_src), bin);
renatofilho@615
   119
renatofilho@752
   120
  g_debug("ADDING WITH: START [%lli] DUR [%lli]", d, gap);
renatofilho@752
   121
  if (d == 0)
renatofilho@752
   122
	{
renatofilho@752
   123
	  g_object_set(G_OBJECT(gnl_src),
renatofilho@752
   124
				  //"start", 0L,
renatofilho@752
   125
				   "duration", 10 * GST_SECOND,
renatofilho@752
   126
				  //"media-start", 0L,
renatofilho@752
   127
				  //"media-duration", 10 * GST_SECOND,
renatofilho@752
   128
				   "priority", priority, NULL);
renatofilho@615
   129
renatofilho@752
   130
	}
renatofilho@752
   131
  else
renatofilho@752
   132
	{
renatofilho@752
   133
	  g_object_set(G_OBJECT(gnl_src),
renatofilho@752
   134
				   "start", 10 * GST_SECOND, "duration", 10 * GST_SECOND,
renatofilho@752
   135
				  ///"media-start", 10 * GST_SECOND,
renatofilho@752
   136
				  //"media-duration", 10 * GST_SECOND,
renatofilho@752
   137
				   "priority", priority, NULL);
renatofilho@615
   138
renatofilho@752
   139
	}
renatofilho@752
   140
  d++;
renatofilho@752
   141
renatofilho@752
   142
  return gnl_src;
renatofilho@615
   143
}
renatofilho@615
   144
renatofilho@615
   145
static void
renatofilho@752
   146
_composition_pad_added_cb(GstElement * composition,
renatofilho@752
   147
						  GstPad * pad, gpointer data)
renatofilho@615
   148
{
renatofilho@752
   149
  GstPad *sink_pad = gst_element_get_pad(GST_ELEMENT(data), "sink");
renatofilho@752
   150
  g_debug("compose pad added");
renatofilho@615
   151
renatofilho@752
   152
  if (gst_pad_link(pad, sink_pad) != GST_PAD_LINK_OK)
renatofilho@752
   153
	{
renatofilho@752
   154
	  g_warning("Failed to link decode");
renatofilho@752
   155
	}
renatofilho@615
   156
renatofilho@752
   157
  g_debug("Linked ok");
renatofilho@615
   158
}
renatofilho@615
   159
renatofilho@615
   160
static void
renatofilho@752
   161
_compose_add_file(GstElement * compose,
renatofilho@752
   162
				  const gchar * e_name,
renatofilho@752
   163
				  const gchar * uri, MyStreamType type, guint priority)
renatofilho@615
   164
{
renatofilho@752
   165
  GstElement *src;
renatofilho@615
   166
renatofilho@752
   167
  src = _create_src_element(e_name, uri, type, priority);
renatofilho@752
   168
  gst_bin_add(GST_BIN(compose), src);
renatofilho@615
   169
}
renatofilho@615
   170
renatofilho@615
   171
renatofilho@752
   172
int
renatofilho@752
   173
main(int argc, char **argv)
renatofilho@615
   174
{
renatofilho@752
   175
  GstElement *pipe;
renatofilho@752
   176
  GstElement *gnl_compose_a;
renatofilho@752
   177
  GstElement *gnl_compose_v;
renatofilho@752
   178
  GstElement *asink;
renatofilho@752
   179
  GstElement *vsink;
renatofilho@752
   180
  GstElement *aqueue;
renatofilho@752
   181
  GstElement *vqueue;
renatofilho@615
   182
renatofilho@752
   183
  g_type_init();
renatofilho@752
   184
  gst_init(&argc, &argv);
renatofilho@615
   185
renatofilho@752
   186
  mainloop = g_main_loop_new(NULL, FALSE);
renatofilho@615
   187
renatofilho@752
   188
  pipe = gst_pipeline_new("test_pipeline");
renatofilho@615
   189
renatofilho@752
   190
  gnl_compose_a = gst_element_factory_make("gnlcomposition", "acompose");
renatofilho@752
   191
  g_return_val_if_fail(gnl_compose_a != NULL, 1);
renatofilho@615
   192
renatofilho@752
   193
  gnl_compose_v = gst_element_factory_make("gnlcomposition", "vcompose");
renatofilho@752
   194
  g_return_val_if_fail(gnl_compose_v != NULL, 1);
renatofilho@615
   195
renatofilho@615
   196
renatofilho@752
   197
 //_compose_add_file (gnl_compose_a, "src0", argv[1], MY_STREAM_TYPE_AUDIO, 1);
renatofilho@752
   198
 //_compose_add_file (gnl_compose_a, "src1", argv[2], MY_STREAM_TYPE_AUDIO, 1);
renatofilho@615
   199
renatofilho@752
   200
  d = 0;
renatofilho@615
   201
renatofilho@752
   202
  _compose_add_file(gnl_compose_v, "src2", argv[1], MY_STREAM_TYPE_VIDEO, 1);
renatofilho@752
   203
  _compose_add_file(gnl_compose_v, "src3", argv[2], MY_STREAM_TYPE_VIDEO, 1);
renatofilho@615
   204
renatofilho@615
   205
renatofilho@752
   206
 //aqueue = gst_element_factory_make ("queue", "aqueue");
renatofilho@752
   207
 //asink = gst_element_factory_make ("alsasink", "asink");
renatofilho@615
   208
renatofilho@752
   209
  vqueue = gst_element_factory_make("queue", "vqueue");
renatofilho@752
   210
  vsink = gst_element_factory_make("xvimagesink", "vsink");
renatofilho@615
   211
renatofilho@752
   212
  gst_bin_add_many(GST_BIN(pipe), gnl_compose_a, gnl_compose_v, vqueue, vsink,
renatofilho@752
   213
				  //aqueue, asink, 
renatofilho@752
   214
				   NULL);
renatofilho@615
   215
renatofilho@752
   216
  gst_element_link(vqueue, vsink);
renatofilho@752
   217
 //gst_element_link (aqueue, asink);
renatofilho@615
   218
renatofilho@752
   219
 //g_signal_connect (G_OBJECT (gnl_compose_a), "pad-added",
renatofilho@752
   220
 //                  G_CALLBACK (_composition_pad_added_cb), aqueue);
renatofilho@615
   221
renatofilho@752
   222
  g_signal_connect(G_OBJECT(gnl_compose_v), "pad-added",
renatofilho@752
   223
				   G_CALLBACK(_composition_pad_added_cb), vqueue);
renatofilho@615
   224
renatofilho@615
   225
renatofilho@752
   226
 //g_idle_add (_play, pipe);
renatofilho@752
   227
  gst_element_set_state(GST_ELEMENT(pipe), GST_STATE_PLAYING);
renatofilho@752
   228
  g_main_loop_run(mainloop);
renatofilho@615
   229
renatofilho@752
   230
  return 0;
renatofilho@615
   231
}