mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 16:08:51 +00:00
Handle more stream types
Original commit message from CVS: Handle more stream types
This commit is contained in:
parent
0f8c7683d1
commit
730bcc0db5
2 changed files with 121 additions and 17 deletions
|
@ -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())
|
#define GST_TYPE_MPLEX_MUX_FORMAT (gst_mplex_mux_format_get_type())
|
||||||
static GType
|
static GType
|
||||||
gst_mplex_mux_format_get_type (void)
|
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);
|
(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*
|
static GstPad*
|
||||||
gst_mplex_request_new_pad (GstElement *element,
|
gst_mplex_request_new_pad (GstElement *element,
|
||||||
GstPadTemplate *templ,
|
GstPadTemplate *templ,
|
||||||
|
@ -238,14 +289,35 @@ gst_mplex_request_new_pad (GstElement *element,
|
||||||
stream = g_new0 (GstMPlexStream, 1);
|
stream = g_new0 (GstMPlexStream, 1);
|
||||||
|
|
||||||
if (!strncmp (templ->name_template, "audio", 5)) {
|
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);
|
||||||
|
|
||||||
|
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)) {
|
||||||
|
gchar *name = g_strdup_printf (templ->name_template, mplex->num_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;
|
stream->type = GST_MPLEX_STREAM_AC3;
|
||||||
}
|
}
|
||||||
else if (!strncmp (templ->name_template, "video", 5)) {
|
else if (!strncmp (templ->name_template, "private_stream_2", 16)) {
|
||||||
pad = gst_pad_new ("video_sink", GST_PAD_SINK);
|
pad = gst_pad_new ("private_stream_2", GST_PAD_SINK);
|
||||||
|
|
||||||
stream->type = GST_MPLEX_STREAM_DVD_VIDEO;
|
stream->type = GST_MPLEX_STREAM_UNKOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pad) {
|
if (pad) {
|
||||||
|
@ -257,6 +329,11 @@ gst_mplex_request_new_pad (GstElement *element,
|
||||||
mplex->streams = g_list_prepend (mplex->streams, stream);
|
mplex->streams = g_list_prepend (mplex->streams, stream);
|
||||||
|
|
||||||
gst_element_add_pad (element, pad);
|
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;
|
return pad;
|
||||||
|
@ -275,6 +352,7 @@ gst_mplex_read_callback (BitStream *bitstream, uint8_t *dest, size_t size, void
|
||||||
if (stream->eos)
|
if (stream->eos)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
do {
|
||||||
len = gst_bytestream_peek_bytes (stream->bytestream, &data, size);
|
len = gst_bytestream_peek_bytes (stream->bytestream, &data, size);
|
||||||
if (len < size) {
|
if (len < size) {
|
||||||
guint32 avail= 0;
|
guint32 avail= 0;
|
||||||
|
@ -292,6 +370,8 @@ gst_mplex_read_callback (BitStream *bitstream, uint8_t *dest, size_t size, void
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
while (len == 0);
|
||||||
|
|
||||||
memcpy (dest, data, len);
|
memcpy (dest, data, len);
|
||||||
|
|
||||||
|
@ -337,6 +417,15 @@ gst_mplex_loop (GstElement *element)
|
||||||
stream->bitstream->open (gst_mplex_read_callback, stream);
|
stream->bitstream->open (gst_mplex_read_callback, stream);
|
||||||
|
|
||||||
switch (stream->type) {
|
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:
|
case GST_MPLEX_STREAM_AC3:
|
||||||
{
|
{
|
||||||
AC3Stream *ac3stream;
|
AC3Stream *ac3stream;
|
||||||
|
@ -355,6 +444,15 @@ gst_mplex_loop (GstElement *element)
|
||||||
stream->elem_stream = dvdstream;
|
stream->elem_stream = dvdstream;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case GST_MPLEX_STREAM_VIDEO:
|
||||||
|
{
|
||||||
|
VideoStream *videostream;
|
||||||
|
|
||||||
|
videostream = new VideoStream(*stream->bitstream, *mplex->ostrm);
|
||||||
|
videostream->Init(0);
|
||||||
|
stream->elem_stream = videostream;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
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 (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 (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 (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));
|
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,10 @@ struct _GstMPlex {
|
||||||
PS_Stream *ps_stream;
|
PS_Stream *ps_stream;
|
||||||
gint data_rate;
|
gint data_rate;
|
||||||
gint sync_offset;
|
gint sync_offset;
|
||||||
|
|
||||||
|
gint num_video;
|
||||||
|
gint num_audio;
|
||||||
|
gint num_private1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstMPlexClass {
|
struct _GstMPlexClass {
|
||||||
|
|
Loading…
Reference in a new issue