I need to validate if a video file (HEVC encoded) is or is not an HDR video. I know that there are many HDR standards, but I did not find a way to identify it using mediainfo or ffprobe.

The need is because I have an API that receives several video profiles (different bitrates, dimensions and codecs) for a single video, which are used to deliver to users the best match based on their devices and connection speed. So now I want to allow them to select HDR profile but to achieve this I need first to validate the ingest files.

Do you know how to handle this?


I've found how to get this information from color primaries attribute. Considering color primaries BT.2020 as a HDR video.

mediainfo video.mp4 --Inform="Video;%colour_primaries%"

In this example above, if the return of the command is BT.2020 so I consider the video as HDR. Otherwise SDR.

  • 1
    Technically, that will only determine if a video is WCG. To test for HDR-ness, you also need to check that the transfer function is one of the HDR flavors. – Jason Conrad Jan 6 '18 at 20:53
  • Nice to know @JasonConrad . So could I consider PQ and HLG as valid transfer functions for and HDR video? – Douglas Lise Apr 21 '18 at 2:17
  • 1
    Yes. I think that the color space, transfer function, and bit depth (HDR also needs to be 10 bits per channel) are enough to minimally qualify video as HDR, but there are different flavors and specifications. – Jason Conrad Apr 22 '18 at 7:10

Assuming your file is ${F}, the below is an efficient means I have been able to create:

COLORS=$(ffprobe -show_streams -v error "${F}" |egrep "^color_transfer|^color_space=|^color_primaries=" |head -3)
for C in $COLORS; do
        if [[ "$C" = "color_space="* ]]; then
        elif [[ "$C" = "color_transfer="* ]]; then
        elif [[ "$C" = "color_primaries="* ]]; then
if [ "${COLORSPACE}" = "bt2020nc" ] && [ "${COLORTRANSFER}" = "smpte2084" ] && [ "${COLORPRIMARIES}" = "bt2020" ]; then 
        echo ${F}

I use this inside a looping function to know when to use https://github.com/Fmstrat/ffmkv to create an SDR version of a video on one of the presets.

  • Note, this defaults to the top video stream. I use -select_stream when I need to be specific. And you'll want to reset the variables in a loop. – Fmstrat Oct 21 '19 at 13:48

Your Answer

