[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