demux/remux pipeline hangs when audio is added

Robert Krakora rob.krakora at messagenetsystems.com
Wed Oct 2 10:38:41 PDT 2013


Have you tried with gst-launch (similar to below -- untested)

gst-launch filesrc location=<path> ! tsdemux name=demux ! mpeg2dec !
x264enc ! mpegtsmux name=mux ! hlssink demux. ! a52dec ! audioconvert !
faac ! mux.


On Wed, Oct 2, 2013 at 1:19 PM, Carah Smith <carah29ingress at gmail.com>wrote:

> Hi,
> I am trying to make a pipeline that takes a transport stream in, demuxes
> it, does some transcoding, remuxes, and sends it to a sink.
> I can make it work if I only have video in the pipeline or if I only have
> audio but once I add both, the application hangs. Here is my source code (I
> removed all the error checking for emailing to reduce line length):
>
> struct custom_data
> {
>     GstElement *video_decoder;
>     GstElement *audio_decoder;
> };
>
> void
> link_to_multiplexer(
>     GstElement *tolink_element,
>     GstElement *mux)
> {
>     GstCaps          *pad_caps = NULL;
>     GstPad           *pad;
>     GstPad           *tolink_pad;
>     GstPadLinkReturn  ret;
>
>     tolink_pad = gst_element_get_static_pad(tolink_element, "src");
>     pad_caps   = gst_pad_query_caps(tolink_pad, NULL);
>     pad        = gst_element_get_compatible_pad(mux, tolink_pad, pad_caps);
>     gst_caps_unref(pad_caps);
>
>     ret = gst_pad_link(tolink_pad, pad);
>     gst_object_unref(GST_OBJECT(pad));
>     g_print("A new pad %s was created and linked to %s\n",
> gst_pad_get_name(tolink_pad), gst_pad_get_name(pad));
> }
>
> static void on_pad_added(
>     GstElement *src,
>     GstPad *new_pad,
>     struct custom_data *data)
> {
>     GstCaps          *new_pad_caps = NULL;
>     GstStructure     *new_pad_struct = NULL;
>     const gchar      *new_pad_type = NULL;
>     GstPad           *decode_pad = NULL;
>     GstPadLinkReturn  ret;
>
>     g_print("Received new pad '%s' from '%s':\n", GST_PAD_NAME(new_pad),
>             GST_ELEMENT_NAME(src));
>
>     /* Check the new pad's type */
>     new_pad_caps   = gst_pad_query_caps(new_pad, NULL);
>     new_pad_struct = gst_caps_get_structure(new_pad_caps, 0);
>     new_pad_type   = gst_structure_get_name(new_pad_struct);
>
>     g_print("New pad type is %s\n", new_pad_type);
>     if (g_str_has_prefix(new_pad_type, "video/mpeg"))
>     {
>         decode_pad = gst_element_get_static_pad(data->video_decoder,
> "sink");
>     }
>     else if (g_str_has_prefix(new_pad_type, "audio/x-ac3"))
>     {
>         decode_pad = gst_element_get_static_pad(data->audio_decoder,
> "sink");
>     }
>     if (!gst_pad_is_linked(decode_pad))
>     {
>         ret = gst_pad_link(new_pad, decode_pad);
>     }
>
>     gst_caps_unref(new_pad_caps);
>     gst_object_unref(decode_pad);
> }
>
> int
> main(int argc, char **argv)
> {
>     GstElement *source;
>     GstElement *pipeline;
>     GstElement *sink;
>     GstElement *demux;
>     GstElement *mux;
>     GstElement *v_dec;
>     GstElement *x264_enc;
>     GstElement *a_dec;
>     GstElement *a_convert;
>     GstElement *aac_enc;
>     struct custom_data data;
>
>     GstBus     *bus;
>     GstMessage *msg;
>     gboolean terminate = FALSE;
>
>     gst_init (&argc, &argv);
>
>     source    = gst_element_factory_make("filesrc", "file-source");
>     demux     = gst_element_factory_make("tsdemux", "demux");
>     v_dec     = gst_element_factory_make("mpeg2dec", "video_decoder");
>     x264_enc  = gst_element_factory_make("x264enc", "h264_encoder");
>     a_dec     = gst_element_factory_make("a52dec", "audio_decoder");
>     a_convert = gst_element_factory_make("audioconvert",
> "audio_converter");
>     aac_enc   = gst_element_factory_make("faac", "aac_encoder");
>     mux       = gst_element_factory_make("mpegtsmux", "muxer");
>     sink      = gst_element_factory_make("hlssink", "hls_sink");
>
>     data.video_decoder = v_dec;
>     data.audio_decoder = a_dec;
>
>     pipeline = gst_pipeline_new("test-pipeline");
>
>     g_object_set(G_OBJECT(source), "location", "stream_1.ts", NULL);
>
>     gst_bin_add_many(GST_BIN(pipeline), source, demux, x264_enc, v_dec,
> a_dec, aac_enc, a_convert, mux, sink, NULL);
>
>     gst_element_link(source, demux);
>     gst_element_link_many(a_dec, a_convert, aac_enc, NULL);
>     link_to_multiplexer(x264_enc, mux);
>     link_to_multiplexer(aac_enc, mux);
>
>     gst_element_link(v_dec, x264_enc);
>     gst_element_link(mux, sink);
>
>     g_signal_connect(demux, "pad-added", G_CALLBACK(on_pad_added), &data);
>
>     gst_element_set_state(pipeline, GST_STATE_PLAYING);
>
>     /* Listen to the bus */
>     bus = gst_element_get_bus(pipeline);
>     do
>     {
>         msg = gst_bus_timed_pop(bus, 0);
>
>         /* Parse message */
>         if (msg != NULL)
>         {
>             switch (GST_MESSAGE_TYPE(msg))
>             {
>                 case GST_MESSAGE_ERROR:
>                 case GST_MESSAGE_EOS:
>                     terminate = TRUE;
>                     break;
>                 case GST_MESSAGE_STATE_CHANGED:
>                     if (GST_MESSAGE_SRC(msg) == GST_OBJECT(pipeline))
>                     {
>                         GstState old_state, new_state, pending_state;
>
>                         gst_message_parse_state_changed(msg, &old_state,
> &new_state, &pending_state);
>                         g_print("Pipeline state changed from %s to %s:\n",
>                         gst_element_state_get_name(old_state),
> gst_element_state_get_name(new_state));
>                     }
>                     break;
>                 default:
>                 g_printerr("New bus message: %s.\n",
> gst_message_type_get_name(GST_MESSAGE_TYPE(msg)));
>                 break;
>             }
>             gst_message_unref(msg);
>         }
>     } while (!terminate);
>
>     /* Free resources */
>     gst_object_unref(bus);
>     gst_element_set_state(pipeline, GST_STATE_NULL);
>     gst_object_unref(pipeline);
>
>     return 0;
> }
>
> Here is my output when it hangs:
>
> A new pad src was created and linked to sink_65
> A new pad src was created and linked to sink_66
> Pipeline state changed from NULL to READY:
> New bus message: stream-status.
> New bus message: stream-status.
> New bus message: element.
> New bus message: element.
> Received new pad 'video_01e1' from 'demux':
> New pad type is video/mpeg
> New bus message: latency.
> New bus message: qos.
> New bus message: qos.
> New bus message: latency.
> Received new pad 'audio_01e2' from 'demux':
> New pad type is audio/x-ac3
> New bus message: tag.
> (Hangs here)
>
> Here is my output if I detach the audio from the muxer and only let the
> video flow all the way through:
>
> A new pad src was created and linked to sink_65
> Pipeline state changed from NULL to READY:
> New bus message: stream-status.
> New bus message: stream-status.
> New bus message: element.
> New bus message: element.
> Received new pad 'video_01e1' from 'demux':
> New pad type is video/mpeg
> New bus message: latency.
> New bus message: qos.
> New bus message: qos.
> New bus message: latency.
> Received new pad 'audio_01e2' from 'demux':
> New pad type is audio/x-ac3
> Received new pad 'audio_01e3' from 'demux':
> New pad type is audio/x-ac3
> Pad is already linked.
> New bus message: tag.
> New bus message: stream-start.
> Pipeline state changed from READY to PAUSED:
> New bus message: async-done.
> New bus message: new-clock.
> Pipeline state changed from PAUSED to PLAYING:
> (Program reads whole transport stream and successfully completes)
>
> Could please help me determine why adding the audio to the muxer causes
> the program to hang?
>
>
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>


-- 

Rob Krakora,
Senior Software Engineer

MessageNet Systems
101 E Carmel Dr, Suite 105
Carmel, IN 46032

MessageNetSystems.com<http://www.messagenetcommunicationsystems.com/?utm_source=email+signature&utm_medium=email&utm_campaign=email+signature+to+homepage>
Rob.Krakora at MessageNetSystems.com <rob.krakora at messagenetsystems.com>
P: 317.566.1677, 212
F: 317.663.0808

For the latest news, information, and blogs, please be sure to visit,
follow, and like us...

<http://www.messagenetcommunicationsystems.com/get-the-message-out-blog/?utm_source=email+signature&utm_medium=email&utm_campaign=gmail+signature+to+blog>
   <http://www.youtube.com/user/MessageNetConnection/feed>
<http://www.linkedin.com/company/messagenet-systems>
   <http://twitter.com/MessageNet>  <http://www.facebook.com/MessageNetsystems>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20131002/a84e9c41/attachment.html>


More information about the gstreamer-devel mailing list