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