Appsrc use gst_app_src_push_buffer by Udpsink don‘t send and data

Erickson.LU ericksonlushan at gmail.com
Mon Jun 4 13:17:16 UTC 2018


Hi 
Code is below 
-------------------------------------------------------------------------------------------------------------------------------------------
void NeedDataCallback(GstAppSrc* appsrc, guint length, gpointer user_data)
{
    boost::mutex::scoped_lock(pushBufferFlagMutex);
    needsData = true;
}
void EnoughDataCallback(GstAppSrc* appsrc, gpointer user_data)
{
    boost::mutex::scoped_lock(pushBufferFlagMutex);
    std::cout << "EnoughDataCallback!\n";
    needsData = false;
}
gboolean SeekDataCallback(GstAppSrc* appsrc, guint64 offset, gpointer
user_data)
{

    return false;
}

bool SendBUF(GstBuffer* buffer)
{

    boost::mutex::scoped_lock(pushBufferFlagMutex);
    if (!needsData) {
        return false;
    }

    if (buffer) {
        if (needsData){
            GstFlowReturn ret = gst_app_src_push_buffer((GstAppSrc*)appsrc,
buffer); // buffer released automatically
            g_print("\n%d\n",ret);

        }
    }

    return true;
}

void Process_frame0(){
    GstSample* sample;
    GstMapInfo map;
    GstStructure* s;
    GstBuffer* buffer;
    GstCaps* caps;
    GstMemory* mem;
    int height, width, size;
    int count=0;
    void* map_data;
    while(is_streaming){
        if(appSinkPipeline0->GetIsNewFrameAvailable()){
            appSinkPipeline0->GetLatestSample(&sample);
            caps = gst_sample_get_caps(sample);
            buffer = gst_sample_get_buffer(sample);
            s = gst_caps_get_structure(caps, 0);
            gst_structure_get_int(s, "height", &height);
            gst_structure_get_int(s, "width", &width);
            size = gst_buffer_get_size(buffer);
            if (gst_buffer_map (buffer, &map, GST_MAP_READ)) {
                cv::Mat frame(height, width, CV_8UC3,map.data,
cv::Mat::AUTO_STEP);
                std::string msg ="Copy Right";
                cv::Point origin(0,0+13);
                cv::putText( frame, msg, origin, 1, 1, RED);
//                cv::namedWindow("View_CV");
//                cv::imshow("cam0",frame);
//                cv::waitKey(1);
//                cv::waitKey(0);
                gst_buffer_unmap (buffer, &map);
                gst_buffer_ref(buffer);
                SendBUF(buffer);
            }
            gst_sample_unref (sample);
            appSinkPipeline0->ReleaseFrameBuffer();
        } else {
        }

    
}


int
main (int argc, char *argv[])
{
    XInitThreads();
    boost::thread g_main_loop_thread0;

    GstAppSinkCallbacks appsinkCallbacks;
    GstAppSrcCallbacks appsrcCallbacks;
    appSinkPipeline0 = new GstAppSinkPipeline();

    gst_init(&argc, &argv);
    GstElement  *conv, *encoder, *rtppay, *udpsink;


    appSinkPipeline0->Initialize(SINK0,"APP_SINK0");



    appSinkPipeline0->set_is_streaming(true);

    appSinkPipeline0->SetPipelineState(GST_STATE_PLAYING);


    GstElement *pipeline_sink, *sink,*pipeline_src,*src ;
    gint width, height;
    GstSample *sample;
    gchar *descr,*src_pip_str;

    GError *error = NULL;
    gint64 duration, position;
    GstStateChangeReturn ret;
    gboolean res;
    GstMapInfo map;

    pipeline_src = gst_pipeline_new("pipeline_src");
    appsrc = gst_element_factory_make ("appsrc", "APP_SRC");
    conv = gst_element_factory_make ("videoconvert", "conv");
    encoder = gst_element_factory_make ("x265enc", "encoder");
    rtppay = gst_element_factory_make ("rtph265pay", "rtppay");
    udpsink = gst_element_factory_make ("udpsink", "sink");

    g_object_set (G_OBJECT (rtppay), "ssrc",1,
    "pt",96,
    "config-interval",5,
    "sprop-parameter-sets","12345",NULL);


    g_object_set (G_OBJECT (appsrc), "caps",
                  gst_caps_new_simple ("video/x-raw",
                                       "format", G_TYPE_STRING, "BGR",
                                       "width", G_TYPE_INT, 640,
                                       "height", G_TYPE_INT, 480,
                                       "framerate", GST_TYPE_FRACTION, 30,
1,
                                       NULL), NULL);

    g_object_set( udpsink, "host", "127.0.0.1", NULL );
    g_object_set( udpsink, "port", 3221, NULL );
    g_object_set( udpsink, "sync", false, NULL );
    g_object_set( udpsink, "async", false, NULL );


    appsrcCallbacks.need_data = NeedDataCallback;
    appsrcCallbacks.enough_data = EnoughDataCallback;
    appsrcCallbacks.seek_data = SeekDataCallback;
    gst_app_src_set_callbacks(GST_APP_SRC(appsrc), &appsrcCallbacks, NULL,
(GDestroyNotify)DestroyCallback_src);
    gst_app_src_set_max_bytes(GST_APP_SRC(appsrc), 0);



    g_object_set (G_OBJECT (appsrc),
                  "stream-type", 0,
                  "format", GST_FORMAT_TIME, NULL);
    gst_bin_add_many (GST_BIN (pipeline_src), appsrc, conv, encoder, rtppay,
udpsink, NULL);
    gst_element_link_many (appsrc, conv, encoder, rtppay, udpsink , NULL);

    /* setup appsrc */
    GstStateChangeReturn ret_src_set =
gst_element_set_state(pipeline_src,GST_STATE_PLAYING);
    if (ret_src_set == GST_STATE_CHANGE_FAILURE) {
        g_printerr("Unable to set the pipeline_sink to the playing state");
        gst_object_unref(pipeline_src);
        return false;
    }

    g_main_loop_thread0 = boost::thread(&Process_frame0);

    g_main_loop_thread0.join();
}
-------------------------------------------------------------------------------------------------------------------------------------------

At the same time i use “ sudo tcpdump -i lo dst port 3221”
====================================================
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
====================================================

So, it seems that the appsrc didn't send and data by udpsink. I don't know
where is wrong.
Can someone give me some hint ???
Thanks a lot.



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


More information about the gstreamer-devel mailing list