[FFmpeg-devel] [PATCH v2] avcodec/hevcdec: set the SEI parameters early on the AVCodecContext

James Almer jamrial at gmail.com
Mon May 27 17:58:28 EEST 2019


On 5/27/2019 11:06 AM, Steve Lhomme wrote:
> 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>
> ---
> The same problem may exist with H264 alternative_transfer but I don't have a
> sample to test with and the code seems a bit different.

As i said, h264 should be a matter or moving the relevant code to
h264_init_ps().

Try https://0x0.st/zate.mkv, i created it using the patch i sent last
night that adds support for atc sei messages to cbs_h264, and
re-encoding a few frames from the LG HLG jazz sample.

> 
> Compared to previous version:
> - no handling of the cpation flag
> - pass the HEVCContext to export_stream_params()
> ---
>  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;
>          }
>      }

LGTM.


More information about the ffmpeg-devel mailing list