After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 769780 - Obout v4l2src At the same time preview and video switch to preview only have a bug
Obout v4l2src At the same time preview and video switch to preview only have...
Status: RESOLVED INVALID
Product: GStreamer
Classification: Platform
Component: gstreamer (core)
1.0.0
Other Linux
: Normal normal
: NONE
Assigned To: GStreamer Maintainers
GStreamer Maintainers
Depends on:
Blocks:
 
 
Reported: 2016-08-12 04:40 UTC by frank
Modified: 2016-08-12 21:58 UTC
See Also:
GNOME target: ---
GNOME version: ---


Attachments
source code (15.15 KB, text/x-csrc)
2016-08-12 04:40 UTC, frank
Details

Description frank 2016-08-12 04:40:22 UTC
Created attachment 333158 [details]
source code

hello:
  I comefrom china, my namer is frank i have gstreamer program have some bugs,You can provide some suggestions?, thank you very much 
1)use v4l2src element to realization picture and record ,frist v4l2src can preview camera , 
 SinkPipeline::SinkPipeline(QGraphicsView *parent) : QObject(parent)
{
  GstStateChangeReturn sret;

  camRecordflg  = 0;
  camPictureflg = 0;

  //camera preview pipeline
  pevPipeline = gst_pipeline_new ("xvoverlay");
  camPrevSrc  = gst_element_factory_make ("v4l2src", NULL);
  main_valve  = gst_element_factory_make ("valve","mainValve");
  input_device = "/dev/video0";
  camPrevfilter = gst_element_factory_make("capsfilter",NULL);
  camPrevCaps = gst_caps_from_string("video/x-raw,width=1280,height=720,framerate=60/1");

  g_object_set(G_OBJECT(camPrevSrc),"device",input_device,NULL);
  g_object_set(G_OBJECT(camPrevfilter),"caps",camPrevCaps,NULL);

  //record video picture pipeline
  fileSink          = gst_element_factory_make("filesink",NULL);
  camRecordCaps     = gst_caps_from_string("video/x-raw,width=1280,height=720,framerate=60/1");
  tee               = gst_element_factory_make("tee", NULL);
  camPrev_Queue     = gst_element_factory_make("queue",NULL);
  mp4Mux            = gst_element_factory_make("mpegtsmux",NULL);
  camRecord_Queue   = gst_element_factory_make("queue",NULL);
  camRecordfilter   = gst_element_factory_make("capsfilter",NULL);
  camRecordFileName = "/home/ubuntu/family.mp4";
  nvOmx_H264enc     = gst_element_factory_make("omxh264enc",NULL);  //omxh264enc
  h264parse         = gst_element_factory_make("h264parse",NULL);


  g_object_set(G_OBJECT(camRecordfilter),"caps",camRecordCaps,NULL);
  g_object_set(G_OBJECT(fileSink),"location",camRecordFileName,NULL);;

  g_object_set(G_OBJECT(camPrev_Queue),"max-size-buffers",0,NULL);
  g_object_set(G_OBJECT(camPrev_Queue),"max-size-time",0,NULL);
  g_object_set(G_OBJECT(camPrev_Queue),"max-size-bytes",512000000,NULL);

  g_object_set(G_OBJECT(camRecord_Queue),"max-size-buffers",0,NULL);
  g_object_set(G_OBJECT(camRecord_Queue),"max-size-time",0,NULL);
  g_object_set(G_OBJECT(camRecord_Queue),"max-size-bytes",512000000,NULL);


  //config and link cam_pipline
  if ((sink = gst_element_factory_make ("xvimagesink", NULL))) {  //
    sret = gst_element_set_state (sink, GST_STATE_READY);
    if (sret != GST_STATE_CHANGE_SUCCESS) {
      gst_element_set_state (sink, GST_STATE_NULL);
      gst_object_unref (sink);
    }
  }

  if (sink == NULL)
    g_error ("Couldn't find a working video sink.");


  if(!pevPipeline || ! camPrevSrc || !tee || !main_valve || !camPrev_Queue || !camPrevfilter || !sink
          || !camRecord_Queue || !camRecordfilter || !nvOmx_H264enc|| !h264parse || !mp4Mux || !fileSink){
      g_error ("Someting error.");
  }


  //src link to sink
  // camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL)
  gst_bin_add_many (GST_BIN (pevPipeline), camPrevSrc, tee ,main_valve,camPrev_Queue, camPrevfilter,sink,NULL);

  if(gst_element_link_many(camPrevSrc,tee,main_valve,NULL) != TRUE ||
          gst_element_link_many(camPrev_Queue,camPrevfilter, sink,NULL) != TRUE ||
            gst_element_link_many(camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL) != TRUE){
      g_printerr("Elements could not be linked.\n");
      gst_object_unref(pevPipeline);
  }

  if(mp4Mux==NULL){
       g_printerr("Error: mp4Mux == Null\n");
  }
  if(tee==NULL){
       g_printerr("Error: TEE == Null\n");
  }

  tee_src_pad_template = gst_element_class_get_pad_template( GST_ELEMENT_GET_CLASS( tee ), "src_%u" );
   if (tee_src_pad_template == NULL){
       g_printerr("Error: tee_src_pad_template == Null\n");
   }

   tee_camPrev_pad      = gst_element_request_pad(tee,tee_src_pad_template,NULL,NULL);
   g_print("Obtained reques pad %s for tee_camPrev_pad branch.\n", gst_pad_get_name(tee_camPrev_pad));
   queue_camPrev_pad    = gst_element_get_static_pad(camPrev_Queue,"sink");

   tee_camRecord_pad    = gst_element_request_pad(tee,tee_src_pad_template,NULL,NULL);
   g_print("Obtained reques pad %s for tee_camRecord_pad branch.\n", gst_pad_get_name(tee_src_pad_template));
   queue_camRecord_pad  = gst_element_get_static_pad(camRecord_Queue,"sink");

   //gst_pad_link(tee_camRecord_pad,queue_camRecord_pad) != GST_PAD_LINK_OK)
   if(gst_pad_link(tee_camPrev_pad,queue_camPrev_pad) != GST_PAD_LINK_OK ){
       g_printerr("Tee could not be linked.\n");
       gst_object_unref(pevPipeline);
   }

   //gst_object_unref(queue_camPrev_pad);
  
   xwinid = parent->winId();
}

