*/
/**
- * @file flashsv.c
+ * @file libavcodec/flashsv.c
* Flash Screen Video decoder
* @author Alex Beregszaszi
* @author Benjamin Larsson
#include <stdio.h>
#include <stdlib.h>
-#include "common.h"
#include "avcodec.h"
-#include "bitstream.h"
+#include "get_bits.h"
-#ifdef CONFIG_ZLIB
#include <zlib.h>
-#endif
typedef struct FlashSVContext {
AVCodecContext *avctx;
int block_width, block_height;
uint8_t* tmpblock;
int block_size;
-#ifdef CONFIG_ZLIB
z_stream zstream;
-#endif
} FlashSVContext;
}
-static int flashsv_decode_init(AVCodecContext *avctx)
+static av_cold int flashsv_decode_init(AVCodecContext *avctx)
{
- FlashSVContext *s = (FlashSVContext *)avctx->priv_data;
+ FlashSVContext *s = avctx->priv_data;
int zret; // Zlib return code
s->avctx = avctx;
-#ifdef CONFIG_ZLIB
s->zstream.zalloc = Z_NULL;
s->zstream.zfree = Z_NULL;
s->zstream.opaque = Z_NULL;
av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
return 1;
}
-#else
- av_log(avctx, AV_LOG_ERROR, "Zlib support not compiled. Needed for the decoder.\n");
- return 1;
-#endif
avctx->pix_fmt = PIX_FMT_BGR24;
- avctx->has_b_frames = 0;
s->frame.data[0] = NULL;
return 0;
static int flashsv_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
- uint8_t *buf, int buf_size)
+ AVPacket *avpkt)
{
- FlashSVContext *s = (FlashSVContext *)avctx->priv_data;
+ const uint8_t *buf = avpkt->data;
+ int buf_size = avpkt->size;
+ FlashSVContext *s = avctx->priv_data;
int h_blocks, v_blocks, h_part, v_part, i, j;
GetBitContext gb;
if(s->block_size < s->block_width*s->block_height) {
if (s->tmpblock != NULL)
av_free(s->tmpblock);
- s->block_size = s->block_width*s->block_height;
- if ((s->tmpblock = av_malloc(3*s->block_size)) == NULL) {
+ if ((s->tmpblock = av_malloc(3*s->block_width*s->block_height)) == NULL) {
av_log(avctx, AV_LOG_ERROR, "Can't allocate decompression buffer.\n");
return -1;
}
}
+ s->block_size = s->block_width*s->block_height;
/* init the image size once */
if((avctx->width==0) && (avctx->height==0)){
/* no change, don't do anything */
} else {
/* decompress block */
-#ifdef CONFIG_ZLIB
int ret = inflateReset(&(s->zstream));
if (ret != Z_OK)
{
ret = inflate(&(s->zstream), Z_FINISH);
if (ret == Z_DATA_ERROR)
{
- av_log(avctx, AV_LOG_ERROR, "Zlib resync occured\n");
+ av_log(avctx, AV_LOG_ERROR, "Zlib resync occurred\n");
inflateSync(&(s->zstream));
ret = inflate(&(s->zstream), Z_FINISH);
}
av_log(avctx, AV_LOG_ERROR, "error in decompression of block %dx%d: %d\n", i, j, ret);
/* return -1; */
}
-#else
- av_log(avctx, AV_LOG_ERROR, "Zlib support not compiled in.\n");
- return -1;
-#endif
copy_region(s->tmpblock, s->frame.data[0], s->image_height-(hp+hs+1), wp, hs, ws, s->frame.linesize[0]);
- skip_bits(&gb, 8*size); /* skip the consumed bits */
+ skip_bits_long(&gb, 8*size); /* skip the consumed bits */
}
}
}
}
-static int flashsv_decode_end(AVCodecContext *avctx)
+static av_cold int flashsv_decode_end(AVCodecContext *avctx)
{
- FlashSVContext *s = (FlashSVContext *)avctx->priv_data;
-#ifdef CONFIG_ZLIB
+ FlashSVContext *s = avctx->priv_data;
inflateEnd(&(s->zstream));
-#endif
/* release the frame if needed */
if (s->frame.data[0])
avctx->release_buffer(avctx, &s->frame);
flashsv_decode_end,
flashsv_decode_frame,
CODEC_CAP_DR1,
- .pix_fmts = (enum PixelFormat[]){PIX_FMT_BGR24, -1},
+ .pix_fmts = (enum PixelFormat[]){PIX_FMT_BGR24, PIX_FMT_NONE},
+ .long_name = NULL_IF_CONFIG_SMALL("Flash Screen Video v1"),
};