annotate ffmpeg/libavcodec/libopenjpegenc.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * JPEG 2000 encoding support via OpenJPEG
yading@10 3 * Copyright (c) 2011 Michael Bradshaw <mjbshaw gmail com>
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 /**
yading@10 23 * @file
yading@10 24 * JPEG 2000 encoder using libopenjpeg
yading@10 25 */
yading@10 26
yading@10 27 #define OPJ_STATIC
yading@10 28
yading@10 29 #include "libavutil/avassert.h"
yading@10 30 #include "libavutil/common.h"
yading@10 31 #include "libavutil/imgutils.h"
yading@10 32 #include "libavutil/intreadwrite.h"
yading@10 33 #include "libavutil/opt.h"
yading@10 34 #include "avcodec.h"
yading@10 35 #include "internal.h"
yading@10 36
yading@10 37 #if HAVE_OPENJPEG_1_5_OPENJPEG_H
yading@10 38 # include <openjpeg-1.5/openjpeg.h>
yading@10 39 #else
yading@10 40 # include <openjpeg.h>
yading@10 41 #endif
yading@10 42
yading@10 43 typedef struct {
yading@10 44 AVClass *avclass;
yading@10 45 opj_image_t *image;
yading@10 46 opj_cparameters_t enc_params;
yading@10 47 opj_cinfo_t *compress;
yading@10 48 opj_event_mgr_t event_mgr;
yading@10 49 int format;
yading@10 50 int profile;
yading@10 51 int prog_order;
yading@10 52 int cinema_mode;
yading@10 53 int numresolution;
yading@10 54 int numlayers;
yading@10 55 int disto_alloc;
yading@10 56 int fixed_alloc;
yading@10 57 int fixed_quality;
yading@10 58 } LibOpenJPEGContext;
yading@10 59
yading@10 60 static void error_callback(const char *msg, void *data)
yading@10 61 {
yading@10 62 av_log(data, AV_LOG_ERROR, "%s\n", msg);
yading@10 63 }
yading@10 64
yading@10 65 static void warning_callback(const char *msg, void *data)
yading@10 66 {
yading@10 67 av_log(data, AV_LOG_WARNING, "%s\n", msg);
yading@10 68 }
yading@10 69
yading@10 70 static void info_callback(const char *msg, void *data)
yading@10 71 {
yading@10 72 av_log(data, AV_LOG_DEBUG, "%s\n", msg);
yading@10 73 }
yading@10 74
yading@10 75 static opj_image_t *mj2_create_image(AVCodecContext *avctx, opj_cparameters_t *parameters)
yading@10 76 {
yading@10 77 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
yading@10 78 opj_image_cmptparm_t *cmptparm;
yading@10 79 opj_image_t *img;
yading@10 80 int i;
yading@10 81 int sub_dx[4];
yading@10 82 int sub_dy[4];
yading@10 83 int numcomps;
yading@10 84 OPJ_COLOR_SPACE color_space = CLRSPC_UNKNOWN;
yading@10 85
yading@10 86 sub_dx[0] = sub_dx[3] = 1;
yading@10 87 sub_dy[0] = sub_dy[3] = 1;
yading@10 88 sub_dx[1] = sub_dx[2] = 1 << desc->log2_chroma_w;
yading@10 89 sub_dy[1] = sub_dy[2] = 1 << desc->log2_chroma_h;
yading@10 90
yading@10 91 numcomps = desc->nb_components;
yading@10 92
yading@10 93 switch (avctx->pix_fmt) {
yading@10 94 case AV_PIX_FMT_GRAY8:
yading@10 95 case AV_PIX_FMT_GRAY8A:
yading@10 96 case AV_PIX_FMT_GRAY16:
yading@10 97 color_space = CLRSPC_GRAY;
yading@10 98 break;
yading@10 99 case AV_PIX_FMT_RGB24:
yading@10 100 case AV_PIX_FMT_RGBA:
yading@10 101 case AV_PIX_FMT_RGB48:
yading@10 102 case AV_PIX_FMT_RGBA64:
yading@10 103 case AV_PIX_FMT_GBR24P:
yading@10 104 case AV_PIX_FMT_GBRP9:
yading@10 105 case AV_PIX_FMT_GBRP10:
yading@10 106 case AV_PIX_FMT_GBRP12:
yading@10 107 case AV_PIX_FMT_GBRP14:
yading@10 108 case AV_PIX_FMT_GBRP16:
yading@10 109 color_space = CLRSPC_SRGB;
yading@10 110 break;
yading@10 111 case AV_PIX_FMT_YUV410P:
yading@10 112 case AV_PIX_FMT_YUV411P:
yading@10 113 case AV_PIX_FMT_YUV420P:
yading@10 114 case AV_PIX_FMT_YUV422P:
yading@10 115 case AV_PIX_FMT_YUV440P:
yading@10 116 case AV_PIX_FMT_YUV444P:
yading@10 117 case AV_PIX_FMT_YUVA420P:
yading@10 118 case AV_PIX_FMT_YUVA422P:
yading@10 119 case AV_PIX_FMT_YUVA444P:
yading@10 120 case AV_PIX_FMT_YUV420P9:
yading@10 121 case AV_PIX_FMT_YUV422P9:
yading@10 122 case AV_PIX_FMT_YUV444P9:
yading@10 123 case AV_PIX_FMT_YUVA420P9:
yading@10 124 case AV_PIX_FMT_YUVA422P9:
yading@10 125 case AV_PIX_FMT_YUVA444P9:
yading@10 126 case AV_PIX_FMT_YUV420P10:
yading@10 127 case AV_PIX_FMT_YUV422P10:
yading@10 128 case AV_PIX_FMT_YUV444P10:
yading@10 129 case AV_PIX_FMT_YUVA420P10:
yading@10 130 case AV_PIX_FMT_YUVA422P10:
yading@10 131 case AV_PIX_FMT_YUVA444P10:
yading@10 132 case AV_PIX_FMT_YUV420P12:
yading@10 133 case AV_PIX_FMT_YUV422P12:
yading@10 134 case AV_PIX_FMT_YUV444P12:
yading@10 135 case AV_PIX_FMT_YUV420P14:
yading@10 136 case AV_PIX_FMT_YUV422P14:
yading@10 137 case AV_PIX_FMT_YUV444P14:
yading@10 138 case AV_PIX_FMT_YUV420P16:
yading@10 139 case AV_PIX_FMT_YUV422P16:
yading@10 140 case AV_PIX_FMT_YUV444P16:
yading@10 141 case AV_PIX_FMT_YUVA420P16:
yading@10 142 case AV_PIX_FMT_YUVA422P16:
yading@10 143 case AV_PIX_FMT_YUVA444P16:
yading@10 144 color_space = CLRSPC_SYCC;
yading@10 145 break;
yading@10 146 default:
yading@10 147 av_log(avctx, AV_LOG_ERROR,
yading@10 148 "The requested pixel format '%s' is not supported\n",
yading@10 149 av_get_pix_fmt_name(avctx->pix_fmt));
yading@10 150 return NULL;
yading@10 151 }
yading@10 152
yading@10 153 cmptparm = av_mallocz(numcomps * sizeof(*cmptparm));
yading@10 154 if (!cmptparm) {
yading@10 155 av_log(avctx, AV_LOG_ERROR, "Not enough memory\n");
yading@10 156 return NULL;
yading@10 157 }
yading@10 158 for (i = 0; i < numcomps; i++) {
yading@10 159 cmptparm[i].prec = desc->comp[i].depth_minus1 + 1;
yading@10 160 cmptparm[i].bpp = desc->comp[i].depth_minus1 + 1;
yading@10 161 cmptparm[i].sgnd = 0;
yading@10 162 cmptparm[i].dx = sub_dx[i];
yading@10 163 cmptparm[i].dy = sub_dy[i];
yading@10 164 cmptparm[i].w = avctx->width / sub_dx[i];
yading@10 165 cmptparm[i].h = avctx->height / sub_dy[i];
yading@10 166 }
yading@10 167
yading@10 168 img = opj_image_create(numcomps, cmptparm, color_space);
yading@10 169 av_freep(&cmptparm);
yading@10 170 return img;
yading@10 171 }
yading@10 172
yading@10 173 static av_cold int libopenjpeg_encode_init(AVCodecContext *avctx)
yading@10 174 {
yading@10 175 LibOpenJPEGContext *ctx = avctx->priv_data;
yading@10 176 int err = AVERROR(ENOMEM);
yading@10 177
yading@10 178 opj_set_default_encoder_parameters(&ctx->enc_params);
yading@10 179
yading@10 180 ctx->enc_params.cp_rsiz = ctx->profile;
yading@10 181 ctx->enc_params.mode = !!avctx->global_quality;
yading@10 182 ctx->enc_params.cp_cinema = ctx->cinema_mode;
yading@10 183 ctx->enc_params.prog_order = ctx->prog_order;
yading@10 184 ctx->enc_params.numresolution = ctx->numresolution;
yading@10 185 ctx->enc_params.cp_disto_alloc = ctx->disto_alloc;
yading@10 186 ctx->enc_params.cp_fixed_alloc = ctx->fixed_alloc;
yading@10 187 ctx->enc_params.cp_fixed_quality = ctx->fixed_quality;
yading@10 188 ctx->enc_params.tcp_numlayers = ctx->numlayers;
yading@10 189 ctx->enc_params.tcp_rates[0] = FFMAX(avctx->compression_level, 0) * 2;
yading@10 190
yading@10 191 if (ctx->cinema_mode > 0) {
yading@10 192 ctx->enc_params.irreversible = 1;
yading@10 193 ctx->enc_params.tcp_mct = 1;
yading@10 194 ctx->enc_params.tile_size_on = 0;
yading@10 195 /* no subsampling */
yading@10 196 ctx->enc_params.cp_tdx=1;
yading@10 197 ctx->enc_params.cp_tdy=1;
yading@10 198 ctx->enc_params.subsampling_dx = 1;
yading@10 199 ctx->enc_params.subsampling_dy = 1;
yading@10 200 /* Tile and Image shall be at (0,0) */
yading@10 201 ctx->enc_params.cp_tx0 = 0;
yading@10 202 ctx->enc_params.cp_ty0 = 0;
yading@10 203 ctx->enc_params.image_offset_x0 = 0;
yading@10 204 ctx->enc_params.image_offset_y0 = 0;
yading@10 205 /* Codeblock size= 32*32 */
yading@10 206 ctx->enc_params.cblockw_init = 32;
yading@10 207 ctx->enc_params.cblockh_init = 32;
yading@10 208 ctx->enc_params.csty |= 0x01;
yading@10 209 /* No ROI */
yading@10 210 ctx->enc_params.roi_compno = -1;
yading@10 211
yading@10 212 if (ctx->enc_params.prog_order != CPRL) {
yading@10 213 av_log(avctx, AV_LOG_ERROR, "prog_order forced to CPRL\n");
yading@10 214 ctx->enc_params.prog_order = CPRL;
yading@10 215 }
yading@10 216 ctx->enc_params.tp_flag = 'C';
yading@10 217 ctx->enc_params.tp_on = 1;
yading@10 218 }
yading@10 219
yading@10 220 ctx->compress = opj_create_compress(ctx->format);
yading@10 221 if (!ctx->compress) {
yading@10 222 av_log(avctx, AV_LOG_ERROR, "Error creating the compressor\n");
yading@10 223 return AVERROR(ENOMEM);
yading@10 224 }
yading@10 225
yading@10 226 avctx->coded_frame = avcodec_alloc_frame();
yading@10 227 if (!avctx->coded_frame) {
yading@10 228 av_log(avctx, AV_LOG_ERROR, "Error allocating coded frame\n");
yading@10 229 goto fail;
yading@10 230 }
yading@10 231
yading@10 232 ctx->image = mj2_create_image(avctx, &ctx->enc_params);
yading@10 233 if (!ctx->image) {
yading@10 234 av_log(avctx, AV_LOG_ERROR, "Error creating the mj2 image\n");
yading@10 235 err = AVERROR(EINVAL);
yading@10 236 goto fail;
yading@10 237 }
yading@10 238
yading@10 239 memset(&ctx->event_mgr, 0, sizeof(opj_event_mgr_t));
yading@10 240 ctx->event_mgr.info_handler = info_callback;
yading@10 241 ctx->event_mgr.error_handler = error_callback;
yading@10 242 ctx->event_mgr.warning_handler = warning_callback;
yading@10 243 opj_set_event_mgr((opj_common_ptr)ctx->compress, &ctx->event_mgr, avctx);
yading@10 244
yading@10 245 return 0;
yading@10 246
yading@10 247 fail:
yading@10 248 av_freep(&ctx->compress);
yading@10 249 av_freep(&avctx->coded_frame);
yading@10 250 return err;
yading@10 251 }
yading@10 252
yading@10 253 static int libopenjpeg_copy_packed8(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
yading@10 254 {
yading@10 255 int compno;
yading@10 256 int x;
yading@10 257 int y;
yading@10 258 int image_index;
yading@10 259 int frame_index;
yading@10 260 const int numcomps = image->numcomps;
yading@10 261
yading@10 262 for (compno = 0; compno < numcomps; ++compno) {
yading@10 263 if (image->comps[compno].w > frame->linesize[0] / numcomps) {
yading@10 264 av_log(avctx, AV_LOG_ERROR, "Error: frame's linesize is too small for the image\n");
yading@10 265 return 0;
yading@10 266 }
yading@10 267 }
yading@10 268
yading@10 269 for (compno = 0; compno < numcomps; ++compno) {
yading@10 270 for (y = 0; y < avctx->height; ++y) {
yading@10 271 image_index = y * avctx->width;
yading@10 272 frame_index = y * frame->linesize[0] + compno;
yading@10 273 for (x = 0; x < avctx->width; ++x) {
yading@10 274 image->comps[compno].data[image_index++] = frame->data[0][frame_index];
yading@10 275 frame_index += numcomps;
yading@10 276 }
yading@10 277 }
yading@10 278 }
yading@10 279
yading@10 280 return 1;
yading@10 281 }
yading@10 282
yading@10 283 static int libopenjpeg_copy_packed16(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
yading@10 284 {
yading@10 285 int compno;
yading@10 286 int x;
yading@10 287 int y;
yading@10 288 int image_index;
yading@10 289 int frame_index;
yading@10 290 const int numcomps = image->numcomps;
yading@10 291 uint16_t *frame_ptr = (uint16_t*)frame->data[0];
yading@10 292
yading@10 293 for (compno = 0; compno < numcomps; ++compno) {
yading@10 294 if (image->comps[compno].w > frame->linesize[0] / numcomps) {
yading@10 295 av_log(avctx, AV_LOG_ERROR, "Error: frame's linesize is too small for the image\n");
yading@10 296 return 0;
yading@10 297 }
yading@10 298 }
yading@10 299
yading@10 300 for (compno = 0; compno < numcomps; ++compno) {
yading@10 301 for (y = 0; y < avctx->height; ++y) {
yading@10 302 image_index = y * avctx->width;
yading@10 303 frame_index = y * (frame->linesize[0] / 2) + compno;
yading@10 304 for (x = 0; x < avctx->width; ++x) {
yading@10 305 image->comps[compno].data[image_index++] = frame_ptr[frame_index];
yading@10 306 frame_index += numcomps;
yading@10 307 }
yading@10 308 }
yading@10 309 }
yading@10 310
yading@10 311 return 1;
yading@10 312 }
yading@10 313
yading@10 314 static int libopenjpeg_copy_unpacked8(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
yading@10 315 {
yading@10 316 int compno;
yading@10 317 int x;
yading@10 318 int y;
yading@10 319 int width;
yading@10 320 int height;
yading@10 321 int image_index;
yading@10 322 int frame_index;
yading@10 323 const int numcomps = image->numcomps;
yading@10 324
yading@10 325 for (compno = 0; compno < numcomps; ++compno) {
yading@10 326 if (image->comps[compno].w > frame->linesize[compno]) {
yading@10 327 av_log(avctx, AV_LOG_ERROR, "Error: frame's linesize is too small for the image\n");
yading@10 328 return 0;
yading@10 329 }
yading@10 330 }
yading@10 331
yading@10 332 for (compno = 0; compno < numcomps; ++compno) {
yading@10 333 width = avctx->width / image->comps[compno].dx;
yading@10 334 height = avctx->height / image->comps[compno].dy;
yading@10 335 for (y = 0; y < height; ++y) {
yading@10 336 image_index = y * width;
yading@10 337 frame_index = y * frame->linesize[compno];
yading@10 338 for (x = 0; x < width; ++x)
yading@10 339 image->comps[compno].data[image_index++] = frame->data[compno][frame_index++];
yading@10 340 }
yading@10 341 }
yading@10 342
yading@10 343 return 1;
yading@10 344 }
yading@10 345
yading@10 346 static int libopenjpeg_copy_unpacked16(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
yading@10 347 {
yading@10 348 int compno;
yading@10 349 int x;
yading@10 350 int y;
yading@10 351 int width;
yading@10 352 int height;
yading@10 353 int image_index;
yading@10 354 int frame_index;
yading@10 355 const int numcomps = image->numcomps;
yading@10 356 uint16_t *frame_ptr;
yading@10 357
yading@10 358 for (compno = 0; compno < numcomps; ++compno) {
yading@10 359 if (image->comps[compno].w > frame->linesize[compno]) {
yading@10 360 av_log(avctx, AV_LOG_ERROR, "Error: frame's linesize is too small for the image\n");
yading@10 361 return 0;
yading@10 362 }
yading@10 363 }
yading@10 364
yading@10 365 for (compno = 0; compno < numcomps; ++compno) {
yading@10 366 width = avctx->width / image->comps[compno].dx;
yading@10 367 height = avctx->height / image->comps[compno].dy;
yading@10 368 frame_ptr = (uint16_t*)frame->data[compno];
yading@10 369 for (y = 0; y < height; ++y) {
yading@10 370 image_index = y * width;
yading@10 371 frame_index = y * (frame->linesize[compno] / 2);
yading@10 372 for (x = 0; x < width; ++x)
yading@10 373 image->comps[compno].data[image_index++] = frame_ptr[frame_index++];
yading@10 374 }
yading@10 375 }
yading@10 376
yading@10 377 return 1;
yading@10 378 }
yading@10 379
yading@10 380 static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
yading@10 381 const AVFrame *frame, int *got_packet)
yading@10 382 {
yading@10 383 LibOpenJPEGContext *ctx = avctx->priv_data;
yading@10 384 opj_cinfo_t *compress = ctx->compress;
yading@10 385 opj_image_t *image = ctx->image;
yading@10 386 opj_cio_t *stream;
yading@10 387 int cpyresult = 0;
yading@10 388 int ret, len;
yading@10 389 AVFrame gbrframe;
yading@10 390
yading@10 391 // x0, y0 is the top left corner of the image
yading@10 392 // x1, y1 is the width, height of the reference grid
yading@10 393 image->x0 = 0;
yading@10 394 image->y0 = 0;
yading@10 395 image->x1 = (avctx->width - 1) * ctx->enc_params.subsampling_dx + 1;
yading@10 396 image->y1 = (avctx->height - 1) * ctx->enc_params.subsampling_dy + 1;
yading@10 397
yading@10 398 switch (avctx->pix_fmt) {
yading@10 399 case AV_PIX_FMT_RGB24:
yading@10 400 case AV_PIX_FMT_RGBA:
yading@10 401 case AV_PIX_FMT_GRAY8A:
yading@10 402 cpyresult = libopenjpeg_copy_packed8(avctx, frame, image);
yading@10 403 break;
yading@10 404 case AV_PIX_FMT_RGB48:
yading@10 405 case AV_PIX_FMT_RGBA64:
yading@10 406 cpyresult = libopenjpeg_copy_packed16(avctx, frame, image);
yading@10 407 break;
yading@10 408 case AV_PIX_FMT_GBR24P:
yading@10 409 case AV_PIX_FMT_GBRP9:
yading@10 410 case AV_PIX_FMT_GBRP10:
yading@10 411 case AV_PIX_FMT_GBRP12:
yading@10 412 case AV_PIX_FMT_GBRP14:
yading@10 413 case AV_PIX_FMT_GBRP16:
yading@10 414 gbrframe = *frame;
yading@10 415 gbrframe.data[0] = frame->data[2]; // swap to be rgb
yading@10 416 gbrframe.data[1] = frame->data[0];
yading@10 417 gbrframe.data[2] = frame->data[1];
yading@10 418 gbrframe.linesize[0] = frame->linesize[2];
yading@10 419 gbrframe.linesize[1] = frame->linesize[0];
yading@10 420 gbrframe.linesize[2] = frame->linesize[1];
yading@10 421 if (avctx->pix_fmt == AV_PIX_FMT_GBR24P) {
yading@10 422 cpyresult = libopenjpeg_copy_unpacked8(avctx, &gbrframe, image);
yading@10 423 } else {
yading@10 424 cpyresult = libopenjpeg_copy_unpacked16(avctx, &gbrframe, image);
yading@10 425 }
yading@10 426 break;
yading@10 427 case AV_PIX_FMT_GRAY8:
yading@10 428 case AV_PIX_FMT_YUV410P:
yading@10 429 case AV_PIX_FMT_YUV411P:
yading@10 430 case AV_PIX_FMT_YUV420P:
yading@10 431 case AV_PIX_FMT_YUV422P:
yading@10 432 case AV_PIX_FMT_YUV440P:
yading@10 433 case AV_PIX_FMT_YUV444P:
yading@10 434 case AV_PIX_FMT_YUVA420P:
yading@10 435 case AV_PIX_FMT_YUVA422P:
yading@10 436 case AV_PIX_FMT_YUVA444P:
yading@10 437 cpyresult = libopenjpeg_copy_unpacked8(avctx, frame, image);
yading@10 438 break;
yading@10 439 case AV_PIX_FMT_GRAY16:
yading@10 440 case AV_PIX_FMT_YUV420P9:
yading@10 441 case AV_PIX_FMT_YUV422P9:
yading@10 442 case AV_PIX_FMT_YUV444P9:
yading@10 443 case AV_PIX_FMT_YUVA420P9:
yading@10 444 case AV_PIX_FMT_YUVA422P9:
yading@10 445 case AV_PIX_FMT_YUVA444P9:
yading@10 446 case AV_PIX_FMT_YUV444P10:
yading@10 447 case AV_PIX_FMT_YUV422P10:
yading@10 448 case AV_PIX_FMT_YUV420P10:
yading@10 449 case AV_PIX_FMT_YUVA444P10:
yading@10 450 case AV_PIX_FMT_YUVA422P10:
yading@10 451 case AV_PIX_FMT_YUVA420P10:
yading@10 452 case AV_PIX_FMT_YUV420P12:
yading@10 453 case AV_PIX_FMT_YUV422P12:
yading@10 454 case AV_PIX_FMT_YUV444P12:
yading@10 455 case AV_PIX_FMT_YUV420P14:
yading@10 456 case AV_PIX_FMT_YUV422P14:
yading@10 457 case AV_PIX_FMT_YUV444P14:
yading@10 458 case AV_PIX_FMT_YUV444P16:
yading@10 459 case AV_PIX_FMT_YUV422P16:
yading@10 460 case AV_PIX_FMT_YUV420P16:
yading@10 461 case AV_PIX_FMT_YUVA444P16:
yading@10 462 case AV_PIX_FMT_YUVA422P16:
yading@10 463 case AV_PIX_FMT_YUVA420P16:
yading@10 464 cpyresult = libopenjpeg_copy_unpacked16(avctx, frame, image);
yading@10 465 break;
yading@10 466 default:
yading@10 467 av_log(avctx, AV_LOG_ERROR,
yading@10 468 "The frame's pixel format '%s' is not supported\n",
yading@10 469 av_get_pix_fmt_name(avctx->pix_fmt));
yading@10 470 return AVERROR(EINVAL);
yading@10 471 break;
yading@10 472 }
yading@10 473
yading@10 474 if (!cpyresult) {
yading@10 475 av_log(avctx, AV_LOG_ERROR,
yading@10 476 "Could not copy the frame data to the internal image buffer\n");
yading@10 477 return -1;
yading@10 478 }
yading@10 479
yading@10 480 opj_setup_encoder(compress, &ctx->enc_params, image);
yading@10 481 stream = opj_cio_open((opj_common_ptr)compress, NULL, 0);
yading@10 482 if (!stream) {
yading@10 483 av_log(avctx, AV_LOG_ERROR, "Error creating the cio stream\n");
yading@10 484 return AVERROR(ENOMEM);
yading@10 485 }
yading@10 486
yading@10 487 if (!opj_encode(compress, stream, image, NULL)) {
yading@10 488 opj_cio_close(stream);
yading@10 489 av_log(avctx, AV_LOG_ERROR, "Error during the opj encode\n");
yading@10 490 return -1;
yading@10 491 }
yading@10 492
yading@10 493 len = cio_tell(stream);
yading@10 494 if ((ret = ff_alloc_packet2(avctx, pkt, len)) < 0) {
yading@10 495 opj_cio_close(stream);
yading@10 496 return ret;
yading@10 497 }
yading@10 498
yading@10 499 memcpy(pkt->data, stream->buffer, len);
yading@10 500 pkt->flags |= AV_PKT_FLAG_KEY;
yading@10 501 *got_packet = 1;
yading@10 502 opj_cio_close(stream);
yading@10 503 return 0;
yading@10 504 }
yading@10 505
yading@10 506 static av_cold int libopenjpeg_encode_close(AVCodecContext *avctx)
yading@10 507 {
yading@10 508 LibOpenJPEGContext *ctx = avctx->priv_data;
yading@10 509
yading@10 510 opj_destroy_compress(ctx->compress);
yading@10 511 opj_image_destroy(ctx->image);
yading@10 512 av_freep(&avctx->coded_frame);
yading@10 513 return 0;
yading@10 514 }
yading@10 515
yading@10 516 #define OFFSET(x) offsetof(LibOpenJPEGContext, x)
yading@10 517 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
yading@10 518 static const AVOption options[] = {
yading@10 519 { "format", "Codec Format", OFFSET(format), AV_OPT_TYPE_INT, { .i64 = CODEC_JP2 }, CODEC_J2K, CODEC_JP2, VE, "format" },
yading@10 520 { "j2k", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CODEC_J2K }, 0, 0, VE, "format" },
yading@10 521 { "jp2", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CODEC_JP2 }, 0, 0, VE, "format" },
yading@10 522 { "profile", NULL, OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = STD_RSIZ }, STD_RSIZ, CINEMA4K, VE, "profile" },
yading@10 523 { "jpeg2000", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = STD_RSIZ }, 0, 0, VE, "profile" },
yading@10 524 { "cinema2k", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA2K }, 0, 0, VE, "profile" },
yading@10 525 { "cinema4k", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA4K }, 0, 0, VE, "profile" },
yading@10 526 { "cinema_mode", "Digital Cinema", OFFSET(cinema_mode), AV_OPT_TYPE_INT, { .i64 = OFF }, OFF, CINEMA4K_24, VE, "cinema_mode" },
yading@10 527 { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OFF }, 0, 0, VE, "cinema_mode" },
yading@10 528 { "2k_24", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA2K_24 }, 0, 0, VE, "cinema_mode" },
yading@10 529 { "2k_48", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA2K_48 }, 0, 0, VE, "cinema_mode" },
yading@10 530 { "4k_24", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA4K_24 }, 0, 0, VE, "cinema_mode" },
yading@10 531 { "prog_order", "Progression Order", OFFSET(prog_order), AV_OPT_TYPE_INT, { .i64 = LRCP }, LRCP, CPRL, VE, "prog_order" },
yading@10 532 { "lrcp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LRCP }, 0, 0, VE, "prog_order" },
yading@10 533 { "rlcp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = RLCP }, 0, 0, VE, "prog_order" },
yading@10 534 { "rpcl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = RPCL }, 0, 0, VE, "prog_order" },
yading@10 535 { "pcrl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PCRL }, 0, 0, VE, "prog_order" },
yading@10 536 { "cprl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPRL }, 0, 0, VE, "prog_order" },
yading@10 537 { "numresolution", NULL, OFFSET(numresolution), AV_OPT_TYPE_INT, { .i64 = 6 }, 1, INT_MAX, VE },
yading@10 538 { "numlayers", NULL, OFFSET(numlayers), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, 10, VE },
yading@10 539 { "disto_alloc", NULL, OFFSET(disto_alloc), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE },
yading@10 540 { "fixed_alloc", NULL, OFFSET(fixed_alloc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
yading@10 541 { "fixed_quality", NULL, OFFSET(fixed_quality), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
yading@10 542 { NULL },
yading@10 543 };
yading@10 544
yading@10 545 static const AVClass class = {
yading@10 546 .class_name = "libopenjpeg",
yading@10 547 .item_name = av_default_item_name,
yading@10 548 .option = options,
yading@10 549 .version = LIBAVUTIL_VERSION_INT,
yading@10 550 };
yading@10 551
yading@10 552 AVCodec ff_libopenjpeg_encoder = {
yading@10 553 .name = "libopenjpeg",
yading@10 554 .type = AVMEDIA_TYPE_VIDEO,
yading@10 555 .id = AV_CODEC_ID_JPEG2000,
yading@10 556 .priv_data_size = sizeof(LibOpenJPEGContext),
yading@10 557 .init = libopenjpeg_encode_init,
yading@10 558 .encode2 = libopenjpeg_encode_frame,
yading@10 559 .close = libopenjpeg_encode_close,
yading@10 560 .capabilities = 0,
yading@10 561 .pix_fmts = (const enum AVPixelFormat[]) {
yading@10 562 AV_PIX_FMT_RGB24, AV_PIX_FMT_RGBA, AV_PIX_FMT_RGB48, AV_PIX_FMT_RGBA64,
yading@10 563 AV_PIX_FMT_GBR24P,
yading@10 564 AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
yading@10 565 AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY8A, AV_PIX_FMT_GRAY16,
yading@10 566 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P,
yading@10 567 AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA422P,
yading@10 568 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUVA444P,
yading@10 569 AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
yading@10 570 AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
yading@10 571 AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
yading@10 572 AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
yading@10 573 AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12,
yading@10 574 AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
yading@10 575 AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
yading@10 576 AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
yading@10 577 AV_PIX_FMT_NONE
yading@10 578 },
yading@10 579 .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"),
yading@10 580 .priv_class = &class,
yading@10 581 };