Commit b605b123 authored by Anton Khirnov's avatar Anton Khirnov

mxpegdec: use the AVFrame API properly.

parent afa21a12
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
typedef struct MXpegDecodeContext { typedef struct MXpegDecodeContext {
MJpegDecodeContext jpg; MJpegDecodeContext jpg;
AVFrame picture[2]; /* pictures array */ AVFrame *picture[2]; /* pictures array */
int picture_index; /* index of current picture */ int picture_index; /* index of current picture */
int got_sof_data; /* true if SOF data successfully parsed */ int got_sof_data; /* true if SOF data successfully parsed */
int got_mxm_bitmask; /* true if MXM bitmask available */ int got_mxm_bitmask; /* true if MXM bitmask available */
...@@ -42,11 +42,36 @@ typedef struct MXpegDecodeContext { ...@@ -42,11 +42,36 @@ typedef struct MXpegDecodeContext {
unsigned mb_width, mb_height; /* size of picture in MB's from MXM header */ unsigned mb_width, mb_height; /* size of picture in MB's from MXM header */
} MXpegDecodeContext; } MXpegDecodeContext;
static av_cold int mxpeg_decode_end(AVCodecContext *avctx)
{
MXpegDecodeContext *s = avctx->priv_data;
MJpegDecodeContext *jpg = &s->jpg;
int i;
jpg->picture_ptr = NULL;
ff_mjpeg_decode_end(avctx);
for (i = 0; i < 2; ++i)
av_frame_free(&s->picture[i]);
av_freep(&s->mxm_bitmask);
av_freep(&s->completion_bitmask);
return 0;
}
static av_cold int mxpeg_decode_init(AVCodecContext *avctx) static av_cold int mxpeg_decode_init(AVCodecContext *avctx)
{ {
MXpegDecodeContext *s = avctx->priv_data; MXpegDecodeContext *s = avctx->priv_data;
s->jpg.picture_ptr = &s->picture[0]; s->picture[0] = av_frame_alloc();
s->picture[1] = av_frame_alloc();
if (!s->picture[0] || !s->picture[1]) {
mxpeg_decode_end(avctx);
return AVERROR(ENOMEM);
}
s->jpg.picture_ptr = s->picture[0];
return ff_mjpeg_decode_init(avctx); return ff_mjpeg_decode_init(avctx);
} }
...@@ -261,7 +286,7 @@ static int mxpeg_decode_frame(AVCodecContext *avctx, ...@@ -261,7 +286,7 @@ static int mxpeg_decode_frame(AVCodecContext *avctx,
} }
if (s->got_mxm_bitmask) { if (s->got_mxm_bitmask) {
AVFrame *reference_ptr = &s->picture[s->picture_index ^ 1]; AVFrame *reference_ptr = s->picture[s->picture_index ^ 1];
if (mxpeg_check_dimensions(s, jpg, reference_ptr) < 0) if (mxpeg_check_dimensions(s, jpg, reference_ptr) < 0)
break; break;
...@@ -298,7 +323,7 @@ the_end: ...@@ -298,7 +323,7 @@ the_end:
*got_frame = 1; *got_frame = 1;
s->picture_index ^= 1; s->picture_index ^= 1;
jpg->picture_ptr = &s->picture[s->picture_index]; jpg->picture_ptr = s->picture[s->picture_index];
if (!s->has_complete_frame) { if (!s->has_complete_frame) {
if (!s->got_mxm_bitmask) if (!s->got_mxm_bitmask)
...@@ -311,24 +336,6 @@ the_end: ...@@ -311,24 +336,6 @@ the_end:
return buf_ptr - buf; return buf_ptr - buf;
} }
static av_cold int mxpeg_decode_end(AVCodecContext *avctx)
{
MXpegDecodeContext *s = avctx->priv_data;
MJpegDecodeContext *jpg = &s->jpg;
int i;
jpg->picture_ptr = NULL;
ff_mjpeg_decode_end(avctx);
for (i = 0; i < 2; ++i)
av_frame_unref(&s->picture[i]);
av_freep(&s->mxm_bitmask);
av_freep(&s->completion_bitmask);
return 0;
}
AVCodec ff_mxpeg_decoder = { AVCodec ff_mxpeg_decoder = {
.name = "mxpeg", .name = "mxpeg",
.long_name = NULL_IF_CONFIG_SMALL("Mobotix MxPEG video"), .long_name = NULL_IF_CONFIG_SMALL("Mobotix MxPEG video"),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment