summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2009-09-23 13:17:54 -0700
committerDavid Schleef <ds@schleef.org>2009-10-02 21:58:26 -0700
commit05a1e071b9d1ad06536814e546d7256169654adf (patch)
treef8031c43bf3fca4c0e3ddf25b61e8620b4be4653 /ext
parent2390d3a31cb028347eb86477076d37879616730c (diff)
celtdec: Handle lookahead, discont
Diffstat (limited to 'ext')
-rw-r--r--ext/celt/gstceltdec.c21
-rw-r--r--ext/celt/gstceltdec.h1
2 files changed, 22 insertions, 0 deletions
diff --git a/ext/celt/gstceltdec.c b/ext/celt/gstceltdec.c
index 2f3d7807d..4837237f2 100644
--- a/ext/celt/gstceltdec.c
+++ b/ext/celt/gstceltdec.c
@@ -609,6 +609,7 @@ celt_dec_chain_parse_data (GstCeltDec * dec, GstBuffer * buf,
GstBuffer *outbuf;
gint16 *out_data;
gint error = CELT_OK;
+ int skip = 0;
if (timestamp != -1) {
dec->segment.last_stop = timestamp;
@@ -636,6 +637,10 @@ celt_dec_chain_parse_data (GstCeltDec * dec, GstBuffer * buf,
size = 0;
}
+ if (dec->discont) {
+ celt_mode_info (dec->mode, CELT_GET_LOOKAHEAD, &skip);
+ }
+
res = gst_pad_alloc_buffer_and_set_caps (dec->srcpad,
GST_BUFFER_OFFSET_NONE, dec->frame_size * dec->header.nb_channels * 2,
GST_PAD_CAPS (dec->srcpad), &outbuf);
@@ -655,6 +660,14 @@ celt_dec_chain_parse_data (GstCeltDec * dec, GstBuffer * buf,
return GST_FLOW_ERROR;
}
+ if (skip > 0) {
+ GST_ERROR ("skipping %d samples", skip);
+ GST_BUFFER_DATA (outbuf) = GST_BUFFER_DATA (outbuf) +
+ skip * dec->header.nb_channels * 2;
+ GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (outbuf) -
+ skip * dec->header.nb_channels * 2;
+ }
+
if (dec->granulepos == -1) {
if (dec->segment.format != GST_FORMAT_TIME) {
GST_WARNING_OBJECT (dec, "segment not initialized or not TIME format");
@@ -672,6 +685,10 @@ celt_dec_chain_parse_data (GstCeltDec * dec, GstBuffer * buf,
gst_util_uint64_scale_int (dec->granulepos - dec->frame_size, GST_SECOND,
dec->header.sample_rate);
GST_BUFFER_DURATION (outbuf) = dec->frame_duration;
+ if (dec->discont) {
+ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
+ dec->discont = 0;
+ }
dec->granulepos += dec->frame_size;
dec->segment.last_stop += dec->frame_duration;
@@ -696,6 +713,10 @@ celt_dec_chain (GstPad * pad, GstBuffer * buf)
dec = GST_CELT_DEC (gst_pad_get_parent (pad));
+ if (GST_BUFFER_IS_DISCONT (buf)) {
+ dec->discont = TRUE;
+ }
+
if (dec->packetno == 0)
res = celt_dec_chain_parse_header (dec, buf);
else if (dec->packetno == 1)
diff --git a/ext/celt/gstceltdec.h b/ext/celt/gstceltdec.h
index 77851338a..8d86290a6 100644
--- a/ext/celt/gstceltdec.h
+++ b/ext/celt/gstceltdec.h
@@ -58,6 +58,7 @@ struct _GstCeltDec {
GstSegment segment; /* STREAM LOCK */
gint64 granulepos; /* -1 = needs to be set from current time */
+ gboolean discont;
};
struct _GstCeltDecClass {