DVB Remux

Bernhard Graaf bernhard.graaf at gmx.de
Fri Jan 30 04:52:13 PST 2015


Hi,

 

I've try to remux a mpegts-stream from satellite to a file with demuxing and
muxing from/to a mpegts stream.

I thought that this should be easy and build following simple C-Code:

 

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <gst/gst.h>

#include <glib.h>

 

 

static gboolean

bus_call (GstBus     *bus,

          GstMessage *msg,

          gpointer    data)

{

  GMainLoop *loop = (GMainLoop *) data;

 

  switch (GST_MESSAGE_TYPE (msg)) {

 

    case GST_MESSAGE_EOS:

      g_print ("End of stream\n");

      g_main_loop_quit (loop);

      break;

 

    case GST_MESSAGE_ERROR: {

      gchar  *debug;

      GError *error;

 

      gst_message_parse_error (msg, &error, &debug);

      g_free (debug);

 

      g_printerr ("Error: %s\n", error->message);

      g_error_free (error);

 

      g_main_loop_quit (loop);

      break;

    }

/*    case GST_MESSAGE_ELEMENT: 

    {

      const GstStructure *str;

 

      str = gst_message_get_structure (msg);

      const gchar *name = gst_structure_get_name (str);

 

      printf("got message from %s\n", name);

    } */

    default:

      break;

  }

 

  return TRUE;

}

 

 

static void link_to_mux (GstPad *tolink_pad,  GstElement *mux)

{

  GstPad *pad;

  gchar *srcname, *sinkname;

 

  srcname = gst_pad_get_name (tolink_pad);

  pad = gst_element_get_compatible_pad (mux, tolink_pad, NULL);

  gst_pad_link (tolink_pad, pad);

  sinkname = gst_pad_get_name (pad);

  gst_object_unref (GST_OBJECT (pad));

 

  g_print ("A new pad %s was created and linked to %s\n", srcname,
sinkname);

  g_free (sinkname);

  g_free (srcname);

}

 

static void

on_pad_added (GstElement *element,

              GstPad     *pad,

              gpointer    data)

{

  GstElement *mux = (GstElement *) data;

  GstCaps *caps;

  gchar *caps_string;

  gchar *name;

 

  name = gst_pad_get_name (pad);

  printf("A new pad %s was created\n", name);

 

  caps = gst_pad_query_caps (pad, NULL);

  caps_string = gst_caps_to_string (caps);

  g_print (" Capability:  %s\n", caps_string);

 

//  if ((strstr(caps_string, "audio")) || (strstr(caps_string, "video"))) 

  link_to_mux(pad, mux);

 

  gst_caps_unref (caps);

  g_free (name);

  g_free (caps_string);  

 

}

 

 

void no_more_pads (GstElement* object, gpointer user_data)

{

  g_print("No more pads event from %s\n", gst_element_get_name(object));

}

 

int

main ()

{

  GMainLoop *loop;

 

  GstElement *pipeline, *source, *parse, *demux, *mux, *sink;

  GstBus *bus;

 

  gst_init (0, NULL);

 

  loop = g_main_loop_new (NULL, FALSE);

 

  pipeline = gst_pipeline_new ("DVB-Filesave");

  source   = gst_element_factory_make ("dvbbasebin",  "dvb-source");

  parse    = gst_element_factory_make ("tsparse",       "dvb-parse");

  demux    = gst_element_factory_make ("tsdemux",     "dvb-demux");

  mux    = gst_element_factory_make ("mpegtsmux",   "dvb-mux");

  sink     = gst_element_factory_make ("filesink", "file-output");

 

  if (!pipeline || !source || !parse || !demux || !mux || !sink) {

    g_printerr ("One element could not be created. Exiting.\n");

    if(!pipeline) g_printerr("Pipeline not created\n");

    else if(!source) g_printerr("Source not created\n");

    else if(!sink) g_printerr("Sink not created\n");

    return -1;

  }

 

  g_object_set (G_OBJECT (source), "adapter", 2, NULL);

  g_object_set (G_OBJECT (source), "frequency", 12544000, NULL);

  g_object_set (G_OBJECT (source), "program-numbers", "17501", NULL); 

  g_object_set (G_OBJECT (source), "polarity", "h", NULL);

  g_object_set (G_OBJECT (source), "symbol-rate", 22000, NULL);

 

  g_object_set (G_OBJECT (sink), "location", "remux_test.mpg", NULL);

 

  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));

  gst_bus_add_watch (bus, bus_call, loop);

  gst_object_unref (bus);

 

  gst_bin_add_many (GST_BIN (pipeline), source, parse, demux, mux, sink,
NULL);

 

  gst_element_link_many (source, parse, demux, NULL);

  gst_element_link (mux, sink);

 

  g_signal_connect (demux, "pad-added", G_CALLBACK (on_pad_added), mux);

  g_signal_connect (demux, "no-more-pads", G_CALLBACK (on_pad_added), NULL);


 

 

  g_print ("Now playing: ");

  gst_element_set_state (pipeline, GST_STATE_PLAYING);

 

  g_print ("Running...\n");

  g_main_loop_run (loop);

 

  return 0;

}

 

