aboutsummaryrefslogtreecommitdiff
path: root/libs/libopusenc/patches/0002-Fix-use-of-uninitialized-fields.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libs/libopusenc/patches/0002-Fix-use-of-uninitialized-fields.patch')
-rw-r--r--libs/libopusenc/patches/0002-Fix-use-of-uninitialized-fields.patch78
1 files changed, 78 insertions, 0 deletions
diff --git a/libs/libopusenc/patches/0002-Fix-use-of-uninitialized-fields.patch b/libs/libopusenc/patches/0002-Fix-use-of-uninitialized-fields.patch
new file mode 100644
index 000000000..8642e2fff
--- /dev/null
+++ b/libs/libopusenc/patches/0002-Fix-use-of-uninitialized-fields.patch
@@ -0,0 +1,78 @@
+From 6d46f2d7f7617852bab7cbb2f7cae8350b99204e Mon Sep 17 00:00:00 2001
+From: Mark Harris <mark.hsj@gmail.com>
+Date: Mon, 28 Dec 2020 17:01:39 -0800
+Subject: [PATCH] Fix use of uninitialized fields
+
+enc->streams->end_granule used uninitialized in encode_buffer() if the
+stream contains no audio (opusenc_example /dev/null out.opus).
+
+enc->frame_size_request used uninitialized in encode_buffer() if the
+frame size was not explicitly set.
+
+enc->callbacks used uninitialized if the encoder is created with
+ope_encoder_create_callbacks() and callbacks is NULL.
+---
+ src/opusenc.c | 23 +++++++++++++++++------
+ 1 file changed, 17 insertions(+), 6 deletions(-)
+
+--- a/src/opusenc.c
++++ b/src/opusenc.c
+@@ -361,8 +361,7 @@ static void stream_destroy(EncStream *st
+ free(stream);
+ }
+
+-/* Create a new OggOpus file (callback-based). */
+-OggOpusEnc *ope_encoder_create_callbacks(const OpusEncCallbacks *callbacks, void *user_data,
++static OggOpusEnc *ope_encoder_create_callbacks_impl(const OpusEncCallbacks *callbacks, void *user_data,
+ OggOpusComments *comments, opus_int32 rate, int channels, int family, int *error) {
+ OggOpusEnc *enc=NULL;
+ int ret;
+@@ -395,11 +394,11 @@ OggOpusEnc *ope_encoder_create_callbacks
+ enc->oggp = NULL;
+ /* Not initializing anything is an unrecoverable error. */
+ enc->unrecoverable = family == -1 ? OPE_TOO_LATE : 0;
+- enc->pull_api = 0;
+ enc->packet_callback = NULL;
+ enc->rate = rate;
+ enc->channels = channels;
+ enc->frame_size = 960;
++ enc->frame_size_request = OPUS_FRAMESIZE_20_MS;
+ enc->decision_delay = 96000;
+ enc->max_ogg_delay = 48000;
+ enc->chaining_keyframe = NULL;
+@@ -447,8 +446,12 @@ OggOpusEnc *ope_encoder_create_callbacks
+ if (callbacks != NULL)
+ {
+ enc->callbacks = *callbacks;
++ enc->pull_api = 0;
++ } else {
++ enc->pull_api = 1;
+ }
+ enc->streams->user_data = user_data;
++ enc->streams->end_granule = 0;
+ if (error) *error = OPE_OK;
+ return enc;
+ fail:
+@@ -462,11 +465,19 @@ fail:
+ return NULL;
+ }
+
++/* Create a new OggOpus stream (callback-based). */
++OggOpusEnc *ope_encoder_create_callbacks(const OpusEncCallbacks *callbacks, void *user_data,
++ OggOpusComments *comments, opus_int32 rate, int channels, int family, int *error) {
++ if (callbacks == NULL) {
++ if (error) *error = OPE_BAD_ARG;
++ return NULL;
++ }
++ return ope_encoder_create_callbacks_impl(callbacks, user_data, comments, rate, channels, family, error);
++}
++
+ /* Create a new OggOpus stream, pulling one page at a time. */
+ OggOpusEnc *ope_encoder_create_pull(OggOpusComments *comments, opus_int32 rate, int channels, int family, int *error) {
+- OggOpusEnc *enc = ope_encoder_create_callbacks(NULL, NULL, comments, rate, channels, family, error);
+- if (enc) enc->pull_api = 1;
+- return enc;
++ return ope_encoder_create_callbacks_impl(NULL, NULL, comments, rate, channels, family, error);
+ }
+
+ int ope_encoder_deferred_init_with_mapping(OggOpusEnc *enc, int family, int streams,