Re: [FFmpeg-devel] [PATCH 2/3] avcodec/nvenc: add master display and light level sei for HDR10

2019-05-29 Thread Lance Wang
On Wed, May 29, 2019 at 7:11 PM Dennis Mungai  wrote:

> On Tue, May 28, 2019, 01:15 James Almer  wrote:
>
> > On 5/27/2019 7:13 PM, Timo Rothenpieler wrote:
> > > On 27.05.2019 23:49, Lance Wang wrote:
> > >> On Saturday, May 25, 2019, James Almer  wrote:
> > >>
> > >>> On 5/22/2019 3:59 AM, lance.lmw...@gmail.com wrote:
> >  From: Limin Wang 
> > 
> >  The testing command for the HDR10 output with nvenc:
> >  $ ./ffmpeg_g -y -i 4K.mp4 -c:v hevc_nvenc -g 7 -color_primaries
> bt2020
> > >>> -colorspace bt2020_ncl -color_trc smpte2084 -sei hdr10 \
> >   -master_display "G(13250,34500)B(7500,3000)R(
> > >>> 34000,16000)WP(15635,16450)L(1000,50)" -max_cll "0, 0" test.ts
> > 
> >  Please notice it is preferable to use the frame sei side data than
> > >>> master_display and max_cll paramters config
> >  ---
> >    libavcodec/nvenc.c  | 129
> >  
> >    libavcodec/nvenc.h  |  18 ++
> >    libavcodec/nvenc_hevc.c |  11 
> >    3 files changed, 158 insertions(+)
> > 
> >  diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
> >  index 75dda6d689..3fd0eca4a5 100644
> >  --- a/libavcodec/nvenc.c
> >  +++ b/libavcodec/nvenc.c
> >  @@ -22,6 +22,9 @@
> >    #include "config.h"
> > 
> >    #include "nvenc.h"
> >  +#include "cbs_h265.h"
> > >>>
> > >>> This doesn't seem right. The encoder isn't using this framework at
> all.
> > >>>
> > >>> You're apparently including this only to get the
> > >>> H265RawSEIMasteringDisplayColourVolume and
> > >>> H265RawSEIContentLightLevelInfo structs, which you don't really need
> to
> > >>> fill sei_data[i].payload
> > >>>
> > >>> OK,  I'll remove the dependent for the two structure and update the
> > >>> patch.
> > >>
> > >>
> > >
> > > I'm still not convinced that all this belong in an encoder.
> > > Can it really not be made into a filter that adds it as extra data to
> > > frames? There got to be other frame consumers that use this kind of
> data.
> >
> > hevc_metadata (h265_metadata_bsf.c) already exists. It should be trivial
> > to add support for this there.
> >
>
> Case in point: Some encoders, such as hevc_vaapi, present private codec
> options for the retention of specific SEIs, such as HDR (and is on by
> default), yet others, such as the QSV runtime, have no such options.
>
> Wiring this into a bitstream filter (such as hevc_metadata), etc would
> easily address such disparities without mucking around with convoluted
> private encoder options.
>

I haven't seen any support for the SEI data process for the hevc_metadata.
That's great if any expert to extend the hevc_metadata for the SEI HDR
support in future.




> >
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 2/3] avcodec/nvenc: add master display and light level sei for HDR10

2019-05-29 Thread Dennis Mungai
On Tue, May 28, 2019, 01:15 James Almer  wrote:

