<div dir="ltr"><div>Hello All,<br><br><br></div><div>I have written a program to play a mp4 file with aapsrc, program compiles fine but i dont see any display and i get following output on the console:<br><br>/My_programs$ gcc mp4_stream.c -o mp4_stream -lX11 `pkg-config --cflags --libs gstreamer-0.10 gstreamer-app-0.10` -lgstinterfaces-0.10<br>

/My_programs$ ./mp4_stream test.mp4 <br><br>** (process:14249): WARNING **: map xwindow<br>set state returned 2<br>got message stream-status<br>got message stream-status<br>start feeding<br>stop feeding<br>pad added<br>pad name video/x-h264<br>

pad added<br>pad name video/x-h264<br>got message tag<br>pad added<br>pad name audio/mpeg<br>pad added<br>pad name audio/mpeg<br>got message tag<br>got message tag<br>Error Internal data flow error.<br>set state null returned 1<br>

X Error of failed request:  BadWindow (invalid Window parameter)<br>  Major opcode of failed request:  4 (X_DestroyWindow)<br>  Resource id in failed request:  0x3600002<br>  Serial number of failed request:  15<br>  Current serial number in output stream:  17<br>

/My_programs$ <br><br><br></div><div>Following is the code, and iam using gstreamer 0.1<br><br></div><div>I have tested the pipeline manually with gst-launch and it works fine, with following command:<br><br></div><div>gst-launch-0.10 filesrc location=test.mp4 ! qtdemux name=demux.audio_00 ! queue ! faad ! alsasink demux.video_00 ! queue ! ffdec_h264 ! autovideosink<br>

</div><div><br><br></div><div>PLEASE HELP...WITH FOLLOWING CODE:<br></div><div><br>#include <X11/Xlib.h><br>#include <X11/Xutil.h><br>#include <stdio.h><br>#include <unistd.h> // sleep()<br>#include <stdbool.h><br>

<br>#include <gst/gst.h><br>#include <gst/app/gstappsrc.h><br>#include <gst/app/gstappbuffer.h><br>#include <gst/interfaces/xoverlay.h><br><br>#define BUFF_SIZE (640*480*3)//(1024)<br>#define BORDER_WIDTH    2<br>

<br>#define DEBUG   printf<br><br>typedef unsigned int  uint32;<br>typedef unsigned char uint8;<br><br>typedef struct {<br>    GstPipeline *pipeline;<br>    GstAppSrc *src;<br>    GstElement *sink;<br>    GstElement *video_decoder;<br>

    GstElement *audio_decoder;<br>    GstElement *audiosink;<br>    GstElement *queue1;<br>    GstElement *queue2;<br>    //GstElement *ffmpeg;<br>    GstElement *videosink;<br>    GstElement *demuxer;<br>    GMainLoop *loop;<br>

    guint sourceid;<br>    FILE *file;<br>} gst_app_t;<br><br>static gst_app_t gst_app;<br><br>static Window child_window = 0;<br>static Window window = 0;<br><br>static gboolean read_data(gst_app_t *app)<br>{<br>    GstBuffer *buffer;<br>

    guint8 *ptr;<br>    gint size;<br>    GstFlowReturn ret;<br><br>    ptr = g_malloc(BUFF_SIZE);<br>    g_assert(ptr);<br><br>    size = fread(ptr, 1, BUFF_SIZE, app->file);<br><br>    if(size == 0){<br>    ret = gst_app_src_end_of_stream(app->src);<br>

    DEBUG("eos returned %d at %d\n", ret, __LINE__);<br>    return FALSE;<br>    }<br><br>    buffer = gst_buffer_new();<br>    GST_BUFFER_MALLOCDATA(buffer) = ptr;<br>    GST_BUFFER_SIZE(buffer) = size;<br>    GST_BUFFER_DATA(buffer) = GST_BUFFER_MALLOCDATA(buffer);<br>

<br>    ret = gst_app_src_push_buffer(app->src, buffer);<br><br>    if(ret !=  GST_FLOW_OK){<br>        DEBUG("push buffer returned %d for %d bytes \n", ret, size);<br>        return FALSE;<br>    }<br><br>    if(size != BUFF_SIZE){<br>

        ret = gst_app_src_end_of_stream(app->src);<br>        DEBUG("eos returned %d at %d\n", ret, __LINE__);<br>        return FALSE;<br>    }<br><br>    return TRUE;<br>}<br><br>static void start_feed (GstElement * pipeline, guint size, gst_app_t *app)<br>

{<br>    if (app->sourceid == 0) {<br>        DEBUG ("start feeding\n");<br>        app->sourceid = g_idle_add ((GSourceFunc) read_data, app);<br>    }<br>}<br><br>static void stop_feed (GstElement * pipeline, gst_app_t *app)<br>

