DVB Remux

Bernhard Graaf bernhard.graaf at gmx.de
Sat Jan 31 04:15:29 PST 2015


Hi Jan,

Thanks a lot!
Now it works without stalling.
The code:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <gst/gst.h>
#include <glib.h>


GstElement *pipeline;
GstElement *parser[5];
GstElement *p_queue[5];

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);
  if (GST_PAD_IS_LINKED (pad)) g_print (" pad %s was linked to %s\n",
srcname, sinkname);
  else g_print("Link failed: %s to %s!\n",srcname, sinkname);
  gst_object_unref (GST_OBJECT (pad));

  
  g_free (sinkname);
  g_free (srcname);
  g_print(" Leaving link to mux\n");
}

static void on_pad_added (GstElement *element,
              GstPad     *pad,
              gpointer    data)
{
  GstElement *mux = (GstElement *) data;
  GstCaps *caps;
  gchar *caps_string;
  gchar *name;
  
  GstPad *sink_pad, *src_pad;

  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, "video/mpeg")) && (!parser[0])) 
  {
    parser[0] = gst_element_factory_make ("mpegvideoparse",  NULL);
    gst_bin_add (GST_BIN (pipeline), parser[0]);
    p_queue[0] = gst_element_factory_make ("queue",  NULL);
    gst_bin_add (GST_BIN (pipeline), p_queue[0]);

    gst_element_set_state (parser[0], GST_STATE_PLAYING);
    gst_element_set_state (p_queue[0], GST_STATE_PLAYING);

    gst_element_link (p_queue[0], parser[0]);

    sink_pad = gst_element_get_static_pad (p_queue[0], "sink");
    src_pad = gst_element_get_static_pad (parser[0], "src");

    gst_pad_link (pad, sink_pad);
    link_to_mux(src_pad, mux);
    gst_object_unref (GST_OBJECT (sink_pad));
    gst_object_unref (GST_OBJECT (src_pad));
  }
  else if ((strstr(caps_string, "video/x-h264")) && (!parser[0])) 
  {
    parser[0] = gst_element_factory_make ("h264parse",  NULL);
    gst_bin_add (GST_BIN (pipeline), parser[0]);
    p_queue[0] = gst_element_factory_make ("queue",  NULL);
    gst_bin_add (GST_BIN (pipeline), p_queue[0]);

    gst_element_set_state (parser[0], GST_STATE_PLAYING);
    gst_element_set_state (p_queue[0], GST_STATE_PLAYING);

    gst_element_link (p_queue[0], parser[0]);

    sink_pad = gst_element_get_static_pad (p_queue[0], "sink");
    src_pad = gst_element_get_static_pad (parser[0], "src");

    gst_pad_link (pad, sink_pad);
    link_to_mux(src_pad, mux);
    gst_object_unref (GST_OBJECT (sink_pad));
    gst_object_unref (GST_OBJECT (src_pad));
  }
  else if ((strstr(caps_string, "audio/mpeg")) && (!parser[1])) 
  {
    parser[1] = gst_element_factory_make ("mpegaudioparse",  NULL);
    gst_bin_add (GST_BIN (pipeline), parser[1]);
    p_queue[1] = gst_element_factory_make ("queue",  NULL);
    gst_bin_add (GST_BIN (pipeline), p_queue[1]);

    gst_element_set_state (parser[1], GST_STATE_PLAYING);
    gst_element_set_state (p_queue[1], GST_STATE_PLAYING);

    gst_element_link (p_queue[1], parser[1]);

    sink_pad = gst_element_get_static_pad (p_queue[1], "sink");
    src_pad = gst_element_get_static_pad (parser[1], "src");

    gst_pad_link (pad, sink_pad);
    link_to_mux(src_pad, mux);
    gst_object_unref (GST_OBJECT (sink_pad));
    gst_object_unref (GST_OBJECT (src_pad));
  }
  else if ((strstr(caps_string, "audio/x-ac3")) && (!parser[2])) 
  {
    parser[2] = gst_element_factory_make ("ac3parse",  NULL);
    gst_bin_add (GST_BIN (pipeline), parser[2]);
    p_queue[2] = gst_element_factory_make ("queue",  NULL);
    gst_bin_add (GST_BIN (pipeline), p_queue[2]);

    gst_element_set_state (parser[2], GST_STATE_PLAYING);
    gst_element_set_state (p_queue[2], GST_STATE_PLAYING);

    gst_element_link (p_queue[2], parser[2]);

    sink_pad = gst_element_get_static_pad (p_queue[2], "sink");
    src_pad = gst_element_get_static_pad (parser[2], "src");

    gst_pad_link (pad, sink_pad);
    link_to_mux(src_pad, mux);
    gst_object_unref (GST_OBJECT (sink_pad));
    gst_object_unref (GST_OBJECT (src_pad));
  } 


  gst_caps_unref (caps);
  g_free (name);
  g_free (caps_string);  
  g_print("Leaving Pad-Adder\n");
}


