summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2012-03-07 12:59:28 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-06-26 12:48:50 +0200
commitbd61c60c647c6f9050d70b125cd217665844b118 (patch)
tree2ae41dc84306d4ec35ec34dbc1756b784237e496 /ext
parent07969ee1165d03c6c73a5fb42a58e357d33ba74a (diff)
opusenc: only request and process 1 frame at a time
... since it is specified in _finish_frame that input buffer may be invalidated after calling it, and is as such not reliably available for further encoding. Also, requesting or allowing several frames is only useful if subclass intends to process these "in 1 run" (as in, 1 output buffer), not for having another (inner) loop in subclass where the baseclass one will do just fine.
Diffstat (limited to 'ext')
-rw-r--r--ext/opus/gstopusenc.c70
1 files changed, 31 insertions, 39 deletions
diff --git a/ext/opus/gstopusenc.c b/ext/opus/gstopusenc.c
index f0e21ae6f..346379f52 100644
--- a/ext/opus/gstopusenc.c
+++ b/ext/opus/gstopusenc.c
@@ -383,7 +383,7 @@ gst_opus_enc_setup_base_class (GstOpusEnc * enc, GstAudioEncoder * benc)
gst_opus_enc_get_latency (enc), gst_opus_enc_get_latency (enc));
gst_audio_encoder_set_frame_samples_min (benc, enc->frame_samples);
gst_audio_encoder_set_frame_samples_max (benc, enc->frame_samples);
- gst_audio_encoder_set_frame_max (benc, 0);
+ gst_audio_encoder_set_frame_max (benc, 1);
}
static gint
@@ -793,6 +793,8 @@ gst_opus_enc_encode (GstOpusEnc * enc, GstBuffer * buf)
gsize bsize, size;
gsize bytes;
gint ret = GST_FLOW_OK;
+ gint outsize;
+ GstBuffer *outbuf;
g_mutex_lock (enc->property_lock);
@@ -817,51 +819,41 @@ gst_opus_enc_encode (GstOpusEnc * enc, GstBuffer * buf)
goto done;
}
+ g_assert (size == bytes);
- while (size) {
- gint outsize;
- GstBuffer *outbuf;
+ ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc),
+ GST_BUFFER_OFFSET_NONE, enc->max_payload_size * enc->n_channels,
+ GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (enc)), &outbuf);
- ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc),
- GST_BUFFER_OFFSET_NONE, enc->max_payload_size * enc->n_channels,
- GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (enc)), &outbuf);
-
- if (GST_FLOW_OK != ret)
- goto done;
-
- GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)",
- enc->frame_samples, (int) bytes);
-
- outsize =
- opus_multistream_encode (enc->state, (const gint16 *) data,
- enc->frame_samples, GST_BUFFER_DATA (outbuf),
- enc->max_payload_size * enc->n_channels);
+ if (GST_FLOW_OK != ret)
+ goto done;
- if (outsize < 0) {
- GST_ERROR_OBJECT (enc, "Encoding failed: %d", outsize);
- ret = GST_FLOW_ERROR;
- goto done;
- } else if (outsize > enc->max_payload_size) {
- GST_WARNING_OBJECT (enc,
- "Encoded size %d is higher than max payload size (%d bytes)",
- outsize, enc->max_payload_size);
- ret = GST_FLOW_ERROR;
- goto done;
- }
+ GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)",
+ enc->frame_samples, (int) bytes);
- GST_DEBUG_OBJECT (enc, "Output packet is %u bytes", outsize);
- GST_BUFFER_SIZE (outbuf) = outsize;
+ outsize =
+ opus_multistream_encode (enc->state, (const gint16 *) data,
+ enc->frame_samples, GST_BUFFER_DATA (outbuf),
+ enc->max_payload_size * enc->n_channels);
- ret =
- gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (enc), outbuf,
- enc->frame_samples);
+ if (outsize < 0) {
+ GST_ERROR_OBJECT (enc, "Encoding failed: %d", outsize);
+ ret = GST_FLOW_ERROR;
+ goto done;
+ } else if (outsize > enc->max_payload_size) {
+ GST_WARNING_OBJECT (enc,
+ "Encoded size %d is higher than max payload size (%d bytes)",
+ outsize, enc->max_payload_size);
+ ret = GST_FLOW_ERROR;
+ goto done;
+ }
- if ((GST_FLOW_OK != ret) && (GST_FLOW_NOT_LINKED != ret))
- goto done;
+ GST_DEBUG_OBJECT (enc, "Output packet is %u bytes", outsize);
+ GST_BUFFER_SIZE (outbuf) = outsize;
- data += bytes;
- size -= bytes;
- }
+ ret =
+ gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (enc), outbuf,
+ enc->frame_samples);
done: