简体   繁体   中英

Error while negotinating gstreamer pipeline from code

Constructing this pipeline from code in few steps. 结果管道

Gstreamermm used.

  • Create appsrc_1:
appsrc = Gst::ElementFactory::create_element("appsrc", name);
appsrc->set_property("block", false);
appsrc->set_property("min-latency", 0);
appsrc->set_property("max-latency", 100);
appsrc->set_property("do-timestamp", false);
appsrc->set_property("format", 3);

const char * format = nullptr;
switch (m_type)
{
    case CV_8UC1: format = "GRAY8"; break;
    case CV_8UC3: format = "BGR"; break;
    default:
        assert(false);
        return;
}

appsrcCaps = Gst::Caps::create_simple("video/x-raw",
                                     "format", format,
                                     "framerate", Gst::Fraction(m_fps, 1),
                                     "width", m_frameSize.width,
                                     "height", m_frameSize.height);
appsrc->set_property("caps", appsrcCaps);
  • Create bin0:
bin = Glib::RefPtr<Gst::Bin>::cast_dynamic(Gst::Parse::create_bin("queue ! videoconvert", false));

binSinkPad = bin->add_ghost_pad(bin->get_element("queue0"), "sink");
binSrcPad = bin->add_ghost_pad(bin->get_element("videoconvert0"), "src");
  • Create tee:
tee = Gst::ElementFactory::create_element("tee");
tee->set_property("allow-not-linked", true);

Then, new pipeline was created and existing elements were added:

pipeline = Gst::Pipeline::create("webrtc_pipeline");
pipeline->add(appsrc);
pipeline->add(tee)->add(bin);
  • Link step:
appsrc->link(bin)->link(tee);

Then, on some time, when new client connects, bin1 spawns with fake ximagesink :


pipeline->set_state(Gst::STATE_READY);

bin1 = Glib::RefPtr<Gst::Bin>::cast_dynamic(Gst::Parse::create_bin("queue name=q ! ximagesink", false));
videoSinkPad = bin1->add_ghost_pad(bin1->get_element("q"), "sink", "videosinkpad");
bin1->set_state(Gst::STATE_PAUSED);

pipeline->add(bin1);

tee->link(bin1);

pipeline->set_state(Gst::STATE_PLAYING);

After those steps I am getting this strange log and error:

