* JPEG 2000 encoder using libopenjpeg
*/
-#define OPJ_STATIC
-
#include "libavutil/avassert.h"
#include "libavutil/common.h"
#include "libavutil/imgutils.h"
typedef struct LibOpenJPEGContext {
AVClass *avclass;
+#if OPENJPEG_MAJOR_VERSION == 1
opj_image_t *image;
+#endif // OPENJPEG_MAJOR_VERSION == 1
opj_cparameters_t enc_params;
#if OPENJPEG_MAJOR_VERSION == 1
opj_event_mgr_t event_mgr;
cinema_parameters(&ctx->enc_params);
}
+#if OPENJPEG_MAJOR_VERSION == 1
ctx->image = mj2_create_image(avctx, &ctx->enc_params);
if (!ctx->image) {
av_log(avctx, AV_LOG_ERROR, "Error creating the mj2 image\n");
err = AVERROR(EINVAL);
goto fail;
}
+#endif // OPENJPEG_MAJOR_VERSION == 1
return 0;
fail:
+#if OPENJPEG_MAJOR_VERSION == 1
opj_image_destroy(ctx->image);
ctx->image = NULL;
+#endif // OPENJPEG_MAJOR_VERSION == 1
return err;
}
for (; y < image->comps[compno].h; ++y) {
image_line = image->comps[compno].data + y * image->comps[compno].w;
for (x = 0; x < image->comps[compno].w; ++x) {
- image_line[x] = image_line[x - image->comps[compno].w];
+ image_line[x] = image_line[x - (int)image->comps[compno].w];
}
}
}
for (; y < image->comps[compno].h; ++y) {
image_line = image->comps[compno].data + y * image->comps[compno].w;
for (x = 0; x < image->comps[compno].w; ++x) {
- image_line[x] = image_line[x - image->comps[compno].w];
+ image_line[x] = image_line[x - (int)image->comps[compno].w];
}
}
}
for (; y < image->comps[compno].h; ++y) {
image_line = image->comps[compno].data + y * image->comps[compno].w;
for (x = 0; x < image->comps[compno].w; ++x) {
- image_line[x] = image_line[x - image->comps[compno].w];
+ image_line[x] = image_line[x - (int)image->comps[compno].w];
}
}
}
}
for (compno = 0; compno < numcomps; ++compno) {
- width = avctx->width / image->comps[compno].dx;
- height = avctx->height / image->comps[compno].dy;
+ width = (avctx->width + image->comps[compno].dx - 1) / image->comps[compno].dx;
+ height = (avctx->height + image->comps[compno].dy - 1) / image->comps[compno].dy;
for (y = 0; y < height; ++y) {
image_line = image->comps[compno].data + y * image->comps[compno].w;
frame_index = y * frame->linesize[compno];
for (; y < image->comps[compno].h; ++y) {
image_line = image->comps[compno].data + y * image->comps[compno].w;
for (x = 0; x < image->comps[compno].w; ++x) {
- image_line[x] = image_line[x - image->comps[compno].w];
+ image_line[x] = image_line[x - (int)image->comps[compno].w];
}
}
}
}
for (compno = 0; compno < numcomps; ++compno) {
- width = avctx->width / image->comps[compno].dx;
- height = avctx->height / image->comps[compno].dy;
+ width = (avctx->width + image->comps[compno].dx - 1) / image->comps[compno].dx;
+ height = (avctx->height + image->comps[compno].dy - 1) / image->comps[compno].dy;
frame_ptr = (uint16_t *)frame->data[compno];
for (y = 0; y < height; ++y) {
image_line = image->comps[compno].data + y * image->comps[compno].w;
for (; y < image->comps[compno].h; ++y) {
image_line = image->comps[compno].data + y * image->comps[compno].w;
for (x = 0; x < image->comps[compno].w; ++x) {
- image_line[x] = image_line[x - image->comps[compno].w];
+ image_line[x] = image_line[x - (int)image->comps[compno].w];
}
}
}
const AVFrame *frame, int *got_packet)
{
LibOpenJPEGContext *ctx = avctx->priv_data;
- opj_image_t *image = ctx->image;
+ int ret;
+ AVFrame *gbrframe;
+ int cpyresult = 0;
#if OPENJPEG_MAJOR_VERSION == 1
+ opj_image_t *image = ctx->image;
opj_cinfo_t *compress = NULL;
opj_cio_t *stream = NULL;
int len;
#else // OPENJPEG_MAJOR_VERSION == 2
+ PacketWriter writer = { 0 };
opj_codec_t *compress = NULL;
opj_stream_t *stream = NULL;
- PacketWriter writer = { 0 };
+ opj_image_t *image = mj2_create_image(avctx, &ctx->enc_params);
+ if (!image) {
+ av_log(avctx, AV_LOG_ERROR, "Error creating the mj2 image\n");
+ ret = AVERROR(EINVAL);
+ goto done;
+ }
#endif // OPENJPEG_MAJOR_VERSION == 1
- int cpyresult = 0;
- int ret;
- AVFrame *gbrframe;
switch (avctx->pix_fmt) {
case AV_PIX_FMT_RGB24:
case AV_PIX_FMT_GBRP14:
case AV_PIX_FMT_GBRP16:
gbrframe = av_frame_clone(frame);
- if (!gbrframe)
- return AVERROR(ENOMEM);
+ if (!gbrframe) {
+ ret = AVERROR(ENOMEM);
+ goto done;
+ }
gbrframe->data[0] = frame->data[2]; // swap to be rgb
gbrframe->data[1] = frame->data[0];
gbrframe->data[2] = frame->data[1];
av_log(avctx, AV_LOG_ERROR,
"The frame's pixel format '%s' is not supported\n",
av_get_pix_fmt_name(avctx->pix_fmt));
- return AVERROR(EINVAL);
+ ret = AVERROR(EINVAL);
+ goto done;
break;
}
if (!cpyresult) {
av_log(avctx, AV_LOG_ERROR,
"Could not copy the frame data to the internal image buffer\n");
- return -1;
+ ret = -1;
+ goto done;
}
#if OPENJPEG_MAJOR_VERSION == 2
if ((ret = ff_alloc_packet2(avctx, pkt, 1024, 0)) < 0) {
- return ret;
+ goto done;
}
#endif // OPENJPEG_MAJOR_VERSION == 2
#error Missing call to opj_stream_set_user_data
#endif
- if (!opj_start_compress(compress, ctx->image, stream) ||
+ if (!opj_start_compress(compress, image, stream) ||
!opj_encode(compress, stream) ||
!opj_end_compress(compress, stream)) {
av_log(avctx, AV_LOG_ERROR, "Error during the opj encode\n");
#if OPENJPEG_MAJOR_VERSION == 2
opj_stream_destroy(stream);
opj_destroy_codec(compress);
+ opj_image_destroy(image);
#else
opj_cio_close(stream);
opj_destroy_compress(compress);
static av_cold int libopenjpeg_encode_close(AVCodecContext *avctx)
{
+#if OPENJPEG_MAJOR_VERSION == 1
LibOpenJPEGContext *ctx = avctx->priv_data;
opj_image_destroy(ctx->image);
ctx->image = NULL;
+#endif // OPENJPEG_MAJOR_VERSION == 1
return 0;
}