Hi guys,

first thing, thanks for this greate multimedia framework. :)

I have a problem:
I can't play a URL (URI). I use playbin and decodebin.

The technical description:

I initialize first the gstreamer with gst_init( &argc, &argv ). It works fine.
After this i create a new pipeline with function gstt_pipeline_new( "name" );
All ok. Now i create an output binary with convert, resample, volume and sink elements. Thats fine. So i add bin, link and add pad to this.

    GstElement *outputConvert   = gst_element_factory_make ("audioconvert", "audioconvert" );
    GstElement *outputResample  = gst_element_factory_make ("audioresample", "audioresample" );
    GstElement *outputVolume    = gst_element_factory_make ("volume", "volume" );
    GstElement *outputSink      = PSGstHelper::audioSink(); // gives me the correct audio from systemx

    gst_bin_add_many( GST_BIN( m_gstBinary[ OUTPUT ] ), outputConvert, outputResample, outputVolume, outputSink, NULL );
    gst_element_link_many( outputConvert, outputResample, outputVolume, outputSink, NULL );

    GstPad *outputPad = gst_element_get_static_pad( outputConvert, "sink" );
    gst_element_add_pad( m_gstBinary[ OUTPUT ], gst_ghost_pad_new( "sink", outputPad ) );
    gst_object_unref( outputPad );
    gst_object_ref( m_gstBinary[ OUTPUT ] );
   
After creating this binary, i create a new binary for "filesrc"
     
    GstElement *fileSource    = gst_element_factory_make( "filesrc", "filesrc" );
    GstElement *fileDecoder   = gst_element_factory_make( "decodebin", "decodebin" );
    GstElement *fileIdentity  = gst_element_factory_make( "identity", "identity" );

    if( fileSource && fileDecoder && fileIdentity) {
      gst_bin_add_many( GST_BIN( m_gstBinary[ FILE ] ), fileSource, fileDecoder, fileIdentity, NULL );
      gst_element_link_many( fileSource, fileDecoder, NULL );

      g_signal_connect( G_OBJECT(fileDecoder), "new-decoded-pad", G_CALLBACK(gstPadLink), fileIdentity );

      GstPad * pad = gst_element_get_static_pad (fileIdentity, "src");
      gst_element_add_pad( m_gstBinary[ FILE ], gst_ghost_pad_new("src", pad) );
      gst_object_unref(pad);

      gst_object_ref( m_gstBinary[ FILE ] );
      //g_timeout_add( 200, (GSourceFunc)gstQueryTimePosition, fileSource );
    }

After creating this binary, i create a new binary for "playbin"

    GstElement *httpSource    = gst_element_factory_make( "playbin", "playbin" );
    GstElement *httpDecoder   = gst_element_factory_make( "decodebin", "decodebin" );
    GstElement *httpIdentity  = gst_element_factory_make( "identity", "identity" );

    if( httpSource && httpDecoder && httpIdentity ) {
      gst_bin_add_many( GST_BIN( m_gstBinary[ HTTP ] ), httpSource, httpDecoder, httpIdentity, NULL );
      gst_element_link_many( httpSource, httpDecoder, httpIdentity, NULL );

      g_signal_connect( G_OBJECT(httpDecoder), "new-decoded-pad", G_CALLBACK(gstPadLink), httpIdentity );

      GstPad *httpPad = gst_element_get_static_pad( httpIdentity, "src" );
      gst_element_add_pad( m_gstBinary[ HTTP ], gst_ghost_pad_new( "src", httpPad ) );
      gst_object_unref( httpPad );

      gst_object_ref( m_gstBinary[ HTTP ] );
      g_timeout_add( 200, (GSourceFunc)gstQueryTimePosition, httpSource );
    }
 
At end i set the state to ready:

  gst_element_set_state( m_gstPipeline, GST_STATE_READY );
  gst_element_get_state( m_gstPipeline, NULL, NULL, GST_CLOCK_TIME_NONE );

Everything fine, but my problem, if i play with m_gstBinary[ FILE ] works ok, but if i play with m_gstBinary[ HTTP ] is not working.
My play function sets the state to GST_STATE_PLAYING on m_gstPipeline but i get GST_STATE_CHANGE_ASYNC every time.
Before I play a source I change the m_gstPipeline to the correct m_gstBinary but if it is playing I set the state to GST_STATE_NULL:

  m_gstPlayElement = m_gstBinary[ _binaries ];
  gst_bin_add_many( GST_BIN(m_gstPipeline), m_gstPlayElement, m_gstBinary[ OUTPUT ], NULL);
  gst_element_link_many( m_gstPlayElement, m_gstBinary[ OUTPUT ], NULL);

  GstStateChangeReturn ret = gst_element_set_state( m_gstPipeline, GST_STATE_READY );
  ret = gst_element_get_state( m_gstPipeline, NULL, NULL, GST_CLOCK_TIME_NONE );
 
Of course I catch the events from m_gstPipeline such as GST_MESSAGE_BUFFERING ... GST_MESSAGE_BUFFERING and so on.

But I can't play the stream!

Regards
ChMaster



--
GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT!
Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01