Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: "Diederick C. Niehorster" <dcnieho@gmail.com>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH v6 11/12] avdevice/dshow: discover source color range/space/etc
Date: Tue, 21 Dec 2021 14:11:14 +0100
Message-ID: <CABcAi1iFOOwa5qXwbz4zV1Dsgds57-KL7_nj1Uy-nX-mPdNpAg@mail.gmail.com> (raw)
In-Reply-To: <CA+anqdzmRt32_HYj+XOHcDVMjAssfwje0U+DH2b_rYxF9T6JWQ@mail.gmail.com>

Hi Hendrik,

Thanks for the review! Comments/questions below:

On Tue, Dec 21, 2021 at 1:35 PM Hendrik Leppkes <h.leppkes@gmail.com> wrote:
>
> On Tue, Dec 21, 2021 at 1:15 PM Diederick Niehorster <dcnieho@gmail.com> wrote:
> >
> > Enabled discovering a DirectShow device's color range, space, primaries,
> > transfer characteristics and chroma location, if the device exposes that
> > information. Sets them in the stream's codecpars.
> >
> > Co-authored-by: Valerii Zapodovnikov <val.zapod.vz@gmail.com>
> > Signed-off-by: Diederick Niehorster <dcnieho@gmail.com>
> > ---
> >  libavdevice/dshow.c | 255 +++++++++++++++++++++++++++++++++++++++++++-
> >  1 file changed, 254 insertions(+), 1 deletion(-)
> >
> > diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
> > index 4b1e942c7a..79be32b255 100644
> > --- a/libavdevice/dshow.c
> > +++ b/libavdevice/dshow.c
> > @@ -29,6 +29,31 @@
> >  #include "libavcodec/raw.h"
> >  #include "objidl.h"
> >  #include "shlwapi.h"
> > +// NB: technically, we should include dxva.h and use
> > +// DXVA_ExtendedFormat, but that type is not defined in
> > +// the MinGW headers. The DXVA2_ExtendedFormat and the
> > +// contents of its fields is identical to
> > +// DXVA_ExtendedFormat (see https://docs.microsoft.com/en-us/windows/win32/medfound/extended-color-information#color-space-in-media-types)
> > +// and is provided by MinGW as well, so we use that
> > +// instead. NB also that per the Microsoft docs, the
> > +// lowest 8 bits of the structure, i.e. the SampleFormat
> > +// field, contain AMCONTROL_xxx flags instead of sample
> > +// format information, and should thus not be used.
> > +// NB further that various values in the structure's
> > +// fields (e.g. BT.2020 color space) are not provided
> > +// for either of the DXVA structs, but are provided in
> > +// the flags of the corresponding fields of Media Foundation.
> > +// These may be provided by DirectShow devices (e.g. LAVFilters
> > +// does so). So we use those values here too (the equivalence is
> > +// indicated by Microsoft example code: https://docs.microsoft.com/en-us/windows/win32/api/dxva2api/ns-dxva2api-dxva2_videodesc)
> > +typedef DWORD D3DFORMAT;    // dxva2api.h header needs these types defined before include apparently in WinSDK (not MinGW).
> > +typedef DWORD D3DPOOL;
>
> These come from d3d9types.h, through d3d9.h, which presumably you need
> anyway due to the other D3D9 interfaces used in dxva2api.h, so I'm not
> quite sure when these typedefs are required?

I tried to keep the includes minimal (I don't need any of the d3d9
headers), and to be able to include dxva2api.h, these two typedefs
were needed and nothing else. You prefer i include d3d9types.h instead
of the typedefs?

