Re: [FFmpeg-devel] [PATCH 2/3] avcodec/nvenc: add master display and light level sei for HDR10
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
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
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
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
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
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
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
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
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