From: elinor Date: Mon, 26 Mar 2018 04:54:20 +0000 (+0300) Subject: Added get last packet duration in decoder ctls X-Git-Tag: v2.0.0~21^2~13 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=5822db34bb118b9cf936a50f3f69304912b0d04c;p=go-opus.git Added get last packet duration in decoder ctls --- diff --git a/decoder.go b/decoder.go index a131a23..99b8e61 100644 --- a/decoder.go +++ b/decoder.go @@ -12,6 +12,12 @@ import ( /* #cgo pkg-config: opus #include + +int +bridge_decoder_get_last_packet_duration(OpusDecoder *st, opus_int32 *samples) +{ + return opus_decoder_ctl(st, OPUS_GET_LAST_PACKET_DURATION(samples)); +} */ import "C" @@ -105,3 +111,13 @@ func (dec *Decoder) DecodeFloat32(data []byte, pcm []float32) (int, error) { } return n, nil } + +// Gets the duration (in samples) of the last packet successfully decoded or concealed. +func (dec *Decoder) LastPacketDuration() (int,error){ + var samples C.opus_int32 + res := C.bridge_decoder_get_last_packet_duration(dec.p, &samples) + if res != C.OPUS_OK { + return 0, Error(res) + } + return int(samples), nil +} diff --git a/decoder_test.go b/decoder_test.go index ff7ebfa..d1e39b4 100644 --- a/decoder_test.go +++ b/decoder_test.go @@ -30,3 +30,39 @@ func TestDecoderUnitialized(t *testing.T) { t.Errorf("Expected \"unitialized decoder\" error: %v", err) } } + +func TestDecoder_GetLastPacketDuration(t *testing.T) { + const G4 = 391.995 + const SAMPLE_RATE = 48000 + const FRAME_SIZE_MS = 60 + const FRAME_SIZE = SAMPLE_RATE * FRAME_SIZE_MS / 1000 + pcm := make([]int16, FRAME_SIZE) + enc, err := NewEncoder(SAMPLE_RATE, 1, AppVoIP) + if err != nil || enc == nil { + t.Fatalf("Error creating new encoder: %v", err) + } + addSine(pcm, SAMPLE_RATE, G4) + + data := make([]byte, 1000) + n, err := enc.Encode(pcm, data) + if err != nil { + t.Fatalf("Couldn't encode data: %v", err) + } + data = data[:n] + + dec, err := NewDecoder(SAMPLE_RATE, 1) + if err != nil || dec == nil { + t.Fatalf("Error creating new decoder: %v", err) + } + n, err = dec.Decode(data, pcm) + if err != nil { + t.Fatalf("Couldn't decode data: %v", err) + } + samples, err := dec.LastPacketDuration() + if err!=nil{ + t.Fatalf("Couldn't get last packet duration: %v",err) + } + if samples!=n{ + t.Fatalf("Wrong duration length. Expected %d. Got %d", n, samples) + } +}