Commit bef3c14d authored by Carl Eugen Hoyos's avatar Carl Eugen Hoyos

lavc/amrwbdec: Do not ignore NO_DATA frames.

Fixes the actual output duration of the sample in ticket #7113.
parent 56f59246
...@@ -1884,7 +1884,7 @@ static const float lpf_7_coef[31] = { // low pass, 7kHz cutoff ...@@ -1884,7 +1884,7 @@ static const float lpf_7_coef[31] = { // low pass, 7kHz cutoff
/** Core frame sizes in each mode */ /** Core frame sizes in each mode */
static const uint16_t cf_sizes_wb[] = { static const uint16_t cf_sizes_wb[] = {
132, 177, 253, 285, 317, 365, 397, 461, 477, 132, 177, 253, 285, 317, 365, 397, 461, 477,
40 /// SID/comfort noise frame 40, 0, 0, 0, 0, 0, 0
}; };
#endif /* AVCODEC_AMRWBDATA_H */ #endif /* AVCODEC_AMRWBDATA_H */
...@@ -1119,12 +1119,19 @@ static int amrwb_decode_frame(AVCodecContext *avctx, void *data, ...@@ -1119,12 +1119,19 @@ static int amrwb_decode_frame(AVCodecContext *avctx, void *data,
buf_out = (float *)frame->data[0]; buf_out = (float *)frame->data[0];
header_size = decode_mime_header(ctx, buf); header_size = decode_mime_header(ctx, buf);
expected_fr_size = ((cf_sizes_wb[ctx->fr_cur_mode] + 7) >> 3) + 1;
if (ctx->fr_cur_mode == NO_DATA) {
for (i = 0; i < frame->nb_samples; i++)
buf_out[i] = 0.f;
*got_frame_ptr = 1;
return expected_fr_size;
}
if (ctx->fr_cur_mode > MODE_SID) { if (ctx->fr_cur_mode > MODE_SID) {
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
"Invalid mode %d\n", ctx->fr_cur_mode); "Invalid mode %d\n", ctx->fr_cur_mode);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
expected_fr_size = ((cf_sizes_wb[ctx->fr_cur_mode] + 7) >> 3) + 1;
if (buf_size < expected_fr_size) { if (buf_size < expected_fr_size) {
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment