Meego camera input

Peter Staab PixStaMP at gmx.net
Mon Sep 5 01:45:17 PDT 2011


Hello,

I am trying to record video with gstreamer on a N950 Meego device (from a Qt application). For first tests I adopted this sample code: http://maemo.org/maemo_release_documentation/maemo4.1.x/node9.html

The adopted code looks this way:
#####
/* Initialize Gstreamer */
    gst_init(NULL, NULL);

    /* Create pipeline and attach a callback to it's
     * message bus */
    pipeline = gst_pipeline_new("test-camera");

    bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
    gst_bus_add_watch(bus, (GstBusFunc)bus_callback, this);
    gst_object_unref(GST_OBJECT(bus));

    /* Create elements */
    /* Camera video stream comes from a Video4Linux driver */
    camera_src = gst_element_factory_make("autovideosrc", "camera_src"); //also tested: subdevsrc, v4l2camsrc, v4l2src
    /* Colorspace filter is needed to make sure that sinks understands
     * the stream coming from the camera */
    csp_filter = gst_element_factory_make("ffmpegcolorspace", "capsfilter");
    /* Tee that copies the stream to multiple outputs */
    tee = gst_element_factory_make("tee", "tee");
    /* Queue creates new thread for the stream */
    screen_queue = gst_element_factory_make("queue", "screen_queue");
    /* Sink that shows the image on screen. Xephyr doesn't support XVideo
     * extension, so it needs to use ximagesink, but the device uses
     * xvimagesink */
    screen_sink = gst_element_factory_make("xvimagesink", "screen_sink");
    /* Creates separate thread for the stream from which the image
     * is captured */
    image_queue = gst_element_factory_make("queue", "image_queue");
    /* Filter to convert stream to use format that the gdkpixbuf library
     * can use */
    image_filter = gst_element_factory_make("ffmpegcolorspace", "image_filter");
    /* A dummy sink for the image stream. Goes to bitheaven */
    image_sink = gst_element_factory_make("fakesink", "image_sink");

    /* Check that elements are correctly initialized */
    if(!(pipeline && camera_src && screen_sink && csp_filter && screen_queue
            && image_queue && image_filter && image_sink))
    {
            qDebug() << "Couldn't create pipeline elements";
            QApplication::exit(0);
    }

    /* Set image sink to emit handoff-signal before throwing away
     * it's buffer */
    g_object_set(G_OBJECT(image_sink),
                    "signal-handoffs", TRUE, NULL);



    /* Add elements to the pipeline. This has to be done prior to
     * linking them */
    gst_bin_add_many(GST_BIN(pipeline), camera_src, csp_filter,
                    tee, screen_queue, screen_sink, image_queue,
                    image_filter, image_sink, NULL);

    /* Specify what kind of video is wanted from the camera */
    caps = gst_caps_new_simple("video/x-raw-rgb", //x-raw-rgb yuv
                    "width", G_TYPE_INT, 640,
                    "height", G_TYPE_INT, 480,
                    NULL);

    if (!caps)
    {
        qDebug() << "caps NULL";
    }


    /* Link the camera source and colorspace filter using capabilities
     * specified */
    if(!gst_element_link_filtered(camera_src, csp_filter, caps))
    {
        qDebug() << "gst_element_link_filtered caps error";
     //   QApplication::exit(0);
    }
    gst_caps_unref(caps);

    /* Connect Colorspace Filter -> Tee -> Screen Queue -> Screen Sink
     * This finalizes the initialization of the screen-part of the pipeline */
    if(!gst_element_link_many(csp_filter, tee, screen_queue, screen_sink, NULL))
    {
        qDebug() << "gst_element_link_many tee error";
        QApplication::exit(0);
    }

    /* gdkpixbuf requires 8 bits per sample which is 24 bits per
     * pixel */
    caps = gst_caps_new_simple("video/x-raw-rgb",
                    "width", G_TYPE_INT, 640,
                    "height", G_TYPE_INT, 480,
                    "bpp", G_TYPE_INT, 24,
                    "depth", G_TYPE_INT, 24,
                    "framerate", GST_TYPE_FRACTION, 15, 1,
                    NULL);

    /* Link the image-branch of the pipeline. The pipeline is
     * ready after this */
    if(!gst_element_link_many(tee, image_queue, image_filter, NULL))
    {
        qDebug() << "gst_element_link_many image_queue error";
        QApplication::exit(0);
    }

    if(!gst_element_link_filtered(image_filter, image_sink, caps))
    {
        qDebug() << "gst_element_link_filtered image_sink error";
        QApplication::exit(0);
    }

    gst_caps_unref(caps);

    /* As soon as screen is exposed, window ID will be advised to the sink */
    //g_signal_connect(this, "expose-event", G_CALLBACK(expose_cb),
    //                 screen_sink);

    GstStateChangeReturn sret = gst_element_set_state(pipeline, GST_STATE_PLAYING);
    if(sret == GST_STATE_CHANGE_FAILURE)
    {
        qDebug() << "Error GST_STATE_PLAYING: " << sret;
    }
    else
    {
        qDebug() << "Ok GST_STATE_PLAYING: " << sret;
    }
#####

Now the problem is that I just get "GST_STATE_CHANGE_FAILURE" as result and no preview (no error/debug messages).
I already tested different parameters and looked into the Qt Mobility source code for reference which uses gstreamer too, all without success.

Is there something wrong with the code, or can someone provide me a simple working example how to make the camera preview visible (in Qt/Meego)?

Regards,
Peter
-- 
NEU: FreePhone - 0ct/min Handyspartarif mit Geld-zurück-Garantie!		
Jetzt informieren: http://www.gmx.net/de/go/freephone


More information about the gstreamer-devel mailing list