Fixing failure due to CBR allocating zero byte to a stream
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 9 Sep 2016 20:51:01 +0000 (16:51 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Wed, 14 Sep 2016 15:41:02 +0000 (11:41 -0400)
src/opus_encoder.c

index aa5e73d..4044010 100644 (file)
@@ -1336,7 +1336,8 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_
        /* We need to make sure that "int" values always fit in 16 bits. */
        cbrBytes = IMIN( (3*st->bitrate_bps/8 + frame_rate3/2)/frame_rate3, max_data_bytes);
        st->bitrate_bps = cbrBytes*(opus_int32)frame_rate3*8/3;
-       max_data_bytes = cbrBytes;
+       /* Make sure we provide at least one byte to avoid failing. */
+       max_data_bytes = IMAX(1, cbrBytes);
     }
     if (max_data_bytes<3 || st->bitrate_bps < 3*frame_rate*8
        || (frame_rate<50 && (max_data_bytes*frame_rate<300 || st->bitrate_bps < 2400)))
@@ -1363,6 +1364,8 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_
           ret = opus_packet_pad(data, ret, max_data_bytes);
           if (ret == OPUS_OK)
              ret = max_data_bytes;
+          else
+             ret = OPUS_INTERNAL_ERROR;
        }
        RESTORE_STACK;
        return ret;