seek failed with appsrc

leon dudi.reuveni at comm-it.co.il
Tue Apr 8 00:37:18 PDT 2014


cheers!

Im using appsrc in my code (visual studio) and I have two pipelines-
transmitter and receiver. 
the transmitter loads file with RTP stream push the RTP packet into udpsink
and udpsink transmit is.
the transmission works great.

*pipeline 1 (transmitter)*:

   app->src = (GstAppSrc*)gst_element_factory_make("appsrc", "mysrc"); 
   app->sink = gst_element_factory_make ("udpsink", "sink"); 
   g_object_set(G_OBJECT(app->sink),"port",5000,NULL); 

   gst_bin_add_many(GST_BIN(app->pipeline1), (GstElement*)app->src,
app->sink, NULL); 
  
    if(!gst_element_link((GstElement*)app->src, app->sink)){ 
    g_warning("failed to link src and sink"); 
    } 


*callbacks to appsrc*:

  g_signal_connect(app->src, "need-data", G_CALLBACK(start_feed), app); 


*Start playing*:  

 gst_element_set_state((GstElement*)app->pipeline1, GST_STATE_PLAYING); 





*the goal is implementing fast forward and rewind by seek.*

 if (!gst_element_seek ((GstElement*)app->pipeline1, app->rate,
GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH,
                         GST_SEEK_TYPE_SET, app->osition,
                         GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
    g_print ("Seek failed!\n");
  }


*so I though to implement it inside "need-data" callback:*


static gboolean read_data(gst_app_t *app)
{
 GstBuffer *buffer;
 void *ptr;
 int size;
 GstFlowReturn ret;

 struct pcap_pkthdr *header;
 const u_char *data;
 u_char *RTP_ptr;

 

 int returnValue = pcap_next_ex(app->pcap, &header, &data); //read the next
packet from pcap file
 
 RTP_ptr= (u_char *)data + 42; //go to the start of RTP packet
 size = (header->caplen)-42; 



if (!gst_element_query_position ( (GstElement *)app->pipeline1, app->format
, &(app->position) ) ){
    g_printerr ("Unable to retrieve current position.\n");
  }
else g_print ("position: %d \n", app->position);
 

 *if (!gst_element_seek ((GstElement*)app->pipeline1, 2.0, GST_FORMAT_BYTES,
GST_SEEK_FLAG_FLUSH,
                         GST_SEEK_TYPE_SET, app->position,
                         GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
    g_print ("Seek failed!\n");
  }*

 
 if (returnValue >= 0)
   {

		RTP_ptr= (u_char *)data + 42;
		size = (header->caplen)-42;   
	 	

	    if(size == 0){
			   ret = gst_app_src_end_of_stream(app->src);
			   g_debug("eos returned %d at %d\n", ret, __LINE__);
			   return FALSE;
	      }

		buffer =gst_buffer_new_wrapped (g_memdup (RTP_ptr, size), size);

	    ret = gst_app_src_push_buffer(app->src, buffer);
 
        if(ret !=  GST_FLOW_OK){
               g_debug("push buffer returned %d for %d bytes \n", ret,
size);
			   return FALSE;
         }
   }
	 
 else if (returnValue == -2){

		printf("\n\n\ngot EOS\n\n\n");
		gst_element_set_state (app->pipeline2, GST_STATE_NULL);
		gst_object_unref (app->pipeline2);
		g_main_loop_quit (app->loop);
		return FALSE;
     }

 else if (returnValue == -1){
		printf("\nreturn value of \"next packet\" is not o.k\n");
     }

 else printf("Unknown error from reading next packet");


 return TRUE;
}


*now I have two questions-*

1. I know there is callback named "seek-data". what is the difference
between implementing it inside "need-data" and "seek-data". from my
understanding (correct me if I wrong) "need-data" is called every time the
buffer can get more data. so if I call "seek-data"  and the buffer is empty
and calling "need-data", what will happen? are they working in parallel?

2. in my code- the section of the seek command, I get "seek failed" and I
cant figure why.. the seek is in BYTES format and the input to the buffer of
appsrc, is file- with RTP packets. 

I will be happy for some help here.

thanks!

Leon.



--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/seek-failed-with-appsrc-tp4666348.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.


More information about the gstreamer-devel mailing list