> On 5/27/2019 7:13 PM, Timo Rothenpieler wrote:
> > On 27.05.2019 23:49, Lance Wang wrote:
> >> On Saturday, May 25, 2019, James Almer  wrote:
> >>
> >>> On 5/22/2019 3:59 AM, lance.lmw...@gmail.com wrote:
>  From: Limin Wang 
> 
>  The testing command for the HDR10 output with nvenc:
>  $ ./ffmpeg_g -y -i 4K.mp4 -c:v hevc_nvenc -g 7 -color_primaries bt2020
> >>> -colorspace bt2020_ncl -color_trc smpte2084 -sei hdr10 \
>   -master_display "G(13250,34500)B(7500,3000)R(
> >>> 34000,16000)WP(15635,16450)L(1000,50)" -max_cll "0, 0" test.ts
> 
>  Please notice it is preferable to use the frame sei side data than
> >>> master_display and max_cll paramters config
>  ---
>    libavcodec/nvenc.c  | 129
>  
>    libavcodec/nvenc.h  |  18 ++
>    libavcodec/nvenc_hevc.c |  11 
>    3 files changed, 158 insertions(+)
> 
>  diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
>  index 75dda6d689..3fd0eca4a5 100644
>  --- a/libavcodec/nvenc.c
>  +++ b/libavcodec/nvenc.c
>  @@ -22,6 +22,9 @@
>    #include "config.h"
> 
>    #include "nvenc.h"
>  +#include "cbs_h265.h"
> >>>
> >>> This doesn't seem right. The encoder isn't using this framework at all.
> >>>
> >>> You're apparently including this only to get the
> >>> H265RawSEIMasteringDisplayColourVolume and
> >>> H265RawSEIContentLightLevelInfo structs, which you don't really need to
> >>> fill sei_data[i].payload
> >>>
> >>> OK,  I'll remove the dependent for the two structure and update the
> >>> patch.
> >>
> >>
> >
> > I'm still not convinced that all this belong in an encoder.
> > Can it really not be made into a filter that adds it as extra data to
> > frames? There got to be other frame consumers that use this kind of data.
>
> hevc_metadata (h265_metadata_bsf.c) already exists. It should be trivial
> to add support for this there.
>

Case in point: Some encoders, such as hevc_vaapi, present private codec
options for the retention of specific SEIs, such as HDR (and is on by
default), yet others, such as the QSV runtime, have no such options.

Wiring this into a bitstream filter (such as hevc_metadata), etc would
easily address such disparities without mucking around with convoluted
private encoder options.

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 2/3] avcodec/nvenc: add master display and light level sei for HDR10

2019-05-27 Thread James Almer
On 5/27/2019 7:13 PM, Timo Rothenpieler wrote:
> On 27.05.2019 23:49, Lance Wang wrote:
>> On Saturday, May 25, 2019, James Almer  wrote:
>>
>>> On 5/22/2019 3:59 AM, lance.lmw...@gmail.com wrote:
 From: Limin Wang 

 The testing command for the HDR10 output with nvenc:
 $ ./ffmpeg_g -y -i 4K.mp4 -c:v hevc_nvenc -g 7 -color_primaries bt2020
>>> -colorspace bt2020_ncl -color_trc smpte2084 -sei hdr10 \
  -master_display "G(13250,34500)B(7500,3000)R(
>>> 34000,16000)WP(15635,16450)L(1000,50)" -max_cll "0, 0" test.ts

 Please notice it is preferable to use the frame sei side data than
>>> master_display and max_cll paramters config
 ---
   libavcodec/nvenc.c  | 129
 
   libavcodec/nvenc.h  |  18 ++
   libavcodec/nvenc_hevc.c |  11 
   3 files changed, 158 insertions(+)

 diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
 index 75dda6d689..3fd0eca4a5 100644
 --- a/libavcodec/nvenc.c
 +++ b/libavcodec/nvenc.c
 @@ -22,6 +22,9 @@
   #include "config.h"

   #include "nvenc.h"
 +#include "cbs_h265.h"
>>>
>>> This doesn't seem right. The encoder isn't using this framework at all.
>>>
>>> You're apparently including this only to get the
>>> H265RawSEIMasteringDisplayColourVolume and
>>> H265RawSEIContentLightLevelInfo structs, which you don't really need to
>>> fill sei_data[i].payload
>>>
>>> OK,  I'll remove the dependent for the two structure and update the
>>> patch.
>>
>>
> 
> I'm still not convinced that all this belong in an encoder.
> Can it really not be made into a filter that adds it as extra data to
> frames? There got to be other frame consumers that use this kind of data.

hevc_metadata (h265_metadata_bsf.c) already exists. It should be trivial
to add support for this there.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 2/3] avcodec/nvenc: add master display and light level sei for HDR10

2019-05-27 Thread Timo Rothenpieler

On 27.05.2019 23:49, Lance Wang wrote:

On Saturday, May 25, 2019, James Almer  wrote:


On 5/22/2019 3:59 AM, lance.lmw...@gmail.com wrote:

From: Limin Wang 

The testing command for the HDR10 output with nvenc:
$ ./ffmpeg_g -y -i 4K.mp4 -c:v hevc_nvenc -g 7 -color_primaries bt2020