{<br>    if (app->sourceid != 0) {<br>        DEBUG ("stop feeding\n");<br>        g_source_remove (app->sourceid);<br>        app->sourceid = 0;<br>    }<br>}<br><br>static void on_pad_added(GstElement *element, GstPad *pad)<br>

{<br>    GstCaps *caps;<br>    GstStructure *str;<br>    gchar *name;<br>    //GstPad *ffmpegsink;<br>    GstPadLinkReturn ret;<br><br>    DEBUG("pad added\n");<br><br>    caps = gst_pad_get_caps(pad);<br>    str = gst_caps_get_structure(caps, 0);<br>

<br>    g_assert(str);<br><br>    name = (gchar*)gst_structure_get_name(str);<br><br>    DEBUG("pad name %s\n", name);<br><br>    gst_caps_unref(caps);<br>}<br><br>static gboolean bus_callback(GstBus *bus, GstMessage *message, gpointer *ptr)<br>

{<br>    gst_app_t *app = (gst_app_t*)ptr;<br><br>    switch(GST_MESSAGE_TYPE(message))<br>    {<br>    case GST_MESSAGE_ELEMENT: {<br>        gst_x_overlay_set_window_handle (GST_X_OVERLAY (GST_MESSAGE_SRC(message)), child_window);<br>

        }<br>        break;<br><br>    case GST_MESSAGE_ERROR:<br>        {<br>        gchar *debug;<br>        GError *err;<br><br>        gst_message_parse_error(message, &err, &debug);<br>        DEBUG("Error %s\n", err->message);<br>

        g_error_free(err);<br>        g_free(debug);<br>        g_main_loop_quit(app->loop);<br>        }<br>        break;<br><br>    case GST_MESSAGE_WARNING:<br>        {<br>        gchar *debug;<br>        GError *err;<br>

        gchar *name;<br><br>        gst_message_parse_warning(message, &err, &debug);<br>        DEBUG("Warning %s\nDebug %s\n", err->message, debug);<br><br>        name = GST_MESSAGE_SRC_NAME(message);<br>

<br>        DEBUG("Name of src %s\n", name ? name : "nil");<br>        g_error_free(err);<br>        g_free(debug);<br>        }<br>        break;<br><br>    case GST_MESSAGE_EOS:<br>        DEBUG("End of stream\n");<br>

        g_main_loop_quit(app->loop);<br>        break;<br><br>    case GST_MESSAGE_STATE_CHANGED:<br>        break;<br><br>    default:<br>        DEBUG("got message %s\n", \<br>        gst_message_type_get_name (GST_MESSAGE_TYPE (message)));<br>

        break;<br>    }<br><br>    return TRUE;<br>}<br><br>static gboolean terminate_playback (GstElement * loop)<br>{<br>    DEBUG ("Terminating playback\n");<br>    g_main_loop_quit ((GMainLoop *)loop);<br>    return FALSE;<br>

}<br><br>int gstreamer_init(int argc, char *argv[])<br>{<br>    gst_app_t *app = &gst_app;<br><br>    GstBus *bus;<br>    GstStateChangeReturn state_ret;<br><br>    app->file = fopen(argv[1], "r");<br><br>

    g_assert(app->file);<br><br>    /* initialization */<br>    gst_init((int)0, NULL);<br><br>    app->loop = g_main_loop_new(NULL, FALSE);<br><br>    /* create elements */<br>    app->pipeline = (GstPipeline *)gst_pipeline_new("my_pipeline");<br>

    app->src = (GstAppSrc *)gst_element_factory_make("appsrc", "myappsrc");<br>    app->video_decoder = gst_element_factory_make("ffdec_h264", "myvideodecoder");<br>    app->videosink = gst_element_factory_make("autovideosink", "myvideosink");<br>

    app->audiosink = gst_element_factory_make("alsasink", "myaudiosink");<br>    app->demuxer   = gst_element_factory_make("qtdemux","mydemuxer");<br>    app->audio_decoder=gst_element_factory_make("faad", "myaudiodecoder");<br>

    app->queue1=gst_element_factory_make("queue", "myqueue1");<br>    app->queue2=gst_element_factory_make("queue", "myqueue2");<br><br><br>    if (!app->videosink) {<br>        DEBUG ("output could not be found - check your install\n");<br>

    }<br><br>    g_assert(app->src);<br>    g_assert(app->video_decoder);<br>    g_assert(app->audio_decoder);<br><br>    g_assert(app->videosink);<br>    g_assert(app->audiosink);<br>    g_assert(app->demuxer);<br>

    g_assert(app->queue1);<br>    g_assert(app->queue2);<br><br>    bus = gst_pipeline_get_bus(GST_PIPELINE(app->pipeline));<br>    gst_bus_add_watch(bus, (GstBusFunc)bus_callback, app);<br>    gst_object_unref(bus);<br>

<br><br><br><br>    //gst_app_src_set_emit_signals(app->src, true);<br>    g_signal_connect(app->src, "need-data", G_CALLBACK(start_feed), app);<br>    g_signal_connect(app->src, "enough-data", G_CALLBACK(stop_feed), app);<br>

<br>    gst_bin_add_many (GST_BIN (app->pipeline), (GstElement *)app->src,app->demuxer,app->queue1,<br>                app->audio_decoder,app->audiosink,app->queue2,app->video_decoder,app->videosink, NULL);<br>

<br>    /* link everything together */<br><br>    if (!gst_element_link((GstElement *)app->src,(GstElement *)app->demuxer)) {<br><br>        DEBUG ("Failed to link source and demuxer !\n");<br>        return -1;<br>

    }<br><br>    /*if (!gst_element_link((GstElement *)app->demuxer, (GstElement *)app->queue1)) {<br><br>        DEBUG ("Failed to link demuxer and queue1 here!\n");<br>        return -1;<br>    }*/<br>    <br>

    if (!gst_element_link((GstElement *)app->audio_decoder, (GstElement *)app->audiosink)) {<br><br>        DEBUG ("Failed to link audio decoder and audio sink !\n");<br>        return -1;<br>    }<br><br>

    /*if (!gst_element_link((GstElement *)app->queue2, (GstElement *)app->video_decoder)) {<br><br>        DEBUG ("Failed to link queue2 and video_decoder !\n");<br>        return -1;<br>    }*/<br><br>    if (!gst_element_link((GstElement *)app->video_decoder, (GstElement *)app->videosink)) {<br>

<br>        DEBUG ("Failed to link video decoder and video sink !\n");<br>        return -1;<br>    }<br><br>    g_signal_connect(app->demuxer, "pad-added",G_CALLBACK(on_pad_added), app->audio_decoder);<br>

<br>    g_signal_connect(app->demuxer, "pad-added",G_CALLBACK(on_pad_added), app->video_decoder);<br><br>     <br>    state_ret = gst_element_set_state((GstElement *)app->pipeline, GST_STATE_PLAYING);<br>

    if (state_ret == GST_STATE_CHANGE_FAILURE) {<br><br>        DEBUG("Failed to start up pipeline!\n");<br>        return 1;<br>    }<br><br>    DEBUG("set state returned %d\n", state_ret);<br><br>    //g_timeout_add (15000, (GSourceFunc) terminate_playback, app->loop);<br>

<br>    g_main_loop_run(app->loop);<br><br>    state_ret = gst_element_set_state((GstElement *)app->pipeline, GST_STATE_NULL);<br>    DEBUG("set state null returned %d\n", state_ret);<br>    gst_object_unref(app->pipeline);<br>

<br>    return 1;<br>}<br><br>int main(int argc, char *argv[])<br>{<br>    Display *disp;<br>    Window root;<br>    long fgcolor, bgcolor;<br><br>    GC gc;<br>    XGCValues gc_val;<br>    XEvent event;<br>    char *msg = "Hello, World!";<br>

    int screen;<br><br>    disp = XOpenDisplay(NULL);<br>    if (disp == NULL) {<br>        fprintf(stderr, "Cannot open display\n");<br>        exit(1);<br>    }<br><br>    screen = DefaultScreen(disp);<br><br>

    root = RootWindow(disp, screen);<br>    fgcolor = BlackPixel(disp, screen);<br>    bgcolor = WhitePixel(disp, screen);<br><br>    window = XCreateSimpleWindow(disp, root, 100, 100, 1000, 840, 1,<br>                    fgcolor, bgcolor);<br>

<br>    child_window = XCreateSimpleWindow(disp, window, 100, 100, 800, 600, 1,<br>                    fgcolor, bgcolor);<br><br>    gc_val.foreground = fgcolor;<br>    gc_val.background = bgcolor;<br>    gc = XCreateGC(disp, child_window, GCForeground|GCBackground, &gc_val);<br>

<br>    XSelectInput(disp, child_window, ExposureMask | KeyPressMask);<br><br>    g_warning("map xwindow");<br>    //XMapWindow(disp, window);<br>    XMapWindow(disp, window);<br>    XMapWindow(disp, child_window);<br>

    XSync(disp, FALSE);<br><br>    //XDrawLine (disp, window, gc, 0, 0, 1000, 800); <br>    //XDrawLine (disp, child_window, gc, 0, 0, 800, 600); <br><br>    gstreamer_init(argc, argv);<br><br>    XDestroyWindow( disp, window );<br>

    XDestroyWindow( disp, child_window );<br><br>    XCloseDisplay( disp );<br><br>    return 0;<br>}<br><br></div><div>Thanks in Advance<br></div><div>Jyoti<br></div></div>