> > +#include "dxva2api.h"
> > +
> > +#ifndef AMCONTROL_COLORINFO_PRESENT
> > +// not defined in some versions of MinGW's dvdmedia.h
> > +#   define AMCONTROL_COLORINFO_PRESENT 0x00000080 // if set, indicates DXVA color info is present in the upper (24) bits of the dwControlFlags
> > +#endif
> >
> >
> >  static enum AVPixelFormat dshow_pixfmt(DWORD biCompression, WORD biBitCount)
> > @@ -54,6 +79,192 @@ static enum AVPixelFormat dshow_pixfmt(DWORD biCompression, WORD biBitCount)
> >      return avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), biCompression); // all others
> >  }
> >
> > +static enum AVColorRange dshow_color_range(DXVA2_ExtendedFormat *fmt_info)
> > +{
> > +    switch (fmt_info->NominalRange)
> > +    {
> > +    case DXVA2_NominalRange_Unknown:
> > +        return AVCOL_RANGE_UNSPECIFIED;
> > +    case DXVA2_NominalRange_Normal: // equal to DXVA2_NominalRange_0_255
> > +        return AVCOL_RANGE_JPEG;
> > +    case DXVA2_NominalRange_Wide:   // equal to DXVA2_NominalRange_16_235
> > +        return AVCOL_RANGE_MPEG;
> > +    case DXVA2_NominalRange_48_208:
> > +        // not an ffmpeg color range
> > +        return AVCOL_RANGE_UNSPECIFIED;
> > +
> > +    // values from MediaFoundation SDK (mfobjects.h)
> > +    case 4:     // MFNominalRange_64_127
> > +        // not an ffmpeg color range
> > +        return AVCOL_RANGE_UNSPECIFIED;
> > +
> > +    default:
> > +        return DXVA2_NominalRange_Unknown;
>
> The default return here should be an AVCOL_RANGE_ constant as well

Absolutely, good catch!

> > +    }
> > +}
> > +
> > +static enum AVColorSpace dshow_color_space(DXVA2_ExtendedFormat *fmt_info)
> > +{
> > +    enum AVColorSpace ret = AVCOL_SPC_UNSPECIFIED;
> > +
> > +    switch (fmt_info->VideoTransferMatrix)
> > +    {
> > +    case DXVA2_VideoTransferMatrix_BT709:
> > +        ret = AVCOL_SPC_BT709;
> > +        break;
> > +    case DXVA2_VideoTransferMatrix_BT601:
> > +        ret = AVCOL_SPC_BT470BG;
> > +        break;
> > +    case DXVA2_VideoTransferMatrix_SMPTE240M:
> > +        ret = AVCOL_SPC_SMPTE240M;
> > +        break;
> > +
> > +    // values from MediaFoundation SDK (mfobjects.h)
> > +    case 4:     // MFVideoTransferMatrix_BT2020_10
> > +    case 5:     // MFVideoTransferMatrix_BT2020_12
> > +        if (fmt_info->VideoTransferFunction==12)    // MFVideoTransFunc_2020_const
>
> Spaces around the == operator please.

ok

> > +            ret = AVCOL_SPC_BT2020_CL;
> > +        else
> > +            ret = AVCOL_SPC_BT2020_NCL;
> > +        break;
> > +    }
> > +
> > +    if (ret == AVCOL_SPC_UNSPECIFIED)
> > +    {
> > +        // if color space not known from transfer matrix,
> > +        // fall back to using primaries to guess color space
>
> Guessing color space from primaries seems unusual, especially since
> the behavior of unknown is actually defined in MSDN docs. IMHO it
> would be better to forward information provided and not try to
> interpret it.

You think i should remove this whole if (ret == AVCOL_SPC_UNSPECIFIED)
code block? I indeed see the docs comment about how
DXVA2_VideoTransferMatrix_Unknown should be interpreted (nothing we
can do here in this function).

> > +        switch (fmt_info->VideoPrimaries)
> > +        {
> > +        case DXVA2_VideoPrimaries_BT709:
> > +            ret = AVCOL_SPC_BT709;
> > +            break;
> > +        case DXVA2_VideoPrimaries_BT470_2_SysM:
> > +            ret = AVCOL_SPC_FCC;
> > +            break;
> > +        case DXVA2_VideoPrimaries_BT470_2_SysBG:
> > +        case DXVA2_VideoPrimaries_EBU3213:   // this is PAL
> > +            ret = AVCOL_SPC_BT470BG;
> > +            break;
> > +        case DXVA2_VideoPrimaries_SMPTE170M:
> > +        case DXVA2_VideoPrimaries_SMPTE_C:
> > +            ret = AVCOL_SPC_SMPTE170M;
> > +            break;
> > +        case DXVA2_VideoPrimaries_SMPTE240M:
> > +            ret = AVCOL_SPC_SMPTE240M;
> > +            break;
> > +        }
> > +    }
> > +
> > +    return ret;
> > +}
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

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

  reply	other threads:[~2021-12-21 13:11 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-21 12:12 [FFmpeg-devel] [PATCH v6 00/12] dshow enhancements Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 01/12] avdevice/dshow: prevent NULL access Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 02/12] avdevice/dshow: implement option to use device video timestamps Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 03/12] avdevice/dshow: query graph and sample time only once Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 04/12] avdevice/dshow: handle unknown sample time Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 05/12] avdevice/dshow: set no-seek flags Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 06/12] avdevice/dshow: implement get_device_list Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 07/12] avdevice/dshow: list_devices: show media type(s) per device Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 08/12] avdevice: add info about media types(s) to AVDeviceInfo Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 09/12] avdevice/dshow: add media type info to get_device_list Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 10/12] fftools: provide media type info for devices Diederick Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 11/12] avdevice/dshow: discover source color range/space/etc Diederick Niehorster
2021-12-21 12:35   ` Hendrik Leppkes
2021-12-21 13:11     ` Diederick C. Niehorster [this message]
2021-12-21 13:35       ` Hendrik Leppkes
2021-12-21 13:44         ` Diederick C. Niehorster
2021-12-21 12:12 ` [FFmpeg-devel] [PATCH v6 12/12] avdevice/dshow: select format with extended color info Diederick Niehorster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CABcAi1iFOOwa5qXwbz4zV1Dsgds57-KL7_nj1Uy-nX-mPdNpAg@mail.gmail.com \
    --to=dcnieho@gmail.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git