void no_more_pads (GstElement* object, gpointer user_data)
{
  g_print("No more pads event from %s\n", gst_element_get_name(object));
}

void on_pad_removed (GstElement* object, GstPad* pad, gpointer user_data)
{

  g_print("pad %s was removed\n", gst_pad_get_name (pad));
}

int
main ()
{
  GMainLoop *loop;

  GstElement *source, *queue2, *demux, *mux, *queue, *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");
  queue2   = gst_element_factory_make ("queue2",      "dvb-queue2");
  demux    = gst_element_factory_make ("tsdemux",     "dvb-demux");
  mux	   = gst_element_factory_make ("mpegtsmux",   "dvb-mux");
  queue    = gst_element_factory_make ("queue",       "dvb-queue");
  sink     = gst_element_factory_make ("filesink",    "file-output");

  if (!pipeline || !source || !demux || !mux || !queue || !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(!demux) g_printerr("Demux not created\n");
    else if(!mux) g_printerr("Muxer not created\n");
    else if(!queue) g_printerr("Queue not created\n");
    else if(!sink) g_printerr("Sink not created\n");
    return -1;
  }

  g_object_set (G_OBJECT (source), "adapter", 3, 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 (source), "async-handling", TRUE, NULL);

  g_object_set (G_OBJECT (sink), "location", "remux_test.mpg", NULL);
  g_object_set (G_OBJECT (sink), "sync", FALSE, 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, queue2, demux, mux, queue,
sink, NULL);

  gst_element_link_many (source, queue2, demux, NULL);
  gst_element_link_many (mux, queue, sink, NULL);

  g_signal_connect (demux, "pad-added", G_CALLBACK (on_pad_added), mux);
  g_signal_connect (demux, "no-more-pads", G_CALLBACK (no_more_pads), NULL);
  g_signal_connect (demux, "pad-removed", G_CALLBACK (on_pad_removed),
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 now there seems to be a timing issue:

<snipe>
0:00:47.631243054  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
queue2 gstqueue2.c:994:update_in_rates:<dvb-queue2> [00m rates: in
486778.154258, time 0:00:01.666073123
0:00:47.631281369  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
queue_dataflow gstqueue.c:1240:gst_queue_loop:<queue0> [00m queue is empty
0:00:47.660218322  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;33m           GST_CLOCK
gstclock.c:950:gst_clock_get_internal_time:<GstSystemClock> [00m internal
time 3:52:34.418290610
0:00:47.660297457  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;33m           GST_CLOCK
gstclock.c:995:gst_clock_get_time:<GstSystemClock> [00m adjusted time
3:52:34.418290610
0:00:47.660325672  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2300:gst_base_src_do_sync:<dvbsrc0> [00m no sync needed
0:00:47.660342652  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2505:gst_base_src_get_range:<dvbsrc0> [00m buffer ok
0:00:47.660372672  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2441:gst_base_src_get_range:<dvbsrc0> [00m calling
create offset 18446744073709551615 length 4096, time 0
0:00:47.660399602  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
dvbsrc gstdvbsrc.c:1455:gst_dvbsrc_create:<dvbsrc0> [00m Reading from DVR
device
0:00:47.660411932  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
queue_dataflow gstqueue.c:1252:gst_queue_loop:<queue0> [00m queue is not
empty
0:00:47.660434932  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;34m          GST_MEMORY gstmemory.c:137:gst_memory_init: [00m new
memory 0x7f1e080dbde0, maxsize:8199 offset:0 size:8192
0:00:47.660479917  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:653:mpegts_packetizer_push: [00m Pushing
8192 byte from offset 18446744073709551615
0:00:47.660494337  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
GST_POLL gstpoll.c:1195:gst_poll_wait: [00m 0x19c1800: timeout
:0:00:01.000000000
0:00:47.660518727  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m
[00;01;37;41m     GST_PERFORMANCE gstadapter.c:499:gst_adapter_map: [00m
copy remaining 8364 bytes from adapter
0:00:47.660562197  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;33m           GST_CLOCK
gstclock.c:950:gst_clock_get_internal_time:<GstSystemClock> [00m internal
time 3:52:34.418639255
0:00:47.660592467  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;33m           GST_CLOCK
gstclock.c:995:gst_clock_get_time:<GstSystemClock> [00m adjusted time
3:52:34.418639255
0:00:47.660620182  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2300:gst_base_src_do_sync:<dvbsrc0> [00m no sync needed
0:00:47.660639017  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2505:gst_base_src_get_range:<dvbsrc0> [00m buffer ok
0:00:47.660568962  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
adapter gstadapter.c:294:copy_into_unchecked: [00m bsize 8192, skip 8020,
csize 172
0:00:47.660665027  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2441:gst_base_src_get_range:<dvbsrc0> [00m calling
create offset 18446744073709551615 length 4096, time 0
0:00:47.660727943  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
dvbsrc gstdvbsrc.c:1455:gst_dvbsrc_create:<dvbsrc0> [00m Reading from DVR
device
0:00:47.660698703  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.660758088  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;34m          GST_MEMORY gstmemory.c:137:gst_memory_init: [00m new
memory 0x7f1e080dde80, maxsize:8199 offset:0 size:8192
0:00:47.660793473  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
GST_POLL gstpoll.c:1195:gst_poll_wait: [00m 0x19c1800: timeout
:0:00:01.000000000
0:00:47.660831163  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
GST_POLL gstpoll.c:1195:gst_poll_wait: [00m 0x19c1800: timeout
:0:00:01.000000000
0:00:47.660865768  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.660890873  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.660923838  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.660943578  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.660961153  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1126:mpegts_packetizer_push_section:
[00m PID 0x0012 length:1635 table_id:0x50 subtable_extension:0x445c
version_number:15 section_number:120(last:248)
0:00:47.660990913  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1142:mpegts_packetizer_push_section:
[00m PID 0x0012 Already processed table_id:0x50 subtable_extension:0x445c,
version_number:15, section_number:120
0:00:47.661015213  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.661031708  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.661048873  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.661067933  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.661084723  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.661102168  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.661119878  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.661138363  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.661154843  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1177:mpegts_packetizer_push_section:
[00m result: (nil)
0:00:47.661184363  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
queue2 gstqueue2.c:722:apply_buffer:<dvb-queue2> [00m position updated to
0:00:47.133511403
0:00:47.661211548  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
queue2 gstqueue2.c:655:update_time_level:<dvb-queue2> [00m sink
0:00:47.133511403, src 0:00:45.398634614
0:00:47.661242013  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
queue2 gstqueue2.c:970:update_in_rates:<dvb-queue2> [00m rates: period
0.209311, in 106496, global period 3.547849
0:00:47.661272038  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
queue2 gstqueue2.c:994:update_in_rates:<dvb-queue2> [00m rates: in
488004.606620, time 0:00:01.678672678
0:00:47.661308223  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:653:mpegts_packetizer_push: [00m Pushing
8192 byte from offset 18446744073709551615
0:00:47.661331068  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m
[00;01;37;41m     GST_PERFORMANCE gstadapter.c:499:gst_adapter_map: [00m
copy remaining 8284 bytes from adapter
0:00:47.661352593  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
adapter gstadapter.c:294:copy_into_unchecked: [00m bsize 8192, skip 8100,
csize 92
0:00:47.661377573  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer
mpegtspacketizer.c:372:mpegts_packetizer_parse_adaptation_field_control:
[00m flags: PCR 
0:00:47.661406108  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer
mpegtspacketizer.c:381:mpegts_packetizer_parse_adaptation_field_control:
[00m pcr 0x01ff 1314073305963 (13:31:09.381702333) offset:22882795
0:00:47.661442903  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1349:calculate_skew: [00m gstpcr
13:31:09.381702333, buftime 0:00:47.133860048, base 13:30:22.537866037,
send_diff 0:00:46.843836296
0:00:47.661477808  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1381:calculate_skew: [00m time
0:00:47.133860048, base 0:00:00.294413614, recv_diff 0:00:46.839446434,
slope 8
0:00:47.661506833  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1460:calculate_skew: [00m delta
-4389862, new min: -24155513
0:00:47.661527348  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer mpegtspacketizer.c:1506:calculate_skew: [00m skew
-23409348, out 0:00:47.114840562
0:00:47.661550518  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
mpegtspacketizer
mpegtspacketizer.c:372:mpegts_packetizer_parse_adaptation_field_control:
[00m flags: <none>
0:00:47.661584238  [331m10014 [00m      0x19c18a0  [37mDEBUG   [00m  [00m
queue2_dataflow gstqueue2.c:1603:gst_queue2_wait_free_space:<dvb-queue2>
[00m queue is full, waiting for free space
0:00:47.690090616  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;33m           GST_CLOCK
gstclock.c:950:gst_clock_get_internal_time:<GstSystemClock> [00m internal
time 3:52:34.448162459
0:00:47.690154821  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;33m           GST_CLOCK
gstclock.c:995:gst_clock_get_time:<GstSystemClock> [00m adjusted time
3:52:34.448162459
0:00:47.690180621  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2300:gst_base_src_do_sync:<dvbsrc0> [00m no sync needed
0:00:47.690197571  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2505:gst_base_src_get_range:<dvbsrc0> [00m buffer ok
0:00:47.690222021  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2441:gst_base_src_get_range:<dvbsrc0> [00m calling
create offset 18446744073709551615 length 4096, time 0
0:00:47.690256781  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
dvbsrc gstdvbsrc.c:1455:gst_dvbsrc_create:<dvbsrc0> [00m Reading from DVR
device
0:00:47.690290251  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;34m          GST_MEMORY gstmemory.c:137:gst_memory_init: [00m new
memory 0x7f1e080dff20, maxsize:8199 offset:0 size:8192
0:00:47.690323421  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
GST_POLL gstpoll.c:1195:gst_poll_wait: [00m 0x19c1800: timeout
:0:00:01.000000000
0:00:47.690361886  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;33m           GST_CLOCK
gstclock.c:950:gst_clock_get_internal_time:<GstSystemClock> [00m internal
time 3:52:34.448439109
0:00:47.690386771  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;33m           GST_CLOCK
gstclock.c:995:gst_clock_get_time:<GstSystemClock> [00m adjusted time
3:52:34.448439109
0:00:47.690406126  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2300:gst_base_src_do_sync:<dvbsrc0> [00m no sync needed
0:00:47.690420761  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2505:gst_base_src_get_range:<dvbsrc0> [00m buffer ok
0:00:47.690447591  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
basesrc gstbasesrc.c:2441:gst_base_src_get_range:<dvbsrc0> [00m calling
create offset 18446744073709551615 length 4096, time 0
0:00:47.690470406  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
dvbsrc gstdvbsrc.c:1455:gst_dvbsrc_create:<dvbsrc0> [00m Reading from DVR
device
0:00:47.690495591  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m
[00;01;34m          GST_MEMORY gstmemory.c:137:gst_memory_init: [00m new
memory 0x7f1e080e1fc0, maxsize:8199 offset:0 size:8192
0:00:47.690525456  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
GST_POLL gstpoll.c:1195:gst_poll_wait: [00m 0x19c1800: timeout
:0:00:01.000000000
0:00:47.690571566  [331m10014 [00m      0x19c1850  [37mDEBUG   [00m  [00m
GST_POLL gstpoll.c:1195:gst_poll_wait: [00m 0x19c1800: timeout
:0:00:01.000000000

I've put the queue2 between 'dvbbasebin' and 'tsdemux' to have a larger
buffering between them, but it doesn’t solve this problem.

If you have any idea to stabilize this, I will be very happy.

Bernhard


-----Ursprüngliche Nachricht-----
Von: gstreamer-devel [mailto:gstreamer-devel-bounces at lists.freedesktop.org]
Im Auftrag von Jan Schmidt
Gesendet: Samstag, 31. Januar 2015 04:09
An: gstreamer-devel at lists.freedesktop.org
Betreff: Re: DVB Remux

Hi Bernhard,

As a general rule, whenever you have a demuxer you also need a queue (or 
use multiqueue) on the output of each demuxer pad to decouple the 
streams, or your pipeline will stall exactly like you are seeing.

Regards,
Jan.




More information about the gstreamer-devel mailing list