diff options
author | Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> | 2011-09-28 14:22:02 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2011-10-03 11:21:15 +0200 |
commit | 934144c352a5edd054e4ebdf5113630ccf963be9 (patch) | |
tree | e91948e901d0844074701fa5b94a1ca35e97c312 | |
parent | 85de20b8a14834059b5a60f33ba4757ed55f1ed6 (diff) |
opus: properly setup caps and init state from caps
https://bugzilla.gnome.org/show_bug.cgi?id=660364
-rw-r--r-- | ext/opus/gstopusdec.c | 47 | ||||
-rw-r--r-- | ext/opus/gstopusenc.c | 37 |
2 files changed, 47 insertions, 37 deletions
diff --git a/ext/opus/gstopusdec.c b/ext/opus/gstopusdec.c index 9cdc14457..ae0b0bc68 100644 --- a/ext/opus/gstopusdec.c +++ b/ext/opus/gstopusdec.c @@ -193,6 +193,8 @@ opus_dec_sink_setcaps (GstPad * pad, GstCaps * caps) GstStructure *s; const GValue *streamheader; + GST_DEBUG_OBJECT (pad, "Setting sink caps to %" GST_PTR_FORMAT, caps); + s = gst_caps_get_structure (caps, 0); if ((streamheader = gst_structure_get_value (s, "streamheader")) && G_VALUE_HOLDS (streamheader, GST_TYPE_ARRAY) && @@ -237,6 +239,47 @@ opus_dec_sink_setcaps (GstPad * pad, GstCaps * caps) } } + if (!gst_structure_get_int (s, "frame-size", &dec->frame_size)) { + GST_WARNING_OBJECT (dec, "Frame size not included in caps"); + } + if (!gst_structure_get_int (s, "channels", &dec->n_channels)) { + GST_WARNING_OBJECT (dec, "Number of channels not included in caps"); + } + if (!gst_structure_get_int (s, "rate", &dec->sample_rate)) { + GST_WARNING_OBJECT (dec, "Sample rate not included in caps"); + } + switch (dec->frame_size) { + case 2: + dec->frame_samples = dec->sample_rate / 400; + break; + case 5: + dec->frame_samples = dec->sample_rate / 200; + break; + case 10: + dec->frame_samples = dec->sample_rate / 100; + break; + case 20: + dec->frame_samples = dec->sample_rate / 50; + break; + case 40: + dec->frame_samples = dec->sample_rate / 25; + break; + case 60: + dec->frame_samples = 3 * dec->sample_rate / 50; + break; + default: + GST_WARNING_OBJECT (dec, "Unsupported frame size: %d", dec->frame_size); + break; + } + + dec->frame_duration = gst_util_uint64_scale_int (dec->frame_samples, + GST_SECOND, dec->sample_rate); + + GST_INFO_OBJECT (dec, + "Got frame size %d, %d channels, %d Hz, giving %d samples per frame, frame duration %" + GST_TIME_FORMAT, dec->frame_size, dec->n_channels, dec->sample_rate, + dec->frame_samples, GST_TIME_ARGS (dec->frame_duration)); + done: gst_object_unref (dec); return ret; @@ -788,6 +831,10 @@ opus_dec_chain (GstPad * pad, GstBuffer * buf) GstOpusDec *dec; dec = GST_OPUS_DEC (gst_pad_get_parent (pad)); + GST_LOG_OBJECT (pad, + "Got buffer ts %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buf))); if (GST_BUFFER_IS_DISCONT (buf)) { dec->discont = TRUE; diff --git a/ext/opus/gstopusenc.c b/ext/opus/gstopusenc.c index 10c1747d6..db0d4d43c 100644 --- a/ext/opus/gstopusenc.c +++ b/ext/opus/gstopusenc.c @@ -879,29 +879,10 @@ gst_opus_enc_chain (GstPad * pad, GstBuffer * buf) if (!enc->setup) goto not_setup; -#if 0 if (!enc->header_sent) { - /* Opus streams begin with two headers; the initial header (with - most of the codec setup parameters) which is mandated by the Ogg - bitstream spec. The second header holds any comment fields. - We merely need to make the headers, then pass them to libopus - one at a time; libopus handles the additional Ogg bitstream - constraints */ - GstBuffer *buf1, *buf2; GstCaps *caps; - guchar data[100]; - - /* create header buffer */ - opus_header_to_packet (&enc->header, data, 100); - buf1 = gst_opus_enc_buffer_from_data (enc, data, 100, 0); - /* create comment buffer */ - buf2 = gst_opus_enc_create_metadata_buffer (enc); - - /* mark and put on caps */ caps = gst_pad_get_caps (enc->srcpad); - caps = gst_opus_enc_set_header_on_caps (caps, buf1, buf2); - gst_caps_set_simple (caps, "rate", G_TYPE_INT, enc->sample_rate, "channels", G_TYPE_INT, enc->n_channels, @@ -913,26 +894,8 @@ gst_opus_enc_chain (GstPad * pad, GstBuffer * buf) enc->sample_rate, enc->n_channels, enc->frame_size); gst_pad_set_caps (enc->srcpad, caps); - gst_buffer_set_caps (buf1, caps); - gst_buffer_set_caps (buf2, caps); - gst_caps_unref (caps); - - /* push out buffers */ - ret = gst_opus_enc_push_buffer (enc, buf1); - - if (ret != GST_FLOW_OK) { - gst_buffer_unref (buf2); - goto done; - } - - ret = gst_opus_enc_push_buffer (enc, buf2); - - if (ret != GST_FLOW_OK) - goto done; - enc->header_sent = TRUE; } -#endif GST_DEBUG_OBJECT (enc, "received buffer of %u bytes", GST_BUFFER_SIZE (buf)); |