2)second, I use startRecodPipeline() function to preview and record camer,  in qt_videooverlay.cpp
void SinkPipeline::startRecodPipeline(){
    stopPipeline();  //to READY state
    camRecordflg = 1;
    gst_pad_unlink(tee_camPrev_pad,queue_camPrev_pad);
 
    qDebug("1");
    gst_element_unlink_many(camPrevSrc,tee,main_valve,NULL);
    gst_element_unlink_many(camPrev_Queue,camPrevfilter, sink,NULL);
    gst_element_unlink_many(camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL) ;
    gst_bin_remove_many (GST_BIN (pevPipeline), camPrevSrc, tee ,camPrev_Queue, camPrevfilter,sink,NULL);
    qDebug("5");
    // camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL)
 
    if(!pevPipeline || ! camPrevSrc || !tee  || !camPrev_Queue || !camPrevfilter || !sink
              || !camRecord_Queue || !camRecordfilter || !nvOmx_H264enc|| !h264parse || !mp4Mux || !fileSink){
          g_error ("Someting error.");
      }
    qDebug("6");
 
    gst_bin_add_many (GST_BIN (pevPipeline),camPrevSrc, tee ,camPrev_Queue, camPrevfilter,sink,
                      camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL);
    if(gst_element_link_many(camPrevSrc,tee,NULL) != TRUE ||
            gst_element_link_many(camPrev_Queue,camPrevfilter, sink,NULL) != TRUE ||
              gst_element_link_many(camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL) != TRUE){
        g_printerr("Elements could not be linked.\n");
        gst_object_unref(pevPipeline);
    }
 
    if(gst_pad_link(tee_camPrev_pad,queue_camPrev_pad) != GST_PAD_LINK_OK ||
                gst_pad_link(tee_camRecord_pad,queue_camRecord_pad) != GST_PAD_LINK_OK){
        g_printerr("Tee could not be linked.\n");
        gst_object_unref(pevPipeline);
    }
 
    startPipeline(); //to playing state
}

3)then, I use stoRecordPipeline funcation to just preview camera,but have error, v4l2 gstv4l2object.c:2524:gst_v4l2_object_set_format:<v4l2src0>[00m error: Device '/dev/video0' is busy. in debug.txt
void SinkPipeline::stopRecodPipeline(){
    qDebug("-->Enter int stopRecodPipeline function");
    stopPipeline();
    camRecordflg = 0;
 
    gst_element_send_event(pevPipeline,gst_event_new_eos());
    gst_element_send_event(camPrevSrc,gst_event_new_eos());
 
 

//    if(!gst_pad_unlink(tee_camRecord_pad,queue_camRecord_pad)){
//         g_error ("tee_camRecord_pad error.");
//    }
//    if(!gst_pad_unlink(tee_camPrev_pad,queue_camPrev_pad)){
//         g_error ("tee_camPrev_pad error.");
//    }
 
    //gst_bin_remove(GST_BIN(pevPipeline),camPrevSrc);
    gst_bin_remove_many (GST_BIN (pevPipeline), camPrevSrc, tee ,camPrev_Queue, camPrevfilter,sink,
                         camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL);
 
    gst_element_unlink_many(camPrev_Queue,camPrevfilter, sink,NULL);
    gst_element_unlink_many(camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL);
    gst_element_unlink_many(camPrevSrc,tee,NULL);
 

    qDebug("4");
 
 
 
    if(!pevPipeline || ! camPrevSrc || !tee  || !camPrev_Queue || !camPrevfilter || !sink
            || !camRecord_Queue || !camRecordfilter || !nvOmx_H264enc|| !h264parse || !mp4Mux || !fileSink){
        g_error ("Someting error.");
    }
 
    g_object_set(G_OBJECT(camPrevSrc),"device",input_device,NULL);
    g_object_set(G_OBJECT(camPrevfilter),"caps",camPrevCaps,NULL);
 
    //src link to sink
    // camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL)
    gst_bin_add_many (GST_BIN (pevPipeline), camPrevSrc, tee ,camPrev_Queue, camPrevfilter,sink,NULL);
 
    if(gst_element_link_many(camPrevSrc,tee,NULL) != TRUE ||
            gst_element_link_many(camPrev_Queue,camPrevfilter, sink,NULL) != TRUE){
        g_printerr("Elements could not be linked.\n");
        gst_object_unref(pevPipeline);
    }
 
     //gst_pad_link(tee_camRecord_pad,queue_camRecord_pad) != GST_PAD_LINK_OK)
     if(gst_pad_link(tee_camPrev_pad,queue_camPrev_pad) != GST_PAD_LINK_OK ){
         g_printerr("Tee could not be linked.\n");
         gst_object_unref(pevPipeline);
        }
 
     startPipeline();
}
 
Best wishes
Comment 1 Tim-Philipp Müller 2016-08-12 15:09:08 UTC
Hi Frank,

I think the gstreamer-devel mailing list would be a better forum to get help with this problem, since it's not really clear whether there's actually a bug in GStreamer or if it's in your application.

You might also want to have a look at the "camerabin" element, which might alreayd provide all the functionality you're looking for.