-
- const uint8_t **in = const_cast<const uint8_t**>(frame->extended_data);
- uint8_t* out[] = {buffer_.data()};
-
- auto channel_samples = swr_convert(swr_.get(),
- out, static_cast<int>(buffer_.size()) / format_desc_.audio_channels / av_get_bytes_per_sample(AV_SAMPLE_FMT_S32),
- in, frame->nb_samples);
-
- frame->data[0] = buffer_.data();
- frame->linesize[0] = channel_samples * format_desc_.audio_channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S32);
- frame->nb_samples = channel_samples;
- frame->format = AV_SAMPLE_FMT_S32;
-
- monitor_subject_ << core::monitor::message("/file/audio/sample-rate") % codec_context_->sample_rate
- << core::monitor::message("/file/audio/channels") % codec_context_->channels
- << core::monitor::message("/file/audio/format") % u8(av_get_sample_fmt_name(codec_context_->sample_fmt))
- << core::monitor::message("/file/audio/codec") % u8(codec_context_->codec->long_name);
-
- return frame;
+
+ const uint8_t **in = const_cast<const uint8_t**>(decoded_frame->extended_data);
+ uint8_t* out[] = { reinterpret_cast<uint8_t*>(buffer_.data()) };
+
+ const auto channel_samples = swr_convert(
+ swr_.get(),
+ out,
+ static_cast<int>(buffer_.size()) / codec_context_->channels,
+ in,
+ decoded_frame->nb_samples);
+
+ return std::make_shared<core::mutable_audio_buffer>(
+ buffer_.begin(),
+ buffer_.begin() + channel_samples * decoded_frame->channels);