From 4421c708d144e2434edec37d4bad1272a94196f0 Mon Sep 17 00:00:00 2001 From: WeebDataHoarder <57538841+WeebDataHoarder@users.noreply.github.com> Date: Wed, 20 Jul 2022 11:53:44 +0200 Subject: [PATCH] Add support for setting and getting the ogg muxing delay --- callbacks.c | 12 ++++++++++++ encoder.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/callbacks.c b/callbacks.c index 6306870..c888bc6 100644 --- a/callbacks.c +++ b/callbacks.c @@ -85,6 +85,18 @@ bridge_encoder_get_sample_rate(OggOpusEnc *st, opus_int32 *sample_rate) } +int +bridge_encoder_set_muxing_delay(OggOpusEnc *st, opus_int32 delay) +{ + return ope_encoder_ctl(st, OPE_SET_MUXING_DELAY(delay)); +} + +int +bridge_encoder_get_muxing_delay(OggOpusEnc *st, opus_int32 *delay) +{ + return ope_encoder_ctl(st, OPE_GET_MUXING_DELAY(delay)); +} + int bridge_encoder_set_bitrate(OggOpusEnc *st, opus_int32 bitrate) { diff --git a/encoder.go b/encoder.go index bea59d0..5c518a9 100644 --- a/encoder.go +++ b/encoder.go @@ -5,9 +5,11 @@ package opus import ( + "errors" "fmt" "io" "runtime/cgo" + "time" "unsafe" ) @@ -25,6 +27,11 @@ bridge_encoder_get_dtx(OggOpusEnc *st, opus_int32 *dtx); int bridge_encoder_get_sample_rate(OggOpusEnc *st, opus_int32 *sample_rate); +int +bridge_encoder_set_muxing_delay(OggOpusEnc *st, opus_int32 delay); + +int +bridge_encoder_get_muxing_delay(OggOpusEnc *st, opus_int32 *delay); int bridge_encoder_set_bitrate(OggOpusEnc *st, opus_int32 bitrate); @@ -285,6 +292,28 @@ func (enc *Encoder) Bitrate() (int, error) { return int(bitrate), nil } +// SetMuxingDelay sets maximum container delay +func (enc *Encoder) SetMuxingDelay(delay time.Duration) error { + if delay < 0 || delay > time.Millisecond*1000 { + return errors.New("value must be between 0 to 1000 milliseconds") + } + res := C.bridge_encoder_set_muxing_delay(enc.p, C.opus_int32(delay.Milliseconds()*48)) + if res != C.OPUS_OK { + return Error(res) + } + return nil +} + +// MuxingDelay returns the maximum container delay +func (enc *Encoder) MuxingDelay() (time.Duration, error) { + var delay C.opus_int32 + res := C.bridge_encoder_get_muxing_delay(enc.p, &delay) + if res != C.OPUS_OK { + return 0, Error(res) + } + return time.Millisecond * time.Duration(int(delay)/48), nil +} + // SetComplexity sets the encoder's computational complexity func (enc *Encoder) SetComplexity(complexity int) error { res := C.bridge_encoder_set_complexity(enc.p, C.opus_int32(complexity))