examples: Add an mpegtsmux example of prog-map usage.

Add an example of how to construct the prog-map structure for
the MPEG-TS muxers and assign streams to programs, and set PCR
and PMT PIDs.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2039>
This commit is contained in:
Jan Schmidt 2021-02-26 03:28:29 +11:00 committed by GStreamer Marge Bot
parent 18a095ca63
commit 0d36dcab4e
2 changed files with 100 additions and 1 deletions

View file

@ -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,

View file

@ -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 <jan@centricular.com>
*
* 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 <gst/gst.h>
/* 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;
}