summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2009-11-05 14:31:40 +0100
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2009-12-08 16:05:26 +0100
commit64d6d5554e0d4e8ec0c3a74c9f69ca3f036cfb3c (patch)
treebb9949f0e8b0513c066b6266beda0f532317284d
parentd4c89e249205ef1d5f8f5966828c4560f8984bbe (diff)
aacparse: use (default) time handling of baseparser class
-rw-r--r--gst/aacparse/gstaacparse.c195
-rw-r--r--gst/aacparse/gstaacparse.h8
2 files changed, 11 insertions, 192 deletions
diff --git a/gst/aacparse/gstaacparse.c b/gst/aacparse/gstaacparse.c
index 1b4fca55f..bab626320 100644
--- a/gst/aacparse/gstaacparse.c
+++ b/gst/aacparse/gstaacparse.c
@@ -156,8 +156,6 @@ gst_aacparse_class_init (GstAacParseClass * klass)
parse_class->start = GST_DEBUG_FUNCPTR (gst_aacparse_start);
parse_class->stop = GST_DEBUG_FUNCPTR (gst_aacparse_stop);
- parse_class->event = GST_DEBUG_FUNCPTR (gst_aacparse_event);
- parse_class->convert = GST_DEBUG_FUNCPTR (gst_aacparse_convert);
parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_aacparse_sink_setcaps);
parse_class->is_seekable = GST_DEBUG_FUNCPTR (gst_aacparse_is_seekable);
parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_aacparse_parse_frame);
@@ -177,7 +175,6 @@ gst_aacparse_init (GstAacParse * aacparse, GstAacParseClass * klass)
{
/* init rest */
gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), 1024);
- aacparse->ts = 0;
GST_DEBUG ("initialized");
}
@@ -295,41 +292,6 @@ gst_aacparse_sink_setcaps (GstBaseParse * parse, GstCaps * caps)
/**
- * gst_aacparse_update_duration:
- * @aacparse: #GstAacParse.
- *
- */
-static void
-gst_aacparse_update_duration (GstAacParse * aacparse)
-{
- GstPad *peer;
- GstBaseParse *parse;
-
- parse = GST_BASE_PARSE (aacparse);
-
- /* Cannot estimate duration. No data has been passed to us yet */
- if (!aacparse->framecount || !aacparse->frames_per_sec) {
- return;
- }
-
- peer = gst_pad_get_peer (parse->sinkpad);
- if (peer) {
- GstFormat pformat = GST_FORMAT_BYTES;
- guint64 bpf = aacparse->bytecount / aacparse->framecount;
- gboolean qres = FALSE;
- gint64 ptot;
-
- qres = gst_pad_query_duration (peer, &pformat, &ptot);
- gst_object_unref (GST_OBJECT (peer));
- if (qres && bpf) {
- gst_base_parse_set_duration (parse, GST_FORMAT_TIME,
- AAC_FRAME_DURATION (aacparse) * ptot / bpf);
- }
- }
-}
-
-
-/**
* gst_aacparse_adts_get_frame_len:
* @data: block of data containing an ADTS header.
*
@@ -384,7 +346,7 @@ gst_aacparse_check_adts_frame (GstAacParse * aacparse,
*framesize = gst_aacparse_adts_get_frame_len (data);
/* In EOS mode this is enough. No need to examine the data further */
- if (aacparse->eos) {
+ if (gst_base_parse_get_drain (GST_BASE_PARSE (aacparse))) {
return TRUE;
}
@@ -408,7 +370,6 @@ gst_aacparse_check_adts_frame (GstAacParse * aacparse,
return TRUE;
}
}
- aacparse->sync = FALSE;
return FALSE;
}
@@ -484,13 +445,13 @@ gst_aacparse_detect_stream (GstAacParse * aacparse,
aacparse->channels = ((data[2] & 0x01) << 2) | ((data[3] & 0xc0) >> 6);
aacparse->bitrate = ((data[5] & 0x1f) << 6) | ((data[6] & 0xfc) >> 2);
- aacparse->frames_per_sec = aacparse->sample_rate / 1024.f;
+ gst_base_parse_set_frame_props (GST_BASE_PARSE (aacparse),
+ aacparse->sample_rate, 1024, 50);
- GST_DEBUG ("ADTS: samplerate %d, channels %d, bitrate %d, objtype %d, "
- "fps %f", aacparse->sample_rate, aacparse->channels,
- aacparse->bitrate, aacparse->object_type, aacparse->frames_per_sec);
+ GST_DEBUG ("ADTS: samplerate %d, channels %d, bitrate %d, objtype %d",
+ aacparse->sample_rate, aacparse->channels, aacparse->bitrate,
+ aacparse->object_type);
- aacparse->sync = TRUE;
return TRUE;
} else if (need_data) {
/* This tells the parent class not to skip any data */
@@ -556,8 +517,8 @@ gst_aacparse_detect_stream (GstAacParse * aacparse,
be based on this */
aacparse->sample_rate = gst_aacparse_get_sample_rate_from_index (sr_idx);
- aacparse->frames_per_sec = aacparse->sample_rate / 1024.f;
- GST_INFO ("ADIF fps: %f", aacparse->frames_per_sec);
+ /* baseparse is not given any fps,
+ * so it will give up on timestamps, seeking, etc */
/* FIXME: Can we assume this? */
aacparse->channels = 2;
@@ -568,7 +529,6 @@ gst_aacparse_detect_stream (GstAacParse * aacparse,
gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), 512);
*framesize = avail;
- aacparse->sync = TRUE;
return TRUE;
}
@@ -596,14 +556,12 @@ gst_aacparse_check_valid_frame (GstBaseParse * parse,
const guint8 *data;
GstAacParse *aacparse;
gboolean ret = FALSE;
+ gboolean sync;
aacparse = GST_AACPARSE (parse);
data = GST_BUFFER_DATA (buffer);
- if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) {
- /* Discontinuous stream -> drop the sync */
- aacparse->sync = FALSE;
- }
+ sync = gst_base_parse_get_sync (parse);
if (aacparse->header_type == DSPAAC_HEADER_ADIF ||
aacparse->header_type == DSPAAC_HEADER_NONE) {
@@ -611,8 +569,7 @@ gst_aacparse_check_valid_frame (GstBaseParse * parse,
*framesize = GST_BUFFER_SIZE (buffer);
ret = TRUE;
- } else if (aacparse->header_type == DSPAAC_HEADER_NOT_PARSED ||
- aacparse->sync == FALSE) {
+ } else if (aacparse->header_type == DSPAAC_HEADER_NOT_PARSED || sync == FALSE) {
ret = gst_aacparse_detect_stream (aacparse, data, GST_BUFFER_SIZE (buffer),
framesize, skipsize);
@@ -656,32 +613,6 @@ gst_aacparse_parse_frame (GstBaseParse * parse, GstBuffer * buffer)
aacparse = GST_AACPARSE (parse);
- if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) {
- gint64 btime;
- gboolean r = gst_aacparse_convert (parse, GST_FORMAT_BYTES,
- GST_BUFFER_OFFSET (buffer),
- GST_FORMAT_TIME, &btime);
- if (r) {
- /* FIXME: What to do if the conversion fails? */
- aacparse->ts = btime;
- }
- }
-
- /* ADIF: only send an initial 0 timestamp downstream,
- * then admit we have no idea and let downstream (decoder) handle it */
- if (aacparse->header_type != DSPAAC_HEADER_ADIF || !aacparse->ts) {
- GST_BUFFER_DURATION (buffer) = AAC_FRAME_DURATION (aacparse);
- GST_BUFFER_TIMESTAMP (buffer) = aacparse->ts;
- }
-
- if (GST_CLOCK_TIME_IS_VALID (aacparse->ts))
- aacparse->ts += GST_BUFFER_DURATION (buffer);
-
- if (!(++aacparse->framecount % 50)) {
- gst_aacparse_update_duration (aacparse);
- }
- aacparse->bytecount += GST_BUFFER_SIZE (buffer);
-
if (!aacparse->src_caps_set) {
if (!gst_aacparse_set_src_caps (aacparse,
GST_PAD_CAPS (GST_BASE_PARSE (aacparse)->sinkpad))) {
@@ -712,11 +643,6 @@ gst_aacparse_start (GstBaseParse * parse)
aacparse = GST_AACPARSE (parse);
GST_DEBUG ("start");
aacparse->src_caps_set = FALSE;
- aacparse->framecount = 0;
- aacparse->bytecount = 0;
- aacparse->ts = 0;
- aacparse->sync = FALSE;
- aacparse->eos = FALSE;
gst_base_parse_set_passthrough (parse, FALSE);
return TRUE;
}
@@ -737,110 +663,11 @@ gst_aacparse_stop (GstBaseParse * parse)
aacparse = GST_AACPARSE (parse);
GST_DEBUG ("stop");
- aacparse->ts = -1;
return TRUE;
}
/**
- * gst_aacparse_event:
- * @parse: #GstBaseParse.
- * @event: #GstEvent.
- *
- * Implementation of "event" vmethod in #GstBaseParse class.
- *
- * Returns: TRUE if the event was handled and can be dropped.
- */
-gboolean
-gst_aacparse_event (GstBaseParse * parse, GstEvent * event)
-{
- GstAacParse *aacparse;
-
- aacparse = GST_AACPARSE (parse);
- GST_DEBUG ("event");
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_EOS:
- aacparse->eos = TRUE;
- GST_DEBUG ("EOS event");
- break;
- default:
- break;
- }
-
- return parent_class->event (parse, event);
-}
-
-
-/**
- * gst_aacparse_convert:
- * @parse: #GstBaseParse.
- * @src_format: #GstFormat describing the source format.
- * @src_value: Source value to be converted.
- * @dest_format: #GstFormat defining the converted format.
- * @dest_value: Pointer where the conversion result will be put.
- *
- * Implementation of "convert" vmethod in #GstBaseParse class.
- *
- * Returns: TRUE if conversion was successful.
- */
-gboolean
-gst_aacparse_convert (GstBaseParse * parse,
- GstFormat src_format,
- gint64 src_value, GstFormat dest_format, gint64 * dest_value)
-{
- gboolean ret = FALSE;
- GstAacParse *aacparse;
- gfloat bpf;
-
- aacparse = GST_AACPARSE (parse);
-
- /* We are not able to do any estimations until some data has been passed */
- if (!aacparse->framecount)
- return FALSE;
-
- bpf = (gfloat) aacparse->bytecount / aacparse->framecount;
-
- if (src_format == GST_FORMAT_BYTES) {
- if (dest_format == GST_FORMAT_TIME) {
- /* BYTES -> TIME conversion */
- GST_DEBUG ("converting bytes -> time");
-
- if (aacparse->framecount && aacparse->frames_per_sec) {
- *dest_value = AAC_FRAME_DURATION (aacparse) * src_value / bpf;
- GST_DEBUG ("conversion result: %" G_GINT64_FORMAT " ms",
- *dest_value / GST_MSECOND);
- ret = TRUE;
- }
- } else if (dest_format == GST_FORMAT_BYTES) {
- /* Parent class may ask us to convert from BYTES to BYTES */
- *dest_value = src_value;
- ret = TRUE;
- }
- } else if (src_format == GST_FORMAT_TIME) {
- GST_DEBUG ("converting time -> bytes");
- if (dest_format == GST_FORMAT_BYTES) {
- if (aacparse->framecount && aacparse->frames_per_sec) {
- *dest_value = bpf * src_value / AAC_FRAME_DURATION (aacparse);
- GST_DEBUG ("time %" G_GINT64_FORMAT " ms in bytes = %" G_GINT64_FORMAT,
- src_value / GST_MSECOND, *dest_value);
- ret = TRUE;
- }
- }
- } else if (src_format == GST_FORMAT_DEFAULT) {
- /* DEFAULT == frame-based */
- if (dest_format == GST_FORMAT_TIME && aacparse->frames_per_sec) {
- *dest_value = src_value * AAC_FRAME_DURATION (aacparse);
- ret = TRUE;
- } else if (dest_format == GST_FORMAT_BYTES) {
- }
- }
-
- return ret;
-}
-
-
-/**
* gst_aacparse_is_seekable:
* @parse: #GstBaseParse.
*
diff --git a/gst/aacparse/gstaacparse.h b/gst/aacparse/gstaacparse.h
index bbdbebcf9..70fe2ae36 100644
--- a/gst/aacparse/gstaacparse.h
+++ b/gst/aacparse/gstaacparse.h
@@ -88,18 +88,10 @@ struct _GstAacParse {
gint sample_rate;
gint channels;
gint mpegversion;
- gfloat frames_per_sec;
GstAacHeaderType header_type;
- guint64 framecount;
- guint64 bytecount;
gboolean src_caps_set;
- gboolean sync;
- gboolean eos;
-
- GstClockTime duration;
- GstClockTime ts;
};
/**