why not appsink buffer error?

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

why not appsink buffer error?

JongIlLee
hi

I made other pipelines in the pipeline

Pipes should try to play one of the on / off.

However, if the execution, the following error occurs.

What is the cause? Please advise.

(Rear_cam_recorder: 1015): GStreamer-CRITICAL **: gst_buffer_iterate_meta: assertion '! Buffer = NULL' failed

(Rear_cam_recorder: 1015): GStreamer-CRITICAL **: gst_buffer_add_meta: assertion '! Buffer = NULL' failed

I designed the code is below.

---------------------------------------------------------------------------------------------------------

GstCaps *v4l2src_caps, *appsink_caps, *appsrc_caps,*png_caps,*pre_caps;

        GstBuffer* buffer;
        GstMemory* memory;
        GstMapInfo mapinfo;

       
        //SRC Define
        mRecSrcData.pipe = gst_pipeline_new("rear_src_pipeline");
        g_assert(mRecSrcData.pipe);

        mPreSinkData.pre_pipe = gst_pipeline_new("rear_pre_pipeline");
        g_assert(mPreSinkData.pre_pipe);

        mRecSrcData.imxv4l2src = gst_element_factory_make("imxv4l2src", "rear_v4l2src");
        g_assert(mRecSrcData.imxv4l2src);

        mRecSrcData.capsfilter = gst_element_factory_make("capsfilter", "rear_capsfilter");
        g_assert(mRecSrcData.capsfilter);
       
        mRecSrcData.queue1 = gst_element_factory_make("queue", "rear_queue1");
        g_assert(mRecSrcData.queue1);
        mRecSrcData.ipuconverter = gst_element_factory_make("imxvideoconvert_ipu", "rear_ipu_converter");
        g_assert(mRecSrcData.ipuconverter);

        mRecSrcData.ipuconverter1 = gst_element_factory_make("imxvideoconvert_ipu", "rear_pre_ipu_converter");
        g_assert(mRecSrcData.ipuconverter1);

        mRecSrcData.vpuenc = gst_element_factory_make("vpuenc_h264", "rear_vpuenc");
        g_assert(mRecSrcData.vpuenc);

        mRecSrcData.queue2 = gst_element_factory_make("queue", "rear_queue2");
        g_assert(mRecSrcData.queue2);

        mRecSrcData.appsink2= gst_element_factory_make("appsink", "rear_appsink_preview");
        g_assert(mRecSrcData.appsink2);

        mRecSrcData.appsink= gst_element_factory_make("appsink", "rear_appsink");
        g_assert(mRecSrcData.appsink);

        mRecSrcData.tee= gst_element_factory_make("tee", "rear_tee");
        g_assert(mRecSrcData.tee);

        mRecSrcData.autovideosink = gst_element_factory_make("autovideosink", "rear_autovideosink");
        g_assert(mRecSrcData.autovideosink);
       
        mRecSrcData.source_bus = gst_pipeline_get_bus(GST_PIPELINE(mRecSrcData.pipe));
        g_assert(mRecSrcData.source_bus);
#if 0
        mRecSrcData.textoverlay = gst_element_factory_make("textoverlay", "textoverlay");
        g_assert(mRecSrcData.textoverlay);
#endif


        gst_bin_add_many(
                GST_BIN(mRecSrcData.pipe),
                mRecSrcData.imxv4l2src,
                mRecSrcData.tee,
                mRecSrcData.capsfilter,
                mRecSrcData.queue1,
                mRecSrcData.ipuconverter,
                mRecSrcData.vpuenc,
                mRecSrcData.appsink,
                mRecSrcData.queue2,
                mRecSrcData.ipuconverter1,
                mRecSrcData.appsink2,
                NULL);


        if(gst_element_link_many(
                mRecSrcData.imxv4l2src,
                mRecSrcData.capsfilter,
                mRecSrcData.tee,
                NULL) != TRUE)
        {
                printf("RecSrcData link failed!\n");
                gst_object_unref(mRecSrcData.pipe);
                return -1;
        }
       
        if(gst_element_link_many(
                mRecSrcData.queue1,
                mRecSrcData.ipuconverter,
                mRecSrcData.vpuenc,
                mRecSrcData.appsink,
                NULL) != TRUE)
        {
                printf("RecSrcData link failed!\n");
                gst_object_unref(mRecSrcData.pipe);
                return -1;
        }
        if(gst_element_link_many(
                mRecSrcData.queue2,
                mRecSrcData.ipuconverter1,
                mRecSrcData.appsink2,
                NULL) != TRUE)
        {
                printf("RecSrcData link failed!\n");
                gst_object_unref(mRecSrcData.pipe);
                return -1;
        }

