Log in

View Full Version : Color handling in ffmpeg and mencoder?


Selur
6th January 2014, 06:43
From what I could gather, ffmpeg offers:

a. a ColorMatrix filter (http://www.ffmpeg.org/ffmpeg-filters.html#colormatrix)
and
b. the option to specify PC/TV scale through the '-pix_fmt'
for pc scale: yuvj420p, yuvj422p, yuvj444p
for tv scale: yuv420p, yuyv422, yuv444p

from the looks of it these are only specified for 8bit sampling, but what about high bit depth? (10/16bit)
(is 10/16bit output always tv scale for some reason?)

Also looking at mencoder/mplayer there seems to be no ColorMatrix filter and no way to specify whether the input/output is PC or TV scale. (seems like it always assumes TV scale)
Seems like mplayer2 has colormatrix, colormatrix-input-range and colormatrix-output-range to handle this, but mplayer2 seems to be a dead project for roughly 1/2 year (judging from http://git.mplayer2.org/mplayer2/commit/).

-> Did I miss something or should I post a feature request for this to the mencoder/mplayer and ffmpeg bug tracker?

Cu Selur

the_weirdo
6th January 2014, 07:08
FFmpeg has some color options for signaling color of input/output video (but it seems only work for some video formats):
‘color_primaries integer (decoding/encoding,video)’
‘color_trc integer (decoding/encoding,video)’
‘colorspace integer (decoding/encoding,video)’
‘color_range integer (decoding/encoding,video)’

Their values:
(Note: MPEG range = TV range, JPEG range = PC range).
enum AVColorPrimaries{
AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B
AVCOL_PRI_UNSPECIFIED = 2,
AVCOL_PRI_BT470M = 4,
AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above
AVCOL_PRI_FILM = 8,
AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020
AVCOL_PRI_NB , ///< Not part of ABI
};

enum AVColorTransferCharacteristic{
AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361
AVCOL_TRC_UNSPECIFIED = 2,
AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG
AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC
AVCOL_TRC_SMPTE240M = 7,
AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics"
AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)"
AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt( 10 ) : 1 range)"
AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4
AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut
AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC)
AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10 bit system
AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12 bit system
AVCOL_TRC_NB , ///< Not part of ABI
};

enum AVColorSpace{
AVCOL_SPC_RGB = 0,
AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B
AVCOL_SPC_UNSPECIFIED = 2,
AVCOL_SPC_FCC = 4,
AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
AVCOL_SPC_SMPTE240M = 7,
AVCOL_SPC_YCOCG = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system
AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system
AVCOL_SPC_NB , ///< Not part of ABI
};
#define AVCOL_SPC_YCGCO AVCOL_SPC_YCOCG

enum AVColorRange{
AVCOL_RANGE_UNSPECIFIED = 0,
AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges
AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges
AVCOL_RANGE_NB , ///< Not part of ABI
};

Selur
6th January 2014, 07:11
Okay, so is there another way I should handle colors using ffmpeg than with colormatrix and pix_fmt ?