summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2015-10-30 20:47:20 +0200
committerSebastian Dröge <sebastian@centricular.com>2015-11-03 20:35:41 +0200
commit6ffb90e0375de1a31ff2f1bd6dc8a353fce976ff (patch)
treec4dd5a03acd4bc6a4ab14818d8603f2992495df2
parent9c195e37da54b07ee843b42fc02847d8496b9e7c (diff)
downloadgstreamer-plugins-base-6ffb90e0375de1a31ff2f1bd6dc8a353fce976ff.tar.gz
opusenc: Put lookahead/pre-skip into the OpusHead header
https://bugzilla.gnome.org/show_bug.cgi?id=757153
-rw-r--r--ext/opus/gstopusenc.c13
-rw-r--r--ext/opus/gstopusheader.c19
-rw-r--r--ext/opus/gstopusheader.h2
3 files changed, 20 insertions, 14 deletions
diff --git a/ext/opus/gstopusenc.c b/ext/opus/gstopusenc.c
index 7dfd44151..62773278b 100644
--- a/ext/opus/gstopusenc.c
+++ b/ext/opus/gstopusenc.c
@@ -722,6 +722,7 @@ gst_opus_enc_setup (GstOpusEnc * enc)
int error = OPUS_OK;
GstCaps *caps;
gboolean ret;
+ gint32 lookahead;
#ifndef GST_DISABLE_GST_DEBUG
GST_DEBUG_OBJECT (enc,
@@ -759,10 +760,16 @@ gst_opus_enc_setup (GstOpusEnc * enc)
opus_multistream_encoder_ctl (enc->state,
OPUS_SET_PACKET_LOSS_PERC (enc->packet_loss_percentage), 0);
- GST_LOG_OBJECT (enc, "we have frame size %d", enc->frame_size);
+ opus_multistream_encoder_ctl (enc->state, OPUS_GET_LOOKAHEAD (&lookahead), 0);
- gst_opus_header_create_caps (&caps, NULL, enc->n_channels,
- enc->n_stereo_streams, enc->sample_rate, enc->channel_mapping_family,
+ GST_LOG_OBJECT (enc, "we have frame size %d, lookahead %d", enc->frame_size,
+ lookahead);
+
+ /* lookahead is samples, the Opus header wants it in 48kHz samples */
+ lookahead = lookahead * 48000 / enc->sample_rate;
+
+ gst_opus_header_create_caps (&caps, NULL, lookahead, enc->sample_rate,
+ enc->n_channels, enc->n_stereo_streams, enc->channel_mapping_family,
enc->decoding_channel_mapping,
gst_tag_setter_get_tag_list (GST_TAG_SETTER (enc)));
diff --git a/ext/opus/gstopusheader.c b/ext/opus/gstopusheader.c
index 1521c1c07..7c1cebe3c 100644
--- a/ext/opus/gstopusheader.c
+++ b/ext/opus/gstopusheader.c
@@ -27,16 +27,15 @@
#include "gstopusheader.h"
static GstBuffer *
-gst_opus_enc_create_id_buffer (gint nchannels, gint n_stereo_streams,
- gint sample_rate, guint8 channel_mapping_family,
+gst_opus_enc_create_id_buffer (guint16 pre_skip, guint sample_rate,
+ guint8 nchannels, guint8 n_stereo_streams, guint8 channel_mapping_family,
const guint8 * channel_mapping)
{
GstBuffer *buffer;
GstByteWriter bw;
gboolean hdl = TRUE;
- g_return_val_if_fail (nchannels > 0 && nchannels < 256, NULL);
- g_return_val_if_fail (n_stereo_streams >= 0, NULL);
+ g_return_val_if_fail (nchannels > 0, NULL);
g_return_val_if_fail (n_stereo_streams <= nchannels - n_stereo_streams, NULL);
gst_byte_writer_init (&bw);
@@ -45,7 +44,7 @@ gst_opus_enc_create_id_buffer (gint nchannels, gint n_stereo_streams,
hdl &= gst_byte_writer_put_data (&bw, (const guint8 *) "OpusHead", 8);
hdl &= gst_byte_writer_put_uint8 (&bw, 0x01); /* version number */
hdl &= gst_byte_writer_put_uint8 (&bw, nchannels);
- hdl &= gst_byte_writer_put_uint16_le (&bw, 0); /* pre-skip */
+ hdl &= gst_byte_writer_put_uint16_le (&bw, pre_skip);
hdl &= gst_byte_writer_put_uint32_le (&bw, sample_rate);
hdl &= gst_byte_writer_put_uint16_le (&bw, 0); /* output gain */
hdl &= gst_byte_writer_put_uint8 (&bw, channel_mapping_family);
@@ -211,8 +210,9 @@ gst_opus_header_create_caps_from_headers (GstCaps ** caps, GSList ** headers,
}
void
-gst_opus_header_create_caps (GstCaps ** caps, GSList ** headers, gint nchannels,
- gint n_stereo_streams, gint sample_rate, guint8 channel_mapping_family,
+gst_opus_header_create_caps (GstCaps ** caps, GSList ** headers,
+ guint16 pre_skip, guint sample_rate, guint8 nchannels,
+ guint8 n_stereo_streams, guint8 channel_mapping_family,
const guint8 * channel_mapping, const GstTagList * tags)
{
GstBuffer *buf1, *buf2;
@@ -220,7 +220,6 @@ gst_opus_header_create_caps (GstCaps ** caps, GSList ** headers, gint nchannels,
g_return_if_fail (caps);
g_return_if_fail (!headers || !*headers);
g_return_if_fail (nchannels > 0);
- g_return_if_fail (sample_rate >= 0); /* 0 -> unset */
g_return_if_fail (channel_mapping_family == 0 || channel_mapping);
/* Opus streams in Ogg begin with two headers; the initial header (with
@@ -229,8 +228,8 @@ gst_opus_header_create_caps (GstCaps ** caps, GSList ** headers, gint nchannels,
/* create header buffers */
buf1 =
- gst_opus_enc_create_id_buffer (nchannels, n_stereo_streams, sample_rate,
- channel_mapping_family, channel_mapping);
+ gst_opus_enc_create_id_buffer (pre_skip, sample_rate, nchannels,
+ n_stereo_streams, channel_mapping_family, channel_mapping);
buf2 = gst_opus_enc_create_metadata_buffer (tags);
gst_opus_header_create_caps_from_headers (caps, headers, buf1, buf2);
diff --git a/ext/opus/gstopusheader.h b/ext/opus/gstopusheader.h
index 14c88c04d..567d88c1f 100644
--- a/ext/opus/gstopusheader.h
+++ b/ext/opus/gstopusheader.h
@@ -29,7 +29,7 @@ G_BEGIN_DECLS
extern void gst_opus_header_create_caps_from_headers (GstCaps **caps, GSList **headers,
GstBuffer *id_header, GstBuffer *comment_header);
extern void gst_opus_header_create_caps (GstCaps **caps, GSList **headers,
- gint nchannels, gint n_stereo_streams, gint sample_rate,
+ guint16 pre_skip, guint sample_rate32, guint8 nchannels, guint8 n_stereo_streams,
guint8 channel_mapping_family, const guint8 *channel_mapping,
const GstTagList *tags);
extern gboolean gst_opus_header_is_header (GstBuffer * buf,