mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-30 13:41:48 +00:00
gst/: Add MS RLE support. I added some functions to read out strf chunks into strf chunks and the data behind it. Thi...
Original commit message from CVS: reviewed by: <delete if not using a buddy> * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data), (gst_riff_create_video_caps), (gst_riff_create_audio_caps), (gst_riff_create_video_template_caps), (gst_riff_create_audio_template_caps): * gst-libs/gst/riff/riff-media.h: * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_vids): * gst-libs/gst/riff/riff-read.h: * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): Add MS RLE support. I added some functions to read out strf chunks into strf chunks and the data behind it. This is usually color palettes (as in RLE, but also in 8-bit RGB). Also use those during caps creation. Lastly, add ADPCM (similar to wavparse - which should eventually be rifflib based). * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), (gst_matroska_demux_init), (gst_matroska_demux_reset): * gst/matroska/matroska-demux.h: Remove placeholders for some prehistoric tagging system. Didn't add support for any tag system really anyway. * gst/qtdemux/qtdemux.c: Add support for audio/x-m4a (MPEG-4) through spider. * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), (gst_wavparse_loop): ADPCM support (#135862). Increase max. buffer size because we cannot split buffers for ADPCM (screws references) and I've seen files with 2048 byte chunks. 4096 seems safe for now.
This commit is contained in:
parent
9369abcfa0
commit
26fe995a13
6 changed files with 64 additions and 51 deletions
32
ChangeLog
32
ChangeLog
|
@ -1,3 +1,35 @@
|
||||||
|
2004-04-15 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
||||||
|
|
||||||
|
reviewed by: <delete if not using a buddy>
|
||||||
|
|
||||||
|
* gst-libs/gst/riff/riff-media.c:
|
||||||
|
(gst_riff_create_video_caps_with_data),
|
||||||
|
(gst_riff_create_video_caps), (gst_riff_create_audio_caps),
|
||||||
|
(gst_riff_create_video_template_caps),
|
||||||
|
(gst_riff_create_audio_template_caps):
|
||||||
|
* gst-libs/gst/riff/riff-media.h:
|
||||||
|
* gst-libs/gst/riff/riff-read.c:
|
||||||
|
(gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_vids):
|
||||||
|
* gst-libs/gst/riff/riff-read.h:
|
||||||
|
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
|
||||||
|
Add MS RLE support. I added some functions to read out strf chunks
|
||||||
|
into strf chunks and the data behind it. This is usually color
|
||||||
|
palettes (as in RLE, but also in 8-bit RGB). Also use those during
|
||||||
|
caps creation. Lastly, add ADPCM (similar to wavparse - which
|
||||||
|
should eventually be rifflib based).
|
||||||
|
* gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init),
|
||||||
|
(gst_matroska_demux_init), (gst_matroska_demux_reset):
|
||||||
|
* gst/matroska/matroska-demux.h:
|
||||||
|
Remove placeholders for some prehistoric tagging system. Didn't add
|
||||||
|
support for any tag system really anyway.
|
||||||
|
* gst/qtdemux/qtdemux.c:
|
||||||
|
Add support for audio/x-m4a (MPEG-4) through spider.
|
||||||
|
* gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt),
|
||||||
|
(gst_wavparse_loop):
|
||||||
|
ADPCM support (#135862). Increase max. buffer size because we
|
||||||
|
cannot split buffers for ADPCM (screws references) and I've seen
|
||||||
|
files with 2048 byte chunks. 4096 seems safe for now.
|
||||||
|
|
||||||
2004-04-15 Thomas Vander Stichele <thomas at apestaart dot org>
|
2004-04-15 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
* configure.ac: bump nano to 1
|
* configure.ac: bump nano to 1
|
||||||
|
|
|
@ -742,6 +742,7 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
|
||||||
GstRiffRead *riff = GST_RIFF_READ (avi);
|
GstRiffRead *riff = GST_RIFF_READ (avi);
|
||||||
guint32 tag;
|
guint32 tag;
|
||||||
gst_riff_strh *strh;
|
gst_riff_strh *strh;
|
||||||
|
GstBuffer *extradata = NULL, *initdata = NULL;
|
||||||
gchar *name = NULL, *padname = NULL;
|
gchar *name = NULL, *padname = NULL;
|
||||||
GstCaps *caps = NULL;
|
GstCaps *caps = NULL;
|
||||||
GstPadTemplate *templ = NULL;
|
GstPadTemplate *templ = NULL;
|
||||||
|
@ -775,7 +776,7 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
|
||||||
}
|
}
|
||||||
switch (strh->type) {
|
switch (strh->type) {
|
||||||
case GST_RIFF_FCC_vids:
|
case GST_RIFF_FCC_vids:
|
||||||
if (!gst_riff_read_strf_vids (riff, &strf.vids))
|
if (!gst_riff_read_strf_vids_with_data (riff, &strf.vids, &extradata))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
break;
|
break;
|
||||||
case GST_RIFF_FCC_auds:
|
case GST_RIFF_FCC_auds:
|
||||||
|
@ -802,6 +803,13 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
|
case GST_RIFF_TAG_strd:
|
||||||
|
if (initdata)
|
||||||
|
gst_buffer_unref (initdata);
|
||||||
|
if (!gst_riff_read_data (riff, &tag, &initdata))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
case GST_RIFF_TAG_strn:
|
case GST_RIFF_TAG_strn:
|
||||||
if (name)
|
if (name)
|
||||||
g_free (name);
|
g_free (name);
|
||||||
|
@ -814,7 +822,6 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
|
||||||
GST_FOURCC_ARGS (tag));
|
GST_FOURCC_ARGS (tag));
|
||||||
/* fall-through */
|
/* fall-through */
|
||||||
|
|
||||||
case GST_RIFF_TAG_strd: /* what is this? */
|
|
||||||
case GST_RIFF_TAG_JUNK:
|
case GST_RIFF_TAG_JUNK:
|
||||||
if (!gst_riff_read_skip (riff))
|
if (!gst_riff_read_skip (riff))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -836,8 +843,8 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
|
||||||
|
|
||||||
padname = g_strdup_printf ("video_%02d", avi->num_v_streams);
|
padname = g_strdup_printf ("video_%02d", avi->num_v_streams);
|
||||||
templ = gst_element_class_get_pad_template (klass, "video_%02d");
|
templ = gst_element_class_get_pad_template (klass, "video_%02d");
|
||||||
caps = gst_riff_create_video_caps (strf.vids->compression, strh,
|
caps = gst_riff_create_video_caps_with_data (strf.vids->compression,
|
||||||
strf.vids, &codec_name);
|
strh, strf.vids, extradata, initdata, &codec_name);
|
||||||
gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
|
gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
|
||||||
codec_name, NULL);
|
codec_name, NULL);
|
||||||
gst_element_found_tags (GST_ELEMENT (avi), list);
|
gst_element_found_tags (GST_ELEMENT (avi), list);
|
||||||
|
@ -920,6 +927,12 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
|
||||||
/* auto-negotiates */
|
/* auto-negotiates */
|
||||||
gst_element_add_pad (GST_ELEMENT (avi), pad);
|
gst_element_add_pad (GST_ELEMENT (avi), pad);
|
||||||
|
|
||||||
|
/* clean something up */
|
||||||
|
if (initdata)
|
||||||
|
gst_buffer_unref (initdata);
|
||||||
|
if (extradata)
|
||||||
|
gst_buffer_unref (extradata);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
skip_stream:
|
skip_stream:
|
||||||
|
|
|
@ -79,10 +79,6 @@ gst_matroska_demux_change_state (GstElement * element);
|
||||||
static void gst_matroska_demux_set_clock (GstElement * element,
|
static void gst_matroska_demux_set_clock (GstElement * element,
|
||||||
GstClock * clock);
|
GstClock * clock);
|
||||||
|
|
||||||
/* gobject bla bla */
|
|
||||||
static void gst_matroska_demux_get_property (GObject * object,
|
|
||||||
guint prop_id, GValue * value, GParamSpec * pspec);
|
|
||||||
|
|
||||||
/* caps functions */
|
/* caps functions */
|
||||||
static GstCaps *gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext
|
static GstCaps *gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext
|
||||||
* videocontext,
|
* videocontext,
|
||||||
|
@ -154,23 +150,12 @@ gst_matroska_demux_base_init (GstMatroskaDemuxClass * klass)
|
||||||
static void
|
static void
|
||||||
gst_matroska_demux_class_init (GstMatroskaDemuxClass * klass)
|
gst_matroska_demux_class_init (GstMatroskaDemuxClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
|
||||||
GstElementClass *gstelement_class;
|
GstElementClass *gstelement_class;
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
|
||||||
gstelement_class = (GstElementClass *) klass;
|
gstelement_class = (GstElementClass *) klass;
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class, ARG_METADATA,
|
|
||||||
g_param_spec_boxed ("metadata", "Metadata", "Metadata",
|
|
||||||
GST_TYPE_STRUCTURE, G_PARAM_READABLE));
|
|
||||||
g_object_class_install_property (gobject_class, ARG_STREAMINFO,
|
|
||||||
g_param_spec_boxed ("streaminfo", "Streaminfo", "Streaminfo",
|
|
||||||
GST_TYPE_STRUCTURE, G_PARAM_READABLE));
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (GST_TYPE_EBML_READ);
|
parent_class = g_type_class_ref (GST_TYPE_EBML_READ);
|
||||||
|
|
||||||
gobject_class->get_property = gst_matroska_demux_get_property;
|
|
||||||
|
|
||||||
gstelement_class->change_state = gst_matroska_demux_change_state;
|
gstelement_class->change_state = gst_matroska_demux_change_state;
|
||||||
gstelement_class->send_event = gst_matroska_demux_send_event;
|
gstelement_class->send_event = gst_matroska_demux_send_event;
|
||||||
gstelement_class->set_clock = gst_matroska_demux_set_clock;
|
gstelement_class->set_clock = gst_matroska_demux_set_clock;
|
||||||
|
@ -196,7 +181,6 @@ gst_matroska_demux_init (GstMatroskaDemux * demux)
|
||||||
for (i = 0; i < GST_MATROSKA_DEMUX_MAX_STREAMS; i++) {
|
for (i = 0; i < GST_MATROSKA_DEMUX_MAX_STREAMS; i++) {
|
||||||
demux->src[i] = NULL;
|
demux->src[i] = NULL;
|
||||||
}
|
}
|
||||||
demux->streaminfo = demux->metadata = NULL;
|
|
||||||
demux->writing_app = demux->muxing_app = NULL;
|
demux->writing_app = demux->muxing_app = NULL;
|
||||||
demux->index = NULL;
|
demux->index = NULL;
|
||||||
|
|
||||||
|
@ -234,10 +218,6 @@ gst_matroska_demux_reset (GstElement * element)
|
||||||
demux->num_v_streams = 0;
|
demux->num_v_streams = 0;
|
||||||
|
|
||||||
/* reset media info */
|
/* reset media info */
|
||||||
|
|
||||||
gst_caps_replace (&demux->metadata, NULL);
|
|
||||||
gst_caps_replace (&demux->streaminfo, NULL);
|
|
||||||
|
|
||||||
g_free (demux->writing_app);
|
g_free (demux->writing_app);
|
||||||
demux->writing_app = NULL;
|
demux->writing_app = NULL;
|
||||||
g_free (demux->muxing_app);
|
g_free (demux->muxing_app);
|
||||||
|
@ -2514,28 +2494,6 @@ gst_matroska_demux_change_state (GstElement * element)
|
||||||
return GST_STATE_SUCCESS;
|
return GST_STATE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gst_matroska_demux_get_property (GObject * object,
|
|
||||||
guint prop_id, GValue * value, GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstMatroskaDemux *demux;
|
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_MATROSKA_DEMUX (object));
|
|
||||||
demux = GST_MATROSKA_DEMUX (object);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case ARG_STREAMINFO:
|
|
||||||
g_value_set_boxed (value, demux->streaminfo);
|
|
||||||
break;
|
|
||||||
case ARG_METADATA:
|
|
||||||
g_value_set_boxed (value, demux->metadata);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
gst_matroska_demux_plugin_init (GstPlugin * plugin)
|
gst_matroska_demux_plugin_init (GstPlugin * plugin)
|
||||||
{
|
{
|
||||||
|
|
|
@ -66,8 +66,6 @@ typedef struct _GstMatroskaDemux {
|
||||||
GstClock *clock;
|
GstClock *clock;
|
||||||
|
|
||||||
/* metadata */
|
/* metadata */
|
||||||
GstCaps *metadata;
|
|
||||||
GstCaps *streaminfo;
|
|
||||||
gchar *muxing_app, *writing_app;
|
gchar *muxing_app, *writing_app;
|
||||||
gint64 created;
|
gint64 created;
|
||||||
|
|
||||||
|
|
|
@ -123,10 +123,10 @@ enum
|
||||||
};
|
};
|
||||||
|
|
||||||
static GstStaticPadTemplate gst_qtdemux_sink_template =
|
static GstStaticPadTemplate gst_qtdemux_sink_template =
|
||||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
GST_PAD_SINK,
|
GST_PAD_SINK,
|
||||||
GST_PAD_SOMETIMES,
|
GST_PAD_SOMETIMES,
|
||||||
GST_STATIC_CAPS ("video/quicktime")
|
GST_STATIC_CAPS ("video/quicktime; audio/x-m4a")
|
||||||
);
|
);
|
||||||
|
|
||||||
static GstStaticPadTemplate gst_qtdemux_videosrc_template =
|
static GstStaticPadTemplate gst_qtdemux_videosrc_template =
|
||||||
|
|
|
@ -80,6 +80,10 @@ static GstStaticPadTemplate src_template_factory =
|
||||||
"rate = (int) [ 8000, 48000 ], "
|
"rate = (int) [ 8000, 48000 ], "
|
||||||
"channels = (int) [ 1, 2 ]; "
|
"channels = (int) [ 1, 2 ]; "
|
||||||
"audio/x-mulaw, "
|
"audio/x-mulaw, "
|
||||||
|
"rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ];"
|
||||||
|
"audio/x-adpcm, "
|
||||||
|
"layout = (string) microsoft, "
|
||||||
|
"block_align = (int) [ 1, 8192 ], "
|
||||||
"rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ]")
|
"rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ]")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -621,6 +625,14 @@ gst_wavparse_parse_fmt (GstWavParse * wavparse, guint size)
|
||||||
"channels", G_TYPE_INT, wavparse->channels, NULL);
|
"channels", G_TYPE_INT, wavparse->channels, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GST_RIFF_WAVE_FORMAT_ADPCM:
|
||||||
|
caps = gst_caps_new_simple ("audio/x-adpcm",
|
||||||
|
"layout", G_TYPE_STRING, "microsoft",
|
||||||
|
"block_align", G_TYPE_INT, wavparse->bps,
|
||||||
|
"rate", G_TYPE_INT, wavparse->rate,
|
||||||
|
"channels", G_TYPE_INT, wavparse->channels, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
case GST_RIFF_WAVE_FORMAT_MPEGL12:
|
case GST_RIFF_WAVE_FORMAT_MPEGL12:
|
||||||
case GST_RIFF_WAVE_FORMAT_MPEGL3:{
|
case GST_RIFF_WAVE_FORMAT_MPEGL3:{
|
||||||
int layer = (wavparse->format == GST_RIFF_WAVE_FORMAT_MPEGL12) ? 2 : 3;
|
int layer = (wavparse->format == GST_RIFF_WAVE_FORMAT_MPEGL12) ? 2 : 3;
|
||||||
|
@ -716,7 +728,7 @@ gst_wavparse_loop (GstElement * element)
|
||||||
Does anyone care about streaming wavs?
|
Does anyone care about streaming wavs?
|
||||||
FIXME: Should we have a decent buffer size? */
|
FIXME: Should we have a decent buffer size? */
|
||||||
|
|
||||||
#define MAX_BUFFER_SIZE 1024
|
#define MAX_BUFFER_SIZE 4096
|
||||||
|
|
||||||
if (wavparse->dataleft > 0) {
|
if (wavparse->dataleft > 0) {
|
||||||
desired = MIN (wavparse->dataleft, MAX_BUFFER_SIZE);
|
desired = MIN (wavparse->dataleft, MAX_BUFFER_SIZE);
|
||||||
|
|
Loading…
Reference in a new issue