[vlc-commits] contrib: ffmpeg: set the alternate transfer function early in HEVC

Steve Lhomme git at videolan.org
Wed May 29 15:44:11 CEST 2019


vlc/vlc-3.0 | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Mon May 27 16:19:18 2019 +0200| [1aa1fd6173c593133781024e5bd0a349a3fae17d] | committer: Steve Lhomme

contrib: ffmpeg: set the alternate transfer function early in HEVC

(cherry picked from commit 1473ad989ac8f96c51af46d3ad0e90bbb3e6f2e8)

> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=1aa1fd6173c593133781024e5bd0a349a3fae17d
---

 ...cdec-set-the-SEI-parameters-early-on-the-.patch | 79 ++++++++++++++++++++++
 contrib/src/ffmpeg/rules.mak                       |  1 +
 2 files changed, 80 insertions(+)

diff --git a/contrib/src/ffmpeg/0001-avcodec-hevcdec-set-the-SEI-parameters-early-on-the-.patch b/contrib/src/ffmpeg/0001-avcodec-hevcdec-set-the-SEI-parameters-early-on-the-.patch
new file mode 100644
index 0000000000..134200868c
--- /dev/null
+++ b/contrib/src/ffmpeg/0001-avcodec-hevcdec-set-the-SEI-parameters-early-on-the-.patch
@@ -0,0 +1,79 @@
+From 66fac4911abbc52333bc35dcff0cab7fa6f0171d Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4 at ycbcr.xyz>
+Date: Fri, 24 May 2019 08:58:00 +0200
+Subject: [PATCH] avcodec/hevcdec: set the SEI parameters early on the
+ AVCodecContext
+
+It's better to do it before the buffers are actually created. At least in VLC
+we currently don't support changing some parameters dynamically easily so we
+don't use the information if it comes after the buffer are created.
+
+Co-authored-by: James Almer <jamrial at gmail.com>
+---
+ libavcodec/hevcdec.c | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
+index 515b346535..f1934975d5 100644
+--- a/libavcodec/hevcdec.c
++++ b/libavcodec/hevcdec.c
+@@ -310,9 +310,10 @@ static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
+     return 0;
+ }
+ 
+-static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets *ps,
+-                                 const HEVCSPS *sps)
++static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
+ {
++    AVCodecContext *avctx = s->avctx;
++    const HEVCParamSets *ps = &s->ps;
+     const HEVCVPS *vps = (const HEVCVPS*)ps->vps_list[sps->vps_id]->data;
+     const HEVCWindow *ow = &sps->output_window;
+     unsigned int num = 0, den = 0;
+@@ -355,6 +356,12 @@ static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets *ps,
+     if (num != 0 && den != 0)
+         av_reduce(&avctx->framerate.den, &avctx->framerate.num,
+                   num, den, 1 << 30);
++
++    if (s->sei.alternative_transfer.present &&
++        av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) &&
++        s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
++        avctx->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
++    }
+ }
+ 
+ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
+@@ -447,7 +454,7 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps,
+     if (ret < 0)
+         goto fail;
+ 
+-    export_stream_params(s->avctx, &s->ps, sps);
++    export_stream_params(s, sps);
+ 
+     s->avctx->pix_fmt = pix_fmt;
+ 
+@@ -2778,12 +2785,6 @@ static int set_side_data(HEVCContext *s)
+         s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
+     }
+ 
+-    if (s->sei.alternative_transfer.present &&
+-        av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) &&
+-        s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
+-        s->avctx->color_trc = out->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
+-    }
+-
+     return 0;
+ }
+ 
+@@ -3179,7 +3180,7 @@ static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int f
+     for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
+         if (first && s->ps.sps_list[i]) {
+             const HEVCSPS *sps = (const HEVCSPS*)s->ps.sps_list[i]->data;
+-            export_stream_params(s->avctx, &s->ps, sps);
++            export_stream_params(s, sps);
+             break;
+         }
+     }
+-- 
+2.19.1.windows.1
+
diff --git a/contrib/src/ffmpeg/rules.mak b/contrib/src/ffmpeg/rules.mak
index de63a08b1b..4be6e7b485 100644
--- a/contrib/src/ffmpeg/rules.mak
+++ b/contrib/src/ffmpeg/rules.mak
@@ -242,6 +242,7 @@ ifdef USE_FFMPEG
 	$(APPLY) $(SRC)/ffmpeg/dxva_vc1_crash.patch
 	$(APPLY) $(SRC)/ffmpeg/h264_early_SAR.patch
 	$(APPLY) $(SRC)/ffmpeg/ffmpeg-mkv-overshoot.patch
+	$(APPLY) $(SRC)/ffmpeg/0001-avcodec-hevcdec-set-the-SEI-parameters-early-on-the-.patch
 endif
 ifdef USE_LIBAV
 	$(APPLY) $(SRC)/ffmpeg/libav_gsm.patch



More information about the vlc-commits mailing list