soho123

push data to appsrc

Jan 14th, 2014
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.88 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <gst/gst.h>
  3. #include <gst/app/gstappsrc.h>
  4.  
  5. typedef struct {
  6. GstPipeline *pipeline;
  7. GstAppSrc *src;
  8. GstElement *sink;
  9. GstElement *decoder;
  10. GstElement *Audioconvert;
  11. GstElement *Audioresample;
  12. GstElement *alsasink;
  13. GMainLoop *loop;
  14. guint sourceid;
  15. FILE *file;
  16. }gst_app_t;
  17. GstCaps SrcCaps;
  18. gst_app_t gst_app;
  19.  
  20. #define BUFF_SIZE (1024)
  21.  
  22. static gboolean read_data(gst_app_t *app)
  23. {
  24. GstBuffer *buffer;
  25. guint8 *ptr;
  26. gint size;
  27. GstFlowReturn ret;
  28.  
  29. ptr = g_malloc(BUFF_SIZE);
  30. g_assert(ptr);
  31.  
  32. size = fread(ptr, 1, BUFF_SIZE, app->file);
  33.  
  34. if(size == 0){
  35. ret = gst_app_src_end_of_stream(app->src);
  36. g_warning("eos returned %d at %d\n", ret, __LINE__);
  37. return FALSE;
  38. }
  39.  
  40. buffer = gst_buffer_new();
  41. GST_BUFFER_MALLOCDATA(buffer) = ptr;
  42. GST_BUFFER_SIZE(buffer) = size;
  43. GST_BUFFER_DATA(buffer) = GST_BUFFER_MALLOCDATA(buffer);
  44.  
  45. ret = gst_app_src_push_buffer(app->src, buffer);
  46.  
  47. if(ret != GST_FLOW_OK){
  48. g_warning("push buffer returned %d for %d bytes \n", ret, size);
  49. return FALSE;
  50. }
  51.  
  52. if(size != BUFF_SIZE){
  53. ret = gst_app_src_end_of_stream(app->src);
  54.  
  55. return FALSE;
  56. }
  57.  
  58. return TRUE;
  59. }
  60.  
  61. static void start_feed (GstElement * pipeline, guint size, gst_app_t *app)
  62. {
  63. if (app->sourceid == 0) {
  64. GST_DEBUG ("start feeding");
  65.  
  66. app->sourceid = g_idle_add ((GSourceFunc) read_data, app);
  67. }
  68. }
  69.  
  70. static void stop_feed (GstElement * pipeline, gst_app_t *app)
  71. {
  72. if (app->sourceid != 0) {
  73. GST_DEBUG ("stop feeding");
  74.  
  75. g_source_remove (app->sourceid);
  76. app->sourceid = 0;
  77. }
  78. }
  79.  
  80. static void on_pad_added(GstElement *element, GstPad *pad)
  81. {
  82. GstCaps *caps;
  83. GstStructure *str;
  84. gchar *name;
  85. GstPad *AudioConvertsink;
  86. GstPadLinkReturn ret;
  87.  
  88. g_debug("pad added");
  89.  
  90. caps = gst_pad_get_caps(pad);
  91. str = gst_caps_get_structure(caps, 0);
  92.  
  93. g_assert(str);
  94.  
  95. name = (gchar*)gst_structure_get_name(str);
  96.  
  97. g_warning("pad name %s", name);
  98.  
  99. if(g_strrstr(name, "audio")){
  100. g_warning("%s, %d",__FUNCTION__, __LINE__);
  101. AudioConvertsink = gst_element_get_pad(gst_app.Audioconvert, "sink");
  102. g_assert(AudioConvertsink);
  103. ret = gst_pad_link(pad, AudioConvertsink);
  104. g_warning("pad_link returned %d\n", ret);
  105. gst_object_unref(AudioConvertsink);
  106. }
  107. gst_caps_unref(caps);
  108. }
  109.  
  110. static gboolean bus_callback(GstBus *bus, GstMessage *message, gpointer *ptr)
  111. {
  112. gst_app_t *app = (gst_app_t*)ptr;
  113.  
  114. switch(GST_MESSAGE_TYPE(message)){
  115.  
  116. case GST_MESSAGE_ERROR:{
  117. gchar *debug;
  118. GError *err;
  119.  
  120. gst_message_parse_error(message, &err, &debug);
  121. g_print("Error %s\n", err->message);
  122. g_error_free(err);
  123. g_free(debug);
  124. g_main_loop_quit(app->loop);
  125. }
  126. break;
  127.  
  128. case GST_MESSAGE_WARNING:{
  129. gchar *debug;
  130. GError *err;
  131. gchar *name;
  132.  
  133. gst_message_parse_warning(message, &err, &debug);
  134. g_print("Warning %s\nDebug %s\n", err->message, debug);
  135.  
  136. name = GST_MESSAGE_SRC_NAME(message);
  137.  
  138. g_print("Name of src %s\n", name ? name : "nil");
  139. g_error_free(err);
  140. g_free(debug);
  141. }
  142. break;
  143.  
  144. case GST_MESSAGE_EOS:
  145. g_print("End of stream\n");
  146. g_main_loop_quit(app->loop);
  147. break;
  148.  
  149. case GST_MESSAGE_STATE_CHANGED:
  150. break;
  151.  
  152. default:
  153. g_print("got message %s\n", \
  154. gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
  155. break;
  156. }
  157.  
  158. return TRUE;
  159. }
  160.  
  161. int put_payload_to_gst(const char * payload, int sz)
  162. {
  163. GstBuffer *buffer;
  164. GstFlowReturn ret;
  165. gst_app_t *app = &gst_app;
  166.  
  167. if(sz == 0){
  168. ret = gst_app_src_end_of_stream(app->src);
  169. printf("eos returned %d at %d\n", ret, __LINE__);
  170. return 0;
  171. }
  172.  
  173. buffer = gst_buffer_new();
  174. GST_BUFFER_MALLOCDATA(buffer) = payload;
  175. GST_BUFFER_SIZE(buffer) = sz;
  176. GST_BUFFER_DATA(buffer) = GST_BUFFER_MALLOCDATA(buffer);
  177.  
  178. ret = gst_app_src_push_buffer(app->src, buffer);
  179. if(ret != GST_FLOW_OK){
  180. g_warning("push buffer returned %d for %d bytes \n", ret, sz);
  181. return 0;
  182. }
  183.  
  184. return 1;
  185.  
  186. }
  187.  
  188. int CreateGstPipe(void)
  189. {
  190. gst_app_t *app = &gst_app;
  191. GstBus *bus;
  192. GstStateChangeReturn state_ret;
  193. GstCaps *pSrcCaps;
  194.  
  195. gst_init(NULL, NULL);
  196.  
  197.  
  198. app->pipeline = (GstPipeline*)gst_pipeline_new("mypipeline");
  199. bus = gst_pipeline_get_bus(app->pipeline);
  200. gst_bus_add_watch(bus, (GstBusFunc)bus_callback, app);
  201. gst_object_unref(bus);
  202.  
  203. app->src = (GstAppSrc*)gst_element_factory_make("appsrc", "mysrc");
  204. app->decoder = gst_element_factory_make("decodebin2", "mydecoder");
  205. app->Audioconvert = gst_element_factory_make ("audioconvert", "audioconvert1");
  206. app->Audioresample = gst_element_factory_make ("audioresample", "audioresample1");
  207. app->alsasink = gst_element_factory_make("alsasink", "myasink");
  208.  
  209. g_assert(app->src);
  210. g_assert(app->decoder);
  211. g_assert(app->Audioconvert);
  212. g_assert(app->Audioresample);
  213. g_assert(app->alsasink);
  214.  
  215.  
  216.  
  217.  
  218. gst_app_src_set_caps(app->src, pSrcCaps);
  219. g_object_set (app->src, "is-live", FALSE, NULL);
  220.  
  221. g_object_set (app->src, "do-timestamp", FALSE, NULL);
  222.  
  223. gst_app_src_set_stream_type(app->src, GST_APP_STREAM_TYPE_SEEKABLE);
  224.  
  225. g_signal_connect(app->decoder, "pad-added", G_CALLBACK(on_pad_added), app->decoder);
  226.  
  227. gst_bin_add_many(GST_BIN(app->pipeline), (GstElement*)app->src,
  228. app->decoder, app->Audioconvert, app->Audioresample, app->alsasink, NULL);
  229.  
  230. if(!gst_element_link((GstElement*)app->src, app->decoder)){
  231. g_warning("failed to link src anbd decoder");
  232. }
  233.  
  234. if(!gst_element_link(app->Audioconvert, app->Audioresample)){
  235. g_warning("failed to link Audioconvert and Audioresample");
  236. }
  237.  
  238. if(!gst_element_link(app->Audioresample, app->alsasink)){
  239. g_warning("failed to link Audioresample and alsasink");
  240. }
  241.  
  242.  
  243. state_ret = gst_element_set_state((GstElement*)app->pipeline, GST_STATE_PLAYING);
  244.  
  245. g_warning("set state returned %d\n", state_ret);
  246.  
  247.  
  248.  
  249.  
  250. return 0;
  251. }
  252.  
  253. /////////////////////////////////////////////////////////
  254. push data here
  255. ///////////////////////////////////////////////////////////
  256. #define ONE_PKT_SIZE 4*1024
  257. char onepkt[ONE_PKT_SIZE];
  258. GstFlowReturn ret;
  259. GstBuffer *buffer;
  260. gst_app_t *app = &gst_app;
  261. while(1)//////////////////////////////////GET Audio Data
  262. {
  263. iRet = Read((char*)(onepkt), ONE_PKT_SIZE, 0);
  264. if(iRet > 0)
  265. {
  266. iTotalBytesRead += iRet;
  267. write(localFile, onepkt, iRet);
  268.  
  269. buffer = gst_buffer_new_and_alloc (iRet);
  270. GST_BUFFER_SIZE(buffer) = iRet;
  271. GST_BUFFER_DATA(buffer) = GST_BUFFER_MALLOCDATA(buffer);
  272. memcpy(GST_BUFFER_DATA(buffer), onepkt,iRet);
  273. ret = gst_app_src_push_buffer(app->src, buffer);
  274. if(ret != GST_FLOW_OK){
  275. g_warning("push buffer returned %d for %d bytes \n", ret, iRet);
  276.  
  277. }
  278.  
  279. if(iTotalBytesRead != iReadBytes)
  280. {
  281. printf("Read iTotalBytesRead=%d\n",iTotalBytesRead);
  282. continue;
  283. }
  284.  
  285. }else{
  286.  
  287. printf("Read END:iTotalBytesRead=%d\n",iTotalBytesRead);
  288. break;
  289. }
  290. }
Advertisement
Add Comment
Please, Sign In to add comment