From: MSJ <mau...@ya...> - 2009-10-02 22:01:55
|
I'm trying to do the same, but my pipeline doesn't seem to work; if I removed either of the lines marked *** then video or audio play, but having both lines doesn't seem to work. I've been trying evrything, and I notice than in the working case I get an sync-done message which I don't get in the other cases. I appreaciate any insight. Thanks. static void on_pad_added (GstElement *element, GstPad *pad, gpointer data) { GstCaps *caps; const gchar *mime; GstPad *audiopad, *videopad; caps = gst_pad_get_caps (pad); g_assert (caps != NULL); mime = gst_structure_get_name (gst_caps_get_structure (caps, 0)); if (g_strrstr (mime, "audio")) { /* only link once */ audiopad = gst_element_get_static_pad (audio, "sink"); g_assert(audiopad); if (GST_PAD_IS_LINKED (audiopad)) { g_error("Audio already Linked\n"); g_object_unref (audiopad); return; } g_print("Linking the audio %s\n", mime); /* link’n’play */ gst_pad_link (pad, audiopad); gst_object_unref (audiopad); } if (g_strrstr (mime, "video")) { /* only link once */ videopad = gst_element_get_static_pad (video, "sink"); g_assert(videopad); if (GST_PAD_IS_LINKED (videopad)) { g_error("Video already Linked\n"); g_object_unref (videopad); return; } gst_pad_link (pad, videopad); gst_object_unref (videopad); } gst_caps_unref (caps); } [...] Main Initialization /* Pipeline Creation */ gst_bin_add_many (GST_BIN (pipeline), source, demux, NULL); /* Link of the elements together */ /* file-source -> AVI-demuxer ~> A/V CODEC -> sink */ gst_element_link (source, demux); g_signal_connect (demux, "pad-added", G_CALLBACK (on_pad_added), NULL); /* create audio output */ audio = gst_bin_new ("audiobin"); gst_bin_add_many (GST_BIN (audio), aqueue, adec, asink, NULL); gst_element_link_many(aqueue, adec, asink, NULL); audiopad = gst_element_get_static_pad (aqueue, "sink"); gst_element_add_pad (audio, gst_ghost_pad_new ("sink", audiopad)); gst_object_unref (audiopad); gst_bin_add (GST_BIN (pipeline), audio); *** /* create video output */ video = gst_bin_new ("videobin"); gst_bin_add_many (GST_BIN (video), vqueue, vdec, vsink, NULL); gst_element_link_many (vqueue, vdec, vsink, NULL); videopad = gst_element_get_static_pad (vqueue, "sink"); gst_element_add_pad (video, gst_ghost_pad_new ("sink", videopad)); gst_object_unref (videopad); gst_bin_add (GST_BIN (pipeline), video *** [...] /* Set the pipeline to "playing" state*/ g_print ("Now playing: %s\n", aviFile); gst_element_set_state (pipeline, GST_STATE_PLAYING); /* Iterate */ g_print ("Running...\n"); /* Out of the main loop, clean up nicely */ g_print ("Returned, stopping playback\n"); gst_element_set_state (pipeline, GST_STATE_NULL); g_print ("Deleting pipeline\n"); gst_object_unref (GST_OBJECT (pipeline)); -- View this message in context: http://www.nabble.com/Converting-a-gst-launch-pipeline-to-C-code-tp19728759p25722086.html Sent from the GStreamer-devel mailing list archive at Nabble.com. |