X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flibopenjpegenc.c;h=d1af0210e320725850f15167202bc3fc927b65d2;hb=e328178da90f44690e0076f4dbfd16da9175f441;hp=ed2ae3ac4a1c8a5e7e4419b7a666cd528d0edfb6;hpb=7ebe3962f399dcddc852bda92e595b0152c3701d;p=ffmpeg diff --git a/libavcodec/libopenjpegenc.c b/libavcodec/libopenjpegenc.c index ed2ae3ac4a1..d1af0210e32 100644 --- a/libavcodec/libopenjpegenc.c +++ b/libavcodec/libopenjpegenc.c @@ -34,7 +34,7 @@ #include "avcodec.h" #include "internal.h" -typedef struct { +typedef struct LibOpenJPEGContext { AVClass *avclass; opj_image_t *image; opj_cparameters_t enc_params; @@ -69,50 +69,52 @@ static void info_callback(const char *msg, void *data) static opj_image_t *libopenjpeg_create_image(AVCodecContext *avctx, opj_cparameters_t *parameters) { + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt); opj_image_cmptparm_t *cmptparm; OPJ_COLOR_SPACE color_space; opj_image_t *img; int i; int sub_dx[4]; int sub_dy[4]; - int numcomps = av_pix_fmt_descriptors[avctx->pix_fmt].nb_components; + int numcomps = desc->nb_components; sub_dx[0] = sub_dx[3] = 1; sub_dy[0] = sub_dy[3] = 1; sub_dx[1] = - sub_dx[2] = 1 << av_pix_fmt_descriptors[avctx->pix_fmt].log2_chroma_w; + sub_dx[2] = 1 << desc->log2_chroma_w; sub_dy[1] = - sub_dy[2] = 1 << av_pix_fmt_descriptors[avctx->pix_fmt].log2_chroma_h; + sub_dy[2] = 1 << desc->log2_chroma_h; switch (avctx->pix_fmt) { - case PIX_FMT_GRAY8: - case PIX_FMT_GRAY16: - case PIX_FMT_Y400A: + case AV_PIX_FMT_GRAY8: + case AV_PIX_FMT_GRAY16: + case AV_PIX_FMT_YA8: color_space = CLRSPC_GRAY; break; - case PIX_FMT_RGB24: - case PIX_FMT_RGBA: - case PIX_FMT_RGB48: + case AV_PIX_FMT_RGB24: + case AV_PIX_FMT_RGBA: + case AV_PIX_FMT_RGB48: + case AV_PIX_FMT_RGBA64: color_space = CLRSPC_SRGB; break; - case PIX_FMT_YUV410P: - case PIX_FMT_YUV411P: - case PIX_FMT_YUV420P: - case PIX_FMT_YUV422P: - case PIX_FMT_YUV440P: - case PIX_FMT_YUV444P: - case PIX_FMT_YUVA420P: - case PIX_FMT_YUV420P9: - case PIX_FMT_YUV422P9: - case PIX_FMT_YUV444P9: - case PIX_FMT_YUV420P10: - case PIX_FMT_YUV422P10: - case PIX_FMT_YUV444P10: - case PIX_FMT_YUV420P16: - case PIX_FMT_YUV422P16: - case PIX_FMT_YUV444P16: + case AV_PIX_FMT_YUV410P: + case AV_PIX_FMT_YUV411P: + case AV_PIX_FMT_YUV420P: + case AV_PIX_FMT_YUV422P: + case AV_PIX_FMT_YUV440P: + case AV_PIX_FMT_YUV444P: + case AV_PIX_FMT_YUVA420P: + case AV_PIX_FMT_YUV420P9: + case AV_PIX_FMT_YUV422P9: + case AV_PIX_FMT_YUV444P9: + case AV_PIX_FMT_YUV420P10: + case AV_PIX_FMT_YUV422P10: + case AV_PIX_FMT_YUV444P10: + case AV_PIX_FMT_YUV420P16: + case AV_PIX_FMT_YUV422P16: + case AV_PIX_FMT_YUV444P16: color_space = CLRSPC_SYCC; break; default: @@ -129,10 +131,8 @@ static opj_image_t *libopenjpeg_create_image(AVCodecContext *avctx, } for (i = 0; i < numcomps; i++) { - cmptparm[i].prec = - av_pix_fmt_descriptors[avctx->pix_fmt].comp[i].depth_minus1 + 1; - cmptparm[i].bpp = - av_pix_fmt_descriptors[avctx->pix_fmt].comp[i].depth_minus1 + 1; + cmptparm[i].prec = desc->comp[i].depth; + cmptparm[i].bpp = desc->comp[i].depth; cmptparm[i].sgnd = 0; cmptparm[i].dx = sub_dx[i]; cmptparm[i].dy = sub_dy[i]; @@ -169,12 +169,6 @@ static av_cold int libopenjpeg_encode_init(AVCodecContext *avctx) return AVERROR(ENOMEM); } - avctx->coded_frame = avcodec_alloc_frame(); - if (!avctx->coded_frame) { - av_log(avctx, AV_LOG_ERROR, "Error allocating coded frame\n"); - goto fail; - } - ctx->image = libopenjpeg_create_image(avctx, &ctx->enc_params); if (!ctx->image) { av_log(avctx, AV_LOG_ERROR, "Error creating the mj2 image\n"); @@ -185,13 +179,12 @@ static av_cold int libopenjpeg_encode_init(AVCodecContext *avctx) 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); + opj_set_event_mgr((opj_common_ptr) ctx->compress, &ctx->event_mgr, avctx); return 0; fail: av_freep(&ctx->compress); - av_freep(&avctx->coded_frame); return err; } @@ -203,7 +196,7 @@ static void libopenjpeg_copy_packed8(AVCodecContext *avctx, int image_index, frame_index; const int numcomps = image->numcomps; - for (compno = 0; compno < numcomps; ++compno) { + for (compno = 0; compno < numcomps; ++compno) for (y = 0; y < avctx->height; ++y) { image_index = y * avctx->width; frame_index = y * frame->linesize[0] + compno; @@ -213,7 +206,6 @@ static void libopenjpeg_copy_packed8(AVCodecContext *avctx, frame_index += numcomps; } } - } } static void libopenjpeg_copy_packed16(AVCodecContext *avctx, @@ -222,10 +214,10 @@ static void libopenjpeg_copy_packed16(AVCodecContext *avctx, int compno; int x, y; int image_index, frame_index; - const int numcomps = image->numcomps; - uint16_t *frame_ptr = (uint16_t*)frame->data[0]; + const int numcomps = image->numcomps; + uint16_t *frame_ptr = (uint16_t *)frame->data[0]; - for (compno = 0; compno < numcomps; ++compno) { + for (compno = 0; compno < numcomps; ++compno) for (y = 0; y < avctx->height; ++y) { image_index = y * avctx->width; frame_index = y * (frame->linesize[0] / 2) + compno; @@ -235,7 +227,6 @@ static void libopenjpeg_copy_packed16(AVCodecContext *avctx, frame_index += numcomps; } } - } } static void libopenjpeg_copy_unpacked8(AVCodecContext *avctx, @@ -248,7 +239,7 @@ static void libopenjpeg_copy_unpacked8(AVCodecContext *avctx, const int numcomps = image->numcomps; for (compno = 0; compno < numcomps; ++compno) { - width = avctx->width / image->comps[compno].dx; + width = avctx->width / image->comps[compno].dx; height = avctx->height / image->comps[compno].dy; for (y = 0; y < height; ++y) { image_index = y * width; @@ -272,9 +263,9 @@ static void libopenjpeg_copy_unpacked16(AVCodecContext *avctx, uint16_t *frame_ptr; for (compno = 0; compno < numcomps; ++compno) { - width = avctx->width / image->comps[compno].dx; - height = avctx->height / image->comps[compno].dy; - frame_ptr = (uint16_t*)frame->data[compno]; + width = avctx->width / image->comps[compno].dx; + height = avctx->height / image->comps[compno].dy; + frame_ptr = (uint16_t *)frame->data[compno]; for (y = 0; y < height; ++y) { image_index = y * width; frame_index = y * (frame->linesize[compno] / 2); @@ -289,8 +280,8 @@ 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_cinfo_t *compress = ctx->compress; + opj_image_t *image = ctx->image; opj_cio_t *stream; int ret, len; @@ -298,38 +289,39 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt, // x1, y1 is the width, height of the reference grid image->x0 = 0; image->y0 = 0; - image->x1 = (avctx->width - 1) * ctx->enc_params.subsampling_dx + 1; + image->x1 = (avctx->width - 1) * ctx->enc_params.subsampling_dx + 1; image->y1 = (avctx->height - 1) * ctx->enc_params.subsampling_dy + 1; switch (avctx->pix_fmt) { - case PIX_FMT_RGB24: - case PIX_FMT_RGBA: - case PIX_FMT_Y400A: + case AV_PIX_FMT_RGB24: + case AV_PIX_FMT_RGBA: + case AV_PIX_FMT_YA8: libopenjpeg_copy_packed8(avctx, frame, image); break; - case PIX_FMT_RGB48: + case AV_PIX_FMT_RGB48: + case AV_PIX_FMT_RGBA64: libopenjpeg_copy_packed16(avctx, frame, image); break; - case PIX_FMT_GRAY8: - case PIX_FMT_YUV410P: - case PIX_FMT_YUV411P: - case PIX_FMT_YUV420P: - case PIX_FMT_YUV422P: - case PIX_FMT_YUV440P: - case PIX_FMT_YUV444P: - case PIX_FMT_YUVA420P: + case AV_PIX_FMT_GRAY8: + case AV_PIX_FMT_YUV410P: + case AV_PIX_FMT_YUV411P: + case AV_PIX_FMT_YUV420P: + case AV_PIX_FMT_YUV422P: + case AV_PIX_FMT_YUV440P: + case AV_PIX_FMT_YUV444P: + case AV_PIX_FMT_YUVA420P: libopenjpeg_copy_unpacked8(avctx, frame, image); break; - case PIX_FMT_GRAY16: - case PIX_FMT_YUV420P9: - case PIX_FMT_YUV422P9: - case PIX_FMT_YUV444P9: - case PIX_FMT_YUV444P10: - case PIX_FMT_YUV422P10: - case PIX_FMT_YUV420P10: - case PIX_FMT_YUV444P16: - case PIX_FMT_YUV422P16: - case PIX_FMT_YUV420P16: + case AV_PIX_FMT_GRAY16: + case AV_PIX_FMT_YUV420P9: + case AV_PIX_FMT_YUV422P9: + case AV_PIX_FMT_YUV444P9: + case AV_PIX_FMT_YUV444P10: + case AV_PIX_FMT_YUV422P10: + case AV_PIX_FMT_YUV420P10: + case AV_PIX_FMT_YUV444P16: + case AV_PIX_FMT_YUV422P16: + case AV_PIX_FMT_YUV420P16: libopenjpeg_copy_unpacked16(avctx, frame, image); break; default: @@ -341,7 +333,7 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt, } opj_setup_encoder(compress, &ctx->enc_params, image); - stream = opj_cio_open((opj_common_ptr)compress, NULL, 0); + stream = opj_cio_open((opj_common_ptr) compress, NULL, 0); if (!stream) { av_log(avctx, AV_LOG_ERROR, "Error creating the cio stream\n"); return AVERROR(ENOMEM); @@ -372,36 +364,35 @@ static av_cold int libopenjpeg_encode_close(AVCodecContext *avctx) opj_destroy_compress(ctx->compress); opj_image_destroy(ctx->image); - av_freep(&avctx->coded_frame); return 0; } #define OFFSET(x) offsetof(LibOpenJPEGContext, x) #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM static const AVOption options[] = { - { "format", "Codec Format", OFFSET(format), AV_OPT_TYPE_INT, { CODEC_JP2 }, CODEC_J2K, CODEC_JP2, VE, "format" }, - { "j2k", NULL, 0, AV_OPT_TYPE_CONST, { CODEC_J2K }, 0, 0, VE, "format" }, - { "jp2", NULL, 0, AV_OPT_TYPE_CONST, { CODEC_JP2 }, 0, 0, VE, "format" }, - { "profile", NULL, OFFSET(profile), AV_OPT_TYPE_INT, { STD_RSIZ }, STD_RSIZ, CINEMA4K, VE, "profile" }, - { "jpeg2000", NULL, 0, AV_OPT_TYPE_CONST, { STD_RSIZ }, 0, 0, VE, "profile" }, - { "cinema2k", NULL, 0, AV_OPT_TYPE_CONST, { CINEMA2K }, 0, 0, VE, "profile" }, - { "cinema4k", NULL, 0, AV_OPT_TYPE_CONST, { CINEMA4K }, 0, 0, VE, "profile" }, - { "cinema_mode", "Digital Cinema", OFFSET(cinema_mode), AV_OPT_TYPE_INT, { OFF }, OFF, CINEMA4K_24, VE, "cinema_mode" }, - { "off", NULL, 0, AV_OPT_TYPE_CONST, { OFF }, 0, 0, VE, "cinema_mode" }, - { "2k_24", NULL, 0, AV_OPT_TYPE_CONST, { CINEMA2K_24 }, 0, 0, VE, "cinema_mode" }, - { "2k_48", NULL, 0, AV_OPT_TYPE_CONST, { CINEMA2K_48 }, 0, 0, VE, "cinema_mode" }, - { "4k_24", NULL, 0, AV_OPT_TYPE_CONST, { CINEMA4K_24 }, 0, 0, VE, "cinema_mode" }, - { "prog_order", "Progression Order", OFFSET(prog_order), AV_OPT_TYPE_INT, { LRCP }, LRCP, CPRL, VE, "prog_order" }, - { "lrcp", NULL, 0, AV_OPT_TYPE_CONST, { LRCP }, 0, 0, VE, "prog_order" }, - { "rlcp", NULL, 0, AV_OPT_TYPE_CONST, { RLCP }, 0, 0, VE, "prog_order" }, - { "rpcl", NULL, 0, AV_OPT_TYPE_CONST, { RPCL }, 0, 0, VE, "prog_order" }, - { "pcrl", NULL, 0, AV_OPT_TYPE_CONST, { PCRL }, 0, 0, VE, "prog_order" }, - { "cprl", NULL, 0, AV_OPT_TYPE_CONST, { CPRL }, 0, 0, VE, "prog_order" }, - { "numresolution", NULL, OFFSET(numresolution), AV_OPT_TYPE_INT, { 6 }, 1, 10, VE }, - { "numlayers", NULL, OFFSET(numlayers), AV_OPT_TYPE_INT, { 1 }, 1, 10, VE }, - { "disto_alloc", NULL, OFFSET(disto_alloc), AV_OPT_TYPE_INT, { 1 }, 0, 1, VE }, - { "fixed_alloc", NULL, OFFSET(fixed_alloc), AV_OPT_TYPE_INT, { 0 }, 0, 1, VE }, - { "fixed_quality", NULL, OFFSET(fixed_quality), AV_OPT_TYPE_INT, { 0 }, 0, 1, VE }, + { "format", "Codec Format", OFFSET(format), AV_OPT_TYPE_INT, { .i64 = CODEC_JP2 }, CODEC_J2K, CODEC_JP2, VE, "format" }, + { "j2k", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CODEC_J2K }, 0, 0, VE, "format" }, + { "jp2", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CODEC_JP2 }, 0, 0, VE, "format" }, + { "profile", NULL, OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = STD_RSIZ }, STD_RSIZ, CINEMA4K, VE, "profile" }, + { "jpeg2000", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = STD_RSIZ }, 0, 0, VE, "profile" }, + { "cinema2k", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA2K }, 0, 0, VE, "profile" }, + { "cinema4k", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA4K }, 0, 0, VE, "profile" }, + { "cinema_mode", "Digital Cinema", OFFSET(cinema_mode), AV_OPT_TYPE_INT, { .i64 = OFF }, OFF, CINEMA4K_24, VE, "cinema_mode" }, + { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OFF }, 0, 0, VE, "cinema_mode" }, + { "2k_24", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA2K_24 }, 0, 0, VE, "cinema_mode" }, + { "2k_48", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA2K_48 }, 0, 0, VE, "cinema_mode" }, + { "4k_24", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA4K_24 }, 0, 0, VE, "cinema_mode" }, + { "prog_order", "Progression Order", OFFSET(prog_order), AV_OPT_TYPE_INT, { .i64 = LRCP }, LRCP, CPRL, VE, "prog_order" }, + { "lrcp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LRCP }, 0, 0, VE, "prog_order" }, + { "rlcp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = RLCP }, 0, 0, VE, "prog_order" }, + { "rpcl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = RPCL }, 0, 0, VE, "prog_order" }, + { "pcrl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PCRL }, 0, 0, VE, "prog_order" }, + { "cprl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPRL }, 0, 0, VE, "prog_order" }, + { "numresolution", NULL, OFFSET(numresolution), AV_OPT_TYPE_INT, { .i64 = 6 }, 1, 10, VE }, + { "numlayers", NULL, OFFSET(numlayers), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, 10, VE }, + { "disto_alloc", NULL, OFFSET(disto_alloc), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE }, + { "fixed_alloc", NULL, OFFSET(fixed_alloc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, + { "fixed_quality", NULL, OFFSET(fixed_quality), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, { NULL }, }; @@ -414,6 +405,7 @@ static const AVClass class = { AVCodec ff_libopenjpeg_encoder = { .name = "libopenjpeg", + .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_JPEG2000, .priv_data_size = sizeof(LibOpenJPEGContext), @@ -421,17 +413,17 @@ AVCodec ff_libopenjpeg_encoder = { .encode2 = libopenjpeg_encode_frame, .close = libopenjpeg_encode_close, .capabilities = 0, - .pix_fmts = (const enum PixelFormat[]) { - PIX_FMT_RGB24, PIX_FMT_RGBA, PIX_FMT_RGB48, - PIX_FMT_GRAY8, PIX_FMT_GRAY16, PIX_FMT_Y400A, - PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUVA420P, - PIX_FMT_YUV440P, PIX_FMT_YUV444P, - PIX_FMT_YUV411P, PIX_FMT_YUV410P, - PIX_FMT_YUV420P9, PIX_FMT_YUV422P9, PIX_FMT_YUV444P9, - PIX_FMT_YUV420P10, PIX_FMT_YUV422P10, PIX_FMT_YUV444P10, - PIX_FMT_YUV420P16, PIX_FMT_YUV422P16, PIX_FMT_YUV444P16, - PIX_FMT_NONE + .pix_fmts = (const enum AVPixelFormat[]) { + AV_PIX_FMT_RGB24, AV_PIX_FMT_RGBA, AV_PIX_FMT_RGB48, + AV_PIX_FMT_RGBA64, + AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY16, AV_PIX_FMT_YA8, + AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, + AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P, + AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, + AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9, + AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10, + AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, + AV_PIX_FMT_NONE }, - .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"), .priv_class = &class, };