diff options
Diffstat (limited to 'app/main.cpp')
-rw-r--r-- | app/main.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/app/main.cpp b/app/main.cpp new file mode 100644 index 0000000..400a066 --- /dev/null +++ b/app/main.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2018 Konsulko Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <string> +#include <iostream> +#include <cstring> +#include <gst/gst.h> +#include "surface.hpp" + +int main(int argc, char *argv[]) +{ + int port = 0; + std::string token; + std::string role = "receiver"; + + try { + port = std::stol(argv[1]); + token = argv[2]; + } catch (const std::invalid_argument& e) { + std::cerr << "Invalid argument" << std::endl; + exit(1); + } catch (const std::out_of_range& e) { + std::cerr << "Port out of range" << std::endl; + exit(1); + } + + // NOTES: + // (1) For reference, the pipeline used is based on the gst-launch-1.0 command in the ad hoc unit + // file in the previous hand-rolled CES demo: + // + // udpsrc port=5005 ! application/x-rtp,media=video,encoding-name=H264 ! queue ! rtph264depay ! h264parse config-interval=1 disable-passthrough=true ! decodebin ! vaapisink + // + // (2) waylandsink is a bit broken, as it needs a RGB format, but its caps include non-RGB formats + // This results in crashes when videoconvert doesn't end up in the pipeline, so care must be taken + // if it is used, e.g. for testing: + // + // videotestsrc pattern=smpte ! video/x-raw,format=BGRx,width=384,height=368 ! waylandsink + // + std::string pipeline_str = \ + "udpsrc port=5005 ! application/x-rtp,media=video,encoding-name=H264 ! queue ! rtph264depay ! h264parse config-interval=1 disable-passthrough=true ! decodebin ! vaapisink"; + + // Initialize GStreamer + gst_init(NULL, NULL); + + // Create our IVI surface handler + SurfaceHandler handler(port, token, role); + + GstElement *pipeline = gst_parse_launch(pipeline_str.c_str(), NULL); + if(!pipeline) { + std::cerr << "gstreamer pipeline construction failed!" << std::endl; + exit(1); + } + + // Start pipeline + gst_element_set_state(pipeline, GST_STATE_PLAYING); + std::cout << "gstreamer pipeline running" << std::endl; + + // Wait until error or EOS + GstBus *bus = gst_element_get_bus(pipeline); + GstMessage *msg = gst_bus_timed_pop_filtered(bus, + GST_CLOCK_TIME_NONE, + (GstMessageType) (GST_MESSAGE_ERROR | GST_MESSAGE_EOS)); + + // Free resources + if(msg != NULL) + gst_message_unref(msg); + gst_object_unref(bus); + gst_element_set_state(pipeline, GST_STATE_NULL); + gst_object_unref(pipeline); + + return 0; +} |