X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flibopenjpegdec.c;h=7f28e87d7f6ce8a5a5654bd44f6075ddbe2dc55e;hb=58995f647b5fa2e1efa33ae4f8b8a76a81ec99df;hp=ab681f1246afd13bf2189cde89fbf77700202141;hpb=61e1287551cd912b9744b7ffa813686afa1f97e2;p=ffmpeg diff --git a/libavcodec/libopenjpegdec.c b/libavcodec/libopenjpegdec.c index ab681f1246a..7f28e87d7f6 100644 --- a/libavcodec/libopenjpegdec.c +++ b/libavcodec/libopenjpegdec.c @@ -83,9 +83,25 @@ static const enum AVPixelFormat libopenjpeg_all_pix_fmts[] = { typedef struct LibOpenJPEGContext { AVClass *class; opj_dparameters_t dec_params; + opj_event_mgr_t event_mgr; int lowqual; } LibOpenJPEGContext; +static void error_callback(const char *msg, void *data) +{ + av_log(data, AV_LOG_ERROR, "%s", msg); +} + +static void warning_callback(const char *msg, void *data) +{ + av_log(data, AV_LOG_WARNING, "%s", msg); +} + +static void info_callback(const char *msg, void *data) +{ + av_log(data, AV_LOG_DEBUG, "%s", msg); +} + static inline int libopenjpeg_matches_pix_fmt(const opj_image_t *image, enum AVPixelFormat pix_fmt) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); @@ -286,7 +302,11 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, av_log(avctx, AV_LOG_ERROR, "Error initializing decoder.\n"); return AVERROR_UNKNOWN; } - opj_set_event_mgr((opj_common_ptr) dec, NULL, NULL); + memset(&ctx->event_mgr, 0, sizeof(ctx->event_mgr)); + 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) dec, &ctx->event_mgr, avctx); ctx->dec_params.cp_limit_decoding = LIMIT_TO_MAIN_HEADER; ctx->dec_params.cp_layer = ctx->lowqual; // Tie decoder with decoding parameters @@ -413,6 +433,15 @@ done: return ret; } +static av_cold void libopenjpeg_static_init(AVCodec *codec) +{ + const char *version = opj_version(); + int major, minor; + + if (sscanf(version, "%d.%d", &major, &minor) == 2 && 1000*major + minor <= 1003) + codec->capabilities |= CODEC_CAP_EXPERIMENTAL; +} + #define OFFSET(x) offsetof(LibOpenJPEGContext, x) #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM @@ -440,4 +469,5 @@ AVCodec ff_libopenjpeg_decoder = { .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS, .max_lowres = 31, .priv_class = &openjpeg_class, + .init_static_data = libopenjpeg_static_init, };