1 /*
2 * JPEG 2000 decoding support via OpenJPEG
3 * Copyright (c) 2009 Jaikrishnan Menon <realityman@gmx.net>
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 decoder using libopenjpeg
25 */
26
28
34
38
39 #if HAVE_OPENJPEG_2_1_OPENJPEG_H
40 # include <openjpeg-2.1/openjpeg.h>
41 #elif HAVE_OPENJPEG_2_0_OPENJPEG_H
42 # include <openjpeg-2.0/openjpeg.h>
43 #elif HAVE_OPENJPEG_1_5_OPENJPEG_H
44 # include <openjpeg-1.5/openjpeg.h>
45 #else
46 # include <openjpeg.h>
47 #endif
48
49 #if HAVE_OPENJPEG_2_1_OPENJPEG_H || HAVE_OPENJPEG_2_0_OPENJPEG_H
50 # define OPENJPEG_MAJOR_VERSION 2
51 # define OPJ(x) OPJ_##x
52 #else
53 # define OPENJPEG_MAJOR_VERSION 1
55 #endif
56
57 #define JP2_SIG_TYPE 0x6A502020
58 #define JP2_SIG_VALUE 0x0D0A870A
59
60 // pix_fmts with lower bpp have to be listed before
61 // similar pix_fmts with higher bpp.
62 #define RGB_PIXEL_FORMATS AV_PIX_FMT_RGB24, AV_PIX_FMT_RGBA, \
63 AV_PIX_FMT_RGB48, AV_PIX_FMT_RGBA64
64
65 #define GRAY_PIXEL_FORMATS AV_PIX_FMT_GRAY8, AV_PIX_FMT_YA8, \
66 AV_PIX_FMT_GRAY16, AV_PIX_FMT_YA16
67
68 #define YUV_PIXEL_FORMATS AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUVA420P, \
69 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA422P, \
70 AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA444P, \
71 AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9, \
72 AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9, \
73 AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10, \
74 AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10, \
75 AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, \
76 AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14, \
77 AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, \
78 AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16
79
80 #define XYZ_PIXEL_FORMATS AV_PIX_FMT_XYZ12
81
84 };
87 };
90 };
93 };
94
98 #if OPENJPEG_MAJOR_VERSION == 1
100 #endif // OPENJPEG_MAJOR_VERSION == 1
103
105 {
107 }
108
110 {
112 }
113
115 {
117 }
118
119 #if OPENJPEG_MAJOR_VERSION == 2
120 typedef struct BufferReader {
121 int pos;
124 } BufferReader;
125
126 static OPJ_SIZE_T stream_read(
void *out_buffer, OPJ_SIZE_T nb_bytes,
void *
user_data)
127 {
129 if (reader->pos == reader->size) {
130 return (OPJ_SIZE_T)-1;
131 }
132 int remaining = reader->size - reader->pos;
133 if (nb_bytes > remaining) {
134 nb_bytes = remaining;
135 }
136 memcpy(out_buffer, reader->buffer + reader->pos, nb_bytes);
137 reader->pos += (int)nb_bytes;
138 return nb_bytes;
139 }
140
141 static OPJ_OFF_T stream_skip(OPJ_OFF_T nb_bytes, void *user_data)
142 {
144 if (nb_bytes < 0) {
145 if (reader->pos == 0) {
146 return (OPJ_SIZE_T)-1;
147 }
148 if (nb_bytes + reader->pos < 0) {
149 nb_bytes = -reader->pos;
150 }
151 } else {
152 if (reader->pos == reader->size) {
153 return (OPJ_SIZE_T)-1;
154 }
155 int remaining = reader->size - reader->pos;
156 if (nb_bytes > remaining) {
157 nb_bytes = remaining;
158 }
159 }
160 reader->pos += (int)nb_bytes;
161 return nb_bytes;
162 }
163
164 static OPJ_BOOL
stream_seek(OPJ_OFF_T nb_bytes,
void *user_data)
165 {
167 if (nb_bytes < 0 || nb_bytes > reader->size) {
168 return OPJ_FALSE;
169 }
170 reader->pos = (int)nb_bytes;
171 return OPJ_TRUE;
172 }
173 #endif // OPENJPEG_MAJOR_VERSION == 2
174
176 {
178 int match = 1;
179
181 return 0;
182 }
183
185 case 4:
186 match = match &&
187 desc->
comp[3].
depth >= image->comps[3].prec &&
188 1 == image->comps[3].dx &&
189 1 == image->comps[3].dy;
190 case 3:
191 match = match &&
192 desc->
comp[2].
depth >= image->comps[2].prec &&
195 case 2:
196 match = match &&
197 desc->
comp[1].
depth >= image->comps[1].prec &&
200 case 1:
201 match = match &&
202 desc->
comp[0].
depth >= image->comps[0].prec &&
203 1 == image->comps[0].dx &&
204 1 == image->comps[0].dy;
205 default:
206 break;
207 }
208
209 return match;
210 }
211
215 int possible_fmts_nb = 0;
216
217 switch (image->color_space) {
218 case OPJ(CLRSPC_SRGB):
221 break;
222 case OPJ(CLRSPC_GRAY):
225 break;
226 case OPJ(CLRSPC_SYCC):
229 break;
230 default:
233 break;
234 }
235
236 for (index = 0; index < possible_fmts_nb; ++
index)
238 return possible_fmts[
index];
239 }
240
242 }
243
245 {
247 int i, component_plane;
248
250 return 0;
251
254 if (component_plane != desc->
comp[i].
plane)
255 return 0;
256 return 1;
257 }
258
262 for (y = 0; y < picture->
height; y++) {
263 index = y * picture->
width;
265 for (x = 0; x < picture->
width; x++, index++)
266 for (c = 0; c < image->numcomps; c++)
267 *img_ptr++ = 0x80 * image->comps[c].sgnd + image->comps[c].data[index];
268 }
269 }
270
272 uint16_t *img_ptr;
276 for (x = 0; x < image->numcomps; x++)
278
279 for (y = 0; y < picture->
height; y++) {
280 index = y * picture->
width;
281 img_ptr = (uint16_t *) (picture->
data[0] + y * picture->
linesize[0]);
282 for (x = 0; x < picture->
width; x++, index++)
283 for (c = 0; c < image->numcomps; c++)
284 *img_ptr++ = (1 << image->comps[c].prec - 1) * image->comps[
c].sgnd +
285 (unsigned)image->comps[c].data[index] << adjust[c];
286 }
287 }
288
290 int *comp_data;
293
294 for (index = 0; index < image->numcomps; index++) {
295 comp_data = image->comps[
index].data;
296 for (y = 0; y < image->comps[
index].h; y++) {
298 for (x = 0; x < image->comps[
index].w; x++) {
299 *img_ptr = 0x80 * image->comps[
index].sgnd + *comp_data;
300 img_ptr++;
301 comp_data++;
302 }
303 }
304 }
305 }
306
308 int *comp_data;
309 uint16_t *img_ptr;
313 for (x = 0; x < image->numcomps; x++)
315
316 for (index = 0; index < image->numcomps; index++) {
317 comp_data = image->comps[
index].data;
318 for (y = 0; y < image->comps[
index].h; y++) {
319 img_ptr = (uint16_t *)(picture->
data[index] + y * picture->
linesize[index]);
320 for (x = 0; x < image->comps[
index].w; x++) {
321 *img_ptr = (1 << image->comps[
index].prec - 1) * image->comps[index].sgnd +
322 (
unsigned)*comp_data << adjust[
index];
323 img_ptr++;
324 comp_data++;
325 }
326 }
327 }
328 }
329
331 {
333
334 opj_set_default_decoder_parameters(&ctx->
dec_params);
335 return 0;
336 }
337
339 void *
data,
int *got_frame,
341 {
343 int buf_size = avpkt->
size;
349 int pixel_size = 0;
350 int ispacked = 0;
351 int i;
352 opj_image_t *image =
NULL;
353 #if OPENJPEG_MAJOR_VERSION == 1
354 opj_dinfo_t *dec =
NULL;
355 opj_cio_t *stream =
NULL;
356 #else // OPENJPEG_MAJOR_VERSION == 2
357 BufferReader reader = {0, avpkt->
size, avpkt->
data};
358 opj_codec_t *dec =
NULL;
359 opj_stream_t *stream =
NULL;
360 #endif // OPENJPEG_MAJOR_VERSION == 1
361
362 *got_frame = 0;
363
364 // Check if input is a raw jpeg2k codestream or in jp2 wrapping
369 } else {
370 /* If the AVPacket contains a jp2c box, then skip to
371 * the starting byte of the codestream. */
373 buf += 8;
375 }
376
377 if (!dec) {
380 goto done;
381 }
382
383 #if OPENJPEG_MAJOR_VERSION == 1
388 opj_set_event_mgr((opj_common_ptr) dec, &ctx->
event_mgr, avctx);
389 ctx->
dec_params.cp_limit_decoding = LIMIT_TO_MAIN_HEADER;
391 #else // OPENJPEG_MAJOR_VERSION == 2
397 goto done;
398 }
399
402 #endif // OPENJPEG_MAJOR_VERSION == 1
403
404 // Tie decoder with decoding parameters
406
407 #if OPENJPEG_MAJOR_VERSION == 1
408 stream = opj_cio_open((opj_common_ptr) dec, buf, buf_size);
409 #else // OPENJPEG_MAJOR_VERSION == 2
410 stream = opj_stream_default_create(OPJ_STREAM_READ);
411 #endif // OPENJPEG_MAJOR_VERSION == 1
412
413 if (!stream) {
415 "Codestream could not be opened for reading.\n");
417 goto done;
418 }
419
420 #if OPENJPEG_MAJOR_VERSION == 1
421 // Decode the header only.
422 image = opj_decode_with_info(dec, stream,
NULL);
423 opj_cio_close(stream);
425 ret = !image;
426 #else // OPENJPEG_MAJOR_VERSION == 2
427 opj_stream_set_read_function(stream, stream_read);
428 opj_stream_set_skip_function(stream, stream_skip);
430 #if HAVE_OPENJPEG_2_1_OPENJPEG_H
431 opj_stream_set_user_data(stream, &reader,
NULL);
432 #elif HAVE_OPENJPEG_2_0_OPENJPEG_H
433 opj_stream_set_user_data(stream, &reader);
434 #else
435 #error Missing call to opj_stream_set_user_data
436 #endif
437 opj_stream_set_user_data_length(stream, avpkt->
size);
438 // Decode the header only.
439 ret = !opj_read_header(stream, dec, &image);
440 #endif // OPENJPEG_MAJOR_VERSION == 1
441
442 if (ret) {
445 goto done;
446 }
447
448 width = image->x1 - image->x0;
449 height = image->y1 - image->y0;
450
452 if (ret < 0)
453 goto done;
454
458
461
465 goto done;
466 }
467 for (i = 0; i < image->numcomps; i++)
470
472 goto done;
473
474 #if OPENJPEG_MAJOR_VERSION == 1
475 ctx->
dec_params.cp_limit_decoding = NO_LIMITATION;
477 // Tie decoder with decoding parameters.
479 stream = opj_cio_open((opj_common_ptr) dec, buf, buf_size);
480 if (!stream) {
482 "Codestream could not be opened for reading.\n");
484 goto done;
485 }
486 opj_image_destroy(image);
487 // Decode the codestream
488 image = opj_decode_with_info(dec, stream,
NULL);
489 ret = !image;
490 #else // OPENJPEG_MAJOR_VERSION == 2
491 ret = !opj_decode(dec, stream, image);
492 #endif // OPENJPEG_MAJOR_VERSION == 1
493
494 if (ret) {
497 goto done;
498 }
499
500 for (i = 0; i < image->numcomps; i++) {
501 if (!image->comps[i].data) {
503 "Image component %d contains no data.\n", i);
505 goto done;
506 }
507 }
508
512
513 switch (pixel_size) {
514 case 1:
515 if (ispacked) {
517 } else {
519 }
520 break;
521 case 2:
522 if (ispacked) {
524 } else {
526 }
527 break;
528 case 3:
529 case 4:
530 if (ispacked) {
532 }
533 break;
534 case 6:
535 case 8:
536 if (ispacked) {
538 }
539 break;
540 default:
543 goto done;
544 }
545
546 *got_frame = 1;
547 ret = buf_size;
548
549 done:
550 opj_image_destroy(image);
551 #if OPENJPEG_MAJOR_VERSION == 2
552 opj_stream_destroy(stream);
553 opj_destroy_codec(dec);
554 #else
555 opj_cio_close(stream);
556 opj_destroy_decompress(dec);
557 #endif
558 return ret;
559 }
560
562 {
563 const char *
version = opj_version();
564 int major, minor;
565
566 if (sscanf(version, "%d.%d", &major, &minor) == 2 && 1000*major + minor <= 1003)
568 }
569
570 #define OFFSET(x) offsetof(LibOpenJPEGContext, x)
571 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
572
574 { "lowqual", "Limit the number of layers used for decoding",
577 };
578
584 };
585
587 .
name =
"libopenjpeg",
595 .max_lowres = 31,
596 .priv_class = &openjpeg_class,
598 };
static void libopenjpeg_copy_to_packed16(AVFrame *picture, opj_image_t *image)
int plane
Which of the 4 planes contains the component.
static int libopenjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static enum AVPixelFormat pix_fmt
static int libopenjpeg_ispacked(enum AVPixelFormat pix_fmt)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
static av_cold int init(AVCodecContext *avctx)
static void stream_seek(VideoState *is, int64_t pos, int64_t rel, int seek_by_bytes)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
#define AV_CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
static const AVClass openjpeg_class
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
static enum AVPixelFormat libopenjpeg_gray_pix_fmts[]
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
#define XYZ_PIXEL_FORMATS
Multithreading support functions.
static void warning_callback(const char *msg, void *data)
static av_cold int libopenjpeg_decode_init(AVCodecContext *avctx)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
static av_cold void init_static_data(void)
int lowres
low resolution decoding, 1-> 1/2 size, 2->1/4 size
static void libopenjpeg_copyto8(AVFrame *picture, opj_image_t *image)
#define YUV_PIXEL_FORMATS
static void libopenjpeg_copyto16(AVFrame *picture, opj_image_t *image)
int width
width and height of the video frame
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
AVS_Value void * user_data
int capabilities
Codec capabilities.
static enum AVPixelFormat libopenjpeg_all_pix_fmts[]
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
const char * name
Name of the codec implementation.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
static void libopenjpeg_copy_to_packed8(AVFrame *picture, opj_image_t *image)
#define RGB_PIXEL_FORMATS
uint8_t nb_components
The number of components each pixel has, (1-4)
#define AV_PIX_FMT_GRAY16
static enum AVPixelFormat libopenjpeg_yuv_pix_fmts[]
#define FF_ARRAY_ELEMS(a)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
main external API structure.
BYTE int const BYTE int int int height
Describe the class of an AVClass context structure.
static enum AVPixelFormat libopenjpeg_guess_pix_fmt(const opj_image_t *image)
opj_event_mgr_t event_mgr
static enum AVPixelFormat libopenjpeg_rgb_pix_fmts[]
int shift
Number of least significant bits that must be shifted away to get the value.
static av_cold void libopenjpeg_static_init(AVCodec *codec)
static void info_callback(const char *msg, void *data)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
common internal api header.
common internal and external API header
static int libopenjpeg_matches_pix_fmt(const opj_image_t *image, enum AVPixelFormat pix_fmt)
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
static const AVOption options[]
static void error_callback(const char *msg, void *data)
opj_dparameters_t dec_params
AVCodec ff_libopenjpeg_decoder
int depth
Number of bits in the component.
#define AVERROR_EXTERNAL
Generic error in an external library.
AVPixelFormat
Pixel format.
This structure stores compressed data.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
int step
Number of elements between 2 horizontally consecutive pixels.
#define GRAY_PIXEL_FORMATS