-colorspace bt2020_ncl -color_trc smpte2084 -sei hdr10 \

 -master_display "G(13250,34500)B(7500,3000)R(

34000,16000)WP(15635,16450)L(1000,50)" -max_cll "0, 0" test.ts


Please notice it is preferable to use the frame sei side data than

master_display and max_cll paramters config

---
  libavcodec/nvenc.c  | 129 
  libavcodec/nvenc.h  |  18 ++
  libavcodec/nvenc_hevc.c |  11 
  3 files changed, 158 insertions(+)

diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
index 75dda6d689..3fd0eca4a5 100644
--- a/libavcodec/nvenc.c
+++ b/libavcodec/nvenc.c
@@ -22,6 +22,9 @@
  #include "config.h"

  #include "nvenc.h"
+#include "cbs_h265.h"


This doesn't seem right. The encoder isn't using this framework at all.

You're apparently including this only to get the
H265RawSEIMasteringDisplayColourVolume and
H265RawSEIContentLightLevelInfo structs, which you don't really need to
fill sei_data[i].payload

OK,  I'll remove the dependent for the two structure and update the patch.





I'm still not convinced that all this belong in an encoder.
Can it really not be made into a filter that adds it as extra data to 
frames? There got to be other frame consumers that use this kind of data.




smime.p7s
Description: S/MIME Cryptographic Signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 2/3] avcodec/nvenc: add master display and light level sei for HDR10

2019-05-27 Thread Lance Wang
On Saturday, May 25, 2019, James Almer  wrote:

> On 5/22/2019 3:59 AM, lance.lmw...@gmail.com wrote:
> > From: Limin Wang 
> >
> > The testing command for the HDR10 output with nvenc:
> > $ ./ffmpeg_g -y -i 4K.mp4 -c:v hevc_nvenc -g 7 -color_primaries bt2020
> -colorspace bt2020_ncl -color_trc smpte2084 -sei hdr10 \
> > -master_display "G(13250,34500)B(7500,3000)R(
> 34000,16000)WP(15635,16450)L(1000,50)" -max_cll "0, 0" test.ts
> >
> > Please notice it is preferable to use the frame sei side data than
> master_display and max_cll paramters config
> > ---
> >  libavcodec/nvenc.c  | 129 
> >  libavcodec/nvenc.h  |  18 ++
> >  libavcodec/nvenc_hevc.c |  11 
> >  3 files changed, 158 insertions(+)
> >
> > diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
> > index 75dda6d689..3fd0eca4a5 100644
> > --- a/libavcodec/nvenc.c
> > +++ b/libavcodec/nvenc.c
> > @@ -22,6 +22,9 @@
> >  #include "config.h"
> >
> >  #include "nvenc.h"
> > +#include "cbs_h265.h"
>
> This doesn't seem right. The encoder isn't using this framework at all.
>
> You're apparently including this only to get the
> H265RawSEIMasteringDisplayColourVolume and
> H265RawSEIContentLightLevelInfo structs, which you don't really need to
> fill sei_data[i].payload
>
> OK,  I'll remove the dependent for the two structure and update the patch.



