| @@ -106,6 +106,7 @@ static opj_image_t *mj2_create_image(AVCodecContext *avctx, opj_cparameters_t *p | |||||
| case AV_PIX_FMT_GBRP12: | case AV_PIX_FMT_GBRP12: | ||||
| case AV_PIX_FMT_GBRP14: | case AV_PIX_FMT_GBRP14: | ||||
| case AV_PIX_FMT_GBRP16: | case AV_PIX_FMT_GBRP16: | ||||
| case AV_PIX_FMT_XYZ12: | |||||
| color_space = CLRSPC_SRGB; | color_space = CLRSPC_SRGB; | ||||
| break; | break; | ||||
| case AV_PIX_FMT_YUV410P: | case AV_PIX_FMT_YUV410P: | ||||
| @@ -280,6 +281,38 @@ static int libopenjpeg_copy_packed8(AVCodecContext *avctx, const AVFrame *frame, | |||||
| return 1; | return 1; | ||||
| } | } | ||||
| // for XYZ 12 bit | |||||
| static int libopenjpeg_copy_packed12(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image) | |||||
| { | |||||
| int compno; | |||||
| int x; | |||||
| int y; | |||||
| int image_index; | |||||
| int frame_index; | |||||
| const int numcomps = image->numcomps; | |||||
| uint16_t *frame_ptr = (uint16_t*)frame->data[0]; | |||||
| for (compno = 0; compno < numcomps; ++compno) { | |||||
| if (image->comps[compno].w > frame->linesize[0] / numcomps) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Error: frame's linesize is too small for the image\n"); | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| for (compno = 0; compno < numcomps; ++compno) { | |||||
| for (y = 0; y < avctx->height; ++y) { | |||||
| image_index = y * avctx->width; | |||||
| frame_index = y * (frame->linesize[0] / 2) + compno; | |||||
| for (x = 0; x < avctx->width; ++x) { | |||||
| image->comps[compno].data[image_index++] = frame_ptr[frame_index] >> 4; | |||||
| frame_index += numcomps; | |||||
| } | |||||
| } | |||||
| } | |||||
| return 1; | |||||
| } | |||||
| static int libopenjpeg_copy_packed16(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image) | static int libopenjpeg_copy_packed16(AVCodecContext *avctx, const AVFrame *frame, opj_image_t *image) | ||||
| { | { | ||||
| int compno; | int compno; | ||||
| @@ -401,6 +434,9 @@ static int libopenjpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | |||||
| case AV_PIX_FMT_GRAY8A: | case AV_PIX_FMT_GRAY8A: | ||||
| cpyresult = libopenjpeg_copy_packed8(avctx, frame, image); | cpyresult = libopenjpeg_copy_packed8(avctx, frame, image); | ||||
| break; | break; | ||||
| case AV_PIX_FMT_XYZ12: | |||||
| cpyresult = libopenjpeg_copy_packed12(avctx, frame, image); | |||||
| break; | |||||
| case AV_PIX_FMT_RGB48: | case AV_PIX_FMT_RGB48: | ||||
| case AV_PIX_FMT_RGBA64: | case AV_PIX_FMT_RGBA64: | ||||
| cpyresult = libopenjpeg_copy_packed16(avctx, frame, image); | cpyresult = libopenjpeg_copy_packed16(avctx, frame, image); | ||||
| @@ -574,6 +610,7 @@ AVCodec ff_libopenjpeg_encoder = { | |||||
| AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14, | AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14, | ||||
| AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, | AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, | ||||
| AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16, | AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16, | ||||
| AV_PIX_FMT_XYZ12, | |||||
| AV_PIX_FMT_NONE | AV_PIX_FMT_NONE | ||||
| }, | }, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"), | .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"), | ||||