*Hi,
When I try the following script, it does not work : the sample of appsink is empty. Nevertheless, when I link "videotestsrc" to "videoconvert-x264enc-appsink" directly, it works and when I connect "appsrc" to "appsink" direcly, it works too... What is the problem ? Thank you.* gst_init(NULL,NULL); GstElement *pipeline2; pipeline2 = gst_pipeline_new("pipeline"); GstElement *appsink2; appsink2 = gst_element_factory_make("appsink", "BufferSink2"); GstElement *videotestsrc = gst_element_factory_make("videotestsrc", "source"); g_object_set(G_OBJECT(videotestsrc), "num-buffers", 1, NULL); gst_bin_add_many(GST_BIN(pipeline2), videotestsrc, appsink2, NULL); GstCaps *caps2 = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "GRAY8", "width", G_TYPE_INT, 100, "height", G_TYPE_INT, 100, NULL); gst_element_link_filtered(videotestsrc, appsink2, caps2); GstStateChangeReturn retPip2 = gst_element_set_state(pipeline2, GST_STATE_PLAYING); GstSample *sample2 = gst_app_sink_pull_sample (GST_APP_SINK(appsink2)); GstBuffer *buffer2= gst_sample_get_buffer(sample2); GstMapInfo map2; gst_buffer_map(buffer2, &map2, GST_MAP_READ); uchar source[map2.size]; memmove(source, map2.data, map2.size); //////// int size = map2.size; GstFlowReturn ret; GstElement *appsrc; appsrc = gst_element_factory_make("appsrc", "appsrc"); g_object_set(G_OBJECT(appsrc), "blocksize", size, NULL); g_object_set(G_OBJECT(appsrc), "num-buffers", 1, NULL); GstBuffer *buffer; buffer = gst_buffer_new_allocate(NULL,size, NULL); GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_WRITE); uchar *buf = map.data; memcpy(buf, source, size); ret = gst_app_src_push_buffer(GST_APP_SRC(appsrc), buffer); g_object_set(G_OBJECT(appsrc), "caps", gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "GRAY8", "width", G_TYPE_INT, 100, "height", G_TYPE_INT, 100, NULL), NULL); //g_object_set(G_OBJECT(appsrc), "stream-type", 0, "format", 3, "size", size, NULL); GstCaps *cap_appsrc_to_x264enc; cap_appsrc_to_x264enc = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "GRAY8", "width", G_TYPE_INT, 100, "height", G_TYPE_INT, 100, NULL); GstCaps *cap_x264enc_to_sink; cap_x264enc_to_sink = gst_caps_new_simple("video/x-h264", "profile", G_TYPE_STRING, "main", NULL); GstElement *x264enc = gst_element_factory_make("x264enc", "encoder"); g_object_set(G_OBJECT(x264enc), "qp-max", 20, NULL); g_object_set(G_OBJECT(x264enc), "pass", 17, NULL); // VBR Pass 1 g_object_set(G_OBJECT(x264enc), "bitrate", 2000, NULL); GstCaps *caps; caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "I420", NULL); GstElement *appsink; appsink = gst_element_factory_make("appsink", "BufferSink"); GstElement *convert = gst_element_factory_make("videoconvert", "convert"); GstElement *pipeline; pipeline = gst_pipeline_new("pipeline"); gst_bin_add_many(GST_BIN(pipeline), appsrc, convert, x264enc, appsink, NULL); gst_element_link_filtered(appsrc, convert, cap_appsrc_to_x264enc); gst_element_link_filtered(convert, x264enc, caps); gst_element_link_filtered(x264enc,appsink, cap_x264enc_to_sink); GstStateChangeReturn retPip = gst_element_set_state(pipeline, GST_STATE_PLAYING); GstSample *sample = gst_app_sink_pull_sample (GST_APP_SINK(appsink)); GstBuffer *encBuffer= gst_sample_get_buffer(sample); gsize senc = gst_buffer_get_size (encBuffer); GstMapInfo mapEnc; gst_buffer_map(encBuffer, &mapEnc, GST_MAP_READ); uchar pRet[mapEnc.size]; printf("%d\n", mapEnc.size); memmove(pRet, mapEnc.data, mapEnc.size); -- Sent from: http://gstreamer-devel.966125.n4.nabble.com/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |