diff --git a/tests/examples/mpegts/meson.build b/tests/examples/mpegts/meson.build index bfe2deb77c..baea3ef622 100644 --- a/tests/examples/mpegts/meson.build +++ b/tests/examples/mpegts/meson.build @@ -1,4 +1,4 @@ -foreach fname : ['ts-parser.c', 'ts-section-writer.c', 'ts-scte-writer.c'] +foreach fname : ['ts-parser.c', 'ts-section-writer.c', 'ts-scte-writer.c', 'tsmux-prog-map.c'] exe_name = fname.split('.').get(0).underscorify() executable(exe_name, diff --git a/tests/examples/mpegts/tsmux-prog-map.c b/tests/examples/mpegts/tsmux-prog-map.c new file mode 100644 index 0000000000..bd5cc6e48b --- /dev/null +++ b/tests/examples/mpegts/tsmux-prog-map.c @@ -0,0 +1,99 @@ +/* GStreamer + * + * tsmux-prog-map.c: sample application to show how to construct the + * mpegtsmux prog-map property. + * + * MIT License + * + * Copyright (C) 2021 Jan Schmidt + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE.* + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +/* Test pipeline with h264video on PID 101 and AAC audio on PID 102 + * The streams will be assigned to Program #2, with PMT on PID 100, and + * the PCR on the video stream */ +#define TEST_PIPELINE "videotestsrc num-buffers=90 ! video/x-raw,framerate=30/1 ! x264enc ! queue ! .sink_101 mpegtsmux name=mux ! fakesink audiotestsrc samplesperbuffer=4800 num-buffers=30 ! audio/x-raw,rate=48000 ! fdkaacenc ! aacparse ! mux.sink_102" + +static void +_on_bus_message (GstBus * bus, GstMessage * message, GMainLoop * mainloop) +{ + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR: + case GST_MESSAGE_EOS: + g_main_loop_quit (mainloop); + break; + default: + break; + } +} + +int +main (int argc, char **argv) +{ + GstElement *pipeline = NULL; + GError *error = NULL; + GstBus *bus; + GMainLoop *mainloop; + GstElement *muxer; + GstStructure *prog_map; + + gst_init (&argc, &argv); + + pipeline = gst_parse_launch (TEST_PIPELINE, &error); + if (error) { + g_print ("Error constructing pipeline: %s\n", error->message); + g_clear_error (&error); + return 1; + } + + mainloop = g_main_loop_new (NULL, FALSE); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect (bus, "message", (GCallback) _on_bus_message, mainloop); + + /* Configure the program map here. The elementary streams get their PIDs from the pad name. + * Assign them to program # 2, with PMT on PID 100 */ + + muxer = gst_bin_get_by_name (GST_BIN (pipeline), "mux"); + + prog_map = gst_structure_new ("x-prog-map", + "sink_101", G_TYPE_INT, 2, "sink_102", G_TYPE_INT, 2, + "PMT_2", G_TYPE_UINT, 100, "PCR_2", G_TYPE_STRING, "sink_101", NULL); + g_object_set (muxer, "prog-map", prog_map, NULL); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + g_main_loop_run (mainloop); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_object_unref (pipeline); + gst_object_unref (bus); + + return 0; +}