Re: [FFmpeg-devel] [PATCH] avcodec/hevc: Extract Content light level from HEVC SEI prefix message

2016-12-30 Thread Nikola Kolarović

On 12/29/2016 07:46 PM, Nicolas George wrote:

Thanks for the patch.

L'octidi 8 nivôse, an CCXXV, Nikola Kolarović a écrit :

From: Nikola Kolarović <nikola.kolaro...@rt-rk.com>

Extract max_content_light_level and max_frame_average_light_level
which are used in HEVC Main 10 (HDR10) for luminosity adjustment.

Based on ISO/IEC 23008-2:2015 section D.2.35.
---
  libavcodec/hevc.h |  4 
  libavcodec/hevc_sei.c | 12 
  2 files changed, 16 insertions(+)

The fields you set in this patch are not used anywhere else. Is there a
second patch coming to make use of them?

Regards,


Hi Nicolas,

No problem, we can expose parsed values in frame/packet side_data.
Follow-up patch is below, and I've run FATE regression tests on x86_64 
linux.


Thanks,
Nikola


From 3caeb8dcd2b68a966c521ffc686c2a326563c7fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nikola=20Kolarovi=C4=87?= <nikola.kolaro...@rt-rk.com>
Date: Fri, 30 Dec 2016 14:12:09 +0100
Subject: [PATCH] avcodec/hevc: Expose light level data using
 AVContentLightLevelMetadata

Set HEVC side data (frame and packet) based on values extracted from 
Content light level

HEVC SEI prefix message.
---
 libavcodec/avcodec.h   |  7 +++
 libavcodec/hevc.c  | 17 +
 libavcodec/hevc.h  |  1 +
 libavcodec/hevc_sei.c  |  1 +
 libavcodec/utils.c |  1 +
 libavfilter/f_sidedata.c   |  1 +
 libavutil/frame.c  |  7 ---
 libavutil/frame.h  |  6 ++
 libavutil/mastering_display_metadata.h | 24 
 9 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index ca8b786077..5dc4556684 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1543,6 +1543,13 @@ enum AVPacketSideDataType {
 AV_PKT_DATA_MASTERING_DISPLAY_METADATA,

 /**
+ * Content light level metadata (based on SMPTE 2086:2014). The payload
+ * is an AVContentLightLevelMetadata type and it contains upper 
bounds for

+ * the nominal target brightness light level.
+ */
+AV_PKT_DATA_CONTENT_LIGHT_LEVEL_METADATA,
+
+/**
  * This side data should be associated with a video stream and 
corresponds

  * to the AVSphericalMapping structure.
  */
diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 7c563a34ba..1a3ccc51a6 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -2645,7 +2645,24 @@ static int set_side_data(HEVCContext *s)
"min_luminance=%f, max_luminance=%f\n",
av_q2d(metadata->min_luminance), 
av_q2d(metadata->max_luminance));

 }
+if (s->sei_content_light_level_info_present) {
+AVFrameSideData* sd = av_frame_new_side_data(out,
+ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL_METADATA,
+ sizeof(AVContentLightLevelMetadata));
+if (sd) {
+AVContentLightLevelMetadata* metadata = 
(AVContentLightLevelMetadata*)sd->data;

+const int luma_den = 1;
+
+metadata->max_content_light_level.num = 
s->max_content_light_level;

+metadata->max_content_light_level.den = luma_den;
+metadata->max_frame_average_light_level.num = 
s->max_frame_average_light_level;

+metadata->max_frame_average_light_level.den = luma_den;

+av_log(s->avctx, AV_LOG_DEBUG, "Content Light Level: 
MaxCLL=%f, MaxFALL=%f\n",

+   av_q2d(metadata->max_content_light_level),
+ av_q2d(metadata->max_frame_average_light_level));
+}
+}
 if (s->a53_caption) {
 AVFrameSideData* sd = av_frame_new_side_data(out,
AV_FRAME_DATA_A53_CC,
diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index d5970b61b6..0af633f52e 100644
--- a/libavcodec/hevc.h
+++ b/libavcodec/hevc.h
@@ -932,6 +932,7 @@ typedef struct HEVCContext {
 uint32_t min_mastering_luminance;

 /** content light level */
+int sei_content_light_level_info_present;
 uint16_t max_content_light_level;
 uint16_t max_frame_average_light_level;

diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 13ecc67173..ec75e8 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -109,6 +109,7 @@ static int 
decode_nal_sei_content_light_level_info(HEVCContext *s)

 s->max_content_light_level = get_bits(gb, 16);
 s->max_frame_average_light_level = get_bits(gb, 16);

+s->sei_content_light_level_info_present = 1;
 return 0;
 }

diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 1263306f63..3393ca34c9 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -766,6 +766,7 @@ int ff_init_buffer_info(AVCodecContext *avctx, 
AVFrame *frame)

 { AV_PKT_DATA_STEREO3D, AV_FRAME_DATA_STEREO3D },
 { AV_PKT_DATA_AUDIO_SERVICE_TYPE, 
AV_FRAME_DATA_AUDIO_SERVICE_TYPE },
 

[FFmpeg-devel] [PATCH] avcodec/hevc: Extract Content light level from HEVC SEI prefix message

2016-12-29 Thread Nikola Kolarović
From: Nikola Kolarović <nikola.kolaro...@rt-rk.com>

Extract max_content_light_level and max_frame_average_light_level
which are used in HEVC Main 10 (HDR10) for luminosity adjustment.

Based on ISO/IEC 23008-2:2015 section D.2.35.
---
 libavcodec/hevc.h |  4 
 libavcodec/hevc_sei.c | 12 
 2 files changed, 16 insertions(+)

diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index 6a3c7506c2..d5970b61b6 100644
--- a/libavcodec/hevc.h
+++ b/libavcodec/hevc.h
@@ -931,6 +931,10 @@ typedef struct HEVCContext {
 uint32_t max_mastering_luminance;
 uint32_t min_mastering_luminance;
 
+/** content light level */
+uint16_t max_content_light_level;
+uint16_t max_frame_average_light_level;
+
 } HEVCContext;
 
 int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx,
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 148f246df1..13ecc67173 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -102,6 +102,16 @@ static int 
decode_nal_sei_mastering_display_info(HEVCContext *s)
 return 0;
 }
 
+static int decode_nal_sei_content_light_level_info(HEVCContext *s)
+{
+GetBitContext *gb = >HEVClc->gb;
+
+s->max_content_light_level = get_bits(gb, 16);
+s->max_frame_average_light_level = get_bits(gb, 16);
+
+return 0;
+}
+
 static int decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
 {
 GetBitContext *gb = >HEVClc->gb;
@@ -304,6 +314,8 @@ static int decode_nal_sei_prefix(HEVCContext *s, int type, 
int size)
 }
 case SEI_TYPE_MASTERING_DISPLAY_INFO:
 return decode_nal_sei_mastering_display_info(s);
+case SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO:
+return decode_nal_sei_content_light_level_info(s);
 case SEI_TYPE_ACTIVE_PARAMETER_SETS:
 active_parameter_sets(s);
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
-- 
2.11.0

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel