[Bug 769780] New: Obout v4l2src At the same time preview and video switch to preview only have a bug

GStreamer (GNOME Bugzilla) bugzilla at gnome.org
Fri Aug 12 04:40:22 UTC 2016


https://bugzilla.gnome.org/show_bug.cgi?id=769780

            Bug ID: 769780
           Summary: Obout v4l2src At the  same time preview and video
                    switch to preview only have a bug
    Classification: Platform
           Product: GStreamer
           Version: git master
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: Normal
         Component: gst-plugins-good
          Assignee: gstreamer-bugs at lists.freedesktop.org
          Reporter: dasimazn at 163.com
        QA Contact: gstreamer-bugs at lists.freedesktop.org
     GNOME version: ---

Created attachment 333158
  --> https://bugzilla.gnome.org/attachment.cgi?id=333158&action=edit
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

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.


More information about the gstreamer-bugs mailing list