Internal data error, in appsink "pull-sample" mode

aasim mdamirraza at gmail.com
Wed May 9 14:10:49 UTC 2018


Hi experts, 
I am getting Internal data error, in appsink . 
My application is to read .yuv data , encode and write to a buffer.

I have accomplished the writing it file but when i changed the code to write
it buffer it giving error. 
Its only able to write only single packet (188bytes). 

Output of program:

(ConsoleApplication6.exe:14432): GStreamer-WARNING **: Failed to load plugin
'C:\gstreamer\1.0\x86_64\lib\gstreamer-1.0\libgstopenh264.dll':
'C:\gstreamer\1.0\x86_64\lib\gstreamer-1.0\libgstopenh264.dll': The
specified procedure could not be found.
pipeline:  filesrc location=Transformers1080p.yuv blocksize=4147200 !
videoparse  width=1920 height=1080 framerate=60/1 ! videoconvert !
video/x-raw,format=I420,width=1920,height=1080,framerate=60/1 !  x264enc !
mpegtsmux ! queue !  appsink name = sink
Now playing: Transformers1080p.yuv
Running...

 on_new_sample_from_sink
*
 sample got of size = 188*
Error: *Internal data stream error.*
Returned, stopping playback
Deleting pipeline

Below is my code for your reference 

Kindly help me out with this error.

Thanks in advance.

Regards,
aasim



#define _CRT_SECURE_NO_WARNINGS 1
//#pragma warning(disable:4996)
#include <gst/gst.h>
#include <gst/audio/audio.h>
#include <gst/app/gstappsrc.h>
#include <gst/base/gstpushsrc.h>
#include <gst/app/gstappsink.h>
#include <gst/video/video.h>
#include <gst/video/gstvideometa.h>
#include <gst/video/video-overlay-composition.h>

#include <string.h>
#include <stdio.h>

#include <fstream.h>
#include <iostream.h>

using namespace std;

GstElement *SinkBuff;
char *out_file_path;
FILE *out_file;

//gst-launch-1.0.exe -v filesrc location=Transformers1080p.yuv
blocksize=4147200 !  
//videoconvert !
video/x-raw,format=I420,width=1920,height=1080,framerate=60/1 !  
//openh264enc ! mpegtsmux ! filesink location=final.ts


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;
	  }
	default:
		break;
    }
	return TRUE;
}

/* called when the appsink notifies us that there is a new buffer ready for
* processing */
static void  on_new_sample_from_sink(GstElement * elt, void *ptr)
{
	guint size;
	GstBuffer *app_buffer, *buffer;
	GstElement *source;
	GstMapInfo map = { 0 };
	GstSample *sample;
	static GstClockTime timestamp = 0;
	printf("\n on_new_sample_from_sink \n ");
	/* get the buffer from appsink */
	g_signal_emit_by_name(SinkBuff, "pull-sample", &sample, NULL);
	if (sample)
	{
		buffer = gst_sample_get_buffer(sample);
		gst_buffer_map(buffer, &map, GST_MAP_READ);

		printf("\n sample got of size = %d \n", map.size);
		//Buffer
		fwrite((char *)map.data, 1, sizeof(map.size), out_file);
		
		gst_buffer_unmap(buffer, &map);
		gst_sample_unref(sample);
	}
}


int main1(int   argc, char *argv[])
{
	GMainLoop *loop;
	int width, height;

	GstElement *pipeline;
	GError *error = NULL;
	GstBus *bus;
	char pipeline_desc[1024];
	out_file = fopen("output.ts", "wb");
	
	
	/* Initialisation */
	gst_init(&argc, &argv);

	// Create gstreamer loop
	loop = g_main_loop_new(NULL, FALSE);

	sprintf(
		pipeline_desc,
		" filesrc location=Transformers1080p.yuv blocksize=4147200 !"
		" videoparse  width=1920 height=1080 framerate=60/1 !"
		" videoconvert !
video/x-raw,format=I420,width=1920,height=1080,framerate=60/1 ! "
		//" x264enc ! mpegtsmux ! filesink location=final.ts");
		" x264enc ! mpegtsmux ! queue !  appsink name = sink");
	

	printf("pipeline: %s\n", pipeline_desc);

	/* Create gstreamer elements */
	pipeline = gst_parse_launch(pipeline_desc, &error);

	/* TODO: Handle recoverable errors. */

	if (!pipeline) {
		g_printerr("Pipeline could not be created. Exiting.\n");
		return -1;
	}

	/* get sink */
	SinkBuff = gst_bin_get_by_name(GST_BIN(pipeline), "sink");
	g_object_set(G_OBJECT(SinkBuff), "emit-signals", TRUE, "sync", FALSE,
NULL);
	g_signal_connect(SinkBuff, "new-sample",
G_CALLBACK(on_new_sample_from_sink), NULL);


	/* Set up the pipeline */
	/* we add a message handler */
	bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
	gst_bus_add_watch(bus, bus_call, loop);
	gst_object_unref(bus);

	/* Set the pipeline to "playing" state*/
	g_print("Now playing: Transformers1080p.yuv \n");
	gst_element_set_state(pipeline, GST_STATE_PLAYING);

	/* Iterate */
	g_print("Running...\n");
	g_main_loop_run(loop);

	/* Out of the main loop, clean up nicely */
	g_print("Returned, stopping playback\n");
	gst_element_set_state(pipeline, GST_STATE_NULL);

	g_print("Deleting pipeline\n");
	gst_object_unref(GST_OBJECT(pipeline));
	fclose(out_file);
	g_main_loop_unref(loop);


	return 0;
}



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


More information about the gstreamer-devel mailing list