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