#if 0
        preview_caps = gst_caps_new_simple("video/x-raw-rgb",
                                "width", G_TYPE_INT, VGA_WIDTH,
                                "height", G_TYPE_INT, VGA_HEIGHT,
                                NULL);
#endif
                /* Link the camera source and colorspace filter using capabilities
         * specified */

        if( !(mNormalRecGstPad.tee_src_pad_template = gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (mRecSrcData.tee), "src_%u"))) {
          g_critical ("Unable to get pad template!");
          return -1;
        }

        mNormalRecGstPad.queue_rec_pad= gst_element_get_static_pad (mRecSrcData.queue1, "sink");
        mNormalRecGstPad.queue_preview_pad= gst_element_get_static_pad (mRecSrcData.queue2, "sink");
       
        mNormalRecGstPad.tee_rec_pad= gst_element_request_pad (mRecSrcData.tee, mNormalRecGstPad.tee_src_pad_template, NULL, NULL);
  g_print ("Obtained request pad %s for rec branch.\n", gst_pad_get_name (mNormalRecGstPad.tee_rec_pad));
 
       
  mNormalRecGstPad.tee_preview_pad= gst_element_request_pad (mRecSrcData.tee, mNormalRecGstPad.tee_src_pad_template, NULL, NULL);
  g_print ("Obtained request pad %s for preview branch.\n", gst_pad_get_name (mNormalRecGstPad.tee_preview_pad));
 
       
  if (gst_pad_link (mNormalRecGstPad.tee_rec_pad, mNormalRecGstPad.queue_rec_pad) != GST_PAD_LINK_OK ||
      gst_pad_link (mNormalRecGstPad.tee_preview_pad, mNormalRecGstPad.queue_preview_pad) != GST_PAD_LINK_OK) {
    g_printerr ("Tee could not be linked.\n");
    gst_object_unref (mRecSrcData.pipe);
    return -1;
  }
        gst_object_unref (mNormalRecGstPad.queue_rec_pad);
  gst_object_unref (mNormalRecGstPad.queue_preview_pad);
#if 0
    // Get sink pad for textoverlay and make it a ghostpad for bin
    mNormalRecGstPad.pad_textoverlay_sink = gst_element_get_pad(mRecSrcData.textoverlay, "appsink");
    gst_element_add_pad(mRecSrcData.pipe, gst_ghost_pad_new("sink", mNormalRecGstPad.pad_textoverlay_sink));

    // Link elements: textoverlay -> clockoverlay -> videosink
    gst_element_link_pads(mRecSrcData.textoverlay, "imxv4l2src", mRecSrcData.clockoverlay, "sink");
    gst_element_link_pads(mRecSrcData.clockoverlay, "imxv4l2src", mRecSrcData.appsink, "sink");
       
        g_object_set (G_OBJECT (playbin2), "appsink", mybin, NULL);
#endif

        v4l2src_caps = gst_caps_new_simple("video/x-raw",
                                                                "stream-format", G_TYPE_STRING, STREAM_FORMAT,
                                                                "width", G_TYPE_INT, VGA_WIDTH,
                                                                "height", G_TYPE_INT, VGA_HEIGHT,
                                                                "framerate", GST_TYPE_FRACTION, VGA_FRAMERATE,1,NULL);
#if 0
        g_object_set(G_OBJECT(mRecSrcData.textoverlay),
                                                                "font-desc","Sans 20",
                                                                "text", "Normal recording",
                                                                "halignment", GST_TEXT_OVERLAY_HALIGN_RIGHT,
                                                                "valignment", GST_TEXT_OVERLAY_VALIGN_BOTTOM,
                                                                "shaded-background", TRUE,
                                                                NULL);