> > +#include "hevc_sei.h"
> > +#include "put_bits.h"
> >
> >  #include "libavutil/hwcontext_cuda.h"
> >  #include "libavutil/hwcontext.h"
> > @@ -30,6 +33,7 @@
> >  #include "libavutil/avassert.h"
> >  #include "libavutil/mem.h"
> >  #include "libavutil/pixdesc.h"
> > +#include "libavutil/mastering_display_metadata.h"
> >  #include "internal.h"
> >
> >  #define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, dl_fn->cuda_dl, x)
> > @@ -1491,6 +1495,46 @@ av_cold int ff_nvenc_encode_init(AVCodecContext
> *avctx)
> >  ctx->data_pix_fmt = avctx->pix_fmt;
> >  }
> >
> > +ctx->display_primaries_x[0] = 13250;
> > +ctx->display_primaries_y[0] = 34500;
> > +ctx->display_primaries_x[1] = 7500;
> > +ctx->display_primaries_y[1] = 3000;
> > +ctx->display_primaries_x[2] = 34000;
> > +ctx->display_primaries_y[2] = 16000;
> > +ctx->white_point_x  = 15635;
> > +ctx->white_point_y  = 16450;
> > +ctx->max_display_mastering_luminance = 1000;
> > +ctx->min_display_mastering_luminance = 500;
> > +ctx->max_content_light_level = 0;
> > +ctx->max_pic_average_light_level = 0;
> > +if (ctx->master_display) {
> > +ret = sscanf(ctx->master_display, "G(%hu,%hu)B(%hu,%hu)R(%hu,%
> hu)WP(%hu,%hu)L(%u,%u)",
> > +&ctx->display_primaries_x[0],
> &ctx->display_primaries_y[0],
> > +&ctx->display_primaries_x[1],
> &ctx->display_primaries_y[1],
> > +&ctx->display_primaries_x[2],
> &ctx->display_primaries_y[2],
> > +&ctx->white_point_x, &ctx->white_point_y,
> > +&ctx->max_display_mastering_luminance,
> &ctx->min_display_mastering_luminance);
> > +if (ret != 10) {
> > +ret = sscanf(ctx->master_display,
> "G[%hu,%hu]B[%hu,%hu]R[%hu,%hu]WP[%hu,%hu]L[%u,%u]",
> > +&ctx->display_primaries_x[0],
> &ctx->display_primaries_y[0],
> > +&ctx->display_primaries_x[1],
> &ctx->display_primaries_y[1],
> > +&ctx->display_primaries_x[2],
> &ctx->display_primaries_y[2],
> > +&ctx->white_point_x, &ctx->white_point_y,
> > +&ctx->max_display_mastering_luminance,
> &ctx->min_display_mastering_luminance);
> > +}
> > +
> > +if (ret != 10) {
> > +av_log(avctx, AV_LOG_INFO, "Failed to parse master
> display(%s)\n", ctx->master_display);
> > +}
> > +}
> > +
> > +if (ctx->max_cll) {
> > +ret = sscanf(ctx->max_cll, "%hu,%hu",
> &ctx->max_content_light_level, &ctx->max_pic_average_light_level);
> > +if (ret != 2) {
> > +av_log(avctx, AV_LOG_INFO, "Failed to parse max cll(%s)\n",
> ctx->max_cll);
> > +}
> > +}
> > +
> >  if ((ret = nvenc_load_libraries(avctx)) < 0)
> >  return ret;
> >
> > @@ -2110,6 +2154,91 @@ int ff_nvenc_send_frame(AVCodecContext *avctx,
> const AVFrame *frame)
> >  }
> >  }
> >
> > +if (ctx->sei  & SEI_MASTERING_DISPLAY) {
> > +AVFrameSideData *sd = av_frame_get_side_data(frame,
> AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
> > +H265RawSEIMasteringDisplayColourVolume smd;
> > +
> > +if (sd) {
> > +AVMasteringDisplayMetadata *mdm =
> (AVMasteringDisplayMetadata *)sd->data;
> > +// HEVC uses a g,b,r ordering, which we convert from a
> more natural r,g,b
> > +const int mapping[3] = {2, 0, 1};
> > +const int chroma_den = 5;
> > +const int luma_den = 1;
> > +
> > +if (mdm->has_prim

Re: [FFmpeg-devel] [PATCH 2/3] avcodec/nvenc: add master display and light level sei for HDR10

2019-05-25 Thread James Almer
On 5/22/2019 3:59 AM, lance.lmw...@gmail.com wrote:
> From: Limin Wang 
> 
> The testing command for the HDR10 output with nvenc:
> $ ./ffmpeg_g -y -i 4K.mp4 -c:v hevc_nvenc -g 7 -color_primaries bt2020 
> -colorspace bt2020_ncl -color_trc smpte2084 -sei hdr10 \
> -master_display 
> "G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(1000,50)" 
> -max_cll "0, 0" test.ts
> 
> Please notice it is preferable to use the frame sei side data than 
> master_display and max_cll paramters config
> ---
>  libavcodec/nvenc.c  | 129 
>  libavcodec/nvenc.h  |  18 ++
>  libavcodec/nvenc_hevc.c |  11 
>  3 files changed, 158 insertions(+)
> 
> diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
> index 75dda6d689..3fd0eca4a5 100644
> --- a/libavcodec/nvenc.c
> +++ b/libavcodec/nvenc.c
> @@ -22,6 +22,9 @@
>  #include "config.h"
>  
>  #include "nvenc.h"
> +#include "cbs_h265.h"

This doesn't seem right. The encoder isn't using this framework at all.

You're apparently including this only to get the
H265RawSEIMasteringDisplayColourVolume and
H265RawSEIContentLightLevelInfo structs, which you don't really need to
fill sei_data[i].payload

> +#include "hevc_sei.h"
> +#include "put_bits.h"
>  
>  #include "libavutil/hwcontext_cuda.h"
>  #include "libavutil/hwcontext.h"
> @@ -30,6 +33,7 @@
>  #include "libavutil/avassert.h"
>  #include "libavutil/mem.h"
>  #include "libavutil/pixdesc.h"
> +#include "libavutil/mastering_display_metadata.h"
>  #include "internal.h"
>  
>  #define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, dl_fn->cuda_dl, x)
> @@ -1491,6 +1495,46 @@ av_cold int ff_nvenc_encode_init(AVCodecContext *avctx)
>  ctx->data_pix_fmt = avctx->pix_fmt;
>  }
>  
> +ctx->display_primaries_x[0] = 13250;
> +ctx->display_primaries_y[0] = 34500;
> +ctx->display_primaries_x[1] = 7500;
> +ctx->display_primaries_y[1] = 3000;
> +ctx->display_primaries_x[2] = 34000;
> +ctx->display_primaries_y[2] = 16000;
> +ctx->white_point_x  = 15635;
> +ctx->white_point_y  = 16450;
> +ctx->max_display_mastering_luminance = 1000;
> +ctx->min_display_mastering_luminance = 500;
> +ctx->max_content_light_level = 0;
> +ctx->max_pic_average_light_level = 0;
> +if (ctx->master_display) {
> +ret = sscanf(ctx->master_display, 
> "G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)",
> +&ctx->display_primaries_x[0], &ctx->display_primaries_y[0],
> +&ctx->display_primaries_x[1], &ctx->display_primaries_y[1],
> +&ctx->display_primaries_x[2], &ctx->display_primaries_y[2],
> +&ctx->white_point_x, &ctx->white_point_y,
> +&ctx->max_display_mastering_luminance, 
> &ctx->min_display_mastering_luminance);
> +if (ret != 10) {
> +ret = sscanf(ctx->master_display, 
> "G[%hu,%hu]B[%hu,%hu]R[%hu,%hu]WP[%hu,%hu]L[%u,%u]",
> +&ctx->display_primaries_x[0], &ctx->display_primaries_y[0],
> +&ctx->display_primaries_x[1], &ctx->display_primaries_y[1],
> +&ctx->display_primaries_x[2], &ctx->display_primaries_y[2],
> +&ctx->white_point_x, &ctx->white_point_y,
> +&ctx->max_display_mastering_luminance, 
> &ctx->min_display_mastering_luminance);
> +}
> +
> +if (ret != 10) {
> +av_log(avctx, AV_LOG_INFO, "Failed to parse master 
> display(%s)\n", ctx->master_display);
> +}
> +}
> +
> +if (ctx->max_cll) {
> +ret = sscanf(ctx->max_cll, "%hu,%hu", &ctx->max_content_light_level, 
> &ctx->max_pic_average_light_level);
> +if (ret != 2) {
> +av_log(avctx, AV_LOG_INFO, "Failed to parse max cll(%s)\n", 
> ctx->max_cll);
> +}
> +}
> +
>  if ((ret = nvenc_load_libraries(avctx)) < 0)
>  return ret;
>  
> @@ -2110,6 +2154,91 @@ int ff_nvenc_send_frame(AVCodecContext *avctx, const 
> AVFrame *frame)
>  }
>  }
>  
> +if (ctx->sei  & SEI_MASTERING_DISPLAY) {
> +AVFrameSideData *sd = av_frame_get_side_data(frame, 
> AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
> +H265RawSEIMasteringDisplayColourVolume smd;
> +
> +if (sd) {
> +AVMasteringDisplayMetadata *mdm = 
> (AVMasteringDisplayMetadata *)sd->data;
> +// HEVC uses a g,b,r ordering, which we convert from a more 
> natural r,g,b
> +const int mapping[3] = {2, 0, 1};
> +const int chroma_den = 5;
> +const int luma_den = 1;
> +
> +if (mdm->has_primaries && mdm->has_luminance) {
> +
> +for (i = 0; i < 3; i++) {
> +const int j = mapping[i];
> +smd.display_primaries_x[i] = chroma_den * 
> av_q2d(mdm->display_primaries[j][0]);
> +smd.display_primaries_y[i] = chroma_den * av_q2d(

Re: [FFmpeg-devel] [PATCH 2/3] avcodec/nvenc: add master display and light level sei for HDR10

2019-05-24 Thread Lance Wang
On Wed, May 22, 2019 at 9:54 PM Timo Rothenpieler 
wrote:

> On 22.05.2019 08:59, lance.lmw...@gmail.com wrote:
> > From: Limin Wang 
> >
> > The testing command for the HDR10 output with nvenc:
> > $ ./ffmpeg_g -y -i 4K.mp4 -c:v hevc_nvenc -g 7 -color_primaries bt2020
> -colorspace bt2020_ncl -color_trc smpte2084 -sei hdr10 \
> >  -master_display
> "G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(1000,50)"
> -max_cll "0, 0" test.ts
> >
> > Please notice it is preferable to use the frame sei side data than
> master_display and max_cll paramters config
> > ---
> >   libavcodec/nvenc.c  | 129 
> >   libavcodec/nvenc.h  |  18 ++
> >   libavcodec/nvenc_hevc.c |  11 
> >   3 files changed, 158 insertions(+)
> >
> > diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
> > index 75dda6d689..3fd0eca4a5 100644
> > --- a/libavcodec/nvenc.c
> > +++ b/libavcodec/nvenc.c
> > @@ -22,6 +22,9 @@
> >   #include "config.h"
> >
> >   #include "nvenc.h"
> > +#include "cbs_h265.h"
> > +#include "hevc_sei.h"
> > +#include "put_bits.h"
> >
> >   #include "libavutil/hwcontext_cuda.h"
> >   #include "libavutil/hwcontext.h"
> > @@ -30,6 +33,7 @@
> >   #include "libavutil/avassert.h"
> >   #include "libavutil/mem.h"
> >   #include "libavutil/pixdesc.h"
> > +#include "libavutil/mastering_display_metadata.h"
> >   #include "internal.h"
> >
> >   #define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, dl_fn->cuda_dl, x)
> > @@ -1491,6 +1495,46 @@ av_cold int ff_nvenc_encode_init(AVCodecContext
> *avctx)
> >   ctx->data_pix_fmt = avctx->pix_fmt;
> >   }
> >
> > +ctx->display_primaries_x[0] = 13250;
> > +ctx->display_primaries_y[0] = 34500;
> > +ctx->display_primaries_x[1] = 7500;
> > +ctx->display_primaries_y[1] = 3000;
> > +ctx->display_primaries_x[2] = 34000;
> > +ctx->display_primaries_y[2] = 16000;
> > +ctx->white_point_x  = 15635;
> > +ctx->white_point_y  = 16450;
> > +ctx->max_display_mastering_luminance = 1000;
> > +ctx->min_display_mastering_luminance = 500;
> > +ctx->max_content_light_level = 0;
> > +ctx->max_pic_average_light_level = 0;
>
> Does all this really belong into an encoder? The command line parameter
> also looks very arcane.
> To me, this looks more like a filter or something should add this as
> extra data, and then multiple encoders can pick it up from there.
>
> Yes, now Nvidia video sdk can't support output HDR SEI data directly,
 however its API allow us to set it by SeiPayloadArray in parameters by the
format, that's the only ways to get 4K HDR output by nvenc.

Below is the discussion for the background FYI:
https://ffmpeg.zeranoe.com/forum/viewtopic.php?t=3729&start=10
https://devtalk.nvidia.com/default/topic/976304/video-technologies/nvidia-video-codec-sdk-7-0-hevc-custom-sei-support-problem/

For the master_display and max_cll parameters, it's same format as x265, in
case the input is raw video, you can configure it by parameters.
With the patches, you can get correct HDR10 and HLG with SDR 4K content.

Or after you get transcode 4K file by Nvenc, you'll lost SEI data, you had
to using the below project to patch the data.
https://github.com/SK-Hardwired/nv_hevc_hdr_patcher


Thanks,
Limin

> Same goes for patch 3/3. Patch 1/3 is looks OK to me.
>
>
> Timo
>
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 2/3] avcodec/nvenc: add master display and light level sei for HDR10

2019-05-22 Thread Timo Rothenpieler

On 22.05.2019 08:59, lance.lmw...@gmail.com wrote:

From: Limin Wang 

The testing command for the HDR10 output with nvenc:
$ ./ffmpeg_g -y -i 4K.mp4 -c:v hevc_nvenc -g 7 -color_primaries bt2020 
-colorspace bt2020_ncl -color_trc smpte2084 -sei hdr10 \
 -master_display 
"G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(1000,50)" -max_cll "0, 
0" test.ts

Please notice it is preferable to use the frame sei side data than 
master_display and max_cll paramters config
---
  libavcodec/nvenc.c  | 129 
  libavcodec/nvenc.h  |  18 ++
  libavcodec/nvenc_hevc.c |  11 
  3 files changed, 158 insertions(+)

diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
index 75dda6d689..3fd0eca4a5 100644
--- a/libavcodec/nvenc.c
+++ b/libavcodec/nvenc.c
@@ -22,6 +22,9 @@
  #include "config.h"
  
  #include "nvenc.h"

+#include "cbs_h265.h"
+#include "hevc_sei.h"
+#include "put_bits.h"
  
  #include "libavutil/hwcontext_cuda.h"

  #include "libavutil/hwcontext.h"
@@ -30,6 +33,7 @@
  #include "libavutil/avassert.h"
  #include "libavutil/mem.h"
  #include "libavutil/pixdesc.h"
+#include "libavutil/mastering_display_metadata.h"
  #include "internal.h"
  
  #define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, dl_fn->cuda_dl, x)

@@ -1491,6 +1495,46 @@ av_cold int ff_nvenc_encode_init(AVCodecContext *avctx)
  ctx->data_pix_fmt = avctx->pix_fmt;
  }
  
+ctx->display_primaries_x[0] = 13250;

+ctx->display_primaries_y[0] = 34500;
+ctx->display_primaries_x[1] = 7500;
+ctx->display_primaries_y[1] = 3000;
+ctx->display_primaries_x[2] = 34000;
+ctx->display_primaries_y[2] = 16000;
+ctx->white_point_x  = 15635;
+ctx->white_point_y  = 16450;
+ctx->max_display_mastering_luminance = 1000;
+ctx->min_display_mastering_luminance = 500;
+ctx->max_content_light_level = 0;
+ctx->max_pic_average_light_level = 0;


Does all this really belong into an encoder? The command line parameter 
also looks very arcane.
To me, this looks more like a filter or something should add this as 
extra data, and then multiple encoders can pick it up from there.


Same goes for patch 3/3. Patch 1/3 is looks OK to me.


Timo



smime.p7s
Description: S/MIME Cryptographic Signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 2/3] avcodec/nvenc: add master display and light level sei for HDR10

2019-05-22 Thread lance . lmwang
From: Limin Wang 

The testing command for the HDR10 output with nvenc:
$ ./ffmpeg_g -y -i 4K.mp4 -c:v hevc_nvenc -g 7 -color_primaries bt2020 
-colorspace bt2020_ncl -color_trc smpte2084 -sei hdr10 \
-master_display 
"G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(1000,50)" 
-max_cll "0, 0" test.ts

Please notice it is preferable to use the frame sei side data than 
master_display and max_cll paramters config
---
 libavcodec/nvenc.c  | 129 
 libavcodec/nvenc.h  |  18 ++
 libavcodec/nvenc_hevc.c |  11 
 3 files changed, 158 insertions(+)

diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
index 75dda6d689..3fd0eca4a5 100644
--- a/libavcodec/nvenc.c
+++ b/libavcodec/nvenc.c
@@ -22,6 +22,9 @@
 #include "config.h"
 
 #include "nvenc.h"
+#include "cbs_h265.h"
+#include "hevc_sei.h"
+#include "put_bits.h"
 
 #include "libavutil/hwcontext_cuda.h"
 #include "libavutil/hwcontext.h"
@@ -30,6 +33,7 @@
 #include "libavutil/avassert.h"
 #include "libavutil/mem.h"
 #include "libavutil/pixdesc.h"
+#include "libavutil/mastering_display_metadata.h"
 #include "internal.h"
 
 #define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, dl_fn->cuda_dl, x)
@@ -1491,6 +1495,46 @@ av_cold int ff_nvenc_encode_init(AVCodecContext *avctx)
 ctx->data_pix_fmt = avctx->pix_fmt;
 }
 
+ctx->display_primaries_x[0] = 13250;
+ctx->display_primaries_y[0] = 34500;
+ctx->display_primaries_x[1] = 7500;
+ctx->display_primaries_y[1] = 3000;
+ctx->display_primaries_x[2] = 34000;
+ctx->display_primaries_y[2] = 16000;
+ctx->white_point_x  = 15635;
+ctx->white_point_y  = 16450;
+ctx->max_display_mastering_luminance = 1000;
+ctx->min_display_mastering_luminance = 500;
+ctx->max_content_light_level = 0;
+ctx->max_pic_average_light_level = 0;
+if (ctx->master_display) {
+ret = sscanf(ctx->master_display, 
"G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)",
+&ctx->display_primaries_x[0], &ctx->display_primaries_y[0],
+&ctx->display_primaries_x[1], &ctx->display_primaries_y[1],
+&ctx->display_primaries_x[2], &ctx->display_primaries_y[2],
+&ctx->white_point_x, &ctx->white_point_y,
+&ctx->max_display_mastering_luminance, 
&ctx->min_display_mastering_luminance);
+if (ret != 10) {
+ret = sscanf(ctx->master_display, 
"G[%hu,%hu]B[%hu,%hu]R[%hu,%hu]WP[%hu,%hu]L[%u,%u]",
+&ctx->display_primaries_x[0], &ctx->display_primaries_y[0],
+&ctx->display_primaries_x[1], &ctx->display_primaries_y[1],
+&ctx->display_primaries_x[2], &ctx->display_primaries_y[2],
+&ctx->white_point_x, &ctx->white_point_y,
+&ctx->max_display_mastering_luminance, 
&ctx->min_display_mastering_luminance);
+}
+
+if (ret != 10) {
+av_log(avctx, AV_LOG_INFO, "Failed to parse master display(%s)\n", 
ctx->master_display);
+}
+}
+
+if (ctx->max_cll) {
+ret = sscanf(ctx->max_cll, "%hu,%hu", &ctx->max_content_light_level, 
&ctx->max_pic_average_light_level);
+if (ret != 2) {
+av_log(avctx, AV_LOG_INFO, "Failed to parse max cll(%s)\n", 
ctx->max_cll);
+}
+}
+
 if ((ret = nvenc_load_libraries(avctx)) < 0)
 return ret;
 
@@ -2110,6 +2154,91 @@ int ff_nvenc_send_frame(AVCodecContext *avctx, const 
AVFrame *frame)
 }
 }
 
+if (ctx->sei  & SEI_MASTERING_DISPLAY) {
+AVFrameSideData *sd = av_frame_get_side_data(frame, 
AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+H265RawSEIMasteringDisplayColourVolume smd;
+
+if (sd) {
+AVMasteringDisplayMetadata *mdm = (AVMasteringDisplayMetadata 
*)sd->data;
+// HEVC uses a g,b,r ordering, which we convert from a more 
natural r,g,b
+const int mapping[3] = {2, 0, 1};
+const int chroma_den = 5;
+const int luma_den = 1;
+
+if (mdm->has_primaries && mdm->has_luminance) {
+
+for (i = 0; i < 3; i++) {
+const int j = mapping[i];
+smd.display_primaries_x[i] = chroma_den * 
av_q2d(mdm->display_primaries[j][0]);
+smd.display_primaries_y[i] = chroma_den * av_q2d( 
mdm->display_primaries[j][1]);
+}
+
+smd.white_point_x = chroma_den * 
av_q2d(mdm->white_point[0]);
+smd.white_point_y = chroma_den * 
av_q2d(mdm->white_point[1]);
+smd.max_display_mastering_luminance = luma_den * 
av_q2d(mdm->max_luminance);
+smd.min_display_mastering_luminance = luma_den * 
av_q2d(mdm->min_luminance);
+}
+} else {
+for (i = 0; i < 3; i++) {
+smd.display_primaries_x[i