From 982cba9029d0c1252bdc50ba2efea463a92804a1 Mon Sep 17 00:00:00 2001 From: Sylvain Munaut Date: Sat, 2 Dec 2017 19:23:42 +0100 Subject: [PATCH] codec: Make ir77_ambe_decode return an error if less than 50% are valid Thanks to schneider for the original patch. Signed-off-by: Sylvain Munaut --- codec/ambe.c | 10 ++++++---- codec/ir77_ambe_decode.c | 13 +++++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/codec/ambe.c b/codec/ambe.c index 705ffab..210af0d 100644 --- a/codec/ambe.c +++ b/codec/ambe.c @@ -97,12 +97,12 @@ ir77_ambe_decode_speech(struct ir77_ambe_decoder *dec, return 0; } -/*! \brief Decodes an AMBE superframe to audio +/*! \brief Decodes an AMBE superframe (=2 frames) to audio * \param[in] dec Decoder object * \param[out] audio Output audio buffers * \param[in] N number of audio samples to produce (== 720 for now) * \param[in] superframe SuperFrame data (39 bytes = 312 bits) - * \returns 0 for success. Negative error code otherwise. + * \returns Number of successfully decoded frames. Negative error code otherwise. */ int ir77_ambe_decode_superframe(struct ir77_ambe_decoder *dec, @@ -111,7 +111,7 @@ ir77_ambe_decode_superframe(struct ir77_ambe_decoder *dec, { ubit_t superframe_bits[312]; ubit_t frame_bits[156]; - int i; + int frames = 0, i; /* Unpack to ubits */ osmo_pbit2ubit_ext(superframe_bits, 0, superframe, 0, 312, 1); @@ -146,6 +146,8 @@ ir77_ambe_decode_superframe(struct ir77_ambe_decoder *dec, continue; } + frames++; + /* De-prioritize */ ir77_ambe_prioritize(frame_lin, frame, 1); @@ -170,7 +172,7 @@ ir77_ambe_decode_superframe(struct ir77_ambe_decoder *dec, } } - return 0; + return frames; } /*! @} */ diff --git a/codec/ir77_ambe_decode.c b/codec/ir77_ambe_decode.c index 4d8fd7b..41b6f18 100644 --- a/codec/ir77_ambe_decode.c +++ b/codec/ir77_ambe_decode.c @@ -73,6 +73,8 @@ int main(int argc, char *argv[]) struct ir77_ambe_decoder *dec = NULL; FILE *fin, *fout; int is_wave = 0, l, rv; + int frames_ok = 0, frames_total = 0; + float error_ratio = 1.0f; /* Arguments */ if (argc > 3) { @@ -139,11 +141,14 @@ int main(int argc, char *argv[]) /* Decompress */ rv = ir77_ambe_decode_superframe(dec, audio, 2*360, superframe); - if (rv) { + if (rv < 0) { fprintf(stderr, "[!] codec error\n"); break; } + frames_ok += rv; + frames_total += 2; + /* Write audio output */ for (i=0; i<2*360; i++) audio[i] = le16(audio[i]); @@ -158,6 +163,10 @@ int main(int argc, char *argv[]) l += 2*360; } + /* Report the frame error ratio */ + error_ratio = 1.0f - (1.0f * frames_ok) / frames_total; + fprintf(stderr, "Error ratio: %.2f\n", error_ratio); + /* Release decoder */ ir77_ambe_decode_release(dec); @@ -195,5 +204,5 @@ exit: fclose(fin); /* All done ! */ - return 0; + return error_ratio < 0.5f ? 0 : 1; }