AW: Converting MPEG-TS to MPEG-PS

Bernhard Graaf bernhard.graaf at gmx.de
Thu Jun 16 07:48:57 PDT 2011


Hi Kapil,

 

thanks' for your answer and your help. The following pipe is running well
(after your mail):

gst-launch-0.10 -vvv dvbsrc adapter=1 frequency=12544000 pids=97:511:512:515
polarity='h' symbol-rate=22000 ! mpegtsdemux name=demux demux.video_01ff !
queue ! mpegpsmux name=mux ! filesink
location=/home/bgraaf/Share/TVAufnahmen/Test3.mpg demux.audio_0200 ! queue !
mux.

 

But the next problem I have is that this pipe should run in my own
C-program. 

---------------------------

#include <stdio.h>

#include <unistd.h>

#include <gst/gst.h>

#include <glib.h>

#include <string.h>

 

GstElement *dvb_pipe, *dvb_source, *dvb_demux, *dvb_queue, *dvb_mux,
*dvb_sink, *fake_queue, *fake_sink;

GstBus *dvb_bus;

GMainLoop *loop;

int mux_pad = 0;

 

static gboolean

dvb_bus_call (GstBus     *tmp_bus,

          GstMessage *msg,

          gpointer    data)

{

 

  switch (GST_MESSAGE_TYPE (msg)) {

 

    case GST_MESSAGE_EOS:

      g_print ("End of stream\n");

      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);

 

      break;

    }

    default:

      break;

  }

 

  return TRUE;

}

 

static void

tv_demux_pad_added (GstElement *element,

              GstPad     *pad,

              gpointer    data)

{

  GstPad *sinkpad;

  GstElement *queue = (GstElement *) data;

  gchar *name;

  char tmp_str[20];

 

  name = gst_pad_get_name (pad);

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

 

  if(strncmp(name,"v",1) == 0) || (strncmp(name,"a",1) == 0))

  { 

    sprintf(tmp_str,"pad%d", mux_pad);

    printf("Pad: %s\n", tmp_str);

    sinkpad = gst_element_get_static_pad (queue, tmp_str);

    gst_pad_link (pad, sinkpad);

    gst_object_unref (sinkpad);

    g_print ("Dynamic pad created, linking TS-Demuxer/TS-Muxer\n");

    ++mux_pad;

  } 

  else

  {

    sinkpad = gst_element_get_static_pad (fake_queue, "sink");

    gst_pad_link (pad, sinkpad);

    gst_object_unref (sinkpad);

    g_print ("Dynamic pad created, linking TS-Demuxer/Fake-Sink\n");

  } 

  g_free (name);

  

}

 

static void

tv_mux_pad_added (GstElement *element,

              GstPad     *pad,

              gpointer    data)

{

  GstPad *sinkpad;

  GstElement *queue = (GstElement *) data;

  gchar *name;

 

  name = gst_pad_get_name (pad);

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

 

  sinkpad = gst_element_get_static_pad (queue, "sink");

  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);

  g_print ("Dynamic pad created, linking TS-Muxer/Video-Sink\n");

 

  g_free (name);

  

}

 

 

int init_gst()

{

  gst_init (0, NULL);

  loop = g_main_loop_new (NULL, FALSE);

 

  dvb_pipe = gst_pipeline_new ("DVB-Streamer");

  dvb_source      = gst_element_factory_make ("dvbsrc",      "dvb-source");

  dvb_demux       = gst_element_factory_make ("mpegtsdemux", "dvb-demux");

  dvb_queue = gst_element_factory_make ("queue",       "dvb-queue");

  dvb_mux         = gst_element_factory_make ("mpegpsmux",   "dvb-mux");

  dvb_sink        = gst_element_factory_make ("filesink",    "dvb-sink");

  fake_queue      = gst_element_factory_make ("queue",       "fake-queue");

  fake_sink = gst_element_factory_make ("fakesink",    "fake-sink");

 

  if (!dvb_pipe || !dvb_source || !dvb_demux || !dvb_queue || !dvb_mux ||
!dvb_sink || !fake_queue || !fake_sink) 

  {

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

    if(!dvb_pipe) g_printerr("DVB-Pipeline not created\n");

    else if(!dvb_source) g_printerr("DVB-Source not created\n");

    else if(!dvb_demux) g_printerr("DVB-Demuxer not created\n");

    else if(!dvb_queue) g_printerr("DVB-Queue not created\n");

    else if(!dvb_mux) g_printerr("DVB-Muxer not created\n");

    else if(!dvb_sink) g_printerr("DVB-Sink not created\n");

    else if(!fake_queue) g_printerr("Fake-Queue not created\n");

    else if(!fake_sink) g_printerr("Fake-Sink not created\n");

    return -1;

  }

 

  dvb_bus = gst_pipeline_get_bus (GST_PIPELINE (dvb_pipe));

  gst_bus_add_watch (dvb_bus, dvb_bus_call, NULL);

  gst_object_unref (dvb_bus);

 

  gst_bin_add_many (GST_BIN (dvb_pipe), dvb_source, dvb_demux, dvb_queue,
dvb_mux, dvb_sink, fake_queue, fake_sink, NULL);

  gst_element_link (dvb_source, dvb_demux);

  gst_element_link_many(dvb_queue, dvb_mux, dvb_sink, NULL);

  gst_element_link_many(fake_queue, fake_sink, NULL);

 

  g_signal_connect (dvb_demux, "pad-added", G_CALLBACK (tv_demux_pad_added),
dvb_mux);

  g_signal_connect (dvb_mux, "pad-added", G_CALLBACK (tv_mux_pad_added),
dvb_sink);

 

  return 1;

}

 

