37 #if HAVE_OPENJPEG_1_5_OPENJPEG_H
38 # include <openjpeg-1.5/openjpeg.h>
40 # include <openjpeg.h>
79 opj_image_cmptparm_t cmptparm[4] = {{0}};
85 OPJ_COLOR_SPACE color_space = CLRSPC_UNKNOWN;
87 sub_dx[0] = sub_dx[3] = 1;
88 sub_dy[0] = sub_dy[3] = 1;
98 color_space = CLRSPC_GRAY;
111 color_space = CLRSPC_SRGB;
146 color_space = CLRSPC_SYCC;
150 "The requested pixel format '%s' is not supported\n",
155 for (i = 0; i < numcomps; i++) {
158 cmptparm[i].sgnd = 0;
159 cmptparm[i].dx = sub_dx[i];
160 cmptparm[i].dy = sub_dy[i];
161 cmptparm[i].w = (avctx->
width + sub_dx[i] - 1) / sub_dx[i];
162 cmptparm[i].h = (avctx->
height + sub_dy[i] - 1) / sub_dy[i];
165 img = opj_image_create(numcomps, cmptparm, color_space);
171 img->x1 = (avctx->
width - 1) * parameters->subsampling_dx + 1;
172 img->y1 = (avctx->
height - 1) * parameters->subsampling_dy + 1;
182 opj_set_default_encoder_parameters(&ctx->
enc_params);
238 ctx->
stream = opj_cio_open((opj_common_ptr)ctx->
compress, NULL, 0);
251 memset(&ctx->
event_mgr, 0,
sizeof(opj_event_mgr_t));
260 opj_cio_close(ctx->
stream);
262 opj_destroy_compress(ctx->
compress);
264 opj_image_destroy(ctx->
image);
277 const int numcomps = image->numcomps;
279 for (compno = 0; compno < numcomps; ++compno) {
280 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
286 for (compno = 0; compno < numcomps; ++compno) {
287 for (y = 0; y < avctx->
height; ++
y) {
288 image_line = image->comps[compno].data + y * image->comps[compno].w;
289 frame_index = y * frame->
linesize[0] + compno;
290 for (x = 0; x < avctx->
width; ++x) {
291 image_line[x] = frame->
data[0][frame_index];
292 frame_index += numcomps;
294 for (; x < image->comps[compno].w; ++x) {
295 image_line[x] = image_line[x - 1];
298 for (; y < image->comps[compno].h; ++
y) {
299 image_line = image->comps[compno].data + y * image->comps[compno].w;
300 for (x = 0; x < image->comps[compno].w; ++x) {
301 image_line[x] = image_line[x - image->comps[compno].w];
317 const int numcomps = image->numcomps;
318 uint16_t *frame_ptr = (uint16_t*)frame->
data[0];
320 for (compno = 0; compno < numcomps; ++compno) {
321 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
327 for (compno = 0; compno < numcomps; ++compno) {
328 for (y = 0; y < avctx->
height; ++
y) {
329 image_line = image->comps[compno].data + y * image->comps[compno].w;
330 frame_index = y * (frame->
linesize[0] / 2) + compno;
331 for (x = 0; x < avctx->
width; ++x) {
332 image_line[x] = frame_ptr[frame_index] >> 4;
333 frame_index += numcomps;
335 for (; x < image->comps[compno].w; ++x) {
336 image_line[x] = image_line[x - 1];
339 for (; y < image->comps[compno].h; ++
y) {
340 image_line = image->comps[compno].data + y * image->comps[compno].w;
341 for (x = 0; x < image->comps[compno].w; ++x) {
342 image_line[x] = image_line[x - image->comps[compno].w];
357 const int numcomps = image->numcomps;
358 uint16_t *frame_ptr = (uint16_t*)frame->
data[0];
360 for (compno = 0; compno < numcomps; ++compno) {
361 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
367 for (compno = 0; compno < numcomps; ++compno) {
368 for (y = 0; y < avctx->
height; ++
y) {
369 image_line = image->comps[compno].data + y * image->comps[compno].w;
370 frame_index = y * (frame->
linesize[0] / 2) + compno;
371 for (x = 0; x < avctx->
width; ++x) {
372 image_line[x] = frame_ptr[frame_index];
373 frame_index += numcomps;
375 for (; x < image->comps[compno].w; ++x) {
376 image_line[x] = image_line[x - 1];
379 for (; y < image->comps[compno].h; ++
y) {
380 image_line = image->comps[compno].data + y * image->comps[compno].w;
381 for (x = 0; x < image->comps[compno].w; ++x) {
382 image_line[x] = image_line[x - image->comps[compno].w];
399 const int numcomps = image->numcomps;
401 for (compno = 0; compno < numcomps; ++compno) {
402 if (image->comps[compno].w > frame->
linesize[compno]) {
408 for (compno = 0; compno < numcomps; ++compno) {
409 width = avctx->
width / image->comps[compno].dx;
410 height = avctx->
height / image->comps[compno].dy;
412 image_line = image->comps[compno].data + y * image->comps[compno].w;
413 frame_index = y * frame->
linesize[compno];
414 for (x = 0; x <
width; ++x)
415 image_line[x] = frame->
data[compno][frame_index++];
416 for (; x < image->comps[compno].w; ++x) {
417 image_line[x] = image_line[x - 1];
420 for (; y < image->comps[compno].h; ++
y) {
421 image_line = image->comps[compno].data + y * image->comps[compno].w;
422 for (x = 0; x < image->comps[compno].w; ++x) {
423 image_line[x] = image_line[x - image->comps[compno].w];
440 const int numcomps = image->numcomps;
443 for (compno = 0; compno < numcomps; ++compno) {
444 if (image->comps[compno].w > frame->
linesize[compno]) {
450 for (compno = 0; compno < numcomps; ++compno) {
451 width = avctx->
width / image->comps[compno].dx;
452 height = avctx->
height / image->comps[compno].dy;
453 frame_ptr = (uint16_t*)frame->
data[compno];
455 image_line = image->comps[compno].data + y * image->comps[compno].w;
456 frame_index = y * (frame->
linesize[compno] / 2);
457 for (x = 0; x <
width; ++x)
458 image_line[x] = frame_ptr[frame_index++];
459 for (; x < image->comps[compno].w; ++x) {
460 image_line[x] = image_line[x - 1];
463 for (; y < image->comps[compno].h; ++
y) {
464 image_line = image->comps[compno].data + y * image->comps[compno].w;
465 for (x = 0; x < image->comps[compno].w; ++x) {
466 image_line[x] = image_line[x - image->comps[compno].w];
478 opj_cinfo_t *compress = ctx->
compress;
479 opj_image_t *image = ctx->
image;
480 opj_cio_t *stream = ctx->
stream;
561 "The frame's pixel format '%s' is not supported\n",
569 "Could not copy the frame data to the internal image buffer\n");
574 if (!opj_encode(compress, stream, image, NULL)) {
579 len = cio_tell(stream);
584 memcpy(pkt->
data, stream->buffer, len);
594 opj_cio_close(ctx->
stream);
596 opj_destroy_compress(ctx->
compress);
598 opj_image_destroy(ctx->
image);
604 #define OFFSET(x) offsetof(LibOpenJPEGContext, x)
605 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
607 {
"format",
"Codec Format",
OFFSET(format),
AV_OPT_TYPE_INT, { .i64 = CODEC_JP2 }, CODEC_J2K, CODEC_JP2,
VE,
"format" },
614 {
"cinema_mode",
"Digital Cinema",
OFFSET(cinema_mode),
AV_OPT_TYPE_INT, { .i64 = OFF }, OFF, CINEMA4K_24,
VE,
"cinema_mode" },
619 {
"prog_order",
"Progression Order",
OFFSET(prog_order),
AV_OPT_TYPE_INT, { .i64 = LRCP }, LRCP, CPRL,
VE,
"prog_order" },
641 .
name =
"libopenjpeg",