| @@ -34,7 +34,7 @@ | |||
| #include "internal.h" | |||
| typedef struct BethsoftvidContext { | |||
| AVFrame frame; | |||
| AVFrame *frame; | |||
| GetByteContext g; | |||
| } BethsoftvidContext; | |||
| @@ -42,13 +42,17 @@ static av_cold int bethsoftvid_decode_init(AVCodecContext *avctx) | |||
| { | |||
| BethsoftvidContext *vid = avctx->priv_data; | |||
| avctx->pix_fmt = AV_PIX_FMT_PAL8; | |||
| avcodec_get_frame_defaults(&vid->frame); | |||
| vid->frame = av_frame_alloc(); | |||
| if (!vid->frame) | |||
| return AVERROR(ENOMEM); | |||
| return 0; | |||
| } | |||
| static int set_palette(BethsoftvidContext *ctx) | |||
| { | |||
| uint32_t *palette = (uint32_t *)ctx->frame.data[1]; | |||
| uint32_t *palette = (uint32_t *)ctx->frame->data[1]; | |||
| int a; | |||
| if (bytestream2_get_bytes_left(&ctx->g) < 256*3) | |||
| @@ -57,7 +61,7 @@ static int set_palette(BethsoftvidContext *ctx) | |||
| for(a = 0; a < 256; a++){ | |||
| palette[a] = bytestream2_get_be24u(&ctx->g) * 4; | |||
| } | |||
| ctx->frame.palette_has_changed = 1; | |||
| ctx->frame->palette_has_changed = 1; | |||
| return 0; | |||
| } | |||
| @@ -74,11 +78,11 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx, | |||
| int code, ret; | |||
| int yoffset; | |||
| if ((ret = ff_reget_buffer(avctx, &vid->frame)) < 0) { | |||
| if ((ret = ff_reget_buffer(avctx, vid->frame)) < 0) { | |||
| av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); | |||
| return ret; | |||
| } | |||
| wrap_to_next_line = vid->frame.linesize[0] - avctx->width; | |||
| wrap_to_next_line = vid->frame->linesize[0] - avctx->width; | |||
| if (avpkt->side_data_elems > 0 && | |||
| avpkt->side_data[0].type == AV_PKT_DATA_PALETTE) { | |||
| @@ -89,8 +93,8 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx, | |||
| } | |||
| bytestream2_init(&vid->g, avpkt->data, avpkt->size); | |||
| dst = vid->frame.data[0]; | |||
| frame_end = vid->frame.data[0] + vid->frame.linesize[0] * avctx->height; | |||
| dst = vid->frame->data[0]; | |||
| frame_end = vid->frame->data[0] + vid->frame->linesize[0] * avctx->height; | |||
| switch(block_type = bytestream2_get_byte(&vid->g)){ | |||
| case PALETTE_BLOCK: { | |||
| @@ -105,7 +109,7 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx, | |||
| yoffset = bytestream2_get_le16(&vid->g); | |||
| if(yoffset >= avctx->height) | |||
| return AVERROR_INVALIDDATA; | |||
| dst += vid->frame.linesize[0] * yoffset; | |||
| dst += vid->frame->linesize[0] * yoffset; | |||
| } | |||
| // main code | |||
| @@ -135,7 +139,7 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx, | |||
| } | |||
| end: | |||
| if ((ret = av_frame_ref(data, &vid->frame)) < 0) | |||
| if ((ret = av_frame_ref(data, vid->frame)) < 0) | |||
| return ret; | |||
| *got_frame = 1; | |||
| @@ -146,7 +150,7 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx, | |||
| static av_cold int bethsoftvid_decode_end(AVCodecContext *avctx) | |||
| { | |||
| BethsoftvidContext * vid = avctx->priv_data; | |||
| av_frame_unref(&vid->frame); | |||
| av_frame_free(&vid->frame); | |||
| return 0; | |||
| } | |||