Thanks Hendrik. For now, I've updated the patch with a better comment and commit message, and will change name to the more intuitive _HLG or (_HYBRID_LOG_GAMMA) if you feel this is better. Seems that the more recent enums use a standard as the name for the enum (e.g., SMPTEST2084 is often referred to as Perceptual Quantizer or PQ).
On Thu, Apr 21, 2016 at 2:03 PM, Hendrik Leppkes <h.lepp...@gmail.com> wrote: > On Thu, Apr 21, 2016 at 10:57 PM, Neil Birkbeck <neil.birkb...@gmail.com> > wrote: >> The standard: >> http://www.arib.or.jp/english/html/overview/doc/2-STD-B67v1_0.pdf >> >> The choice of enum value of 18 is consistent with HEVC: >> http://phenix.it-sudparis.eu/jct/doc_end_user/current_document.php?id=10481 >> >> and also with latest proposal for color trc in mkv: >> https://mailarchive.ietf.org/arch/search/?email_list=cellar&gbt=1&q=Colour+Format+proposal >> >> Signed-off-by: Neil Birkbeck <neil.birkb...@gmail.com> >> --- >> libavutil/color_utils.c | 16 ++++++++++++++++ >> libavutil/pixdesc.c | 2 +- >> libavutil/pixfmt.h | 1 + >> tests/ref/fate/color_utils | 19 +++++++++++++++++++ >> 4 files changed, 37 insertions(+), 1 deletion(-) >> >> diff --git a/libavutil/color_utils.c b/libavutil/color_utils.c >> index 6dba46a..87e5f5e 100644 >> --- a/libavutil/color_utils.c >> +++ b/libavutil/color_utils.c >> @@ -155,6 +155,18 @@ static double avpriv_trc_smpte_st428_1(double Lc) >> : pow(48.0 * Lc / 52.37, 1.0 / 2.6); >> } >> >> + >> +static double avpriv_trc_arib_std_b67(double Lc) { >> + // The function uses the definition from HEVC, which assumes that the >> peak >> + // white is input level = 1. (this is equivalent to scaling E = Lc * 12 >> and >> + // using the definition from the arib standard) >> + const double a = 0.17883277; >> + const double b = 0.28466892; >> + const double c = 0.55991073; >> + return (0.0 > Lc) ? 0.0 : >> + (Lc <= 1.0 / 12.0 ? sqrt(3.0 * Lc) : a * log(12.0 * Lc - b) + c); >> +} >> + >> avpriv_trc_function avpriv_get_trc_function_from_trc(enum >> AVColorTransferCharacteristic trc) >> { >> avpriv_trc_function func = NULL; >> @@ -209,6 +221,10 @@ avpriv_trc_function >> avpriv_get_trc_function_from_trc(enum AVColorTransferCharact >> func = avpriv_trc_smpte_st428_1; >> break; >> >> + case AVCOL_TRC_ARIB_STD_B67: >> + func = avpriv_trc_arib_std_b67; >> + break; >> + >> case AVCOL_TRC_RESERVED0: >> case AVCOL_TRC_UNSPECIFIED: >> case AVCOL_TRC_RESERVED: >> diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c >> index 8a9475c..995244b 100644 >> --- a/libavutil/pixdesc.c >> +++ b/libavutil/pixdesc.c >> @@ -2080,6 +2080,7 @@ static const char *color_transfer_names[AVCOL_TRC_NB] >> = { >> "bt470bg", "smpte170m", "smpte240m", "linear", "log100", >> "log316", "iec61966-2-4", "bt1361e", "iec61966-2-1", >> "bt2020-10", "bt2020-20", "smpte2084", "smpte428-1", >> + "arib-std-b67" >> }; >> >> static const char *color_space_names[AVCOL_SPC_NB] = { >> @@ -2560,4 +2561,3 @@ int main(void){ >> } >> >> #endif >> - >> diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h >> index 546eb44..16bd5bc 100644 >> --- a/libavutil/pixfmt.h >> +++ b/libavutil/pixfmt.h >> @@ -420,6 +420,7 @@ enum AVColorTransferCharacteristic { >> AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12 bit system >> AVCOL_TRC_SMPTEST2084 = 16, ///< SMPTE ST 2084 for 10, 12, 14 and 16 >> bit systems >> AVCOL_TRC_SMPTEST428_1 = 17, ///< SMPTE ST 428-1 >> + AVCOL_TRC_ARIB_STD_B67 = 18, ///< Hybrid log-gamma > > I find it odd that the name is seemingly unrelated to the comment, the > comment should probably elaborate more. > The commit message could probably also benefit from using the same name. > >> AVCOL_TRC_NB, ///< Not part of ABI >> }; >> >> diff --git a/tests/ref/fate/color_utils b/tests/ref/fate/color_utils >> index 6e80ebd..10f8055 100644 >> --- a/tests/ref/fate/color_utils >> +++ b/tests/ref/fate/color_utils >> @@ -283,3 +283,22 @@ AVColorTransferCharacteristic=17 calling >> func(15123.456700) expected=39.174525 >> AVColorTransferCharacteristic=17 calling func(19845.889230) >> expected=43.490646 >> AVColorTransferCharacteristic=17 calling func(98678.423100) >> expected=80.593559 >> AVColorTransferCharacteristic=17 calling func(99999.899998) >> expected=81.006971 >> +AVColorTransferCharacteristic=18 calling func(-0.100000) expected=0.000000 >> +AVColorTransferCharacteristic=18 calling func(-0.018054) expected=0.000000 >> +AVColorTransferCharacteristic=18 calling func(-0.010000) expected=0.000000 >> +AVColorTransferCharacteristic=18 calling func(-0.004490) expected=0.000000 >> +AVColorTransferCharacteristic=18 calling func(0.000000) expected=0.000000 >> +AVColorTransferCharacteristic=18 calling func(0.003162) expected=0.097400 >> +AVColorTransferCharacteristic=18 calling func(0.005000) expected=0.122474 >> +AVColorTransferCharacteristic=18 calling func(0.009000) expected=0.164317 >> +AVColorTransferCharacteristic=18 calling func(0.015000) expected=0.212132 >> +AVColorTransferCharacteristic=18 calling func(0.100000) expected=0.544089 >> +AVColorTransferCharacteristic=18 calling func(1.000000) expected=1.000000 >> +AVColorTransferCharacteristic=18 calling func(52.370000) expected=1.712092 >> +AVColorTransferCharacteristic=18 calling func(125.098765) expected=1.867862 >> +AVColorTransferCharacteristic=18 calling func(1999.111230) expected=2.363502 >> +AVColorTransferCharacteristic=18 calling func(6945.443000) expected=2.586219 >> +AVColorTransferCharacteristic=18 calling func(15123.456700) >> expected=2.725380 >> +AVColorTransferCharacteristic=18 calling func(19845.889230) >> expected=2.773978 >> +AVColorTransferCharacteristic=18 calling func(98678.423100) >> expected=3.060803 >> +AVColorTransferCharacteristic=18 calling func(99999.899998) >> expected=3.063182 >> -- >> 2.8.0.rc3.226.g39d4020 >> >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
From e10703b47ab2438c9332eee0dbe3442e6155bcf8 Mon Sep 17 00:00:00 2001 From: Neil Birkbeck <neil.birkb...@gmail.com> Date: Thu, 21 Apr 2016 12:00:05 -0700 Subject: [PATCH] lavu: [PATCH] lavu: Adding ARIB STD-B67 (hybrid log-gamma) enum value and transfer function. Adding hybrid log-gamma (https://en.wikipedia.org/wiki/Hybrid_Log-Gamma) based on the standardization in ARIB STD-B67: http://www.arib.or.jp/english/html/overview/doc/2-STD-B67v1_0.pdf The choice of enum value of 18 is consistent with HEVC: http://phenix.it-sudparis.eu/jct/doc_end_user/current_document.php?id=10481 And also with latest proposal for color format in mkv: https://mailarchive.ietf.org/arch/search/?email_list=cellar&gbt=1&q=Colour+Format+proposal The implementation assumes a nominal input range of [0, 1], which is consistent with HEVC. Signed-off-by: Neil Birkbeck <neil.birkb...@gmail.com> --- libavutil/color_utils.c | 16 ++++++++++++++++ libavutil/pixdesc.c | 2 +- libavutil/pixfmt.h | 1 + tests/ref/fate/color_utils | 19 +++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/libavutil/color_utils.c b/libavutil/color_utils.c index 6dba46a..1eb1d48 100644 --- a/libavutil/color_utils.c +++ b/libavutil/color_utils.c @@ -155,6 +155,18 @@ static double avpriv_trc_smpte_st428_1(double Lc) : pow(48.0 * Lc / 52.37, 1.0 / 2.6); } + +static double avpriv_trc_arib_std_b67(double Lc) { + // The function uses the definition from HEVC, which assumes that the peak + // white is input level = 1. (this is equivalent to scaling E = Lc * 12 and + // using the definition from the ARIB STD-B67 spec) + const double a = 0.17883277; + const double b = 0.28466892; + const double c = 0.55991073; + return (0.0 > Lc) ? 0.0 : + (Lc <= 1.0 / 12.0 ? sqrt(3.0 * Lc) : a * log(12.0 * Lc - b) + c); +} + avpriv_trc_function avpriv_get_trc_function_from_trc(enum AVColorTransferCharacteristic trc) { avpriv_trc_function func = NULL; @@ -209,6 +221,10 @@ avpriv_trc_function avpriv_get_trc_function_from_trc(enum AVColorTransferCharact func = avpriv_trc_smpte_st428_1; break; + case AVCOL_TRC_ARIB_STD_B67: + func = avpriv_trc_arib_std_b67; + break; + case AVCOL_TRC_RESERVED0: case AVCOL_TRC_UNSPECIFIED: case AVCOL_TRC_RESERVED: diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c index 8a9475c..995244b 100644 --- a/libavutil/pixdesc.c +++ b/libavutil/pixdesc.c @@ -2080,6 +2080,7 @@ static const char *color_transfer_names[AVCOL_TRC_NB] = { "bt470bg", "smpte170m", "smpte240m", "linear", "log100", "log316", "iec61966-2-4", "bt1361e", "iec61966-2-1", "bt2020-10", "bt2020-20", "smpte2084", "smpte428-1", + "arib-std-b67" }; static const char *color_space_names[AVCOL_SPC_NB] = { @@ -2560,4 +2561,3 @@ int main(void){ } #endif - diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h index 546eb44..03431ad 100644 --- a/libavutil/pixfmt.h +++ b/libavutil/pixfmt.h @@ -420,6 +420,7 @@ enum AVColorTransferCharacteristic { AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12 bit system AVCOL_TRC_SMPTEST2084 = 16, ///< SMPTE ST 2084 for 10, 12, 14 and 16 bit systems AVCOL_TRC_SMPTEST428_1 = 17, ///< SMPTE ST 428-1 + AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" AVCOL_TRC_NB, ///< Not part of ABI }; diff --git a/tests/ref/fate/color_utils b/tests/ref/fate/color_utils index 6e80ebd..10f8055 100644 --- a/tests/ref/fate/color_utils +++ b/tests/ref/fate/color_utils @@ -283,3 +283,22 @@ AVColorTransferCharacteristic=17 calling func(15123.456700) expected=39.174525 AVColorTransferCharacteristic=17 calling func(19845.889230) expected=43.490646 AVColorTransferCharacteristic=17 calling func(98678.423100) expected=80.593559 AVColorTransferCharacteristic=17 calling func(99999.899998) expected=81.006971 +AVColorTransferCharacteristic=18 calling func(-0.100000) expected=0.000000 +AVColorTransferCharacteristic=18 calling func(-0.018054) expected=0.000000 +AVColorTransferCharacteristic=18 calling func(-0.010000) expected=0.000000 +AVColorTransferCharacteristic=18 calling func(-0.004490) expected=0.000000 +AVColorTransferCharacteristic=18 calling func(0.000000) expected=0.000000 +AVColorTransferCharacteristic=18 calling func(0.003162) expected=0.097400 +AVColorTransferCharacteristic=18 calling func(0.005000) expected=0.122474 +AVColorTransferCharacteristic=18 calling func(0.009000) expected=0.164317 +AVColorTransferCharacteristic=18 calling func(0.015000) expected=0.212132 +AVColorTransferCharacteristic=18 calling func(0.100000) expected=0.544089 +AVColorTransferCharacteristic=18 calling func(1.000000) expected=1.000000 +AVColorTransferCharacteristic=18 calling func(52.370000) expected=1.712092 +AVColorTransferCharacteristic=18 calling func(125.098765) expected=1.867862 +AVColorTransferCharacteristic=18 calling func(1999.111230) expected=2.363502 +AVColorTransferCharacteristic=18 calling func(6945.443000) expected=2.586219 +AVColorTransferCharacteristic=18 calling func(15123.456700) expected=2.725380 +AVColorTransferCharacteristic=18 calling func(19845.889230) expected=2.773978 +AVColorTransferCharacteristic=18 calling func(98678.423100) expected=3.060803 +AVColorTransferCharacteristic=18 calling func(99999.899998) expected=3.063182 -- 2.8.0.rc3.226.g39d4020
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel