diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/mplex/gstmplex.cc | 134 | ||||
-rw-r--r-- | ext/mplex/gstmplex.h | 4 |
2 files changed, 121 insertions, 17 deletions
diff --git a/ext/mplex/gstmplex.cc b/ext/mplex/gstmplex.cc index 635fe1ce..60021d22 100644 --- a/ext/mplex/gstmplex.cc +++ b/ext/mplex/gstmplex.cc @@ -91,6 +91,28 @@ GST_PAD_TEMPLATE_FACTORY (audio_sink_factory, ) ) +GST_PAD_TEMPLATE_FACTORY (private_1_sink_factory, + "private_stream_1_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_CAPS_NEW ( + "sink_private1", + "audio/ac3", + NULL + ) +) + +GST_PAD_TEMPLATE_FACTORY (private_2_sink_factory, + "private_stream_2", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_CAPS_NEW ( + "sink_private2", + "unkown/unkown", + NULL + ) +) + #define GST_TYPE_MPLEX_MUX_FORMAT (gst_mplex_mux_format_get_type()) static GType gst_mplex_mux_format_get_type (void) @@ -224,6 +246,35 @@ gst_mplex_init (GstMPlex *mplex) (void)mjpeg_default_handler_verbosity(mplex->ostrm->opt_verbosity); } +static GstPadConnectReturn +gst_mplex_video_connect (GstPad *pad, GstCaps *caps) +{ + GstMPlex *mplex; + gint version; + GstMPlexStream *stream; + + mplex = GST_MPLEX (gst_pad_get_parent (pad)); + + if (!GST_CAPS_IS_FIXED (caps)) + return GST_PAD_CONNECT_DELAYED; + + stream = (GstMPlexStream *) gst_pad_get_element_private (pad); + + if (!gst_caps_get_int (caps, "mpegversion", &version)){ + return GST_PAD_CONNECT_REFUSED; + } + + if (version == 2) { + stream->type = GST_MPLEX_STREAM_DVD_VIDEO; + } + else { + stream->type = GST_MPLEX_STREAM_VIDEO; + } + + return GST_PAD_CONNECT_OK; +} + + static GstPad* gst_mplex_request_new_pad (GstElement *element, GstPadTemplate *templ, @@ -238,14 +289,35 @@ gst_mplex_request_new_pad (GstElement *element, stream = g_new0 (GstMPlexStream, 1); if (!strncmp (templ->name_template, "audio", 5)) { - pad = gst_pad_new ("audio_sink", GST_PAD_SINK); + gchar *name = g_strdup_printf (templ->name_template, mplex->num_audio); - stream->type = GST_MPLEX_STREAM_AC3; + pad = gst_pad_new (name, GST_PAD_SINK); + g_free (name); + + stream->type = GST_MPLEX_STREAM_MPA; } else if (!strncmp (templ->name_template, "video", 5)) { - pad = gst_pad_new ("video_sink", GST_PAD_SINK); + gchar *name = g_strdup_printf (templ->name_template, mplex->num_video); - stream->type = GST_MPLEX_STREAM_DVD_VIDEO; + pad = gst_pad_new (name, GST_PAD_SINK); + /* we still need to figure out the mpeg version */ + gst_pad_set_connect_function (pad, gst_mplex_video_connect); + g_free (name); + + stream->type = GST_MPLEX_STREAM_UNKOWN; + } + else if (!strncmp (templ->name_template, "private_stream_1", 16)) { + gchar *name = g_strdup_printf (templ->name_template, mplex->num_private1); + + pad = gst_pad_new (name, GST_PAD_SINK); + g_free (name); + + stream->type = GST_MPLEX_STREAM_AC3; + } + else if (!strncmp (templ->name_template, "private_stream_2", 16)) { + pad = gst_pad_new ("private_stream_2", GST_PAD_SINK); + + stream->type = GST_MPLEX_STREAM_UNKOWN; } if (pad) { @@ -257,6 +329,11 @@ gst_mplex_request_new_pad (GstElement *element, mplex->streams = g_list_prepend (mplex->streams, stream); gst_element_add_pad (element, pad); + gst_pad_set_element_private (pad, stream); + } + else { + /* no pad, free our stream again */ + g_free (stream); } return pad; @@ -275,23 +352,26 @@ gst_mplex_read_callback (BitStream *bitstream, uint8_t *dest, size_t size, void if (stream->eos) return 0; - len = gst_bytestream_peek_bytes (stream->bytestream, &data, size); - if (len < size) { - guint32 avail= 0; - GstEvent *event = NULL; + do { + len = gst_bytestream_peek_bytes (stream->bytestream, &data, size); + if (len < size) { + guint32 avail= 0; + GstEvent *event = NULL; - gst_bytestream_get_status (stream->bytestream, &avail, &event); - if (event != NULL) { - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - stream->eos = TRUE; - break; - default: - break; + gst_bytestream_get_status (stream->bytestream, &avail, &event); + if (event != NULL) { + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + stream->eos = TRUE; + break; + default: + break; + } + gst_event_unref (event); } - gst_event_unref (event); } } + while (len == 0); memcpy (dest, data, len); @@ -337,6 +417,15 @@ gst_mplex_loop (GstElement *element) stream->bitstream->open (gst_mplex_read_callback, stream); switch (stream->type) { + case GST_MPLEX_STREAM_MPA: + { + MPAStream *mpastream; + + mpastream = new MPAStream(*stream->bitstream, *mplex->ostrm); + mpastream->Init(0); + stream->elem_stream = mpastream; + break; + } case GST_MPLEX_STREAM_AC3: { AC3Stream *ac3stream; @@ -355,6 +444,15 @@ gst_mplex_loop (GstElement *element) stream->elem_stream = dvdstream; break; } + case GST_MPLEX_STREAM_VIDEO: + { + VideoStream *videostream; + + videostream = new VideoStream(*stream->bitstream, *mplex->ostrm); + videostream->Init(0); + stream->elem_stream = videostream; + break; + } default: break; } @@ -492,6 +590,8 @@ plugin_init (GModule *module, GstPlugin *plugin) gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (src_factory)); gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (audio_sink_factory)); gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (video_sink_factory)); + gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (private_1_sink_factory)); + gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (private_2_sink_factory)); gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory)); diff --git a/ext/mplex/gstmplex.h b/ext/mplex/gstmplex.h index 381b0af1..98b19aca 100644 --- a/ext/mplex/gstmplex.h +++ b/ext/mplex/gstmplex.h @@ -87,6 +87,10 @@ struct _GstMPlex { PS_Stream *ps_stream; gint data_rate; gint sync_offset; + + gint num_video; + gint num_audio; + gint num_private1; }; struct _GstMPlexClass { |