Encode YUV420 buffer with appsrc

pchaurasia pchaurasia at gameloreinc.com
Tue Dec 12 10:39:19 UTC 2017


Hi Michael,

Thanks for your response. I used your advice and made some changes to the
code but to no avail. I am making sure that  I do not invoke this code
twice. Also there is a check for the current state to not be NULL before
calling this API. The code still gets stuck at "gst_element_set_state".

Please find the code below :

    gst_element_get_state (m_ppipeline, &m_state,NULL,GST_CLOCK_TIME_NONE );

   if (m_state == GST_STATE_PLAYING)
    {

		cout<<"Entering aaOutputEncode::stopRecording"<<endl;

        if (!m_ppipeline || !m_pencoder)
            ORIGINATE_ERROR("Video encoder not initialized");

        if (m_state != GST_STATE_PLAYING)
            ORIGINATE_ERROR("Video encoder not recording");

		cout<<"Calling gst_element_get_static_pad"<<endl;
	
        // Send the end-of-stream event.
        GstPad *pad = gst_element_get_static_pad(m_pencoder, "sink");
        if (!pad)
            ORIGINATE_ERROR("Failed to get 'sink' pad");

		cout<<"Calling gst_pad_send_event"<<endl;

        bool result = gst_pad_send_event(pad, gst_event_new_eos());

		cout<<"Calling gst_object_unref"<<endl;

        gst_object_unref(pad);
        if (!result)
            ORIGINATE_ERROR("Failed to send end of stream event to
encoder");

		cout<<"Calling gst_pipeline_get_bus"<<endl;


        // Wait for the event to complete.
        GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(m_ppipeline));
        if (!bus)
            ORIGINATE_ERROR("Failed to get bus");

		cout<<"Calling gst_bus_poll"<<endl;


        result = gst_bus_poll(bus, GST_MESSAGE_EOS, GST_CLOCK_TIME_NONE);

		cout<<"Calling gst_object_unref"<<endl;


        gst_object_unref(bus);
        if (!result)
            ORIGINATE_ERROR("Failed to wait for the EOF event");


		
		if(m_state != GST_STATE_NULL)
		{
			cout<<"Calling gst_element_set_state"<<endl;

        	// Stop the pipeline.
        	if (gst_element_set_state(m_ppipeline, GST_STATE_NULL) ==
GST_STATE_CHANGE_FAILURE)
            	ORIGINATE_ERROR("Failed to stop recording.");
		}


                m_state = GST_STATE_NULL;

		cout<<"Exiting aaOutputEncode::stopRecording"<<endl;


   }

   if (m_ppipeline)
       gst_object_unref(GST_OBJECT(m_ppipeline));

   m_ppipeline = NULL;




--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/


More information about the gstreamer-devel mailing list