mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
ext/wavpack/gstwavpackenc.*: Use bitrate property solely for bitrates and add new bits-per-sample property for the ot...
Original commit message from CVS: Patch by: Sebastian Dröge <slomo at circular-chaos org> * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_base_init), (gst_wavpack_enc_class_init), (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_chain), (gst_wavpack_enc_sink_event), (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): * ext/wavpack/gstwavpackenc.h: Use bitrate property solely for bitrates and add new bits-per-sample property for the other stuff. Set duration to 'unknown' in initial header and resend header with proper duration on EOS; update Sebastian's e-mail address.
This commit is contained in:
parent
84e86aebf7
commit
a969a074c0
2 changed files with 52 additions and 49 deletions
|
@ -1,5 +1,5 @@
|
||||||
/* GStreamer Wavpack encoder plugin
|
/* GStreamer Wavpack encoder plugin
|
||||||
* Copyright (c) 2006 Sebastian Dröge <mail@slomosnail.de>
|
* Copyright (c) 2006 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
*
|
*
|
||||||
* gstwavpackdec.c: Wavpack audio encoder
|
* gstwavpackdec.c: Wavpack audio encoder
|
||||||
*
|
*
|
||||||
|
@ -63,6 +63,7 @@ enum
|
||||||
ARG_0,
|
ARG_0,
|
||||||
ARG_MODE,
|
ARG_MODE,
|
||||||
ARG_BITRATE,
|
ARG_BITRATE,
|
||||||
|
ARG_BITSPERSAMPLE,
|
||||||
ARG_CORRECTION_MODE,
|
ARG_CORRECTION_MODE,
|
||||||
ARG_MD5,
|
ARG_MD5,
|
||||||
ARG_EXTRA_PROCESSING,
|
ARG_EXTRA_PROCESSING,
|
||||||
|
@ -185,7 +186,7 @@ gst_wavpack_enc_base_init (gpointer klass)
|
||||||
"Wavpack audio encoder",
|
"Wavpack audio encoder",
|
||||||
"Codec/Encoder/Audio",
|
"Codec/Encoder/Audio",
|
||||||
"Encodes audio with the Wavpack lossless/lossy audio codec",
|
"Encodes audio with the Wavpack lossless/lossy audio codec",
|
||||||
"Sebastian Dröge <mail@slomosnail.de>"
|
"Sebastian Dröge <slomo@circular-chaos.org>"
|
||||||
};
|
};
|
||||||
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
||||||
|
|
||||||
|
@ -228,9 +229,14 @@ gst_wavpack_enc_class_init (GstWavpackEncClass * klass)
|
||||||
GST_TYPE_WAVPACK_ENC_MODE, DEFAULT_MODE, G_PARAM_READWRITE));
|
GST_TYPE_WAVPACK_ENC_MODE, DEFAULT_MODE, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (gobject_class, ARG_BITRATE,
|
g_object_class_install_property (gobject_class, ARG_BITRATE,
|
||||||
g_param_spec_double ("bitrate", "Bitrate",
|
g_param_spec_double ("bitrate", "Bitrate",
|
||||||
"Try to encode with this average bitrate. "
|
"Try to encode with this average bitrate (bits/sec). "
|
||||||
"This enables lossy encoding! (0 .. 2.0 == disabled, 2.0 .. 23.9 == bits/sample, 24.0 .. 9600 == kbit/second)",
|
"This enables lossy encoding! A value smaller than 24000.0 disables this.",
|
||||||
0.0, 9600.0, 0.0, G_PARAM_READWRITE));
|
0.0, 9600000.0, 0.0, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (gobject_class, ARG_BITSPERSAMPLE,
|
||||||
|
g_param_spec_double ("bits-per-sample", "Bits per sample",
|
||||||
|
"Try to encode with this amount of bits per sample. "
|
||||||
|
"This enables lossy encoding! A value smaller than 2.0 disables this.",
|
||||||
|
0.0, 24.0, 0.0, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (gobject_class, ARG_CORRECTION_MODE,
|
g_object_class_install_property (gobject_class, ARG_CORRECTION_MODE,
|
||||||
g_param_spec_enum ("correction_mode", "Correction file mode",
|
g_param_spec_enum ("correction_mode", "Correction file mode",
|
||||||
"Use this mode for correction file creation. Only works in lossy mode!",
|
"Use this mode for correction file creation. Only works in lossy mode!",
|
||||||
|
@ -386,11 +392,14 @@ gst_wavpack_enc_set_wp_config (GstWavpackEnc * wavpack_enc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bitrate, enables lossy mode */
|
/* Bitrate, enables lossy mode */
|
||||||
if (wavpack_enc->bitrate > 2.0) {
|
if (wavpack_enc->bitrate >= 2.0) {
|
||||||
wavpack_enc->wp_config->flags |= CONFIG_HYBRID_FLAG;
|
wavpack_enc->wp_config->flags |= CONFIG_HYBRID_FLAG;
|
||||||
wavpack_enc->wp_config->bitrate = wavpack_enc->bitrate;
|
if (wavpack_enc->bitrate >= 24000.0) {
|
||||||
if (wavpack_enc->bitrate >= 24.0)
|
wavpack_enc->wp_config->bitrate = wavpack_enc->bitrate / 1000.0;
|
||||||
wavpack_enc->wp_config->flags |= CONFIG_BITRATE_KBPS;
|
wavpack_enc->wp_config->flags |= CONFIG_BITRATE_KBPS;
|
||||||
|
} else {
|
||||||
|
wavpack_enc->wp_config->bitrate = wavpack_enc->bitrate;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Correction Mode, only in lossy mode */
|
/* Correction Mode, only in lossy mode */
|
||||||
|
@ -674,9 +683,6 @@ gst_wavpack_enc_chain (GstPad * pad, GstBuffer * buf)
|
||||||
|
|
||||||
/* check if we already have a valid WavpackContext, otherwise make one */
|
/* check if we already have a valid WavpackContext, otherwise make one */
|
||||||
if (!wavpack_enc->wp_context) {
|
if (!wavpack_enc->wp_context) {
|
||||||
gint64 duration;
|
|
||||||
GstFormat fmt = GST_FORMAT_DEFAULT;
|
|
||||||
|
|
||||||
/* create raw context */
|
/* create raw context */
|
||||||
wavpack_enc->wp_context =
|
wavpack_enc->wp_context =
|
||||||
WavpackOpenFileOutput (gst_wavpack_enc_push_block, wavpack_enc->wv_id,
|
WavpackOpenFileOutput (gst_wavpack_enc_push_block, wavpack_enc->wv_id,
|
||||||
|
@ -692,38 +698,10 @@ gst_wavpack_enc_chain (GstPad * pad, GstBuffer * buf)
|
||||||
/* set the WavpackConfig according to our parameters */
|
/* set the WavpackConfig according to our parameters */
|
||||||
gst_wavpack_enc_set_wp_config (wavpack_enc);
|
gst_wavpack_enc_set_wp_config (wavpack_enc);
|
||||||
|
|
||||||
/* try to get the duration (or an estimate) in samples from upstream */
|
|
||||||
if (gst_pad_query_peer_duration (pad, &fmt, &duration)) {
|
|
||||||
switch (fmt) {
|
|
||||||
case GST_FORMAT_DEFAULT:
|
|
||||||
break;
|
|
||||||
case GST_FORMAT_TIME:
|
|
||||||
duration =
|
|
||||||
gst_util_uint64_scale (wavpack_enc->samplerate,
|
|
||||||
duration, GST_SECOND);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
duration = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
duration = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wavpack doesn't support more than 2^32 samples unfortunately */
|
|
||||||
if (duration > G_GINT64_CONSTANT (1) << 32) {
|
|
||||||
GST_ELEMENT_ERROR (wavpack_enc, LIBRARY, SETTINGS, (NULL),
|
|
||||||
("more than 2^32 samples are not supported"));
|
|
||||||
WavpackCloseFile (wavpack_enc->wp_context);
|
|
||||||
gst_object_unref (wavpack_enc);
|
|
||||||
gst_buffer_unref (buf);
|
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set the configuration to the context now that we know everything
|
/* set the configuration to the context now that we know everything
|
||||||
* and initialize the encoder */
|
* and initialize the encoder */
|
||||||
if (!WavpackSetConfiguration (wavpack_enc->wp_context,
|
if (!WavpackSetConfiguration (wavpack_enc->wp_context,
|
||||||
wavpack_enc->wp_config, (uint32_t) duration)
|
wavpack_enc->wp_config, (uint32_t) (-1))
|
||||||
|| !WavpackPackInit (wavpack_enc->wp_context)) {
|
|| !WavpackPackInit (wavpack_enc->wp_context)) {
|
||||||
GST_ELEMENT_ERROR (wavpack_enc, LIBRARY, SETTINGS, (NULL),
|
GST_ELEMENT_ERROR (wavpack_enc, LIBRARY, SETTINGS, (NULL),
|
||||||
("error setting up wavpack encoding context"));
|
("error setting up wavpack encoding context"));
|
||||||
|
@ -833,11 +811,8 @@ gst_wavpack_enc_sink_event (GstPad * pad, GstEvent * event)
|
||||||
WavpackStoreMD5Sum (wavpack_enc->wp_context, md5_digest);
|
WavpackStoreMD5Sum (wavpack_enc->wp_context, md5_digest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to rewrite the first frame with the correct sample number if we
|
/* Try to rewrite the first frame with the correct sample number */
|
||||||
* had a wrong one at the start of encoding */
|
if (wavpack_enc->first_block)
|
||||||
if ((wavpack_enc->first_block)
|
|
||||||
&& (WavpackGetNumSamples (wavpack_enc->wp_context) !=
|
|
||||||
WavpackGetSampleIndex (wavpack_enc->wp_context)))
|
|
||||||
gst_wavpack_enc_rewrite_first_block (wavpack_enc);
|
gst_wavpack_enc_rewrite_first_block (wavpack_enc);
|
||||||
|
|
||||||
/* close the context if not already happened */
|
/* close the context if not already happened */
|
||||||
|
@ -936,9 +911,26 @@ gst_wavpack_enc_set_property (GObject * object, guint prop_id,
|
||||||
case ARG_MODE:
|
case ARG_MODE:
|
||||||
wavpack_enc->mode = g_value_get_enum (value);
|
wavpack_enc->mode = g_value_get_enum (value);
|
||||||
break;
|
break;
|
||||||
case ARG_BITRATE:
|
case ARG_BITRATE:{
|
||||||
wavpack_enc->bitrate = g_value_get_double (value);
|
gdouble val = g_value_get_double (value);
|
||||||
|
|
||||||
|
if ((val >= 24000.0) && (val <= 9600000.0)) {
|
||||||
|
wavpack_enc->bitrate = val;
|
||||||
|
} else {
|
||||||
|
wavpack_enc->bitrate = 0.0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
case ARG_BITSPERSAMPLE:{
|
||||||
|
gdouble val = g_value_get_double (value);
|
||||||
|
|
||||||
|
if ((val >= 2.0) && (val <= 24.0)) {
|
||||||
|
wavpack_enc->bitrate = val;
|
||||||
|
} else {
|
||||||
|
wavpack_enc->bitrate = 0.0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ARG_CORRECTION_MODE:
|
case ARG_CORRECTION_MODE:
|
||||||
wavpack_enc->correction_mode = g_value_get_enum (value);
|
wavpack_enc->correction_mode = g_value_get_enum (value);
|
||||||
break;
|
break;
|
||||||
|
@ -968,7 +960,18 @@ gst_wavpack_enc_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
g_value_set_enum (value, wavpack_enc->mode);
|
g_value_set_enum (value, wavpack_enc->mode);
|
||||||
break;
|
break;
|
||||||
case ARG_BITRATE:
|
case ARG_BITRATE:
|
||||||
g_value_set_double (value, wavpack_enc->bitrate);
|
if (wavpack_enc->bitrate >= 24000.0) {
|
||||||
|
g_value_set_double (value, wavpack_enc->bitrate);
|
||||||
|
} else {
|
||||||
|
g_value_set_double (value, 0.0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ARG_BITSPERSAMPLE:
|
||||||
|
if (wavpack_enc->bitrate <= 24.0) {
|
||||||
|
g_value_set_double (value, wavpack_enc->bitrate);
|
||||||
|
} else {
|
||||||
|
g_value_set_double (value, 0.0);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case ARG_CORRECTION_MODE:
|
case ARG_CORRECTION_MODE:
|
||||||
g_value_set_enum (value, wavpack_enc->correction_mode);
|
g_value_set_enum (value, wavpack_enc->correction_mode);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* GStreamer Wavpack encoder plugin
|
/* GStreamer Wavpack encoder plugin
|
||||||
* Copyrigh (c) 2006 Sebastian Dröge <mail@slomosnail.de>
|
* Copyright (c) 2006 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
*
|
*
|
||||||
* gstwavpackenc.h: Wavpack audio encoder
|
* gstwavpackenc.h: Wavpack audio encoder
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue