]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/arbc.c
Merge commit 'e39a9212ab37a55b346801c77487d8a47b6f9fe2'
[ffmpeg] / libavcodec / arbc.c
index 01a146f9349979dd4153e8b5da6824e35ebdf7f8..841a9f10acce3aa53e3f398b55fed3aba6528171 100644 (file)
@@ -45,6 +45,9 @@ static void fill_tile4(AVCodecContext *avctx, uint8_t *color, AVFrame *frame)
     int nb_tiles = bytestream2_get_le16(gb);
     int h = avctx->height - 1;
 
+    if ((avctx->width / 4 + 1) * (avctx->height / 4 + 1) < nb_tiles)
+        return;
+
     for (int i = 0; i < nb_tiles; i++) {
         int y = bytestream2_get_byte(gb);
         int x = bytestream2_get_byte(gb);
@@ -79,6 +82,9 @@ static void fill_tileX(AVCodecContext *avctx, int tile_width, int tile_height,
     int nb_tiles = bytestream2_get_le16(gb);
     int h = avctx->height - 1;
 
+    if ((avctx->width / tile_width + 1) * (avctx->height / tile_height + 1) < nb_tiles)
+        return;
+
     for (int i = 0; i < nb_tiles; i++) {
         int y = bytestream2_get_byte(gb);
         int x = bytestream2_get_byte(gb);
@@ -181,6 +187,13 @@ static av_cold int decode_init(AVCodecContext *avctx)
     return 0;
 }
 
+static void decode_flush(AVCodecContext *avctx)
+{
+    ARBCContext *s = avctx->priv_data;
+
+    av_frame_unref(s->prev_frame);
+}
+
 static av_cold int decode_close(AVCodecContext *avctx)
 {
     ARBCContext *s = avctx->priv_data;
@@ -198,6 +211,7 @@ AVCodec ff_arbc_decoder = {
     .priv_data_size = sizeof(ARBCContext),
     .init           = decode_init,
     .decode         = decode_frame,
+    .flush          = decode_flush,
     .close          = decode_close,
     .capabilities   = AV_CODEC_CAP_DR1,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,