fix number of samples reported with gapless decoding

This commit is contained in:
Vladislav Mikhalin 2024-11-02 11:23:35 +03:00
parent af2df7d889
commit 18a4bd2014
3 changed files with 17 additions and 20 deletions

View File

@ -65,7 +65,6 @@ void AjmAt9Decoder::GetCodecInfo(void* out_info) {
} }
void AjmAt9Decoder::Decode(const AjmJobInput* input, AjmJobOutput* output) { void AjmAt9Decoder::Decode(const AjmJobInput* input, AjmJobOutput* output) {
LOG_TRACE(Lib_Ajm, "Decoding with instance {} in size = {}", index, input->buffer.size());
Atrac9CodecInfo codec_info; Atrac9CodecInfo codec_info;
Atrac9GetCodecInfo(handle, &codec_info); Atrac9GetCodecInfo(handle, &codec_info);
@ -125,16 +124,18 @@ void AjmAt9Decoder::Decode(const AjmJobInput* input, AjmJobOutput* output) {
} }
} }
} else { } else {
written = const auto pcm_size = std::min(pcm_buffer.size(), samples_remain);
write_output({pcm_buffer.data(), std::min(pcm_buffer.size(), samples_remain)}); const auto nsamples = pcm_size / codec_info.channels;
total_decoded_samples += codec_info.frameSamples; written = write_output({pcm_buffer.data(), pcm_size});
total_decoded_samples += nsamples;
if (gapless.total_samples != 0) { if (gapless.total_samples != 0) {
gapless_decoded_samples += codec_info.frameSamples; gapless_decoded_samples += nsamples;
} }
} }
num_frames += 1; num_frames += 1;
if ((num_frames % codec_info.framesInSuperframe) == 0) { if ((num_frames % codec_info.framesInSuperframe) == 0) {
num_frames = 0;
if (superframe_bytes_remain) { if (superframe_bytes_remain) {
if (output->p_stream) { if (output->p_stream) {
output->p_stream->input_consumed += superframe_bytes_remain; output->p_stream->input_consumed += superframe_bytes_remain;
@ -156,11 +157,10 @@ void AjmAt9Decoder::Decode(const AjmJobInput* input, AjmJobOutput* output) {
} }
} }
if (gapless.total_samples != 0 && gapless_decoded_samples >= gapless.total_samples) { if (flags.gapless_loop && gapless.total_samples != 0 &&
if (flags.gapless_loop) { gapless_decoded_samples >= gapless.total_samples) {
ResetCodec(); ResetCodec();
} }
}
if (output->p_stream) { if (output->p_stream) {
output->p_stream->total_decoded_samples = total_decoded_samples; output->p_stream->total_decoded_samples = total_decoded_samples;

View File

@ -25,11 +25,8 @@ struct AjmSidebandDecAt9CodecInfo {
}; };
struct AjmAt9Decoder final : AjmInstance { struct AjmAt9Decoder final : AjmInstance {
void* handle; void* handle{};
bool decoder_initialized = false; u8 config_data[ORBIS_AT9_CONFIG_DATA_SIZE]{};
std::fstream file;
int length;
u8 config_data[ORBIS_AT9_CONFIG_DATA_SIZE];
u32 superframe_bytes_remain{}; u32 superframe_bytes_remain{};
u32 num_frames{}; u32 num_frames{};

View File

@ -74,6 +74,7 @@ void AjmMp3Decoder::Reset() {
int ret = avcodec_open2(c, codec, nullptr); int ret = avcodec_open2(c, codec, nullptr);
ASSERT_MSG(ret >= 0, "Could not open codec"); ASSERT_MSG(ret >= 0, "Could not open codec");
total_decoded_samples = 0; total_decoded_samples = 0;
gapless_decoded_samples = 0;
} }
void AjmMp3Decoder::Decode(const AjmJobInput* input, AjmJobOutput* output) { void AjmMp3Decoder::Decode(const AjmJobInput* input, AjmJobOutput* output) {
@ -138,13 +139,12 @@ void AjmMp3Decoder::Decode(const AjmJobInput* input, AjmJobOutput* output) {
if (frame->format != AV_SAMPLE_FMT_S16) { if (frame->format != AV_SAMPLE_FMT_S16) {
frame = ConvertAudioFrame(frame); frame = ConvertAudioFrame(frame);
} }
const auto frame_samples = frame->ch_layout.nb_channels * frame->nb_samples; const auto size = frame->ch_layout.nb_channels * frame->nb_samples * sizeof(u16);
const auto size = frame_samples * sizeof(u16);
if (gapless.skipped_samples < gapless.skip_samples) { if (gapless.skipped_samples < gapless.skip_samples) {
gapless.skipped_samples += frame_samples; gapless.skipped_samples += frame->nb_samples;
if (gapless.skipped_samples > gapless.skip_samples) { if (gapless.skipped_samples > gapless.skip_samples) {
const u32 nsamples = gapless.skipped_samples - gapless.skip_samples; const u32 nsamples = gapless.skipped_samples - gapless.skip_samples;
const auto start = frame_samples - nsamples; const auto start = frame->nb_samples - nsamples;
write_output({reinterpret_cast<s16*>(frame->data[0]), nsamples}); write_output({reinterpret_cast<s16*>(frame->data[0]), nsamples});
gapless.skipped_samples = gapless.skip_samples; gapless.skipped_samples = gapless.skip_samples;
total_decoded_samples += nsamples; total_decoded_samples += nsamples;
@ -154,9 +154,9 @@ void AjmMp3Decoder::Decode(const AjmJobInput* input, AjmJobOutput* output) {
} }
} else { } else {
write_output({reinterpret_cast<s16*>(frame->data[0]), size >> 1}); write_output({reinterpret_cast<s16*>(frame->data[0]), size >> 1});
total_decoded_samples += frame_samples; total_decoded_samples += frame->nb_samples;
if (gapless.total_samples != 0) { if (gapless.total_samples != 0) {
gapless_decoded_samples += frame_samples; gapless_decoded_samples += frame->nb_samples;
} }
} }
av_frame_free(&frame); av_frame_free(&frame);