37 #if HAVE_OPENJPEG_1_5_OPENJPEG_H
38 # include <openjpeg-1.5/openjpeg.h>
40 # include <openjpeg.h>
87 p->image_offset_x0 = 0;
88 p->image_offset_y0 = 0;
102 p->subsampling_dx = 1;
103 p->subsampling_dy = 1;
114 opj_image_cmptparm_t cmptparm[4] = {{0}};
120 OPJ_COLOR_SPACE color_space = CLRSPC_UNKNOWN;
122 sub_dx[0] = sub_dx[3] = 1;
123 sub_dy[0] = sub_dy[3] = 1;
134 color_space = CLRSPC_GRAY;
147 color_space = CLRSPC_SRGB;
182 color_space = CLRSPC_SYCC;
186 "The requested pixel format '%s' is not supported\n",
191 for (i = 0; i < numcomps; i++) {
194 cmptparm[i].sgnd = 0;
195 cmptparm[i].dx = sub_dx[i];
196 cmptparm[i].dy = sub_dy[i];
197 cmptparm[i].w = (avctx->
width + sub_dx[i] - 1) / sub_dx[i];
198 cmptparm[i].h = (avctx->
height + sub_dy[i] - 1) / sub_dy[i];
201 img = opj_image_create(numcomps, cmptparm, color_space);
210 img->x1 = (avctx->
width - 1) * parameters->subsampling_dx + 1;
211 img->y1 = (avctx->
height - 1) * parameters->subsampling_dy + 1;
221 opj_set_default_encoder_parameters(&ctx->
enc_params);
254 opj_image_destroy(ctx->
image);
267 const int numcomps = image->numcomps;
269 for (compno = 0; compno < numcomps; ++compno) {
270 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
276 for (compno = 0; compno < numcomps; ++compno) {
277 for (y = 0; y < avctx->
height; ++
y) {
278 image_line = image->comps[compno].data + y * image->comps[compno].w;
279 frame_index = y * frame->
linesize[0] + compno;
280 for (x = 0; x < avctx->
width; ++x) {
281 image_line[x] = frame->
data[0][frame_index];
282 frame_index += numcomps;
284 for (; x < image->comps[compno].w; ++x) {
285 image_line[x] = image_line[x - 1];
288 for (; y < image->comps[compno].h; ++
y) {
289 image_line = image->comps[compno].data + y * image->comps[compno].w;
290 for (x = 0; x < image->comps[compno].w; ++x) {
291 image_line[x] = image_line[x - image->comps[compno].w];
306 const int numcomps = image->numcomps;
307 uint16_t *frame_ptr = (uint16_t *)frame->
data[0];
309 for (compno = 0; compno < numcomps; ++compno) {
310 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
316 for (compno = 0; compno < numcomps; ++compno) {
317 for (y = 0; y < avctx->
height; ++
y) {
318 image_line = image->comps[compno].data + y * image->comps[compno].w;
319 frame_index = y * (frame->
linesize[0] / 2) + compno;
320 for (x = 0; x < avctx->
width; ++x) {
321 image_line[x] = frame_ptr[frame_index] >> 4;
322 frame_index += numcomps;
324 for (; x < image->comps[compno].w; ++x) {
325 image_line[x] = image_line[x - 1];
328 for (; y < image->comps[compno].h; ++
y) {
329 image_line = image->comps[compno].data + y * image->comps[compno].w;
330 for (x = 0; x < image->comps[compno].w; ++x) {
331 image_line[x] = image_line[x - image->comps[compno].w];
346 const int numcomps = image->numcomps;
347 uint16_t *frame_ptr = (uint16_t*)frame->
data[0];
349 for (compno = 0; compno < numcomps; ++compno) {
350 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
356 for (compno = 0; compno < numcomps; ++compno) {
357 for (y = 0; y < avctx->
height; ++
y) {
358 image_line = image->comps[compno].data + y * image->comps[compno].w;
359 frame_index = y * (frame->
linesize[0] / 2) + compno;
360 for (x = 0; x < avctx->
width; ++x) {
361 image_line[x] = frame_ptr[frame_index];
362 frame_index += numcomps;
364 for (; x < image->comps[compno].w; ++x) {
365 image_line[x] = image_line[x - 1];
368 for (; y < image->comps[compno].h; ++
y) {
369 image_line = image->comps[compno].data + y * image->comps[compno].w;
370 for (x = 0; x < image->comps[compno].w; ++x) {
371 image_line[x] = image_line[x - image->comps[compno].w];
388 const int numcomps = image->numcomps;
390 for (compno = 0; compno < numcomps; ++compno) {
391 if (image->comps[compno].w > frame->
linesize[compno]) {
397 for (compno = 0; compno < numcomps; ++compno) {
398 width = avctx->
width / image->comps[compno].dx;
399 height = avctx->
height / image->comps[compno].dy;
401 image_line = image->comps[compno].data + y * image->comps[compno].w;
402 frame_index = y * frame->
linesize[compno];
403 for (x = 0; x <
width; ++x)
404 image_line[x] = frame->
data[compno][frame_index++];
405 for (; x < image->comps[compno].w; ++x) {
406 image_line[x] = image_line[x - 1];
409 for (; y < image->comps[compno].h; ++
y) {
410 image_line = image->comps[compno].data + y * image->comps[compno].w;
411 for (x = 0; x < image->comps[compno].w; ++x) {
412 image_line[x] = image_line[x - image->comps[compno].w];
429 const int numcomps = image->numcomps;
432 for (compno = 0; compno < numcomps; ++compno) {
433 if (image->comps[compno].w > frame->
linesize[compno]) {
439 for (compno = 0; compno < numcomps; ++compno) {
440 width = avctx->
width / image->comps[compno].dx;
441 height = avctx->
height / image->comps[compno].dy;
442 frame_ptr = (uint16_t *)frame->
data[compno];
444 image_line = image->comps[compno].data + y * image->comps[compno].w;
445 frame_index = y * (frame->
linesize[compno] / 2);
446 for (x = 0; x <
width; ++x)
447 image_line[x] = frame_ptr[frame_index++];
448 for (; x < image->comps[compno].w; ++x) {
449 image_line[x] = image_line[x - 1];
452 for (; y < image->comps[compno].h; ++
y) {
453 image_line = image->comps[compno].data + y * image->comps[compno].w;
454 for (x = 0; x < image->comps[compno].w; ++x) {
455 image_line[x] = image_line[x - image->comps[compno].w];
467 opj_image_t *image = ctx->
image;
468 opj_cinfo_t *compress =
NULL;
469 opj_cio_t *stream =
NULL;
551 "The frame's pixel format '%s' is not supported\n",
559 "Could not copy the frame data to the internal image buffer\n");
563 compress = opj_create_compress(ctx->
format);
569 opj_setup_encoder(compress, &ctx->
enc_params, image);
571 stream = opj_cio_open((opj_common_ptr) compress,
NULL, 0);
577 memset(&ctx->
event_mgr, 0,
sizeof(opj_event_mgr_t));
581 opj_set_event_mgr((opj_common_ptr) compress, &ctx->
event_mgr, avctx);
583 if (!opj_encode(compress, stream, image,
NULL)) {
588 len = cio_tell(stream);
593 memcpy(pkt->
data, stream->buffer, len);
597 opj_cio_close(stream);
599 opj_destroy_compress(compress);
609 opj_image_destroy(ctx->
image);
615 #define OFFSET(x) offsetof(LibOpenJPEGContext, x)
616 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
618 {
"format",
"Codec Format",
OFFSET(format),
AV_OPT_TYPE_INT, { .i64 = CODEC_JP2 }, CODEC_J2K, CODEC_JP2,
VE,
"format" },
625 {
"cinema_mode",
"Digital Cinema",
OFFSET(cinema_mode),
AV_OPT_TYPE_INT, { .i64 = OFF }, OFF, CINEMA4K_24,
VE,
"cinema_mode" },
630 {
"prog_order",
"Progression Order",
OFFSET(prog_order),
AV_OPT_TYPE_INT, { .i64 = LRCP }, LRCP, CPRL,
VE,
"prog_order" },
652 .
name =
"libopenjpeg",