#endif

        g_object_set(G_OBJECT(mRecSrcData.imxv4l2src),
                                                                "device", REAR_CAM_DEVICE, NULL);

        g_object_set(G_OBJECT(mRecSrcData.capsfilter),
                                                                "caps", v4l2src_caps, NULL);
       
        g_object_set(G_OBJECT(mRecSrcData.ipuconverter), "composition-meta-enable", TRUE,
                                                                                "in-place",TRUE,NULL);
        g_object_set(G_OBJECT(mRecSrcData.ipuconverter1), "composition-meta-enable", TRUE,
                                                                                "in-place",TRUE,NULL);

                                                               
        g_object_set(G_OBJECT(mRecSrcData.vpuenc), "bitrate", REAR_CAM_BITRATE, NULL);

        buffer = gst_buffer_new();
        memory = gst_allocator_alloc(NULL, REAR_NORMAL_CODEC_DATA_SIZE, NULL);
        gst_buffer_insert_memory(buffer, -1, memory);
        gst_buffer_map(buffer, &mapinfo, GST_MAP_WRITE);
        memcpy(mapinfo.data, rear_normal_codec_data, REAR_NORMAL_CODEC_DATA_SIZE);

        appsink_caps = gst_caps_new_simple("video/x-h264",
                                                                        "stream-format",G_TYPE_STRING,"avc",
                                                                        "alignment", G_TYPE_STRING, "au",
                                                                        "width", G_TYPE_INT, VGA_WIDTH,
                                                                        "height", G_TYPE_INT, VGA_HEIGHT,
                                                                        "framerate", GST_TYPE_FRACTION, VGA_FRAMERATE,1,
                                                                        "codec_data", GST_TYPE_BUFFER, buffer,
                                                                        "pixel-aspect-ratio",GST_TYPE_FRACTION,1,1,NULL);
        pre_caps =  gst_caps_new_simple("video/x-raw",
                                                                        "format", G_TYPE_STRING, STREAM_FORMAT,
                                                                        "width", G_TYPE_INT, VGA_WIDTH,
                                                                        "height", G_TYPE_INT, VGA_HEIGHT,
                                                                        "framerate", GST_TYPE_FRACTION, VGA_FRAMERATE,1,NULL);


        g_object_set (G_OBJECT (mRecSrcData.appsink), "emit-signals", TRUE, "caps", appsink_caps, NULL);
        g_object_set (G_OBJECT (mRecSrcData.appsink2), "emit-signals", TRUE, "caps",pre_caps, "sync", FALSE, NULL);
       
        g_signal_connect (mRecSrcData.appsink, "new-sample", G_CALLBACK (on_normal_new_sample_from_sink), this);
        g_signal_connect (mRecSrcData.appsink2, "new-sample", G_CALLBACK (on_normal_pre_new_sample_from_sink), this);


        gst_bus_add_watch (mRecSrcData.source_bus, (GstBusFunc) on_normal_source_message, this);


  gst_object_unref (mNormalRecGstPad.tee_rec_pad);
  gst_object_unref (mNormalRecGstPad.tee_preview_pad);

        //SINK Define
        mRecSinkData.pipe = gst_pipeline_new("rear_sink_pipeline");
        g_assert(mRecSinkData.pipe);

        mRecSinkData.appsource = gst_element_factory_make("appsrc", "rear_appsrc");
        g_assert(mRecSinkData.appsource);

        mRecSinkData.queue = gst_element_factory_make("queue", "rear_queue3");
        g_assert(mRecSinkData.queue);
       
        mRecSinkData.h264parse= gst_element_factory_make("h264parse", "rear_h264parse");
        g_assert(mRecSinkData.h264parse);
               
        mRecSinkData.mp4mux= gst_element_factory_make("mp4mux", "rear_mp4mux");
        g_assert(mRecSinkData.mp4mux);

        mRecSinkData.filesink= gst_element_factory_make("filesink", "rear_filesink");
        g_assert(mRecSinkData.filesink);

        appsrc_caps = gst_caps_new_simple("video/x-h264",
                                                                        "stream-format",G_TYPE_STRING,"avc",
                                                                        "alignment", G_TYPE_STRING, "au",
                                                                        "width", G_TYPE_INT, VGA_WIDTH,
                                                                        "height", G_TYPE_INT, VGA_HEIGHT,
                                                                        "framerate", GST_TYPE_FRACTION, VGA_FRAMERATE,1,
                                                                        "codec_data", GST_TYPE_BUFFER, buffer,
                                                                        "pixel-aspect-ratio",GST_TYPE_FRACTION,1,1,NULL);

        g_object_set (G_OBJECT(mRecSinkData.appsource), "caps",appsrc_caps,
                                                                    "stream-type",GST_APP_STREAM_TYPE_STREAM,
                                                                    "typefind", TRUE,
                                                                    "is-live", TRUE,
                                                                    "block", FALSE,
                                                                    "do-timestamp", TRUE,
                                                                    "num-buffers", REAR_NUM_BUFFERS,
                                                                    "format", GST_FORMAT_BUFFERS,NULL);




        g_signal_connect (mRecSinkData.appsource, "need-data", G_CALLBACK (normal_start_feed), this);
        g_signal_connect (mRecSinkData.appsource, "enough-data", G_CALLBACK (normal_stop_feed), this);
 
        mRecSinkData.sink_bus = gst_pipeline_get_bus(GST_PIPELINE(mRecSinkData.pipe));
        g_assert(mRecSinkData.sink_bus);
       
        gst_bus_add_watch (mRecSinkData.sink_bus, (GstBusFunc) on_normal_sink_message, this);



        gst_bin_add_many(GST_BIN(mRecSinkData.pipe), mRecSinkData.appsource, mRecSinkData.queue, mRecSinkData.h264parse,
                mRecSinkData.mp4mux, mRecSinkData.filesink, NULL);

        if(gst_element_link_many(mRecSinkData.appsource, mRecSinkData.queue, mRecSinkData.h264parse,
                mRecSinkData.mp4mux, mRecSinkData.filesink,NULL) != TRUE)
        {
                printf("RecSinkData gst_element_link_many failed!\n");
                gst_object_unref(mRecSinkData.pipe);
                return -1;
        }
       
        //preview
        mPreSinkData.pre_appsource = gst_element_factory_make("appsrc", "rear_pre_appsrc");
        g_assert(mPreSinkData.pre_appsource);
        mPreSinkData.pre_videomixer = gst_element_factory_make("glvideomixer", "rear_glvideomixer");
        g_assert(mPreSinkData.pre_videomixer);
        mPreSinkData.pre_multifilesrc = gst_element_factory_make("multifilesrc", "rear_multifilesrc");
        g_assert(mPreSinkData.pre_multifilesrc);
        mPreSinkData.pre_pngdec = gst_element_factory_make("pngdec", "rear_pngdec");
        g_assert(mPreSinkData.pre_pngdec);
        mPreSinkData.pre_videoconvert1 = gst_element_factory_make("videoconvert", "rear_imxvideoconvert_ipu1");
        g_assert(mPreSinkData.pre_videoconvert1);
        mPreSinkData.pre_videoconvert2 = gst_element_factory_make("videoconvert", "rear_imxvideoconvert_ipu2");
        g_assert(mPreSinkData.pre_videoconvert2);
        mPreSinkData.pre_glsink = gst_element_factory_make("glimagesinkelement", "rear_glimagesinkelement");
        g_assert(mPreSinkData.pre_glsink);
        mPreSinkData.pre_queue = gst_element_factory_make("queue", "queue4");
        g_assert(mPreSinkData.pre_queue);

        mPreSinkData.pre_sink_bus = gst_pipeline_get_bus(GST_PIPELINE(mPreSinkData.pre_pipe));
        g_assert(mPreSinkData.pre_sink_bus);
       


                                                                   
        g_object_set (G_OBJECT(mPreSinkData.pre_appsource), "format", GST_FORMAT_TIME,"caps",pre_caps, NULL);

        png_caps = gst_caps_new_simple("image/png",
                                                                        "framerate", GST_TYPE_FRACTION, 1,60,NULL);
       
        g_object_set(G_OBJECT(mPreSinkData.pre_multifilesrc),
                                                                "caps",png_caps,
                                                                "location", REAR_OVERLAY_IMAGE, NULL);
        g_object_set(G_OBJECT(mPreSinkData.pre_glsink),
                                                                "force-aspect-ratio", TRUE, NULL);

        gst_bus_add_watch (mPreSinkData.pre_sink_bus, (GstBusFunc) on_normal_pre_sink_message, this);

        gst_bin_add_many(
        GST_BIN(mPreSinkData.pre_pipe),
        mPreSinkData.pre_appsource,
        mPreSinkData.pre_queue,
        mRecSrcData.autovideosink,
        NULL);


        if(gst_element_link_many(
                        mPreSinkData.pre_appsource,
                        mPreSinkData.pre_queue,
                        mRecSrcData.autovideosink,
                        NULL) != TRUE)
                {
                        printf("RecSrcData videomixer 1 failed!\n");
                        gst_object_unref(mPreSinkData.pre_pipe);
                        return -1;
                }

---------------------------------------------------------------------------------------------------
static GstFlowReturn
on_normal_pre_new_sample_from_sink (GstElement * elt, void * instance)
{
        printf("Rear on_normal_pre_new_sample_from_sink!!\n");
        NormalRecorder *recorder = reinterpret_cast<NormalRecorder*>(instance);
        GstSample *sample;
        GstBuffer *app_buffer, *buffer;
        GstFlowReturn ret;

        sample = gst_app_sink_pull_sample (GST_APP_SINK (elt));
        buffer = gst_sample_get_buffer (sample);
        if(buffer != NULL){
                app_buffer = gst_buffer_copy (buffer);
                ret = gst_app_src_push_buffer (GST_APP_SRC (recorder->mPreSinkData.pre_appsource), app_buffer);
        }else{
        printf("Why not Buffer not??????!!\n");
        }
        gst_sample_unref (sample);

        //source = gst_bin_get_by_name (GST_BIN (data->sink), "testsource");
       

        recorder = NULL;
        return GST_FLOW_OK;