1 /*
2 * JPEG 2000 encoding support via OpenJPEG
3 * Copyright (c) 2011 Michael Bradshaw <mjbshaw gmail com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * JPEG 2000 encoder using libopenjpeg
25 */
26
28
36
37 #if HAVE_OPENJPEG_1_5_OPENJPEG_H
38 # include <openjpeg-1.5/openjpeg.h>
39 #else
40 # include <openjpeg.h>
41 #endif
42
58
60 {
62 }
63
65 {
67 }
68
70 {
72 }
73
75 {
76 p->tile_size_on = 0;
77 p->cp_tdx = 1;
78 p->cp_tdy = 1;
79
80 /* Tile part */
81 p->tp_flag = 'C';
82 p->tp_on = 1;
83
84 /* Tile and Image shall be at (0, 0) */
85 p->cp_tx0 = 0;
86 p->cp_ty0 = 0;
87 p->image_offset_x0 = 0;
88 p->image_offset_y0 = 0;
89
90 /* Codeblock size= 32 * 32 */
91 p->cblockw_init = 32;
92 p->cblockh_init = 32;
93 p->csty |= 0x01;
94
95 /* The progression order shall be CPRL */
96 p->prog_order = CPRL;
97
98 /* No ROI */
99 p->roi_compno = -1;
100
101 /* No subsampling */
102 p->subsampling_dx = 1;
103 p->subsampling_dy = 1;
104
105 /* 9-7 transform */
106 p->irreversible = 1;
107
108 p->tcp_mct = 1;
109 }
110
112 {
114 opj_image_cmptparm_t cmptparm[4] = {{0}};
116 int i;
117 int sub_dx[4];
118 int sub_dy[4];
119 int numcomps;
120 OPJ_COLOR_SPACE color_space = CLRSPC_UNKNOWN;
121
122 sub_dx[0] = sub_dx[3] = 1;
123 sub_dy[0] = sub_dy[3] = 1;
126
128
134 color_space = CLRSPC_GRAY;
135 break;
147 color_space = CLRSPC_SRGB;
148 break;
182 color_space = CLRSPC_SYCC;
183 break;
184 default:
186 "The requested pixel format '%s' is not supported\n",
189 }
190
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];
199 }
200
201 img = opj_image_create(numcomps, cmptparm, color_space);
202
203 // x0, y0 is the top left corner of the image
204 // x1, y1 is the width, height of the reference grid
205 img->x0 = 0;
206 img->y0 = 0;
207 img->x1 = (avctx->
width - 1) * parameters->subsampling_dx + 1;
208 img->y1 = (avctx->
height - 1) * parameters->subsampling_dy + 1;
209
211 }
212
214 {
217
218 opj_set_default_encoder_parameters(&ctx->
enc_params);
219
230
233 }
234
239 goto fail;
240 }
241
245 goto fail;
246 }
247
248 return 0;
249
250 fail:
251 opj_image_destroy(ctx->
image);
254 return err;
255 }
256
258 {
259 int compno;
260 int x;
262 int *image_line;
263 int frame_index;
264 const int numcomps = image->numcomps;
265
266 for (compno = 0; compno < numcomps; ++compno) {
267 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
269 return 0;
270 }
271 }
272
273 for (compno = 0; compno < numcomps; ++compno) {
274 for (y = 0; y < avctx->
height; ++
y) {
275 image_line = image->comps[compno].data + y * image->comps[compno].w;
276 frame_index = y * frame->
linesize[0] + compno;
277 for (x = 0; x < avctx->
width; ++x) {
278 image_line[x] = frame->
data[0][frame_index];
279 frame_index += numcomps;
280 }
281 for (; x < image->comps[compno].w; ++x) {
282 image_line[x] = image_line[x - 1];
283 }
284 }
285 for (; y < image->comps[compno].h; ++
y) {
286 image_line = image->comps[compno].data + y * image->comps[compno].w;
287 for (x = 0; x < image->comps[compno].w; ++x) {
288 image_line[x] = image_line[x - image->comps[compno].w];
289 }
290 }
291 }
292
293 return 1;
294 }
295
296 // for XYZ 12 bit
298 {
299 int compno;
301 int *image_line;
302 int frame_index;
303 const int numcomps = image->numcomps;
304 uint16_t *frame_ptr = (uint16_t *)frame->
data[0];
305
306 for (compno = 0; compno < numcomps; ++compno) {
307 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
309 return 0;
310 }
311 }
312
313 for (compno = 0; compno < numcomps; ++compno) {
314 for (y = 0; y < avctx->
height; ++
y) {
315 image_line = image->comps[compno].data + y * image->comps[compno].w;
316 frame_index = y * (frame->
linesize[0] / 2) + compno;
317 for (x = 0; x < avctx->
width; ++x) {
318 image_line[x] = frame_ptr[frame_index] >> 4;
319 frame_index += numcomps;
320 }
321 for (; x < image->comps[compno].w; ++x) {
322 image_line[x] = image_line[x - 1];
323 }
324 }
325 for (; y < image->comps[compno].h; ++
y) {
326 image_line = image->comps[compno].data + y * image->comps[compno].w;
327 for (x = 0; x < image->comps[compno].w; ++x) {
328 image_line[x] = image_line[x - image->comps[compno].w];
329 }
330 }
331 }
332
333 return 1;
334 }
335
337 {
338 int compno;
339 int x;
341 int *image_line;
342 int frame_index;
343 const int numcomps = image->numcomps;
344 uint16_t *frame_ptr = (uint16_t*)frame->
data[0];
345
346 for (compno = 0; compno < numcomps; ++compno) {
347 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
349 return 0;
350 }
351 }
352
353 for (compno = 0; compno < numcomps; ++compno) {
354 for (y = 0; y < avctx->
height; ++
y) {
355 image_line = image->comps[compno].data + y * image->comps[compno].w;
356 frame_index = y * (frame->
linesize[0] / 2) + compno;
357 for (x = 0; x < avctx->
width; ++x) {
358 image_line[x] = frame_ptr[frame_index];
359 frame_index += numcomps;
360 }
361 for (; x < image->comps[compno].w; ++x) {
362 image_line[x] = image_line[x - 1];
363 }
364 }
365 for (; y < image->comps[compno].h; ++
y) {
366 image_line = image->comps[compno].data + y * image->comps[compno].w;
367 for (x = 0; x < image->comps[compno].w; ++x) {
368 image_line[x] = image_line[x - image->comps[compno].w];
369 }
370 }
371 }
372
373 return 1;
374 }
375
377 {
378 int compno;
379 int x;
383 int *image_line;
384 int frame_index;
385 const int numcomps = image->numcomps;
386
387 for (compno = 0; compno < numcomps; ++compno) {
388 if (image->comps[compno].w > frame->
linesize[compno]) {
390 return 0;
391 }
392 }
393
394 for (compno = 0; compno < numcomps; ++compno) {
395 width = avctx->
width / image->comps[compno].dx;
396 height = avctx->
height / image->comps[compno].dy;
398 image_line = image->comps[compno].data + y * image->comps[compno].w;
399 frame_index = y * frame->
linesize[compno];
400 for (x = 0; x <
width; ++x)
401 image_line[x] = frame->
data[compno][frame_index++];
402 for (; x < image->comps[compno].w; ++x) {
403 image_line[x] = image_line[x - 1];
404 }
405 }
406 for (; y < image->comps[compno].h; ++
y) {
407 image_line = image->comps[compno].data + y * image->comps[compno].w;
408 for (x = 0; x < image->comps[compno].w; ++x) {
409 image_line[x] = image_line[x - image->comps[compno].w];
410 }
411 }
412 }
413
414 return 1;
415 }
416
418 {
419 int compno;
420 int x;
424 int *image_line;
425 int frame_index;
426 const int numcomps = image->numcomps;
427 uint16_t *frame_ptr;
428
429 for (compno = 0; compno < numcomps; ++compno) {
430 if (image->comps[compno].w > frame->
linesize[compno]) {
432 return 0;
433 }
434 }
435
436 for (compno = 0; compno < numcomps; ++compno) {
437 width = avctx->
width / image->comps[compno].dx;
438 height = avctx->
height / image->comps[compno].dy;
439 frame_ptr = (uint16_t *)frame->
data[compno];
441 image_line = image->comps[compno].data + y * image->comps[compno].w;
442 frame_index = y * (frame->
linesize[compno] / 2);
443 for (x = 0; x <
width; ++x)
444 image_line[x] = frame_ptr[frame_index++];
445 for (; x < image->comps[compno].w; ++x) {
446 image_line[x] = image_line[x - 1];
447 }
448 }
449 for (; y < image->comps[compno].h; ++
y) {
450 image_line = image->comps[compno].data + y * image->comps[compno].w;
451 for (x = 0; x < image->comps[compno].w; ++x) {
452 image_line[x] = image_line[x - image->comps[compno].w];
453 }
454 }
455 }
456
457 return 1;
458 }
459
462 {
464 opj_image_t *image = ctx->
image;
465 opj_cinfo_t *compress =
NULL;
466 opj_cio_t *stream =
NULL;
467 int cpyresult = 0;
470
476 break;
479 break;
484 break;
492 if (!gbrframe)
494 gbrframe->
data[0] = frame->
data[2];
// swap to be rgb
502 } else {
504 }
506 break;
518 break;
545 break;
546 default:
548 "The frame's pixel format '%s' is not supported\n",
551 break;
552 }
553
554 if (!cpyresult) {
556 "Could not copy the frame data to the internal image buffer\n");
557 return -1;
558 }
559
560 compress = opj_create_compress(ctx->
format);
561 if (!compress) {
564 }
565
566 opj_setup_encoder(compress, &ctx->
enc_params, image);
567
568 stream = opj_cio_open((opj_common_ptr) compress,
NULL, 0);
569 if (!stream) {
572 }
573
574 memset(&ctx->
event_mgr, 0,
sizeof(opj_event_mgr_t));
578 opj_set_event_mgr((opj_common_ptr) compress, &ctx->
event_mgr, avctx);
579
580 if (!opj_encode(compress, stream, image,
NULL)) {
582 return -1;
583 }
584
585 len = cio_tell(stream);
588 }
589
590 memcpy(pkt->
data, stream->buffer, len);
592 *got_packet = 1;
593
594 opj_cio_close(stream);
596 opj_destroy_compress(compress);
598
599 return 0;
600 }
601
603 {
605
606 opj_image_destroy(ctx->
image);
609 return 0;
610 }
611
612 #define OFFSET(x) offsetof(LibOpenJPEGContext, x)
613 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
615 {
"format",
"Codec Format",
OFFSET(format),
AV_OPT_TYPE_INT, { .i64 = CODEC_JP2 }, CODEC_J2K, CODEC_JP2,
VE,
"format" },
622 {
"cinema_mode",
"Digital Cinema",
OFFSET(cinema_mode),
AV_OPT_TYPE_INT, { .i64 = OFF }, OFF, CINEMA4K_24,
VE,
"cinema_mode" },
627 {
"prog_order",
"Progression Order",
OFFSET(prog_order),
AV_OPT_TYPE_INT, { .i64 = LRCP }, LRCP, CPRL,
VE,
"prog_order" },
639 };
640
646 };
647
649 .
name =
"libopenjpeg",
676 },
678 };