summaryrefslogtreecommitdiffstats
path: root/gst/qtdemux
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2005-01-28 10:36:12 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2005-01-28 10:36:12 +0000
commitd1fc8e974788e241c7793f102491bed9f24dcd46 (patch)
tree24590256cc46761dc3e5ffaa460b5de7fadc1556 /gst/qtdemux
parent6532344da90f5e16933121931187e8d9c052c8a9 (diff)
Add support for AMR-NB (mobile phone audio format; #155163, #163286).
Original commit message from CVS: * configure.ac: * ext/Makefile.am: * ext/amrnb/Makefile.am: * ext/amrnb/amrnb.c: (plugin_init): * ext/amrnb/amrnbdec.c: (gst_amrnbdec_get_type), (gst_amrnbdec_base_init), (gst_amrnbdec_class_init), (gst_amrnbdec_init), (gst_amrnbdec_link), (gst_amrnbdec_chain), (gst_amrnbdec_state_change): * ext/amrnb/amrnbdec.h: * ext/amrnb/amrnbparse.c: (gst_amrnbparse_get_type), (gst_amrnbparse_base_init), (gst_amrnbparse_class_init), (gst_amrnbparse_init), (gst_amrnbparse_formats), (gst_amrnbparse_querytypes), (gst_amrnbparse_query), (gst_amrnbparse_handle_event), (gst_amrnbparse_reserve), (gst_amrnbparse_loop), (gst_amrnbparse_state_change): * ext/amrnb/amrnbparse.h: Add support for AMR-NB (mobile phone audio format; #155163, #163286). * gst/typefind/gsttypefindfunctions.c: (plugin_init): Add AMR-NB/-WB raw formats. * ext/alsa/gstalsa.c: (gst_alsa_link): Keep valid time when changing format. * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (qtdemux_parse_trak): Add some more format-specific options (#140141, #143555, #155163).
Diffstat (limited to 'gst/qtdemux')
-rw-r--r--gst/qtdemux/qtdemux.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c
index 4e02a4ee..c565e285 100644
--- a/gst/qtdemux/qtdemux.c
+++ b/gst/qtdemux/qtdemux.c
@@ -78,6 +78,7 @@ struct _QtDemuxStream
{
guint32 subtype;
GstCaps *caps;
+ guint32 fourcc;
GstPad *pad;
int n_samples;
QtDemuxSample *samples;
@@ -770,11 +771,14 @@ gst_qtdemux_loop_header (GstElement * element)
*/
}
- GST_BUFFER_TIMESTAMP (buf) =
- stream->samples[stream->sample_index].timestamp;
- qtdemux->last_ts = GST_BUFFER_TIMESTAMP (buf);
- GST_BUFFER_DURATION (buf) =
- stream->samples[stream->sample_index].duration;
+ /* timestamps of AMR aren't known... */
+ if (stream->fourcc != GST_MAKE_FOURCC ('s', 'a', 'm', 'r')) {
+ GST_BUFFER_TIMESTAMP (buf) =
+ stream->samples[stream->sample_index].timestamp;
+ qtdemux->last_ts = GST_BUFFER_TIMESTAMP (buf);
+ GST_BUFFER_DURATION (buf) =
+ stream->samples[stream->sample_index].duration;
+ }
if (qtdemux->need_flush) {
gst_pad_event_default (qtdemux->sinkpad,
gst_event_new (GST_EVENT_FLUSH));
@@ -2022,7 +2026,7 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
GST_LOG ("frame count: %u",
QTDEMUX_GUINT16_GET (stsd->data + offset + 48));
- fourcc = QTDEMUX_FOURCC_GET (stsd->data + offset + 4);
+ stream->fourcc = fourcc = QTDEMUX_FOURCC_GET (stsd->data + offset + 4);
stream->caps = qtdemux_video_caps (qtdemux, fourcc, stsd->data);
esds = NULL;
@@ -2050,9 +2054,9 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
GST_LOG ("st type: " GST_FOURCC_FORMAT,
GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (stsd->data + 16 + 4)));
- fourcc = QTDEMUX_FOURCC_GET (stsd->data + 16 + 4);
-
+ stream->fourcc = fourcc = QTDEMUX_FOURCC_GET (stsd->data + 16 + 4);
offset = 32;
+
GST_LOG ("version/rev: %08x",
QTDEMUX_GUINT32_GET (stsd->data + offset));
version = QTDEMUX_GUINT32_GET (stsd->data + offset);
@@ -2098,6 +2102,17 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
stream->compression = 3;
if (fourcc == GST_MAKE_FOURCC ('i', 'm', 'a', '4'))
stream->compression = 4;
+ if (fourcc == GST_MAKE_FOURCC ('s', 'a', 'm', 'r')) {
+ stream->n_channels = 1;
+ stream->rate = 8000;
+ stream->bytes_per_frame <<= 3;
+ }
+ if (fourcc == GST_MAKE_FOURCC ('u', 'l', 'a', 'w'))
+ stream->compression = 2;
+ if (fourcc == GST_MAKE_FOURCC ('a', 'g', 's', 'm')) {
+ stream->bytes_per_frame *= 33;
+ stream->compression = 320;
+ }
} else {
GST_ERROR ("unknown version %08x", version);
}