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