summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLin YANG <oxcsnicho@gmail.com>2009-07-11 19:15:12 +0800
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-08-31 09:19:00 +0200
commitb67ed2467683b554e1f32e37262efdbdae59157f (patch)
tree44abae2bd44f25fae68d3a93522b5ec10df1b9a5
parent451275714ca598f3fcb70f23f13b74b160ce875d (diff)
downloadgstreamer-plugins-bad-b67ed2467683b554e1f32e37262efdbdae59157f.tar.gz
mpegtsmux: mpegtsmux_create_streams(): create multi streams
-rw-r--r--gst/mpegtsmux/mpegtsmux.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c
index 1e595c073..ad50a9ba6 100644
--- a/gst/mpegtsmux/mpegtsmux.c
+++ b/gst/mpegtsmux/mpegtsmux.c
@@ -441,7 +441,7 @@ mpegtsmux_create_stream (MpegTsMux * mux, MpegTsPadData * ts_data, GstPad * pad)
gst_structure_get_int (s, "bitrate", &ts_data->stream->audio_bitrate);
tsmux_stream_set_buffer_release_func (ts_data->stream, release_buffer_cb);
- tsmux_program_add_stream (mux->program, ts_data->stream);
+ tsmux_program_add_stream (ts_data->prog, ts_data->stream);
ret = GST_FLOW_OK;
}
@@ -460,9 +460,38 @@ mpegtsmux_create_streams (MpegTsMux * mux)
while (walk) {
GstCollectData *c_data = (GstCollectData *) walk->data;
MpegTsPadData *ts_data = (MpegTsPadData *) walk->data;
+ gchar *name = NULL;
walk = g_slist_next (walk);
+ if (ts_data->prog_id == -1) {
+ name = GST_PAD_NAME (c_data->pad);
+ if (mux->prog_map != NULL && gst_structure_has_field (mux->prog_map,
+ name)) {
+ guint idx =
+ g_value_get_int (gst_structure_get_value (mux->prog_map, name));
+ if (idx < 0 || idx >= MAX_PROG_NUMBER) {
+ GST_DEBUG_OBJECT (mux, "Program number %d associate with pad %s out "
+ "of range (max = %d); DEFAULT_PROGRAM = %d is used instead",
+ idx, name, MAX_PROG_NUMBER, DEFAULT_PROG_ID);
+ idx = DEFAULT_PROG_ID;
+ }
+ ts_data->prog_id = idx;
+ } else {
+ ts_data->prog_id = DEFAULT_PROG_ID;
+ }
+ }
+
+ ts_data->prog = g_array_index (mux->programs, TsMuxProgram *,
+ ts_data->prog_id);
+ if (ts_data->prog == NULL) {
+ ts_data->prog = tsmux_program_new (mux->tsmux);
+ if (ts_data->prog == NULL)
+ goto no_program;
+ g_array_index (mux->programs, TsMuxProgram *, ts_data->prog_id)
+ = ts_data->prog;
+ }
+
if (ts_data->stream == NULL) {
ret = mpegtsmux_create_stream (mux, ts_data, c_data->pad);
if (ret != GST_FLOW_OK)
@@ -471,6 +500,10 @@ mpegtsmux_create_streams (MpegTsMux * mux)
}
return GST_FLOW_OK;
+no_program:
+ GST_ELEMENT_ERROR (mux, STREAM, MUX, ("tsmux_new_program error"),
+ ("Could not create new program"));
+ return GST_FLOW_ERROR;
no_stream:
GST_ELEMENT_ERROR (mux, STREAM, MUX,
("Could not create handler for stream"), (NULL));