diff mbox

[FFmpeg-devel] h264: Add support for alternative transfer characterics SEI

Message ID 20170808143647.11777-1-vittorio.giovara@gmail.com
State Accepted
Commit 8c34a2024da77b50470e62789e4859b45959932e
Headers show

Commit Message

Vittorio Giovara Aug. 8, 2017, 2:36 p.m. UTC
The use of this SEI is for backward compatibility in HLG HDR systems:
older devices that cannot interpret the "arib-std-b67" transfer will
get the compatible transfer (usually bt709 or bt2020) from the VUI,
while newer devices that can interpret HDR will read the SEI and use
its value instead.

Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
---
 libavcodec/h264_sei.c   | 11 +++++++++++
 libavcodec/h264_sei.h   |  9 ++++++++-
 libavcodec/h264_slice.c |  6 ++++++
 3 files changed, 25 insertions(+), 1 deletion(-)

Comments

Hendrik Leppkes Aug. 8, 2017, 2:41 p.m. UTC | #1
On Tue, Aug 8, 2017 at 4:36 PM, Vittorio Giovara
<vittorio.giovara@gmail.com> wrote:
> The use of this SEI is for backward compatibility in HLG HDR systems:
> older devices that cannot interpret the "arib-std-b67" transfer will
> get the compatible transfer (usually bt709 or bt2020) from the VUI,
> while newer devices that can interpret HDR will read the SEI and use
> its value instead.
>

Following their logic, what if I can't deal with HLG yet, and I want
the original transfer?
Maybe it should be exported somehow, or have an option to not use the
alternate one, or something?

One of the key points of HLG is compatibility with non-HDR systems, so
if the bitstream already offers this choice, maybe so should we,
without having to "guess" if its bt709 or bt2020 or...?

- Hendrik
diff mbox

Patch

diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c
index a7e627eba3..889bea2ee0 100644
--- a/libavcodec/h264_sei.c
+++ b/libavcodec/h264_sei.c
@@ -382,6 +382,14 @@  static int decode_green_metadata(H264SEIGreenMetaData *h, GetBitContext *gb)
     return 0;
 }
 
+static int decode_alternative_transfer(H264SEIAlternativeTransfer *h,
+                                       GetBitContext *gb)
+{
+    h->present = 1;
+    h->preferred_transfer_characteristics = get_bits(gb, 8);
+    return 0;
+}
+
 int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb,
                        const H264ParamSets *ps, void *logctx)
 {
@@ -437,6 +445,9 @@  int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb,
         case SEI_TYPE_GREEN_METADATA:
             ret = decode_green_metadata(&h->green_metadata, gb);
             break;
+        case SEI_TYPE_ALTERNATIVE_TRANSFER:
+            ret = decode_alternative_transfer(&h->alternative_transfer, gb);
+            break;
         default:
             av_log(logctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type);
         }
diff --git a/libavcodec/h264_sei.h b/libavcodec/h264_sei.h
index da3b391860..5f5d895e89 100644
--- a/libavcodec/h264_sei.h
+++ b/libavcodec/h264_sei.h
@@ -32,7 +32,8 @@  typedef enum {
     SEI_TYPE_RECOVERY_POINT         = 6,   ///< recovery point (frame # to decoder sync)
     SEI_TYPE_FRAME_PACKING          = 45,  ///< frame packing arrangement
     SEI_TYPE_DISPLAY_ORIENTATION    = 47,  ///< display orientation
-    SEI_TYPE_GREEN_METADATA         = 56   ///< GreenMPEG information
+    SEI_TYPE_GREEN_METADATA         = 56,  ///< GreenMPEG information
+    SEI_TYPE_ALTERNATIVE_TRANSFER   = 147, ///< alternative transfer
 } SEI_Type;
 
 /**
@@ -144,6 +145,11 @@  typedef struct H264SEIGreenMetaData {
     uint16_t xsd_metric_value;
 } H264SEIGreenMetaData;
 
+typedef struct H264SEIAlternativeTransfer {
+    int present;
+    int preferred_transfer_characteristics;
+} H264SEIAlternativeTransfer;
+
 typedef struct H264SEIContext {
     H264SEIPictureTiming picture_timing;
     H264SEIAFD afd;
@@ -154,6 +160,7 @@  typedef struct H264SEIContext {
     H264SEIFramePacking frame_packing;
     H264SEIDisplayOrientation display_orientation;
     H264SEIGreenMetaData green_metadata;
+    H264SEIAlternativeTransfer alternative_transfer;
 } H264SEIContext;
 
 struct H264ParamSets;
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 4e7eba4adb..ebff7b33e3 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1287,6 +1287,12 @@  static int h264_export_frame_props(H264Context *h)
         h->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
     }
 
+    if (h->sei.alternative_transfer.present &&
+        av_color_transfer_name(h->sei.alternative_transfer.preferred_transfer_characteristics) &&
+        h->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
+        h->avctx->color_trc = cur->f->color_trc = h->sei.alternative_transfer.preferred_transfer_characteristics;
+    }
+
     return 0;
 }