libopenjpegdec.c
Go to the documentation of this file.
1 /*
2  * JPEG 2000 decoding support via OpenJPEG
3  * Copyright (c) 2009 Jaikrishnan Menon <realityman@gmx.net>
4  *
5  * This file is part of Libav.
6  *
7  * Libav 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  * Libav 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 Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
27 #define OPJ_STATIC
28 #include <openjpeg.h>
29 
30 #include "libavutil/common.h"
31 #include "libavutil/intreadwrite.h"
32 #include "libavutil/imgutils.h"
33 #include "libavutil/pixfmt.h"
34 #include "libavutil/opt.h"
35 #include "avcodec.h"
36 #include "thread.h"
37 
38 #define JP2_SIG_TYPE 0x6A502020
39 #define JP2_SIG_VALUE 0x0D0A870A
40 
41 // pix_fmts with lower bpp have to be listed before
42 // similar pix_fmts with higher bpp.
43 #define RGB_PIXEL_FORMATS AV_PIX_FMT_RGB24, AV_PIX_FMT_RGBA, \
44  AV_PIX_FMT_RGB48
45 
46 #define GRAY_PIXEL_FORMATS AV_PIX_FMT_GRAY8, AV_PIX_FMT_Y400A, \
47  AV_PIX_FMT_GRAY16
48 
49 #define YUV_PIXEL_FORMATS AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P, \
50  AV_PIX_FMT_YUVA420P, \
51  AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, \
52  AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P, \
53  AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, \
54  AV_PIX_FMT_YUV444P9, \
55  AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, \
56  AV_PIX_FMT_YUV444P10, \
57  AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, \
58  AV_PIX_FMT_YUV444P16
59 
66 
67 typedef struct {
68  AVClass *class;
69  opj_dparameters_t dec_params;
71  int lowres;
72  int lowqual;
74 
75 static int libopenjpeg_matches_pix_fmt(const opj_image_t *img,
77 {
78  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
79  int match = 1;
80 
81  if (desc->nb_components != img->numcomps) {
82  return 0;
83  }
84 
85  switch (desc->nb_components) {
86  case 4:
87  match = match &&
88  desc->comp[3].depth_minus1 + 1 >= img->comps[3].prec &&
89  1 == img->comps[3].dx &&
90  1 == img->comps[3].dy;
91  case 3:
92  match = match &&
93  desc->comp[2].depth_minus1 + 1 >= img->comps[2].prec &&
94  1 << desc->log2_chroma_w == img->comps[2].dx &&
95  1 << desc->log2_chroma_h == img->comps[2].dy;
96  case 2:
97  match = match &&
98  desc->comp[1].depth_minus1 + 1 >= img->comps[1].prec &&
99  1 << desc->log2_chroma_w == img->comps[1].dx &&
100  1 << desc->log2_chroma_h == img->comps[1].dy;
101  case 1:
102  match = match &&
103  desc->comp[0].depth_minus1 + 1 >= img->comps[0].prec &&
104  1 == img->comps[0].dx &&
105  1 == img->comps[0].dy;
106  default:
107  break;
108  }
109 
110  return match;
111 }
112 
113 static enum AVPixelFormat libopenjpeg_guess_pix_fmt(const opj_image_t *image)
114 {
115  int index;
116  const enum AVPixelFormat *possible_fmts = NULL;
117  int possible_fmts_nb = 0;
118 
119  switch (image->color_space) {
120  case CLRSPC_SRGB:
121  possible_fmts = rgb_pix_fmts;
122  possible_fmts_nb = FF_ARRAY_ELEMS(rgb_pix_fmts);
123  break;
124  case CLRSPC_GRAY:
125  possible_fmts = gray_pix_fmts;
126  possible_fmts_nb = FF_ARRAY_ELEMS(gray_pix_fmts);
127  break;
128  case CLRSPC_SYCC:
129  possible_fmts = yuv_pix_fmts;
130  possible_fmts_nb = FF_ARRAY_ELEMS(yuv_pix_fmts);
131  break;
132  default:
133  possible_fmts = any_pix_fmts;
134  possible_fmts_nb = FF_ARRAY_ELEMS(any_pix_fmts);
135  break;
136  }
137 
138  for (index = 0; index < possible_fmts_nb; ++index) {
139  if (libopenjpeg_matches_pix_fmt(image, possible_fmts[index])) {
140  return possible_fmts[index];
141  }
142  }
143 
144  return AV_PIX_FMT_NONE;
145 }
146 
148 {
149  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
150  int i, component_plane;
151 
152  if (pix_fmt == AV_PIX_FMT_GRAY16)
153  return 0;
154 
155  component_plane = desc->comp[0].plane;
156  for (i = 1; i < desc->nb_components; i++) {
157  if (component_plane != desc->comp[i].plane)
158  return 0;
159  }
160  return 1;
161 }
162 
163 static void libopenjpeg_copy_to_packed8(AVFrame *picture, opj_image_t *image)
164 {
165  uint8_t *img_ptr;
166  int index, x, y, c;
167 
168  for (y = 0; y < picture->height; y++) {
169  index = y*picture->width;
170  img_ptr = picture->data[0] + y*picture->linesize[0];
171  for (x = 0; x < picture->width; x++, index++) {
172  for (c = 0; c < image->numcomps; c++) {
173  *img_ptr++ = image->comps[c].data[index];
174  }
175  }
176  }
177 }
178 
179 static void libopenjpeg_copy_to_packed16(AVFrame *picture, opj_image_t *image)
180 {
181  uint16_t *img_ptr;
182  int index, x, y, c;
183  int adjust[4];
184 
185  for (x = 0; x < image->numcomps; x++)
186  adjust[x] = FFMAX(FFMIN(16 - image->comps[x].prec, 8), 0);
187 
188  for (y = 0; y < picture->height; y++) {
189  index = y*picture->width;
190  img_ptr = (uint16_t*) (picture->data[0] + y*picture->linesize[0]);
191  for (x = 0; x < picture->width; x++, index++) {
192  for (c = 0; c < image->numcomps; c++) {
193  *img_ptr++ = image->comps[c].data[index] << adjust[c];
194  }
195  }
196  }
197 }
198 
199 static void libopenjpeg_copyto8(AVFrame *picture, opj_image_t *image)
200 {
201  int *comp_data;
202  uint8_t *img_ptr;
203  int index, x, y;
204 
205  for (index = 0; index < image->numcomps; index++) {
206  comp_data = image->comps[index].data;
207  for (y = 0; y < image->comps[index].h; y++) {
208  img_ptr = picture->data[index] + y * picture->linesize[index];
209  for (x = 0; x < image->comps[index].w; x++) {
210  *img_ptr = (uint8_t) *comp_data;
211  img_ptr++;
212  comp_data++;
213  }
214  }
215  }
216 }
217 
218 static void libopenjpeg_copyto16(AVFrame *p, opj_image_t *image)
219 {
220  int *comp_data;
221  uint16_t *img_ptr;
222  int index, x, y;
223 
224  for (index = 0; index < image->numcomps; index++) {
225  comp_data = image->comps[index].data;
226  for (y = 0; y < image->comps[index].h; y++) {
227  img_ptr = (uint16_t*) (p->data[index] + y * p->linesize[index]);
228  for (x = 0; x < image->comps[index].w; x++) {
229  *img_ptr = *comp_data;
230  img_ptr++;
231  comp_data++;
232  }
233  }
234  }
235 }
236 
238 {
239  LibOpenJPEGContext *ctx = avctx->priv_data;
240 
241  opj_set_default_decoder_parameters(&ctx->dec_params);
243  avctx->coded_frame = &ctx->image;
244  return 0;
245 }
246 
248 {
249  LibOpenJPEGContext *ctx = avctx->priv_data;
250 
251  avctx->coded_frame = &ctx->image;
252  return 0;
253 }
254 
256  void *data, int *got_frame,
257  AVPacket *avpkt)
258 {
259  uint8_t *buf = avpkt->data;
260  int buf_size = avpkt->size;
261  LibOpenJPEGContext *ctx = avctx->priv_data;
262  AVFrame *picture = &ctx->image, *output = data;
263  const AVPixFmtDescriptor *desc;
264  opj_dinfo_t *dec;
265  opj_cio_t *stream;
266  opj_image_t *image;
267  int width, height, ret = -1;
268  int pixel_size = 0;
269  int ispacked = 0;
270  int i;
271 
272  *got_frame = 0;
273 
274  // Check if input is a raw jpeg2k codestream or in jp2 wrapping
275  if ((AV_RB32(buf) == 12) &&
276  (AV_RB32(buf + 4) == JP2_SIG_TYPE) &&
277  (AV_RB32(buf + 8) == JP2_SIG_VALUE)) {
278  dec = opj_create_decompress(CODEC_JP2);
279  } else {
280  /* If the AVPacket contains a jp2c box, then skip to
281  * the starting byte of the codestream. */
282  if (AV_RB32(buf + 4) == AV_RB32("jp2c"))
283  buf += 8;
284  dec = opj_create_decompress(CODEC_J2K);
285  }
286 
287  if (!dec) {
288  av_log(avctx, AV_LOG_ERROR, "Error initializing decoder.\n");
289  return -1;
290  }
291  opj_set_event_mgr((opj_common_ptr)dec, NULL, NULL);
292 
293  ctx->dec_params.cp_limit_decoding = LIMIT_TO_MAIN_HEADER;
294  ctx->dec_params.cp_reduce = ctx->lowres;
295  ctx->dec_params.cp_layer = ctx->lowqual;
296  // Tie decoder with decoding parameters
297  opj_setup_decoder(dec, &ctx->dec_params);
298  stream = opj_cio_open((opj_common_ptr)dec, buf, buf_size);
299 
300  if (!stream) {
301  av_log(avctx, AV_LOG_ERROR,
302  "Codestream could not be opened for reading.\n");
303  opj_destroy_decompress(dec);
304  return -1;
305  }
306 
307  // Decode the header only.
308  image = opj_decode_with_info(dec, stream, NULL);
309  opj_cio_close(stream);
310 
311  if (!image) {
312  av_log(avctx, AV_LOG_ERROR, "Error decoding codestream.\n");
313  opj_destroy_decompress(dec);
314  return -1;
315  }
316 
317  width = image->x1 - image->x0;
318  height = image->y1 - image->y0;
319 
320  if (ctx->lowres) {
321  width = (width + (1 << ctx->lowres) - 1) >> ctx->lowres;
322  height = (height + (1 << ctx->lowres) - 1) >> ctx->lowres;
323  }
324 
325  if (av_image_check_size(width, height, 0, avctx) < 0) {
326  av_log(avctx, AV_LOG_ERROR,
327  "%dx%d dimension invalid.\n", width, height);
328  goto done;
329  }
330 
331  avcodec_set_dimensions(avctx, width, height);
332 
333  if (avctx->pix_fmt != AV_PIX_FMT_NONE)
334  if (!libopenjpeg_matches_pix_fmt(image, avctx->pix_fmt))
335  avctx->pix_fmt = AV_PIX_FMT_NONE;
336 
337  if (avctx->pix_fmt == AV_PIX_FMT_NONE)
338  avctx->pix_fmt = libopenjpeg_guess_pix_fmt(image);
339 
340  if (avctx->pix_fmt == AV_PIX_FMT_NONE) {
341  av_log(avctx, AV_LOG_ERROR, "Unable to determine pixel format\n");
342  ret = AVERROR_INVALIDDATA;
343  goto done;
344  }
345 
346  for (i = 0; i < image->numcomps; i++)
347  if (image->comps[i].prec > avctx->bits_per_raw_sample)
348  avctx->bits_per_raw_sample = image->comps[i].prec;
349 
350  if (picture->data[0])
351  ff_thread_release_buffer(avctx, picture);
352 
353  if (ff_thread_get_buffer(avctx, picture) < 0) {
354  av_log(avctx, AV_LOG_ERROR, "ff_thread_get_buffer() failed\n");
355  goto done;
356  }
357 
358  ctx->dec_params.cp_limit_decoding = NO_LIMITATION;
359  // Tie decoder with decoding parameters.
360  opj_setup_decoder(dec, &ctx->dec_params);
361  stream = opj_cio_open((opj_common_ptr)dec, buf, buf_size);
362  if (!stream) {
363  av_log(avctx, AV_LOG_ERROR,
364  "Codestream could not be opened for reading.\n");
365  goto done;
366  }
367 
368  opj_image_destroy(image);
369  // Decode the codestream
370  image = opj_decode_with_info(dec, stream, NULL);
371  opj_cio_close(stream);
372 
373  if (!image) {
374  av_log(avctx, AV_LOG_ERROR, "Error decoding codestream.\n");
375  goto done;
376  }
377 
378  desc = av_pix_fmt_desc_get(avctx->pix_fmt);
379  pixel_size = desc->comp[0].step_minus1 + 1;
380  ispacked = libopenjpeg_ispacked(avctx->pix_fmt);
381 
382  switch (pixel_size) {
383  case 1:
384  if (ispacked) {
385  libopenjpeg_copy_to_packed8(picture, image);
386  } else {
387  libopenjpeg_copyto8(picture, image);
388  }
389  break;
390  case 2:
391  if (ispacked) {
392  libopenjpeg_copy_to_packed8(picture, image);
393  } else {
394  libopenjpeg_copyto16(picture, image);
395  }
396  break;
397  case 3:
398  case 4:
399  if (ispacked) {
400  libopenjpeg_copy_to_packed8(picture, image);
401  }
402  break;
403  case 6:
404  case 8:
405  if (ispacked) {
406  libopenjpeg_copy_to_packed16(picture, image);
407  }
408  break;
409  default:
410  av_log(avctx, AV_LOG_ERROR, "unsupported pixel size %d\n", pixel_size);
411  goto done;
412  }
413 
414  *output = ctx->image;
415  *got_frame = 1;
416  ret = buf_size;
417 
418 done:
419  opj_image_destroy(image);
420  opj_destroy_decompress(dec);
421  return ret;
422 }
423 
425 {
426  LibOpenJPEGContext *ctx = avctx->priv_data;
427 
428  if (ctx->image.data[0])
429  ff_thread_release_buffer(avctx, &ctx->image);
430  return 0;
431 }
432 
433 #define OFFSET(x) offsetof(LibOpenJPEGContext, x)
434 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
435 
436 static const AVOption options[] = {
437  { "lowqual", "Limit the number of layers used for decoding", OFFSET(lowqual), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VD },
438  { "lowres", "Lower the decoding resolution by a power of two", OFFSET(lowres), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VD },
439  { NULL },
440 };
441 
442 static const AVClass class = {
443  .class_name = "libopenjpeg",
444  .item_name = av_default_item_name,
445  .option = options,
447 };
448 
450  .name = "libopenjpeg",
451  .type = AVMEDIA_TYPE_VIDEO,
452  .id = AV_CODEC_ID_JPEG2000,
453  .priv_data_size = sizeof(LibOpenJPEGContext),
457  .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
458  .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"),
459  .priv_class = &class,
461 };
static void libopenjpeg_copy_to_packed16(AVFrame *picture, opj_image_t *image)
static int libopenjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
static int libopenjpeg_ispacked(enum AVPixelFormat pix_fmt)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:1435
This structure describes decoded (raw) audio or video data.
Definition: avcodec.h:989
AVOption.
Definition: opt.h:233
misc image utilities
AVFrame * coded_frame
the picture in the bitstream
Definition: avcodec.h:2725
void avcodec_set_dimensions(AVCodecContext *s, int width, int height)
Definition: utils.c:149
int size
Definition: avcodec.h:916
static enum AVPixelFormat rgb_pix_fmts[]
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:1533
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:2711
#define JP2_SIG_TYPE
AVCodec.
Definition: avcodec.h:2960
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:66
static void libopenjpeg_copyto16(AVFrame *p, opj_image_t *image)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:38
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
Definition: mimic.c:228
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:83
uint8_t
AVOptions.
#define AV_RB32
Definition: intreadwrite.h:130
static av_cold int libopenjpeg_decode_init(AVCodecContext *avctx)
const char data[16]
Definition: mxf.c:66
uint8_t * data
Definition: avcodec.h:915
static void libopenjpeg_copyto8(AVFrame *picture, opj_image_t *image)
#define YUV_PIXEL_FORMATS
static int init(AVCodecParserContext *s)
Definition: h264_parser.c:335
#define JP2_SIG_VALUE
uint16_t depth_minus1
number of bits in the component minus 1
Definition: pixdesc.h:43
int width
width and height of the video frame
Definition: avcodec.h:1035
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:75
Multithreading support functions.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:88
static int libopenjpeg_matches_pix_fmt(const opj_image_t *img, enum AVPixelFormat pix_fmt)
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:146
const char * name
Name of the codec implementation.
Definition: avcodec.h:2967
static void libopenjpeg_copy_to_packed8(AVFrame *picture, opj_image_t *image)
#define RGB_PIXEL_FORMATS
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
Definition: internal.h:128
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:220
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition: pixdesc.h:57
static AVFrame * picture
enum AVPixelFormat pix_fmt
Definition: movenc.c:801
static enum AVPixelFormat gray_pix_fmts[]
LIBAVUTIL_VERSION_INT
Definition: eval.c:52
NULL
Definition: eval.c:52
static int width
Definition: utils.c:156
external API header
int linesize[AV_NUM_DATA_POINTERS]
Size, in bytes, of the data for each picture/channel plane.
Definition: avcodec.h:1008
av_default_item_name
Definition: dnxhdenc.c:43
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:55
main external API structure.
Definition: avcodec.h:1339
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:326
void avcodec_get_frame_defaults(AVFrame *frame)
Set the fields of the given AVFrame to default values.
Definition: utils.c:602
Describe the class of an AVClass context structure.
Definition: log.h:33
static enum AVPixelFormat libopenjpeg_guess_pix_fmt(const opj_image_t *image)
int index
Definition: gxfenc.c:72
static av_cold int libopenjpeg_decode_close(AVCodecContext *avctx)
uint16_t step_minus1
Number of elements between 2 horizontally consecutive pixels minus 1.
Definition: pixdesc.h:35
#define VD
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: avcodec.h:997
int height
Definition: gxfenc.c:72
static enum AVPixelFormat any_pix_fmts[]
uint16_t plane
which of the 4 planes contains the component
Definition: pixdesc.h:29
common internal and external API header
void * priv_data
Definition: avcodec.h:1382
pixel format definitions
static const AVOption options[]
static enum AVPixelFormat yuv_pix_fmts[]
opj_dparameters_t dec_params
int height
Definition: avcodec.h:1035
AVCodec ff_libopenjpeg_decoder
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread.c:921
#define OFFSET(x)
AVPixelFormat
Pixel format.
Definition: pixfmt.h:63
This structure stores compressed data.
Definition: avcodec.h:898
static av_cold int libopenjpeg_decode_init_thread_copy(AVCodecContext *avctx)
void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f)
Wrapper around release_buffer() frame-for multithreaded codecs.
Definition: pthread.c:979
#define GRAY_PIXEL_FORMATS