aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean First <jeanfirst@gmail.com>2015-02-02 12:57:03 +0100
committerMichael Niedermayer <michaelni@gmx.at>2015-02-02 17:54:05 +0100
commitecc92ee717eac18540e236ee27e9052cd2917800 (patch)
tree6017aeacee2df447c6d22cb12b85a81e1365ee50
parent6d1d036e2ca8a62067037eed73b16766bf5265b4 (diff)
downloadffmpeg-ecc92ee717eac18540e236ee27e9052cd2917800.tar.gz
lavc/libopenjpegenc: move opj_create_compress, opj_cio_open and opj_set_event_mgr to libopenjpeg_encode_frame
libopenjpegenc crashes with "pointer being freed was not allocated" when threading is enabled with: ffmpeg -i tests/vsynth1/01.pgm -vcodec libopenjpeg file.j2k this appears to be a bug in libopenjpeg Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/libopenjpegenc.c42
1 files changed, 20 insertions, 22 deletions
diff --git a/libavcodec/libopenjpegenc.c b/libavcodec/libopenjpegenc.c
index 0a4658d8cf..9565e5decf 100644
--- a/libavcodec/libopenjpegenc.c
+++ b/libavcodec/libopenjpegenc.c
@@ -43,9 +43,7 @@
typedef struct {
AVClass *avclass;
opj_image_t *image;
- opj_cio_t *stream;
opj_cparameters_t enc_params;
- opj_cinfo_t *compress;
opj_event_mgr_t event_mgr;
int format;
int profile;
@@ -234,12 +232,6 @@ static av_cold int libopenjpeg_encode_init(AVCodecContext *avctx)
cinema_parameters(&ctx->enc_params);
}
- ctx->compress = opj_create_compress(ctx->format);
- if (!ctx->compress) {
- av_log(avctx, AV_LOG_ERROR, "Error creating the compressor\n");
- return AVERROR(ENOMEM);
- }
-
ctx->image = mj2_create_image(avctx, &ctx->enc_params);
if (!ctx->image) {
av_log(avctx, AV_LOG_ERROR, "Error creating the mj2 image\n");
@@ -253,17 +245,9 @@ static av_cold int libopenjpeg_encode_init(AVCodecContext *avctx)
goto fail;
}
- memset(&ctx->event_mgr, 0, sizeof(opj_event_mgr_t));
- ctx->event_mgr.info_handler = info_callback;
- ctx->event_mgr.error_handler = error_callback;
- ctx->event_mgr.warning_handler = warning_callback;
- opj_set_event_mgr((opj_common_ptr) ctx->compress, &ctx->event_mgr, avctx);
-
return 0;
fail:
- opj_destroy_compress(ctx->compress);
- ctx->compress = NULL;
opj_image_destroy(ctx->image);
ctx->image = NULL;
av_freep(&avctx->coded_frame);
@@ -477,9 +461,9 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
const AVFrame *frame, int *got_packet)
{
LibOpenJPEGContext *ctx = avctx->priv_data;
- opj_cinfo_t *compress = ctx->compress;
opj_image_t *image = ctx->image;
- opj_cio_t *stream = ctx->stream;
+ opj_cinfo_t *compress = NULL;
+ opj_cio_t *stream = NULL;
int cpyresult = 0;
int ret, len;
AVFrame *gbrframe;
@@ -573,6 +557,12 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
return -1;
}
+ compress = opj_create_compress(ctx->format);
+ if (!compress) {
+ av_log(avctx, AV_LOG_ERROR, "Error creating the compressor\n");
+ return AVERROR(ENOMEM);
+ }
+
opj_setup_encoder(compress, &ctx->enc_params, image);
stream = opj_cio_open((opj_common_ptr) compress, NULL, 0);
@@ -581,6 +571,12 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
return AVERROR(ENOMEM);
}
+ memset(&ctx->event_mgr, 0, sizeof(opj_event_mgr_t));
+ ctx->event_mgr.info_handler = info_callback;
+ ctx->event_mgr.error_handler = error_callback;
+ ctx->event_mgr.warning_handler = warning_callback;
+ opj_set_event_mgr((opj_common_ptr) compress, &ctx->event_mgr, avctx);
+
if (!opj_encode(compress, stream, image, NULL)) {
av_log(avctx, AV_LOG_ERROR, "Error during the opj encode\n");
return -1;
@@ -594,6 +590,12 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
memcpy(pkt->data, stream->buffer, len);
pkt->flags |= AV_PKT_FLAG_KEY;
*got_packet = 1;
+
+ opj_cio_close(stream);
+ stream = NULL;
+ opj_destroy_compress(compress);
+ compress = NULL;
+
return 0;
}
@@ -601,10 +603,6 @@ static av_cold int libopenjpeg_encode_close(AVCodecContext *avctx)
{
LibOpenJPEGContext *ctx = avctx->priv_data;
- opj_cio_close(ctx->stream);
- ctx->stream = NULL;
- opj_destroy_compress(ctx->compress);
- ctx->compress = NULL;
opj_image_destroy(ctx->image);
ctx->image = NULL;
av_freep(&avctx->coded_frame);