But I get following error running with GST_DEBUG=5:

 

<snipe>

0:00:01.482668761  5432      0x14c52d0 DEBUG                   task
gsttask.c:663:gst_task_set_state:<dvbsrc0:src> Changing task 0x14ae290 to
state 2

0:00:01.482684269  5432      0x14c52d0 DEBUG              GST_EVENT
gstevent.c:301:gst_event_new_custom: creating new event 0x7fbca0003490 eos
28174

0:00:01.482706379  5432      0x14c52d0 WARN                 basesrc
gstbasesrc.c:2933:gst_base_src_loop:<dvbsrc0> error: Internal data flow
error.

0:00:01.482720791  5432      0x14c52d0 WARN                 basesrc
gstbasesrc.c:2933:gst_base_src_loop:<dvbsrc0> error: streaming task paused,
reason not-negotiated (-4)

0:00:01.482736371  5432      0x14c52d0 DEBUG            GST_MESSAGE
gstelement.c:1804:gst_element_message_full:<dvbsrc0> start

0:00:01.482766019  5432      0x14c52d0 INFO        GST_ERROR_SYSTEM
gstelement.c:1835:gst_element_message_full:<dvbsrc0> posting message:
Internal data flow error.

0:00:01.482797146  5432      0x14c52d0 DEBUG                GST_BUS
gstbus.c:310:gst_bus_post:<bus2> [msg 0x7fbca80022c0] posting on bus error
message: 0x7fbca80022c0, time 99:99:99.999999999, seq-num 149, element
'dvbsrc0', GstMessageError, gerror=(GError)NULL,
debug=(string)"gstbasesrc.c\(2933\):\ gst_base_src_loop\ \(\):\
/GstPipeline:DVB-Filesave/DvbBaseBin:dvb-source/GstDvbSrc:dvbsrc0:\012stream
ing\ task\ paused\,\ reason\ not-negotiated\ \(-4\)";

0:00:01.482830109  5432      0x14c52d0 DEBUG                    bin
gstbin.c:3409:gst_bin_handle_message_func:<dvb-source> [msg 0x7fbca80022c0]
handling child dvbsrc0 message of type error

0:00:01.482846629  5432      0x14c52d0 DEBUG                    bin
gstbin.c:3416:gst_bin_handle_message_func:<dvb-source> got ERROR message,
unlocking state change

0:00:01.482860232  5432      0x14c52d0 DEBUG                    bin
gstbin.c:3744:gst_bin_handle_message_func:<dvb-source> posting message
upward

0:00:01.482873804  5432      0x14c52d0 DEBUG                GST_BUS
gstbus.c:310:gst_bus_post:<bus0> [msg 0x7fbca80022c0] posting on bus error
message: 0x7fbca80022c0, time 99:99:99.999999999, seq-num 149, element
'dvbsrc0', GstMessageError, gerror=(GError)NULL,
debug=(string)"gstbasesrc.c\(2933\):\ gst_base_src_loop\ \(\):\
/GstPipeline:DVB-Filesave/DvbBaseBin:dvb-source/GstDvbSrc:dvbsrc0:\012stream
ing\ task\ paused\,\ reason\ not-negotiated\ \(-4\)";

0:00:01.482900244  5432      0x14c52d0 DEBUG                    bin
gstbin.c:3409:gst_bin_handle_message_func:<DVB-Filesave> [msg
0x7fbca80022c0] handling child dvbsrc0 message of type error

