|
|
|
@ -32,7 +32,6 @@ |
|
|
|
|
|
|
|
|
|
struct libopus_context { |
|
|
|
|
OpusMSDecoder *dec; |
|
|
|
|
AVFrame frame; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#define OPUS_HEAD_SIZE 19 |
|
|
|
@ -95,8 +94,7 @@ static av_cold int libopus_decode_init(AVCodecContext *avc) |
|
|
|
|
opus_strerror(ret)); |
|
|
|
|
|
|
|
|
|
avc->delay = 3840; /* Decoder delay (in samples) at 48kHz */ |
|
|
|
|
avcodec_get_frame_defaults(&opus->frame); |
|
|
|
|
avc->coded_frame = &opus->frame; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -110,14 +108,15 @@ static av_cold int libopus_decode_close(AVCodecContext *avc) |
|
|
|
|
|
|
|
|
|
#define MAX_FRAME_SIZE (960 * 6) |
|
|
|
|
|
|
|
|
|
static int libopus_decode(AVCodecContext *avc, void *frame, |
|
|
|
|
static int libopus_decode(AVCodecContext *avc, void *data, |
|
|
|
|
int *got_frame_ptr, AVPacket *pkt) |
|
|
|
|
{ |
|
|
|
|
struct libopus_context *opus = avc->priv_data; |
|
|
|
|
AVFrame *frame = data; |
|
|
|
|
int ret, nb_samples; |
|
|
|
|
|
|
|
|
|
opus->frame.nb_samples = MAX_FRAME_SIZE; |
|
|
|
|
ret = ff_get_buffer(avc, &opus->frame); |
|
|
|
|
frame->nb_samples = MAX_FRAME_SIZE; |
|
|
|
|
ret = ff_get_buffer(avc, frame); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
av_log(avc, AV_LOG_ERROR, "get_buffer() failed\n"); |
|
|
|
|
return ret; |
|
|
|
@ -125,12 +124,12 @@ static int libopus_decode(AVCodecContext *avc, void *frame, |
|
|
|
|
|
|
|
|
|
if (avc->sample_fmt == AV_SAMPLE_FMT_S16) |
|
|
|
|
nb_samples = opus_multistream_decode(opus->dec, pkt->data, pkt->size, |
|
|
|
|
(opus_int16 *)opus->frame.data[0], |
|
|
|
|
opus->frame.nb_samples, 0); |
|
|
|
|
(opus_int16 *)frame->data[0], |
|
|
|
|
frame->nb_samples, 0); |
|
|
|
|
else |
|
|
|
|
nb_samples = opus_multistream_decode_float(opus->dec, pkt->data, pkt->size, |
|
|
|
|
(float *)opus->frame.data[0], |
|
|
|
|
opus->frame.nb_samples, 0); |
|
|
|
|
(float *)frame->data[0], |
|
|
|
|
frame->nb_samples, 0); |
|
|
|
|
|
|
|
|
|
if (nb_samples < 0) { |
|
|
|
|
av_log(avc, AV_LOG_ERROR, "Decoding error: %s\n", |
|
|
|
@ -138,9 +137,9 @@ static int libopus_decode(AVCodecContext *avc, void *frame, |
|
|
|
|
return ff_opus_error_to_averror(nb_samples); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
opus->frame.nb_samples = nb_samples; |
|
|
|
|
*(AVFrame *)frame = opus->frame; |
|
|
|
|
*got_frame_ptr = 1; |
|
|
|
|
frame->nb_samples = nb_samples; |
|
|
|
|
*got_frame_ptr = 1; |
|
|
|
|
|
|
|
|
|
return pkt->size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|