0:01:13.399425680 32822 0x7fd578002800 DEBUG           videoconvert gstvideoconvert.c:405:gst_video_convert_transform_caps:<videoconvert0> transformed video/x-raw, format=(string)GRAY8, framerate=(fraction)8/1, width=(int)640, height=(int)480 into video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, VUYA, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, Y210, Y410, NV12, NV21, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10BE, I420_10LE, I422_10BE, I422_10LE, Y444_10BE, Y444_10LE, GBR, GBR_10BE, GBR_10LE, NV16, NV24, NV12_64Z32, A420_10BE, A420_10LE, A422_10BE, A422_10LE, A444_10BE, A444_10LE, NV61, P010_10BE, P010_10LE, IYU2, VYUY, GBRA, GBRA_10BE, GBRA_10LE, BGR10A2_LE, GBR_12BE, GBR_12LE, GBRA_12BE, GBRA_12LE, I420_12BE, I420_12LE, I422_12BE, I422_12LE, Y444_12BE, Y444_12LE, GRAY10_LE32, NV12_10LE32, NV16_10LE32, NV12_10LE40 }, width=(int)640, height=(int)480, framerate=(fraction)8/1
0:01:13.399443298 32822 0x7fd578002800 DEBUG           videoconvert gstvideoconvert.c:405:gst_video_convert_transform_caps:<videoconvert0> transformed video/x-raw, format=(string)GRAY8, framerate=(fraction)8/1, width=(int)640, height=(int)480 into video/x-raw, framerate=(fraction)8/1, width=(int)640, height=(int)480
0:01:13.399507923 32822 0x7fd578002800 DEBUG           videoconvert gstvideoconvert.c:342:gst_video_convert_fixate_caps:<videoconvert0> trying to fixate othercaps video/x-raw, framerate=(fraction)8/1, width=(int)640, height=(int)480, format=(string)BGRx, pixel-aspect-ratio=(fraction)5/3 based on caps video/x-raw, format=(string)GRAY8, framerate=(fraction)8/1, width=(int)640, height=(int)480
0:01:13.399515137 32822 0x7fd578002800 DEBUG           videoconvert gstvideoconvert.c:353:gst_video_convert_fixate_caps:<videoconvert0> now fixating video/x-raw, framerate=(fraction)8/1, width=(int)640, height=(int)480, format=(string)BGRx, pixel-aspect-ratio=(fraction)5/3
0:01:13.399519528 32822 0x7fd578002800 DEBUG           videoconvert gstvideoconvert.c:290:gst_video_convert_fixate_format:<videoconvert0> source format GRAY8
0:01:13.399524394 32822 0x7fd578002800 DEBUG           videoconvert gstvideoconvert.c:300:gst_video_convert_fixate_format:<videoconvert0> iterate 1 structures
0:01:13.399528710 32822 0x7fd578002800 DEBUG           videoconvert gstvideoconvert.c:264:score_value:<videoconvert0> score GRAY8 -> BGRx = 3
0:01:13.399532151 32822 0x7fd578002800 DEBUG           videoconvert gstvideoconvert.c:269:score_value:<videoconvert0> found new best 3
0:01:13.399550504 32822 0x7fd578002800 ERROR           videoconvert gstvideoconvert.c:490:gst_video_convert_set_info:<videoconvert0> input and output formats do not match
...
0:01:13.399741982 32822 0x7fd578002800 WARN           basetransform gstbasetransform.c:1370:gst_base_transform_setcaps:<videoconvert0> FAILED to configure incaps video/x-raw, format=(string)GRAY8, framerate=(fraction)8/1, width=(int)640, height=(int)480 and outcaps video/x-raw, framerate=(fraction)8/1, width=(int)640, height=(int)480, format=(string)BGRx, pixel-aspect-ratio=(fraction)5/3
0:01:13.399756085 32822 0x7fd578002800 INFO                    task gsttask.c:312:gst_task_func:<queue0:src> Task going to paused
0:01:13.524512587 32822 0x7fd578002360 WARN                 basesrc gstbasesrc.c:3072:gst_base_src_loop:<appsrc_1> error: Internal data stream error.
0:01:13.524526933 32822 0x7fd578002360 WARN                 basesrc gstbasesrc.c:3072:gst_base_src_loop:<appsrc_1> error: streaming stopped, reason not-negotiated (-4)

The question is: How to fix this?

PS : How this could happen, if upstream is limited to format=GRAY8 ???

0:01:13.399507923 32822 0x7fd578002800 DEBUG           videoconvert gstvideoconvert.c:342:gst_video_convert_fixate_caps:<videoconvert0> trying to fixate othercaps video/x-raw, framerate=(fraction)8/1, width=(int)640, height=(int)480, format=(string)BGRx, pixel-aspect-ratio=(fraction)5/3 based on caps video/x-raw, format=(string)GRAY8, framerate=(fraction)8/1, width=(int)640, height=(int)480
0:01:13.399515137 32822 0x7fd578002800 DEBUG           videoconvert gstvideoconvert.c:353:gst_video_convert_fixate_caps:<videoconvert0> now fixating video/x-raw, framerate=(fraction)8/1, width=(int)640, height=(int)480, format=(string)BGRx, pixel-aspect-ratio=(fraction)5/3

I think your problem is not the pixel format=GRAY8 but the pixel-aspect-ratio=5/3 which is not the same up- and downstream of your videoconvert element.

videoconvert cannot handle conversion between different pixel-aspect-ratios. As can be seen here .

Check that you have the right resolution set for your ximagesink . ximagesink docs

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM