Grabbing video frames via Appsink

Lasse Laursen lasse at lasselaursen.com
Fri Aug 1 08:04:48 PDT 2014


Not quite sure what you mean by -

'check in which state return gst_element_get_state()'?

But to clarify, no - none of the callback functions are ever called. The 
pipeline just doesn't seem to start.

Regards,
Lasse

On 01-08-2014 23:48, Dus(an Poizl wrote:
> GST_STATE_CHANGE_ASYNC is ok. it means that pipeline doesn't finished 
> changing state before gst_element_set_state() return. whole pipeline 
> run in separate thread. when you get state you practically wait until 
> pipeline finish transition to desired state. so check in which state 
> return gst_element_get_state() and does your callbacks end up called?
>
> Dn(a 01.08.2014 o 14:37 Lasse Laursen napísal(a):
>> Hey Dev's,
>>
>> I've been throwing myself at this problem for a few days without any 
>> significant progress. Hopefully someone can tell me what painfully 
>> obvious part I've overlooked.
>>
>> Essentially what I'm trying to do is just grab some frames of video 
>> during playback from an appsink, but it seems my simple pipeline is 
>> missing something vital, because when I get to changing the state to 
>> 'paused' or 'playing' the GstStateChangeReturn I recieve is 
>> 'GST_STATE_CHANGE_ASYNC (2)'. The debug log doesn't yield any error 
>> output, so I'm a bit unsure of what to look closer at?
>>
>> Have I perhaps not hooked something up correctly? What am I missing here?
>>
>> Below is my simple code for trying to hook up this simple pipeline 
>> and grab some frames.
>>
>> ---------
>>
>>     std::string launchString = "uridecodebin uri=" + mVideoFileName + 
>> " ! appsink name=sink";
>>
>>     mGstPipeline = gst_parse_launch( launchString.c_str(), &pstGErr1 );
>>     printErrorToConsole( pstGErr1 != nullptr, "GStreamer Error: Could 
>> not construct pipeline", pstGErr1 );
>>
>>
>>     GstElement *mPipeline_AppSink;
>>     mPipeline_AppSink = gst_bin_get_by_name( GST_BIN( mGstPipeline ), 
>> "sink" );
>>
>> ////////////////////////////////////////////////////////////////////////// 
>> VIDEO SINK
>>     // Config Video Sink
>>     gst_base_sink_set_sync( GST_BASE_SINK( mPipeline_AppSink ), true );
>>     gst_app_sink_set_max_buffers( GST_APP_SINK( mPipeline_AppSink ), 8 );
>>     gst_app_sink_set_drop( GST_APP_SINK( mPipeline_AppSink ), true );
>>     gst_base_sink_set_max_lateness( GST_BASE_SINK( mPipeline_AppSink 
>> ), -1 );
>>
>>     // Set some fix caps for the video sink
>>     // It would seem that GStreamer then tries to transform any 
>> incoming video stream according to these caps
>>     GstCaps* caps = gst_caps_new_simple( "video/x-raw-rgb",
>>         "bpp", G_TYPE_INT, 24,
>>         "depth", G_TYPE_INT, 24,
>>         "endianness", G_TYPE_INT, 4321,
>>         "red_mask", G_TYPE_INT, 0xff0000,
>>         "green_mask", G_TYPE_INT, 0x00ff00,
>>         "blue_mask", G_TYPE_INT, 0x0000ff,
>>         "alpha_mask", G_TYPE_INT, 0x000000ff,
>>         NULL );
>>
>>     gst_app_sink_set_caps( GST_APP_SINK( mPipeline_AppSink ), caps );
>>     gst_caps_unref( caps );
>>
>>     // Set the configured video appsink to the main pipeline
>>     //g_object_set( m_GstPipeline, "video-sink", m_GstVideoSink, 
>> (void*) NULL );
>>
>>     // Tell the video appsink that it should not emit signals as the 
>> buffer retrieving is handled via callback methods
>>     g_object_set( mPipeline_AppSink, "emit-signals", false, "sync", 
>> true, (void*) NULL );
>>
>>     GstAppSinkCallbacks cbs; // Does this need to be kept alive?
>>
>>     // Set Video Sink callback methods
>>     cbs.eos = &GSCinderApp::onEosFromVideoSource;
>>     cbs.new_preroll = &GSCinderApp::onNewPrerollFromVideoSource;
>>     cbs.new_sample = &GSCinderApp::onNewBufferFromVideoSource;
>>     gst_app_sink_set_callbacks( GST_APP_SINK( mPipeline_AppSink ), 
>> &cbs, this, NULL );
>>
>>
>> ////////////////////////////////////////////////////////////////////////// 
>> BUS
>>     // Set GstBus
>>     //m_GstBus = gst_pipeline_get_bus( GST_PIPELINE( m_GstPipeline ) );
>>
>>     if ( mGstPipeline != NULL )
>>     {
>>         // We need to stream the file a little bit in order to be 
>> able to retrieve information from it
>>         GstStateChangeReturn nStateChgRet;
>>
>>         nStateChgRet = gst_element_set_state( mGstPipeline, 
>> GST_STATE_READY );
>>         printErrorToConsole( nStateChgRet == 
>> GST_STATE_CHANGE_FAILURE, "GStreamer Error: State Change Failure 1" );
>>
>>         nStateChgRet = gst_element_set_state( mGstPipeline, 
>> GST_STATE_PAUSED );
>>         printErrorToConsole( nStateChgRet == 
>> GST_STATE_CHANGE_FAILURE, "GStreamer Error: State Change Failure 1" );
>>
>>         // For some reason this is needed in order to gather video 
>> information such as size, framerate etc ...
>>         GstState state;
>>         gst_element_get_state( mGstPipeline, &state, NULL, 2 * 
>> GST_SECOND );        // Erm... Why get state?
>>
>>     }
>>     else {
>>         printErrorToConsole( true, "GStreamer Error: Pipeline Empty?!" );
>>     }
>>
>>     // Retrieve and store all relevant Media Information
>>     //retrieveVideoInfo();
>>
>>     // Check if we actually end up playing?
>>     if ( mGstPipeline != NULL )
>>     {
>>         GstStateChangeReturn nStateChgRet;
>>         nStateChgRet = gst_element_set_state( mGstPipeline, 
>> GST_STATE_PAUSED );
>>         printErrorToConsole( nStateChgRet == 
>> GST_STATE_CHANGE_FAILURE, "GStreamer Error: State Change Failure 3" );
>>
>>     }
>>     else {
>>         printErrorToConsole( true, "GStreamer Error: Pipeline Empty?!" );
>>     }
>>
>> ----------------
>>
>> Regards,
>> Lasse
>>
>> -- 
>> Lasse Farnung Laursen
>> Post.doc at the University of Tokyo
>> www.lasselaursen.com <http://www.lasselaursen.com>
>> FB: lasse.laursen <https://www.facebook.com/lasse.laursen>
>> Twitter: @PMP_J <https://twitter.com/PMP_J>
>>
>>
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

-- 
Lasse Farnung Laursen
Post.doc at the University of Tokyo
www.lasselaursen.com <http://www.lasselaursen.com>
FB: lasse.laursen <https://www.facebook.com/lasse.laursen>
Twitter: @PMP_J <https://twitter.com/PMP_J>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20140802/389ac306/attachment.html>


More information about the gstreamer-devel mailing list