int send_p7()

{

  gst_element_set_state (dvb_pipe, GST_STATE_NULL); 

 

  g_object_set (G_OBJECT (dvb_source), "adapter", 1, NULL);

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

  g_object_set (G_OBJECT (dvb_source), "pids", "97:511:512:515", NULL);

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

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

  g_object_set (G_OBJECT (dvb_sink), "location",
"/home/bgraaf/Videos/Test.mpg", NULL);

 

  g_print ("Now playing: Prog 7\n");

  gst_element_set_state (dvb_pipe, GST_STATE_PLAYING);

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

  g_main_loop_run (loop);

  return 0;

}

 

 

 

int

main (int argc, char *argv[])

{

  init_gst();

  send_p7(); 

 

  return 0;

} 

 

------------------------

 

The messages from the program are:

A new pad video_01ff was created

 

(<unknown>:2469): GStreamer-CRITICAL **: gst_pad_link: assertion `GST_IS_PAD
(sinkpad)' failed

 

(<unknown>:2469): GStreamer-CRITICAL **: gst_object_unref: assertion `object
!= NULL' failed

 

So it look like a link problem between the mpegtsdemux-src-pads and the
mpegpsmux-sink-pads. What's wrong with this program.

 

Thanks' a lot for your help!!!

Bernhard

 

 

  _____  

Von: gstreamer-devel-bounces+bernhard.graaf=gmx.de at lists.freedesktop.org
[mailto:gstreamer-devel-bounces+bernhard.graaf=gmx.de at lists.freedesktop.org]
Im Auftrag von Kapil Agrawal
Gesendet: Dienstag, 14. Juni 2011 08:18
An: Discussion of the development of and with GStreamer
Betreff: Re: Converting MPEG-TS to MPEG-PS

 

Your pipe may look like

gst-launch dvbsrc ! mpegtsdemux name=demux demux.video_0040 ! queue !
mpegpsmux name=mux ! filesink demux.audio_0040 ! queue ! mux.

So in your pipe only video pad of demux was linked with video pad of mux.
You need to link both audio & video.

Regards
Kapil
 

On Fri, Jun 10, 2011 at 3:17 PM, Bernhard Graaf <bernhard.graaf at gmx.de>
wrote:

Hi,

 

Sorry, there is a fault in my pipe. I try this:

gst-launch-0.10 -v dvbsrc adapter=0 frequency=12544000 pids=97:511:512:515
polarity='h' symbol-rate=22000 ! mpegtsdemux es-pids=511:512 ! mpegpsmux !
filesink location=test.mpg

 

The Messages are:

 

New clock: MpegTSClock

/GstPipeline:pipeline0/GstMpegTSDemux:mpegtsdemux0.GstPad:sink: caps =
video/mpegts, mpegversion=(int)2, systemstream=(boolean)true

/GstPipeline:pipeline0/GstMpegTSDemux:mpegtsdemux0: pat-info =
((GValueArray*) 0x8307b60)

/GstPipeline:pipeline0/GstMpegTSDemux:mpegtsdemux0: pmt-info =
((MpegTsPmtInfo*) 0xb6c04680)

/GstPipeline:pipeline0/MpegPsMux:mpegpsmux0.GstPad:pad0: caps = video/mpeg,
mpegversion=(int)2, systemstream=(boolean)false

/GstPipeline:pipeline0/MpegPsMux:mpegpsmux0.GstPad:src: caps = video/mpeg,
mpegversion=(int)2, systemstream=(boolean)true

/GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps = video/mpeg,
mpegversion=(int)2, systemstream=(boolean)true

 

And that's what I get: Only the video-stream without any audio.

 

What's wrong with this pipe?

 

Thanks' a lot!

Bernhard

  _____  

Von: gstreamer-devel-bounces+bernhard.graaf=gmx.de at lists.freedesktop.org
[mailto:gstreamer-devel-bounces+bernhard.graaf
<mailto:gstreamer-devel-bounces%2Bbernhard.graaf>
=gmx.de at lists.freedesktop.org] Im Auftrag von Bernhard Graaf
Gesendet: Freitag, 10. Juni 2011 10:28
An: 'Discussion of the development of and with GStreamer'
Betreff: Converting MPEG-TS to MPEG-PS

 

Hi,

 

I have a problem for seeking in MPEG-TS-files (to slow) and want to convert
a TS-Stream to PS.

But it seems to be a little tricky to select the pids. My pipe looks like
this:

'gst-launch-0.10 dvbsrc pids=97:511:512 frequ... ! mpegtsdemux
es-pids=511:512 !  mpeg2dec ! filesink location=test.mpg'

 

The pids are: 97 = PMT, 511 = Video, 512 = Audio.

 

But it doesn't work. The file is always 0 Bytes long.

 

Without converting, it's a very simple pipe:

'gst-launch-0.10 dvbsrc pids=97:511:512 frequ... ! filesink
location=test.mpg'

 

And it's works very good.

 

What to I wrong to convert the stream?

 

Thanks' a lot for helping!!

Bernhard

 

 


_______________________________________________
gstreamer-devel mailing list
gstreamer-devel at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel




-- 
www.mediamagictechnologies.com (Gstreamer, ffmpeg, Red5, Streaming)
twitter handle: @gst_kaps
http://www.linkedin.com/in/kapilagrawal

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20110616/eb6879ee/attachment.html>


More information about the gstreamer-devel mailing list