https://stackoverflow.com/questions/22561176/lcms2-convert-cmyk-to-rgb-throu... this was answered like this === copy === hTransform = cmsCreateTransform(hInProfile, TYPE_CMYK_8, hOutProfile, TYPE_ARGB_8, // ARGB is most likely for QImage INTENT_PERCEPTUAL, 0); uchar *in = outImage->bits(); // bits() is equivalent to scanLine(0) uchar *out = outImage->bits(); cmsDoTransform(hTransform, in, out, outImage->byteCount() / sizeof(QRgb)); === official article show bigger switch https://littlecms.com/blog/2020/12/09/using-lcms2-on-qt/ /** * Convert from Qt format to lcms2 format */ static cmsUInt32Number toLcmsFormat(QImage::Format fmt) { switch (fmt) { case QImage::Format_ARGB32: // (0xAARRGGBB) case QImage::Format_RGB32: // (0xffRRGGBB) return TYPE_BGRA_8; case QImage::Format_RGB888: return TYPE_RGB_8; // 24-bit RGB format (8-8-8). case QImage::Format_RGBX8888: case QImage::Format_RGBA8888: return TYPE_RGBA_8; case QImage::Format_Grayscale8: return TYPE_GRAY_8; case QImage::Format_Grayscale16: return TYPE_GRAY_16; case QImage::Format_RGBA64: case QImage::Format_RGBX64: return TYPE_RGBA_16; case QImage::Format_BGR888: return TYPE_BGR_8; default: return 0; } } so I think we can add support for rgb8 timeline format at least, in same place where swscale call done in our ffmpeg.C in ffmpeg we have libavfilter/vf_iccdetect.c #include <lcms2.h> const AVFrameSideData *sd; cmsHPROFILE profile; sd = av_frame_get_side_data(frame, AV_FRAME_DATA_ICC_PROFILE); profile = cmsOpenProfileFromMemTHR(s->icc.ctx, sd->data, sd->size); cmsCloseProfile(profile); Full documentation in pdf form https://www.littlecms.com/LittleCMS2.18%20tutorial.pdf TYPE_RGB_FLT/TYPE_RGBA_FLT exist in /usr/include/lcms2.h so rgba-float should be supportable too. I'll try to write easy detect part for configure first.