0:00:01.482915307  5432      0x14c52d0 DEBUG                    bin
gstbin.c:3416:gst_bin_handle_message_func:<DVB-Filesave> got ERROR message,
unlocking state change

0:00:01.482928669  5432      0x14c52d0 DEBUG                    bin
gstbin.c:3744:gst_bin_handle_message_func:<DVB-Filesave> posting message
upward

0:00:01.482941762  5432      0x14c52d0 DEBUG                GST_BUS
gstbus.c:310:gst_bus_post:<bus1> [msg 0x7fbca80022c0] posting on bus error
message: 0x7fbca80022c0, time 99:99:99.999999999, seq-num 149, element
'dvbsrc0', GstMessageError, gerror=(GError)NULL,
debug=(string)"gstbasesrc.c\(2933\):\ gst_base_src_loop\ \(\):\
/GstPipeline:DVB-Filesave/DvbBaseBin:dvb-source/GstDvbSrc:dvbsrc0:\012stream
ing\ task\ paused\,\ reason\ not-negotiated\ \(-4\)";

0:00:01.482965819  5432      0x14c52d0 DEBUG                GST_BUS
gstbus.c:345:gst_bus_post:<bus1> [msg 0x7fbca80022c0] pushing on async queue

0:00:01.482985839  5432      0x14c52d0 DEBUG                GST_BUS
gstbus.c:348:gst_bus_post:<bus1> [msg 0x7fbca80022c0] pushed on async queue

0:00:01.483001254  5432      0x14c52d0 DEBUG                GST_BUS
gstbus.c:341:gst_bus_post:<bus0> [msg 0x7fbca80022c0] dropped

0:00:01.483001424  5432      0x13a0800 DEBUG                GST_BUS
gstbus.c:505:gst_bus_timed_pop_filtered:<bus1> got message 0x7fbca80022c0,
error from dvbsrc0, type mask is 4294967295

0:00:01.483018949  5432      0x14c52d0 DEBUG                GST_BUS
gstbus.c:341:gst_bus_post:<bus2> [msg 0x7fbca80022c0] dropped

0:00:01.483073809  5432      0x14c52d0 INFO        GST_ERROR_SYSTEM
gstelement.c:1858:gst_element_message_full:<dvbsrc0> posted error message:
Internal data flow error.

0:00:01.483039739  5432      0x13a0800 DEBUG                GST_BUS
gstbus.c:773:gst_bus_source_dispatch:<bus1> source 0x14dfe40 calling
dispatch with error message: 0x7fbca80022c0, time 99:99:99.999999999,
seq-num 149, element 'dvbsrc0', GstMessageError, gerror=(GError)NULL,
debug=(string)"gstbasesrc.c\(2933\):\ gst_base_src_loop\ \(\):\
/GstPipeline:DVB-Filesave/DvbBaseBin:dvb-source/GstDvbSrc:dvbsrc0:\012stream
ing\ task\ paused\,\ reason\ not-negotiated\ \(-4\)";

0:00:01.483095819  5432      0x14c52d0 DEBUG               GST_PADS
gstpad.c:3498:check_sticky:<dvbsrc0:src> pushing all sticky events

Error: Internal data flow error.

0:00:01.483145094  5432      0x14c52d0 DEBUG               GST_PADS
gstpad.c:3431:push_sticky:<dvbsrc0:src> event stream-start was already
received

0:00:01.483165454  5432      0x13a0800 DEBUG                GST_BUS
gstbus.c:778:gst_bus_source_dispatch:<bus1> source 0x14dfe40 handler returns
1

0:00:01.483177839  5432      0x14c52d0 DEBUG               GST_PADS
gstpad.c:3431:push_sticky:<dvbsrc0:src> event caps was already received

0:00:01.483224132  5432      0x14c52d0 DEBUG               GST_PADS
gstpad.c:3431:push_sticky:<dvbsrc0:src> event segment was already received

0:00:01.483241264  5432      0x14c52d0 DEBUG              GST_EVENT
gstpad.c:5098:gst_pad_send_event_unchecked:<queue0:sink> have event type eos
event: 0x7fbca0003490, time 99:99:99.999999999, seq-num 39, (NULL)

 

Someone with any idea?

 

Thanks a lot!

Bernhard

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20150130/57f485eb/attachment-0001.html>


More information about the gstreamer-devel mailing list