| @@ -36,7 +36,7 @@ typedef struct HuffCode { | |||
| typedef struct MotionPixelsContext { | |||
| AVCodecContext *avctx; | |||
| AVFrame frame; | |||
| AVFrame *frame; | |||
| DSPContext dsp; | |||
| uint8_t *changes_map; | |||
| int offset_bits_len; | |||
| @@ -50,6 +50,19 @@ typedef struct MotionPixelsContext { | |||
| int bswapbuf_size; | |||
| } MotionPixelsContext; | |||
| static av_cold int mp_decode_end(AVCodecContext *avctx) | |||
| { | |||
| MotionPixelsContext *mp = avctx->priv_data; | |||
| av_freep(&mp->changes_map); | |||
| av_freep(&mp->vpt); | |||
| av_freep(&mp->hpt); | |||
| av_freep(&mp->bswapbuf); | |||
| av_frame_free(&mp->frame); | |||
| return 0; | |||
| } | |||
| static av_cold int mp_decode_init(AVCodecContext *avctx) | |||
| { | |||
| MotionPixelsContext *mp = avctx->priv_data; | |||
| @@ -64,7 +77,13 @@ static av_cold int mp_decode_init(AVCodecContext *avctx) | |||
| mp->vpt = av_mallocz(avctx->height * sizeof(YuvPixel)); | |||
| mp->hpt = av_mallocz(h4 * w4 / 16 * sizeof(YuvPixel)); | |||
| avctx->pix_fmt = AV_PIX_FMT_RGB555; | |||
| avcodec_get_frame_defaults(&mp->frame); | |||
| mp->frame = av_frame_alloc(); | |||
| if (!mp->frame) { | |||
| mp_decode_end(avctx); | |||
| return AVERROR(ENOMEM); | |||
| } | |||
| return 0; | |||
| } | |||
| @@ -85,14 +104,14 @@ static void mp_read_changes_map(MotionPixelsContext *mp, GetBitContext *gb, int | |||
| continue; | |||
| w = FFMIN(w, mp->avctx->width - x); | |||
| h = FFMIN(h, mp->avctx->height - y); | |||
| pixels = (uint16_t *)&mp->frame.data[0][y * mp->frame.linesize[0] + x * 2]; | |||
| pixels = (uint16_t *)&mp->frame->data[0][y * mp->frame->linesize[0] + x * 2]; | |||
| while (h--) { | |||
| mp->changes_map[offset] = w; | |||
| if (read_color) | |||
| for (i = 0; i < w; ++i) | |||
| pixels[i] = color; | |||
| offset += mp->avctx->width; | |||
| pixels += mp->frame.linesize[0] / 2; | |||
| pixels += mp->frame->linesize[0] / 2; | |||
| } | |||
| } | |||
| } | |||
| @@ -144,7 +163,7 @@ static YuvPixel mp_get_yuv_from_rgb(MotionPixelsContext *mp, int x, int y) | |||
| { | |||
| int color; | |||
| color = *(uint16_t *)&mp->frame.data[0][y * mp->frame.linesize[0] + x * 2]; | |||
| color = *(uint16_t *)&mp->frame->data[0][y * mp->frame->linesize[0] + x * 2]; | |||
| return mp_rgb_yuv_table[color]; | |||
| } | |||
| @@ -153,7 +172,7 @@ static void mp_set_rgb_from_yuv(MotionPixelsContext *mp, int x, int y, const Yuv | |||
| int color; | |||
| color = mp_yuv_to_rgb(p->y, p->v, p->u, 1); | |||
| *(uint16_t *)&mp->frame.data[0][y * mp->frame.linesize[0] + x * 2] = color; | |||
| *(uint16_t *)&mp->frame->data[0][y * mp->frame->linesize[0] + x * 2] = color; | |||
| } | |||
| static int mp_get_vlc(MotionPixelsContext *mp, GetBitContext *gb) | |||
| @@ -248,7 +267,7 @@ static int mp_decode_frame(AVCodecContext *avctx, | |||
| GetBitContext gb; | |||
| int i, count1, count2, sz, ret; | |||
| if ((ret = ff_reget_buffer(avctx, &mp->frame)) < 0) { | |||
| if ((ret = ff_reget_buffer(avctx, mp->frame)) < 0) { | |||
| av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); | |||
| return ret; | |||
| } | |||
| @@ -276,7 +295,7 @@ static int mp_decode_frame(AVCodecContext *avctx, | |||
| goto end; | |||
| if (mp->changes_map[0] == 0) { | |||
| *(uint16_t *)mp->frame.data[0] = get_bits(&gb, 15); | |||
| *(uint16_t *)mp->frame->data[0] = get_bits(&gb, 15); | |||
| mp->changes_map[0] = 1; | |||
| } | |||
| mp_read_codes_table(mp, &gb); | |||
| @@ -295,25 +314,12 @@ static int mp_decode_frame(AVCodecContext *avctx, | |||
| ff_free_vlc(&mp->vlc); | |||
| end: | |||
| if ((ret = av_frame_ref(data, &mp->frame)) < 0) | |||
| if ((ret = av_frame_ref(data, mp->frame)) < 0) | |||
| return ret; | |||
| *got_frame = 1; | |||
| return buf_size; | |||
| } | |||
| static av_cold int mp_decode_end(AVCodecContext *avctx) | |||
| { | |||
| MotionPixelsContext *mp = avctx->priv_data; | |||
| av_freep(&mp->changes_map); | |||
| av_freep(&mp->vpt); | |||
| av_freep(&mp->hpt); | |||
| av_freep(&mp->bswapbuf); | |||
| av_frame_unref(&mp->frame); | |||
| return 0; | |||
| } | |||
| AVCodec ff_motionpixels_decoder = { | |||
| .name = "motionpixels", | |||
| .long_name = NULL_IF_CONFIG_SMALL("Motion Pixels video"), | |||