yading@10
|
1 /*
|
yading@10
|
2 * JPEG 2000 encoding support via OpenJPEG
|
yading@10
|
3 * Copyright (c) 2011 Michael Bradshaw <mjbshaw gmail com>
|
yading@10
|
4 *
|
yading@10
|
5 * This file is part of FFmpeg.
|
yading@10
|
6 *
|
yading@10
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
9 * License as published by the Free Software Foundation; either
|
yading@10
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
11 *
|
yading@10
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
15 * Lesser General Public License for more details.
|
yading@10
|
16 *
|
yading@10
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
20 */
|
yading@10
|
21
|
yading@10
|
22 /**
|
yading@10
|
23 * @file
|
yading@10
|
24 * JPEG 2000 encoder using libopenjpeg
|
yading@10
|
25 */
|
yading@10
|
26
|
yading@10
|
27 #define OPJ_STATIC
|
yading@10
|
28
|
yading@10
|
29 #include "libavutil/avassert.h"
|
yading@10
|
30 #include "libavutil/common.h"
|
yading@10
|
31 #include "libavutil/imgutils.h"
|
yading@10
|
32 #include "libavutil/intreadwrite.h"
|
yading@10
|
33 #include "libavutil/opt.h"
|
yading@10
|
34 #include "avcodec.h"
|
yading@10
|
35 #include "internal.h"
|
yading@10
|
36
|
yading@10
|
37 #if HAVE_OPENJPEG_1_5_OPENJPEG_H
|
yading@10
|
38 # include <openjpeg-1.5/openjpeg.h>
|
yading@10
|
39 #else
|
yading@10
|
40 # include <openjpeg.h>
|
yading@10
|
41 #endif
|
yading@10
|
42
|
yading@10
|
43 typedef struct {
|
yading@10
|
44 AVClass *avclass;
|
yading@10
|
45 opj_image_t *image;
|
yading@10
|
46 opj_cparameters_t enc_params;
|
yading@10
|
47 opj_cinfo_t *compress;
|
yading@10
|
48 opj_event_mgr_t event_mgr;
|
yading@10
|
49 int format;
|
yading@10
|
50 int profile;
|
yading@10
|
51 int prog_order;
|
yading@10
|
52 int cinema_mode;
|
yading@10
|
53 int numresolution;
|
yading@10
|
54 int numlayers;
|
yading@10
|
55 int disto_alloc;
|
yading@10
|
56 int fixed_alloc;
|
yading@10
|
57 int fixed_quality;
|
yading@10
|
58 } LibOpenJPEGContext;
|
yading@10
|
59
|
yading@10
|
60 static void error_callback(const char *msg, void *data)
|
yading@10
|
61 {
|
yading@10
|
62 av_log(data, AV_LOG_ERROR, "%s\n", msg);
|
yading@10
|
63 }
|
yading@10
|
64
|
yading@10
|
65 static void warning_callback(const char *msg, void *data)
|
yading@10
|
66 {
|
yading@10
|
67 av_log(data, AV_LOG_WARNING, "%s\n", msg);
|
yading@10
|
68 }
|
yading@10
|
69
|
yading@10
|
70 static void info_callback(const char *msg, void *data)
|
yading@10
|
71 {
|
yading@10
|
72 av_log(data, AV_LOG_DEBUG, "%s\n", msg);
|
yading@10
|
73 }
|
yading@10
|
74
|
yading@10
|
75 static opj_image_t *mj2_create_image(AVCodecContext *avctx, opj_cparameters_t *parameters)
|
yading@10
|
76 {
|
yading@10
|
77 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
|
yading@10
|
78 opj_image_cmptparm_t *cmptparm;
|
yading@10
|
79 opj_image_t *img;
|
yading@10
|
80 int i;
|
yading@10
|
81 int sub_dx[4];
|
yading@10
|
82 int sub_dy[4];
|
yading@10
|
83 int numcomps;
|
yading@10
|
84 OPJ_COLOR_SPACE color_space = CLRSPC_UNKNOWN;
|
yading@10
|
85
|
yading@10
|
86 sub_dx[0] = sub_dx[3] = 1;
|
yading@10
|
87 sub_dy[0] = sub_dy[3] = 1;
|
yading@10
|
88 sub_dx[1] = sub_dx[2] = 1 << desc->log2_chroma_w;
|
yading@10
|
89 sub_dy[1] = sub_dy[2] = 1 << desc->log2_chroma_h;
|
yading@10
|
90
|
yading@10
|
91 numcomps = desc->nb_components;
|
yading@10
|
92
|
yading@10
|
93 switch (avctx->pix_fmt) {
|
yading@10
|
94 case AV_PIX_FMT_GRAY8:
|
yading@10
|
95 case AV_PIX_FMT_GRAY8A:
|
yading@10
|
96 case AV_PIX_FMT_GRAY16:
|
yading@10
|
97 color_space = CLRSPC_GRAY;
|
yading@10
|
98 break;
|
yading@10
|
99 case AV_PIX_FMT_RGB24:
|
yading@10
|
100 case AV_PIX_FMT_RGBA:
|
yading@10
|
101 case AV_PIX_FMT_RGB48:
|
yading@10
|
102 case AV_PIX_FMT_RGBA64:
|
yading@10
|
103 case AV_PIX_FMT_GBR24P:
|
yading@10
|
104 case AV_PIX_FMT_GBRP9:
|
yading@10
|
105 case AV_PIX_FMT_GBRP10:
|
yading@10
|
106 case AV_PIX_FMT_GBRP12:
|
yading@10
|
107 case AV_PIX_FMT_GBRP14:
|
yading@10
|
108 case AV_PIX_FMT_GBRP16:
|
yading@10
|
109 color_space = CLRSPC_SRGB;
|
yading@10
|
110 break;
|
yading@10
|
111 case AV_PIX_FMT_YUV410P:
|
yading@10
|
112 case AV_PIX_FMT_YUV411P:
|
yading@10
|
113 case AV_PIX_FMT_YUV420P:
|
yading@10
|
114 case AV_PIX_FMT_YUV422P:
|
yading@10
|
115 case AV_PIX_FMT_YUV440P:
|
yading@10
|
116 case AV_PIX_FMT_YUV444P:
|
yading@10
|
117 case AV_PIX_FMT_YUVA420P:
|
yading@10
|
118 case AV_PIX_FMT_YUVA422P:
|
yading@10
|
119 case AV_PIX_FMT_YUVA444P:
|
yading@10
|
120 case AV_PIX_FMT_YUV420P9:
|
yading@10
|
121 case AV_PIX_FMT_YUV422P9:
|
yading@10
|
122 case AV_PIX_FMT_YUV444P9:
|
yading@10
|
123 case AV_PIX_FMT_YUVA420P9:
|
yading@10
|
124 case AV_PIX_FMT_YUVA422P9:
|
yading@10
|
125 case AV_PIX_FMT_YUVA444P9:
|
yading@10
|
126 case AV_PIX_FMT_YUV420P10:
|
yading@10
|
127 case AV_PIX_FMT_YUV422P10:
|
yading@10
|
128 case AV_PIX_FMT_YUV444P10:
|
yading@10
|
129 case AV_PIX_FMT_YUVA420P10:
|
yading@10
|
130 case AV_PIX_FMT_YUVA422P10:
|
yading@10
|
131 case AV_PIX_FMT_YUVA444P10:
|
yading@10
|
132 case AV_PIX_FMT_YUV420P12:
|
yading@10
|
133 case AV_PIX_FMT_YUV422P12:
|
yading@10
|
134 case AV_PIX_FMT_YUV444P12:
|
yading@10
|
135 case AV_PIX_FMT_YUV420P14:
|
yading@10
|
136 case AV_PIX_FMT_YUV422P14:
|
yading@10
|
137 case AV_PIX_FMT_YUV444P14:
|
yading@10
|
138 case AV_PIX_FMT_YUV420P16:
|
yading@10
|
139 case AV_PIX_FMT_YUV422P16:
|
yading@10
|
140 case AV_PIX_FMT_YUV444P16:
|
yading@10
|
141 case AV_PIX_FMT_YUVA420P16:
|
yading@10
|
142 case AV_PIX_FMT_YUVA422P16:
|
yading@10
|
143 case AV_PIX_FMT_YUVA444P16:
|
yading@10
|
144 color_space = CLRSPC_SYCC;
|
yading@10
|
145 break;
|
yading@10
|
146 default:
|
yading@10
|
147 av_log(avctx, AV_LOG_ERROR,
|
yading@10
|
148 "The requested pixel format '%s' is not supported\n",
|
yading@10
|
149 av_get_pix_fmt_name(avctx->pix_fmt));
|
yading@10
|
150 return NULL;
|
yading@10
|
151 }
|
yading@10
|
152
|
yading@10
|
153 cmptparm = av_mallocz(numcomps * sizeof(*cmptparm));
|
yading@10
|
154 if (!cmptparm) {
|
yading@10
|
155 av_log(avctx, AV_LOG_ERROR, "Not enough memory\n");
|
yading@10
|
156 return NULL;
|
yading@10
|
157 }
|
yading@10
|
158 for (i = 0; i < numcomps; i++) {
|
yading@10
|
159 cmptparm[i].prec = desc->comp[i].depth_minus1 + 1;
|
yading@10
|
160 cmptparm[i].bpp = desc->comp[i].depth_minus1 + 1;
|
yading@10
|
161 cmptparm[i].sgnd = 0;
|
yading@10
|
162 cmptparm[i].dx = sub_dx[i];
|
yading@10
|
163 cmptparm[i].dy = sub_dy[i];
|
yading@10
|
164 cmptparm[i].w = avctx->width / sub_dx[i];
|
yading@10
|
165 cmptparm[i].h = avctx->height / sub_dy[i];
|
yading@10
|
166 }
|
yading@10
|
167
|
yading@10
|
168 img = opj_image_create(numcomps, cmptparm, color_space);
|
yading@10
|
169 av_freep(&cmptparm);
|
yading@10
|
170 return img;
|
yading@10
|
171 }
|
yading@10
|
172
|
yading@10
|
173 static av_cold int libopenjpeg_encode_init(AVCodecContext *avctx)
|
yading@10
|
174 {
|
yading@10
|
175 LibOpenJPEGContext *ctx = avctx->priv_data;
|
yading@10
|
176 int err = AVERROR(ENOMEM);
|
yading@10
|
177
|
yading@10
|
178 opj_set_default_encoder_parameters(&ctx->enc_params);
|
yading@10
|
179
|
yading@10
|
180 ctx->enc_params.cp_rsiz = ctx->profile;
|
yading@10
|
181 ctx->enc_params.mode = !!avctx->global_quality;
|
yading@10
|
182 ctx->enc_params.cp_cinema = ctx->cinema_mode;
|
yading@10
|
183 ctx->enc_params.prog_order = ctx->prog_order;
|
yading@10
|
184 ctx->enc_params.numresolution = ctx->numresolution;
|
yading@10
|
185 ctx->enc_params.cp_disto_alloc = ctx->disto_alloc;
|
yading@10
|
186 ctx->enc_params.cp_fixed_alloc = ctx->fixed_alloc;
|
yading@10
|
187 ctx->enc_params.cp_fixed_quality = ctx->fixed_quality;
|
yading@10
|
188 ctx->enc_params.tcp_numlayers = ctx->numlayers;
|
yading@10
|
189 ctx->enc_params.tcp_rates[0] = FFMAX(avctx->compression_level, 0) * 2;
|
yading@10
|
190
|
yading@10
|
191 if (ctx->cinema_mode > 0) {
|
yading@10
|
192 ctx->enc_params.irreversible = 1;
|
yading@10
|
193 ctx->enc_params.tcp_mct = 1;
|
yading@10
|
194 ctx->enc_params.tile_size_on = 0;
|
yading@10
|
195 /* no subsampling */
|
yading@10
|
196 ctx->enc_params.cp_tdx=1;
|
yading@10
|
197 ctx->enc_params.cp_tdy=1;
|
yading@10
|
198 ctx->enc_params.subsampling_dx = 1;
|
yading@10
|
199 ctx->enc_params.subsampling_dy = 1;
|
yading@10
|
200 /* Tile and Image shall be at (0,0) */
|
yading@10
|
201 ctx->enc_params.cp_tx0 = 0;
|
yading@10
|
202 ctx->enc_params.cp_ty0 = 0;
|
yading@10
|
203 ctx->enc_params.image_offset_x0 = 0;
|
yading@10
|
204 ctx->enc_params.image_offset_y0 = 0;
|
yading@10
|
205 /* Codeblock size= 32*32 */
|
yading@10
|
206 ctx->enc_params.cblockw_init = 32;
|
yading@10
|
207 ctx->enc_params.cblockh_init = 32;
|
yading@10
|
208 ctx->enc_params.csty |= 0x01;
|
yading@10
|
209 /* No ROI */
|
yading@10
|
210 ctx->enc_params.roi_compno = -1;
|
yading@10
|
211
|
yading@10
|
212 if (ctx->enc_params.prog_order != CPRL) {
|
yading@10
|
213 av_log(avctx, AV_LOG_ERROR, "prog_order forced to CPRL\n");
|
yading@10
|
214 ctx->enc_params.prog_order = CPRL;
|
yading@10
|
215 }
|
yading@10
|
216 ctx->enc_params.tp_flag = 'C';
|
yading@10
|
217 ctx->enc_params.tp_on = 1;
|
yading@10
|
218 }
|
yading@10
|
219
|
yading@10
|
220 ctx->compress = opj_create_compress(ctx->format);
|
yading@10
|
221 if (!ctx->compress) {
|
yading@10
|
222 av_log(avctx, AV_LOG_ERROR, "Error creating the compressor\n");
|
yading@10
|
223 return AVERROR(ENOMEM);
|
yading@10
|
224 }
|
yading@10
|
225
|
yading@10
|
226 avctx->coded_frame = avcodec_alloc_frame();
|
yading@10
|
227 if (!avctx->coded_frame) {
|
yading@10
|
228 av_log(avctx, AV_LOG_ERROR, "Error allocating coded frame\n");
|
yading@10
|
229 goto fail;
|
yading@10
|
230 }
|
yading@10
|
231
|
yading@10
|
232 ctx->image = mj2_create_image(avctx, &ctx->enc_params);
|
yading@10
|
233 if (!ctx->image) {
|
yading@10
|
234 av_log(avctx, AV_LOG_ERROR, "Error creating the mj2 image\n");
|
yading@10
|
235 err = AVERROR(EINVAL);
|
yading@10
|
236 goto fail;
|
yading@10
|
237 }
|
yading@10
|
238
|
yading@10
|
239 memset(&ctx->event_mgr, 0, sizeof(opj_event_mgr_t));
|
yading@10
|
240 ctx->event_mgr.info_handler = info_callback;
|
yading@10
|
241 ctx->event_mgr.error_handler = error_callback;
|
yading@10
|
242 ctx->event_mgr.warning_handler = warning_callback;
|
yading@10
|
243 opj_set_event_mgr((opj_common_ptr)ctx->compress, &ctx->event_mgr, avctx);
|
yading@10
|
244
|
yading@10
|
245 return 0;
|
yading@10
|
246
|
yading@10
|
247 fail:
|
yading@10
|
248 av_freep(&ctx->compress);
|
yading@10
|
249 av_freep(&avctx->coded_frame);
|
yading@10
|
250 return err;
|
yading@10
|
251 }
|
yading@10
|
252
|
yading@10
|
253 static int libopenjpeg_copy_packed8(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
|
yading@10
|
254 {
|
yading@10
|
255 int compno;
|
yading@10
|
256 int x;
|
yading@10
|
257 int y;
|
yading@10
|
258 int image_index;
|
yading@10
|
259 int frame_index;
|
yading@10
|
260 const int numcomps = image->numcomps;
|
yading@10
|
261
|
yading@10
|
262 for (compno = 0; compno < numcomps; ++compno) {
|
yading@10
|
263 if (image->comps[compno].w > frame->linesize[0] / numcomps) {
|
yading@10
|
264 av_log(avctx, AV_LOG_ERROR, "Error: frame's linesize is too small for the image\n");
|
yading@10
|
265 return 0;
|
yading@10
|
266 }
|
yading@10
|
267 }
|
yading@10
|
268
|
yading@10
|
269 for (compno = 0; compno < numcomps; ++compno) {
|
yading@10
|
270 for (y = 0; y < avctx->height; ++y) {
|
yading@10
|
271 image_index = y * avctx->width;
|
yading@10
|
272 frame_index = y * frame->linesize[0] + compno;
|
yading@10
|
273 for (x = 0; x < avctx->width; ++x) {
|
yading@10
|
274 image->comps[compno].data[image_index++] = frame->data[0][frame_index];
|
yading@10
|
275 frame_index += numcomps;
|
yading@10
|
276 }
|
yading@10
|
277 }
|
yading@10
|
278 }
|
yading@10
|
279
|
yading@10
|
280 return 1;
|
yading@10
|
281 }
|
yading@10
|
282
|
yading@10
|
283 static int libopenjpeg_copy_packed16(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
|
yading@10
|
284 {
|
yading@10
|
285 int compno;
|
yading@10
|
286 int x;
|
yading@10
|
287 int y;
|
yading@10
|
288 int image_index;
|
yading@10
|
289 int frame_index;
|
yading@10
|
290 const int numcomps = image->numcomps;
|
yading@10
|
291 uint16_t *frame_ptr = (uint16_t*)frame->data[0];
|
yading@10
|
292
|
yading@10
|
293 for (compno = 0; compno < numcomps; ++compno) {
|
yading@10
|
294 if (image->comps[compno].w > frame->linesize[0] / numcomps) {
|
yading@10
|
295 av_log(avctx, AV_LOG_ERROR, "Error: frame's linesize is too small for the image\n");
|
yading@10
|
296 return 0;
|
yading@10
|
297 }
|
yading@10
|
298 }
|
yading@10
|
299
|
yading@10
|
300 for (compno = 0; compno < numcomps; ++compno) {
|
yading@10
|
301 for (y = 0; y < avctx->height; ++y) {
|
yading@10
|
302 image_index = y * avctx->width;
|
yading@10
|
303 frame_index = y * (frame->linesize[0] / 2) + compno;
|
yading@10
|
304 for (x = 0; x < avctx->width; ++x) {
|
yading@10
|
305 image->comps[compno].data[image_index++] = frame_ptr[frame_index];
|
yading@10
|
306 frame_index += numcomps;
|
yading@10
|
307 }
|
yading@10
|
308 }
|
yading@10
|
309 }
|
yading@10
|
310
|
yading@10
|
311 return 1;
|
yading@10
|
312 }
|
yading@10
|
313
|
yading@10
|
314 static int libopenjpeg_copy_unpacked8(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
|
yading@10
|
315 {
|
yading@10
|
316 int compno;
|
yading@10
|
317 int x;
|
yading@10
|
318 int y;
|
yading@10
|
319 int width;
|
yading@10
|
320 int height;
|
yading@10
|
321 int image_index;
|
yading@10
|
322 int frame_index;
|
yading@10
|
323 const int numcomps = image->numcomps;
|
yading@10
|
324
|
yading@10
|
325 for (compno = 0; compno < numcomps; ++compno) {
|
yading@10
|
326 if (image->comps[compno].w > frame->linesize[compno]) {
|
yading@10
|
327 av_log(avctx, AV_LOG_ERROR, "Error: frame's linesize is too small for the image\n");
|
yading@10
|
328 return 0;
|
yading@10
|
329 }
|
yading@10
|
330 }
|
yading@10
|
331
|
yading@10
|
332 for (compno = 0; compno < numcomps; ++compno) {
|
yading@10
|
333 width = avctx->width / image->comps[compno].dx;
|
yading@10
|
334 height = avctx->height / image->comps[compno].dy;
|
yading@10
|
335 for (y = 0; y < height; ++y) {
|
yading@10
|
336 image_index = y * width;
|
yading@10
|
337 frame_index = y * frame->linesize[compno];
|
yading@10
|
338 for (x = 0; x < width; ++x)
|
yading@10
|
339 image->comps[compno].data[image_index++] = frame->data[compno][frame_index++];
|
yading@10
|
340 }
|
yading@10
|
341 }
|
yading@10
|
342
|
yading@10
|
343 return 1;
|
yading@10
|
344 }
|
yading@10
|
345
|
yading@10
|
346 static int libopenjpeg_copy_unpacked16(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
|
yading@10
|
347 {
|
yading@10
|
348 int compno;
|
yading@10
|
349 int x;
|
yading@10
|
350 int y;
|
yading@10
|
351 int width;
|
yading@10
|
352 int height;
|
yading@10
|
353 int image_index;
|
yading@10
|
354 int frame_index;
|
yading@10
|
355 const int numcomps = image->numcomps;
|
yading@10
|
356 uint16_t *frame_ptr;
|
yading@10
|
357
|
yading@10
|
358 for (compno = 0; compno < numcomps; ++compno) {
|
yading@10
|
359 if (image->comps[compno].w > frame->linesize[compno]) {
|
yading@10
|
360 av_log(avctx, AV_LOG_ERROR, "Error: frame's linesize is too small for the image\n");
|
yading@10
|
361 return 0;
|
yading@10
|
362 }
|
yading@10
|
363 }
|
yading@10
|
364
|
yading@10
|
365 for (compno = 0; compno < numcomps; ++compno) {
|
yading@10
|
366 width = avctx->width / image->comps[compno].dx;
|
yading@10
|
367 height = avctx->height / image->comps[compno].dy;
|
yading@10
|
368 frame_ptr = (uint16_t*)frame->data[compno];
|
yading@10
|
369 for (y = 0; y < height; ++y) {
|
yading@10
|
370 image_index = y * width;
|
yading@10
|
371 frame_index = y * (frame->linesize[compno] / 2);
|
yading@10
|
372 for (x = 0; x < width; ++x)
|
yading@10
|
373 image->comps[compno].data[image_index++] = frame_ptr[frame_index++];
|
yading@10
|
374 }
|
yading@10
|
375 }
|
yading@10
|
376
|
yading@10
|
377 return 1;
|
yading@10
|
378 }
|
yading@10
|
379
|
yading@10
|
380 static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
yading@10
|
381 const AVFrame *frame, int *got_packet)
|
yading@10
|
382 {
|
yading@10
|
383 LibOpenJPEGContext *ctx = avctx->priv_data;
|
yading@10
|
384 opj_cinfo_t *compress = ctx->compress;
|
yading@10
|
385 opj_image_t *image = ctx->image;
|
yading@10
|
386 opj_cio_t *stream;
|
yading@10
|
387 int cpyresult = 0;
|
yading@10
|
388 int ret, len;
|
yading@10
|
389 AVFrame gbrframe;
|
yading@10
|
390
|
yading@10
|
391 // x0, y0 is the top left corner of the image
|
yading@10
|
392 // x1, y1 is the width, height of the reference grid
|
yading@10
|
393 image->x0 = 0;
|
yading@10
|
394 image->y0 = 0;
|
yading@10
|
395 image->x1 = (avctx->width - 1) * ctx->enc_params.subsampling_dx + 1;
|
yading@10
|
396 image->y1 = (avctx->height - 1) * ctx->enc_params.subsampling_dy + 1;
|
yading@10
|
397
|
yading@10
|
398 switch (avctx->pix_fmt) {
|
yading@10
|
399 case AV_PIX_FMT_RGB24:
|
yading@10
|
400 case AV_PIX_FMT_RGBA:
|
yading@10
|
401 case AV_PIX_FMT_GRAY8A:
|
yading@10
|
402 cpyresult = libopenjpeg_copy_packed8(avctx, frame, image);
|
yading@10
|
403 break;
|
yading@10
|
404 case AV_PIX_FMT_RGB48:
|
yading@10
|
405 case AV_PIX_FMT_RGBA64:
|
yading@10
|
406 cpyresult = libopenjpeg_copy_packed16(avctx, frame, image);
|
yading@10
|
407 break;
|
yading@10
|
408 case AV_PIX_FMT_GBR24P:
|
yading@10
|
409 case AV_PIX_FMT_GBRP9:
|
yading@10
|
410 case AV_PIX_FMT_GBRP10:
|
yading@10
|
411 case AV_PIX_FMT_GBRP12:
|
yading@10
|
412 case AV_PIX_FMT_GBRP14:
|
yading@10
|
413 case AV_PIX_FMT_GBRP16:
|
yading@10
|
414 gbrframe = *frame;
|
yading@10
|
415 gbrframe.data[0] = frame->data[2]; // swap to be rgb
|
yading@10
|
416 gbrframe.data[1] = frame->data[0];
|
yading@10
|
417 gbrframe.data[2] = frame->data[1];
|
yading@10
|
418 gbrframe.linesize[0] = frame->linesize[2];
|
yading@10
|
419 gbrframe.linesize[1] = frame->linesize[0];
|
yading@10
|
420 gbrframe.linesize[2] = frame->linesize[1];
|
yading@10
|
421 if (avctx->pix_fmt == AV_PIX_FMT_GBR24P) {
|
yading@10
|
422 cpyresult = libopenjpeg_copy_unpacked8(avctx, &gbrframe, image);
|
yading@10
|
423 } else {
|
yading@10
|
424 cpyresult = libopenjpeg_copy_unpacked16(avctx, &gbrframe, image);
|
yading@10
|
425 }
|
yading@10
|
426 break;
|
yading@10
|
427 case AV_PIX_FMT_GRAY8:
|
yading@10
|
428 case AV_PIX_FMT_YUV410P:
|
yading@10
|
429 case AV_PIX_FMT_YUV411P:
|
yading@10
|
430 case AV_PIX_FMT_YUV420P:
|
yading@10
|
431 case AV_PIX_FMT_YUV422P:
|
yading@10
|
432 case AV_PIX_FMT_YUV440P:
|
yading@10
|
433 case AV_PIX_FMT_YUV444P:
|
yading@10
|
434 case AV_PIX_FMT_YUVA420P:
|
yading@10
|
435 case AV_PIX_FMT_YUVA422P:
|
yading@10
|
436 case AV_PIX_FMT_YUVA444P:
|
yading@10
|
437 cpyresult = libopenjpeg_copy_unpacked8(avctx, frame, image);
|
yading@10
|
438 break;
|
yading@10
|
439 case AV_PIX_FMT_GRAY16:
|
yading@10
|
440 case AV_PIX_FMT_YUV420P9:
|
yading@10
|
441 case AV_PIX_FMT_YUV422P9:
|
yading@10
|
442 case AV_PIX_FMT_YUV444P9:
|
yading@10
|
443 case AV_PIX_FMT_YUVA420P9:
|
yading@10
|
444 case AV_PIX_FMT_YUVA422P9:
|
yading@10
|
445 case AV_PIX_FMT_YUVA444P9:
|
yading@10
|
446 case AV_PIX_FMT_YUV444P10:
|
yading@10
|
447 case AV_PIX_FMT_YUV422P10:
|
yading@10
|
448 case AV_PIX_FMT_YUV420P10:
|
yading@10
|
449 case AV_PIX_FMT_YUVA444P10:
|
yading@10
|
450 case AV_PIX_FMT_YUVA422P10:
|
yading@10
|
451 case AV_PIX_FMT_YUVA420P10:
|
yading@10
|
452 case AV_PIX_FMT_YUV420P12:
|
yading@10
|
453 case AV_PIX_FMT_YUV422P12:
|
yading@10
|
454 case AV_PIX_FMT_YUV444P12:
|
yading@10
|
455 case AV_PIX_FMT_YUV420P14:
|
yading@10
|
456 case AV_PIX_FMT_YUV422P14:
|
yading@10
|
457 case AV_PIX_FMT_YUV444P14:
|
yading@10
|
458 case AV_PIX_FMT_YUV444P16:
|
yading@10
|
459 case AV_PIX_FMT_YUV422P16:
|
yading@10
|
460 case AV_PIX_FMT_YUV420P16:
|
yading@10
|
461 case AV_PIX_FMT_YUVA444P16:
|
yading@10
|
462 case AV_PIX_FMT_YUVA422P16:
|
yading@10
|
463 case AV_PIX_FMT_YUVA420P16:
|
yading@10
|
464 cpyresult = libopenjpeg_copy_unpacked16(avctx, frame, image);
|
yading@10
|
465 break;
|
yading@10
|
466 default:
|
yading@10
|
467 av_log(avctx, AV_LOG_ERROR,
|
yading@10
|
468 "The frame's pixel format '%s' is not supported\n",
|
yading@10
|
469 av_get_pix_fmt_name(avctx->pix_fmt));
|
yading@10
|
470 return AVERROR(EINVAL);
|
yading@10
|
471 break;
|
yading@10
|
472 }
|
yading@10
|
473
|
yading@10
|
474 if (!cpyresult) {
|
yading@10
|
475 av_log(avctx, AV_LOG_ERROR,
|
yading@10
|
476 "Could not copy the frame data to the internal image buffer\n");
|
yading@10
|
477 return -1;
|
yading@10
|
478 }
|
yading@10
|
479
|
yading@10
|
480 opj_setup_encoder(compress, &ctx->enc_params, image);
|
yading@10
|
481 stream = opj_cio_open((opj_common_ptr)compress, NULL, 0);
|
yading@10
|
482 if (!stream) {
|
yading@10
|
483 av_log(avctx, AV_LOG_ERROR, "Error creating the cio stream\n");
|
yading@10
|
484 return AVERROR(ENOMEM);
|
yading@10
|
485 }
|
yading@10
|
486
|
yading@10
|
487 if (!opj_encode(compress, stream, image, NULL)) {
|
yading@10
|
488 opj_cio_close(stream);
|
yading@10
|
489 av_log(avctx, AV_LOG_ERROR, "Error during the opj encode\n");
|
yading@10
|
490 return -1;
|
yading@10
|
491 }
|
yading@10
|
492
|
yading@10
|
493 len = cio_tell(stream);
|
yading@10
|
494 if ((ret = ff_alloc_packet2(avctx, pkt, len)) < 0) {
|
yading@10
|
495 opj_cio_close(stream);
|
yading@10
|
496 return ret;
|
yading@10
|
497 }
|
yading@10
|
498
|
yading@10
|
499 memcpy(pkt->data, stream->buffer, len);
|
yading@10
|
500 pkt->flags |= AV_PKT_FLAG_KEY;
|
yading@10
|
501 *got_packet = 1;
|
yading@10
|
502 opj_cio_close(stream);
|
yading@10
|
503 return 0;
|
yading@10
|
504 }
|
yading@10
|
505
|
yading@10
|
506 static av_cold int libopenjpeg_encode_close(AVCodecContext *avctx)
|
yading@10
|
507 {
|
yading@10
|
508 LibOpenJPEGContext *ctx = avctx->priv_data;
|
yading@10
|
509
|
yading@10
|
510 opj_destroy_compress(ctx->compress);
|
yading@10
|
511 opj_image_destroy(ctx->image);
|
yading@10
|
512 av_freep(&avctx->coded_frame);
|
yading@10
|
513 return 0;
|
yading@10
|
514 }
|
yading@10
|
515
|
yading@10
|
516 #define OFFSET(x) offsetof(LibOpenJPEGContext, x)
|
yading@10
|
517 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
|
yading@10
|
518 static const AVOption options[] = {
|
yading@10
|
519 { "format", "Codec Format", OFFSET(format), AV_OPT_TYPE_INT, { .i64 = CODEC_JP2 }, CODEC_J2K, CODEC_JP2, VE, "format" },
|
yading@10
|
520 { "j2k", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CODEC_J2K }, 0, 0, VE, "format" },
|
yading@10
|
521 { "jp2", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CODEC_JP2 }, 0, 0, VE, "format" },
|
yading@10
|
522 { "profile", NULL, OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = STD_RSIZ }, STD_RSIZ, CINEMA4K, VE, "profile" },
|
yading@10
|
523 { "jpeg2000", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = STD_RSIZ }, 0, 0, VE, "profile" },
|
yading@10
|
524 { "cinema2k", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA2K }, 0, 0, VE, "profile" },
|
yading@10
|
525 { "cinema4k", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA4K }, 0, 0, VE, "profile" },
|
yading@10
|
526 { "cinema_mode", "Digital Cinema", OFFSET(cinema_mode), AV_OPT_TYPE_INT, { .i64 = OFF }, OFF, CINEMA4K_24, VE, "cinema_mode" },
|
yading@10
|
527 { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OFF }, 0, 0, VE, "cinema_mode" },
|
yading@10
|
528 { "2k_24", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA2K_24 }, 0, 0, VE, "cinema_mode" },
|
yading@10
|
529 { "2k_48", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA2K_48 }, 0, 0, VE, "cinema_mode" },
|
yading@10
|
530 { "4k_24", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CINEMA4K_24 }, 0, 0, VE, "cinema_mode" },
|
yading@10
|
531 { "prog_order", "Progression Order", OFFSET(prog_order), AV_OPT_TYPE_INT, { .i64 = LRCP }, LRCP, CPRL, VE, "prog_order" },
|
yading@10
|
532 { "lrcp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LRCP }, 0, 0, VE, "prog_order" },
|
yading@10
|
533 { "rlcp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = RLCP }, 0, 0, VE, "prog_order" },
|
yading@10
|
534 { "rpcl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = RPCL }, 0, 0, VE, "prog_order" },
|
yading@10
|
535 { "pcrl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PCRL }, 0, 0, VE, "prog_order" },
|
yading@10
|
536 { "cprl", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPRL }, 0, 0, VE, "prog_order" },
|
yading@10
|
537 { "numresolution", NULL, OFFSET(numresolution), AV_OPT_TYPE_INT, { .i64 = 6 }, 1, INT_MAX, VE },
|
yading@10
|
538 { "numlayers", NULL, OFFSET(numlayers), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, 10, VE },
|
yading@10
|
539 { "disto_alloc", NULL, OFFSET(disto_alloc), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE },
|
yading@10
|
540 { "fixed_alloc", NULL, OFFSET(fixed_alloc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
|
yading@10
|
541 { "fixed_quality", NULL, OFFSET(fixed_quality), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
|
yading@10
|
542 { NULL },
|
yading@10
|
543 };
|
yading@10
|
544
|
yading@10
|
545 static const AVClass class = {
|
yading@10
|
546 .class_name = "libopenjpeg",
|
yading@10
|
547 .item_name = av_default_item_name,
|
yading@10
|
548 .option = options,
|
yading@10
|
549 .version = LIBAVUTIL_VERSION_INT,
|
yading@10
|
550 };
|
yading@10
|
551
|
yading@10
|
552 AVCodec ff_libopenjpeg_encoder = {
|
yading@10
|
553 .name = "libopenjpeg",
|
yading@10
|
554 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
555 .id = AV_CODEC_ID_JPEG2000,
|
yading@10
|
556 .priv_data_size = sizeof(LibOpenJPEGContext),
|
yading@10
|
557 .init = libopenjpeg_encode_init,
|
yading@10
|
558 .encode2 = libopenjpeg_encode_frame,
|
yading@10
|
559 .close = libopenjpeg_encode_close,
|
yading@10
|
560 .capabilities = 0,
|
yading@10
|
561 .pix_fmts = (const enum AVPixelFormat[]) {
|
yading@10
|
562 AV_PIX_FMT_RGB24, AV_PIX_FMT_RGBA, AV_PIX_FMT_RGB48, AV_PIX_FMT_RGBA64,
|
yading@10
|
563 AV_PIX_FMT_GBR24P,
|
yading@10
|
564 AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
|
yading@10
|
565 AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY8A, AV_PIX_FMT_GRAY16,
|
yading@10
|
566 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P,
|
yading@10
|
567 AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA422P,
|
yading@10
|
568 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUVA444P,
|
yading@10
|
569 AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
|
yading@10
|
570 AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
|
yading@10
|
571 AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
|
yading@10
|
572 AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
|
yading@10
|
573 AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12,
|
yading@10
|
574 AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
|
yading@10
|
575 AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
|
yading@10
|
576 AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
|
yading@10
|
577 AV_PIX_FMT_NONE
|
yading@10
|
578 },
|
yading@10
|
579 .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"),
|
yading@10
|
580 .priv_class = &class,
|
yading@10
|
581 };
|