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);
248 opj_image_destroy(ctx->
image);
260 const int numcomps = image->numcomps;
262 for (compno = 0; compno < numcomps; ++compno) {
263 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
269 for (compno = 0; compno < numcomps; ++compno) {
270 for (y = 0; y < avctx->
height; ++
y) {
271 image_line = image->comps[compno].data + y * image->comps[compno].w;
272 frame_index = y * frame->
linesize[0] + compno;
273 for (x = 0; x < avctx->
width; ++x) {
274 image_line[x] = frame->
data[0][frame_index];
275 frame_index += numcomps;
277 for (; x < image->comps[compno].w; ++x) {
278 image_line[x] = image_line[x - 1];
281 for (; y < image->comps[compno].h; ++
y) {
282 image_line = image->comps[compno].data + y * image->comps[compno].w;
283 for (x = 0; x < image->comps[compno].w; ++x) {
284 image_line[x] = image_line[x - image->comps[compno].w];
299 const int numcomps = image->numcomps;
300 uint16_t *frame_ptr = (uint16_t *)frame->
data[0];
302 for (compno = 0; compno < numcomps; ++compno) {
303 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
309 for (compno = 0; compno < numcomps; ++compno) {
310 for (y = 0; y < avctx->
height; ++
y) {
311 image_line = image->comps[compno].data + y * image->comps[compno].w;
312 frame_index = y * (frame->
linesize[0] / 2) + compno;
313 for (x = 0; x < avctx->
width; ++x) {
314 image_line[x] = frame_ptr[frame_index] >> 4;
315 frame_index += numcomps;
317 for (; x < image->comps[compno].w; ++x) {
318 image_line[x] = image_line[x - 1];
321 for (; y < image->comps[compno].h; ++
y) {
322 image_line = image->comps[compno].data + y * image->comps[compno].w;
323 for (x = 0; x < image->comps[compno].w; ++x) {
324 image_line[x] = image_line[x - image->comps[compno].w];
339 const int numcomps = image->numcomps;
340 uint16_t *frame_ptr = (uint16_t*)frame->
data[0];
342 for (compno = 0; compno < numcomps; ++compno) {
343 if (image->comps[compno].w > frame->
linesize[0] / numcomps) {
349 for (compno = 0; compno < numcomps; ++compno) {
350 for (y = 0; y < avctx->
height; ++
y) {
351 image_line = image->comps[compno].data + y * image->comps[compno].w;
352 frame_index = y * (frame->
linesize[0] / 2) + compno;
353 for (x = 0; x < avctx->
width; ++x) {
354 image_line[x] = frame_ptr[frame_index];
355 frame_index += numcomps;
357 for (; x < image->comps[compno].w; ++x) {
358 image_line[x] = image_line[x - 1];
361 for (; y < image->comps[compno].h; ++
y) {
362 image_line = image->comps[compno].data + y * image->comps[compno].w;
363 for (x = 0; x < image->comps[compno].w; ++x) {
364 image_line[x] = image_line[x - image->comps[compno].w];
381 const int numcomps = image->numcomps;
383 for (compno = 0; compno < numcomps; ++compno) {
384 if (image->comps[compno].w > frame->
linesize[compno]) {
390 for (compno = 0; compno < numcomps; ++compno) {
391 width = avctx->
width / image->comps[compno].dx;
392 height = avctx->
height / image->comps[compno].dy;
394 image_line = image->comps[compno].data + y * image->comps[compno].w;
395 frame_index = y * frame->
linesize[compno];
396 for (x = 0; x <
width; ++x)
397 image_line[x] = frame->
data[compno][frame_index++];
398 for (; x < image->comps[compno].w; ++x) {
399 image_line[x] = image_line[x - 1];
402 for (; y < image->comps[compno].h; ++
y) {
403 image_line = image->comps[compno].data + y * image->comps[compno].w;
404 for (x = 0; x < image->comps[compno].w; ++x) {
405 image_line[x] = image_line[x - image->comps[compno].w];
422 const int numcomps = image->numcomps;
425 for (compno = 0; compno < numcomps; ++compno) {
426 if (image->comps[compno].w > frame->
linesize[compno]) {
432 for (compno = 0; compno < numcomps; ++compno) {
433 width = avctx->
width / image->comps[compno].dx;
434 height = avctx->
height / image->comps[compno].dy;
435 frame_ptr = (uint16_t *)frame->
data[compno];
437 image_line = image->comps[compno].data + y * image->comps[compno].w;
438 frame_index = y * (frame->
linesize[compno] / 2);
439 for (x = 0; x <
width; ++x)
440 image_line[x] = frame_ptr[frame_index++];
441 for (; x < image->comps[compno].w; ++x) {
442 image_line[x] = image_line[x - 1];
445 for (; y < image->comps[compno].h; ++
y) {
446 image_line = image->comps[compno].data + y * image->comps[compno].w;
447 for (x = 0; x < image->comps[compno].w; ++x) {
448 image_line[x] = image_line[x - image->comps[compno].w];
460 opj_image_t *image = ctx->
image;
461 opj_cinfo_t *compress =
NULL;
462 opj_cio_t *stream =
NULL;
544 "The frame's pixel format '%s' is not supported\n",
552 "Could not copy the frame data to the internal image buffer\n");
556 compress = opj_create_compress(ctx->
format);
562 opj_setup_encoder(compress, &ctx->
enc_params, image);
564 stream = opj_cio_open((opj_common_ptr) compress,
NULL, 0);
574 opj_set_event_mgr((opj_common_ptr) compress, &ctx->
event_mgr, avctx);
576 if (!opj_encode(compress, stream, image,
NULL)) {
581 len = cio_tell(stream);
586 memcpy(pkt->
data, stream->buffer, len);
590 opj_cio_close(stream);
592 opj_destroy_compress(compress);
602 opj_image_destroy(ctx->
image);
607 #define OFFSET(x) offsetof(LibOpenJPEGContext, x)
608 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
617 {
"cinema_mode",
"Digital Cinema",
OFFSET(cinema_mode),
AV_OPT_TYPE_INT, { .i64 = OFF }, OFF, CINEMA4K_24,
VE,
"cinema_mode" },
622 {
"prog_order",
"Progression Order",
OFFSET(prog_order),
AV_OPT_TYPE_INT, { .i64 = LRCP }, LRCP, CPRL,
VE,
"prog_order" },
644 .
name =
"libopenjpeg",
#define AV_PIX_FMT_YUVA422P16
static int libopenjpeg_copy_unpacked16(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
#define AV_PIX_FMT_YUVA422P9
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_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUVA422P10
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
packed RGB 8:8:8, 24bpp, RGBRGB...
static av_cold int init(AVCodecContext *avctx)
#define AV_PIX_FMT_RGBA64
AVCodec ff_libopenjpeg_encoder
#define AV_PIX_FMT_GBRP10
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static const AVClass openjpeg_class
#define AV_PIX_FMT_YUV420P12
static int libopenjpeg_copy_packed8(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
static av_cold int libopenjpeg_encode_close(AVCodecContext *avctx)
#define AV_CODEC_CAP_INTRA_ONLY
Codec is intra only.
opj_cparameters_t enc_params
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static int libopenjpeg_copy_unpacked8(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
static void cinema_parameters(opj_cparameters_t *p)
#define AV_PIX_FMT_YUVA420P9
static void warning_callback(const char *msg, void *data)
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUVA420P16
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
uint16_t depth_minus1
Number of bits in the component minus 1.
static opj_image_t * mj2_create_image(AVCodecContext *avctx, opj_cparameters_t *parameters)
#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.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_PIX_FMT_YUVA444P16
simple assert() macros that are a bit more flexible than ISO C assert().
static int libopenjpeg_copy_packed16(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
const char * name
Name of the codec implementation.
#define AV_PIX_FMT_YUV444P10
Libavcodec external API header.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
int flags
A combination of AV_PKT_FLAG values.
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
#define AV_PIX_FMT_YUV422P9
uint8_t nb_components
The number of components each pixel has, (1-4)
#define AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_GRAY16
int width
picture width / height.
#define AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_GBRP14
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
static av_cold int libopenjpeg_encode_init(AVCodecContext *avctx)
#define AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P14
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
main external API structure.
static int libopenjpeg_copy_packed12(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image)
BYTE int const BYTE int int int height
#define AV_PIX_FMT_YUV420P10
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Describe the class of an AVClass context structure.
opj_event_mgr_t event_mgr
#define AV_PIX_FMT_YUV420P9
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
#define AV_PIX_FMT_GBR24P
static void info_callback(const char *msg, void *data)
static enum AVPixelFormat pix_fmts[]
#define AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_GBRP12
int global_quality
Global quality for codecs which cannot change it per frame.
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV444P12
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
common internal api header.
common internal and external API header
#define AV_PIX_FMT_YUVA444P9
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
static const AVOption options[]
static void error_callback(const char *msg, void *data)
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
AVPixelFormat
Pixel format.
This structure stores compressed data.
#define AV_PIX_FMT_YUV422P16