From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 8D6D440279 for ; Mon, 20 Dec 2021 01:27:55 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0BC1C68AEE9; Mon, 20 Dec 2021 03:27:53 +0200 (EET) Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2077.outbound.protection.outlook.com [40.92.89.77]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0313E68A92E for ; Mon, 20 Dec 2021 03:27:46 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fI4yvPFUqWxcutnvUM2vpn3idL1N4geUOYOqoAXN9jIn/FzH1cOLXPN50zFuVkUrClk+wQo11MbWg+ls4NODNCkfl8PIamTYw1YDfAk72tq5Ita3cnolnJCbIfaQYzZ5lO+5V+5RnDcYi00chnT8eLTX3reOLpa4NVjIAx6cvcin5M9MmhV3MQfMtxhekxjbOz/gaxHQwmA7H/S5yw66txorFFH0+0+iSonDZgo+7lHuABHacStQ6+Ia2uQejyA7ObBpl55JW8/ehml6GxW1/7zpm7sctNva/y7l+uayswUtgnIVARY7g4Ot9zXwOEJm8m3dMJ0PgluPIMCPlguUfw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=oV7AndwkT2/QCQ2l8fZIbix02eeF11A3P4UoA4P0cVg=; b=Ff7Zp8dUD00kraAsmcUB9RNYqzWuvwjJlb9U0RSq58dFnmlwF/crzYPeEZv1BmWq/JDyS4H1PXfobL4nNGzqvXZi6bUWKmgEETn0mvByIqSgg/VgZ/MQ+glJnKHRvFeJm3VSN4eCZIhxvQ4c3hSyQ/mHCTs5qzlYiuXQisDLO59VACOr3LHFE9mNBLosUsYK5fqbakX3mR+vjyfTZJAw9Xb+8qX9UcgWE5KW7twnBgGbWbU6iLR86hUPqstQgY0DJzv2abbw9FYFFG9I1NSe8Szj/N12Z/GULjBvt6Z0qjmGO9YUB2GNSMyedh1xduvkX4sXixS6BQll12wdRtgowg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oV7AndwkT2/QCQ2l8fZIbix02eeF11A3P4UoA4P0cVg=; b=SqRA3+tmps/iGBJvnp1pAIx26xlEq67zWAtqfeeGzDvcYi2HokgcvEFlLy6JEsGloWqnOtDLhgRPGAC64ilEgpwzVGhnb44/GK9vKWLM5b++3eBhaqQhVpQ2wwwgNQwaH0a2270Fh7XrLeB9c4RxAYk8tCRNB3k2BQKhJcn2eZll8amAKCk0P2xK5hGTO35G8iMPSbl7I0i4UXwpuf2ddJrR8EpuZLvyN4F3DJW/fGCOQLKWMSBp03EFMZ0IkfuuOGMTwV+duH0GIHrZ3dYxrNgsFvtjDoY0qYf1yE8cA4kh3aSGCBtVwrOoPYbD7p6z8FWAqsTQzsVw7FeUrTmTpg== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB3525.eurprd03.prod.outlook.com (2603:10a6:209:32::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4801.17; Mon, 20 Dec 2021 01:27:45 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::f0dc:92f5:6bc2:45ca]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::f0dc:92f5:6bc2:45ca%6]) with mapi id 15.20.4801.020; Mon, 20 Dec 2021 01:27:45 +0000 Message-ID: Date: Mon, 20 Dec 2021 02:27:43 +0100 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20211219192134.1296-1-dcnieho@gmail.com> <20211219192134.1296-13-dcnieho@gmail.com> From: Andreas Rheinhardt In-Reply-To: <20211219192134.1296-13-dcnieho@gmail.com> X-TMN: [dDfe6WRydNJW8SjEJVKsRyKOpD38qgzY] X-ClientProxiedBy: AS9PR06CA0006.eurprd06.prod.outlook.com (2603:10a6:20b:462::25) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c2fc8195-ff41-4188-33ab-08d9c357ec98 X-MS-TrafficTypeDiagnostic: AM6PR03MB3525:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZqWDAA95iT3RMWB9XqP9lRTd8Ue8jl8F1PRuxsgiwkk9i9DQ2KZ6YgR4LxxV42lechASxeZEYNhzgZMueTBKF6mFvQ4psNdxChwwrZmoCqut/I/83k65sO6g5qim7Kk3WvuOK+sVCN478XSmPU4hVOOFurBbMyxl3/F5fh7kRXPkTVTNI0bio+0zvDKJKfEpX6BQEK+Dc6tIOl4+QiUpk2mw5ZdZDeOag++rA947RWm+yHWMQSYeuyXp3EHzmkunV7dFgKxisLcAhk7pI4vqBao5z2/azzANki/M8hTazhRKbqGiJx/A/YdeOpXhVN4wR9UKa9HIXHJSpO8fg1ZHUCKipiPyR+9zdnhJ3yZILopx2Gspel4Lzgk5zgwOk503dYg7ztzV8KeOlRA4yM8fad5LZWnii7LLK54Yh/7500TCUsQJ0W8wxn6cc/egnSORqC09s5ZrMMcyPE9IjN7VPOafJq89iCldEQLzqigi2gAC7wtq5m9Y8AtoQKFg/asdheHLokdJZzaPRL6bDbX6RbPzGPEZYa4l7nnxXbxMSRnKox2ewABzLGYi3243keiBOHbO0FUeOZNMJFV+I+sqipqaOuRaaY/Holyb4aDK6TGJV9oWMvgObgM6NdqB0gg45XDNAwIjcZa7+ZqteaiOMdV20uondiIHCyV0pTrJWu4= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UXpTUjhvbWd3a2xmcjMzOXlwRzRkN2FyMXhScERSRnRiOUxQZ1VzUEdIbERT?= =?utf-8?B?MXViWTZJWnJ1dmdSVzFtdUhEWWFpRXdGVGZWWmJXbGlQUEFWcFIzM1Z5RUMx?= =?utf-8?B?d1FDV2lYdmx3cExjZklsYTNUYTlIakFzS1owYXNOVHNLNy9zelVCZys1cW9j?= =?utf-8?B?VVN3dDEwOHZDZ2poMWl5SGplUFNadU0yTVJwY2hvOTNUMkRwNmxxdVZkMktL?= =?utf-8?B?R2RaRzl5WUhsOXcxZHJlUFpDU1g3eW81bHlNTnpQc1ZvNzJmK0drY1dpRngx?= =?utf-8?B?TFRvMWpXOUhLa2hmYVNVV0J0NlFHV2VSOE5BRXZXS2hSRlZKbmpZVE1jU2k5?= =?utf-8?B?YWR0a2oxdEJ0aWRqSEdjUHJVZG43Mi9kTnF2eG5qRzV5cFlUa2swSExDWTBE?= =?utf-8?B?L2tRS2dhRG83U1VIdWVPVCtjQWRPRFI3OFpqbWFERXBxandMdHZ3WTdRbXRv?= =?utf-8?B?RS9JRHdkMWtvdm9SN1ZHQlA0OUl5bTdKemNyeVRKbG4vZWdKNmpKSkl4cjFy?= =?utf-8?B?d0tSWUxzc0VxY1VsRVA1ZHJXNlpuQjNIeGMzbUZwc1A2Z0ZiTDM3U1NxM2Qz?= =?utf-8?B?SnlGRks1S3k0TVMzbWliSkREVFhqNDY2UlQyeWN5MUF3MUZuUVpxc2ZhRm9D?= =?utf-8?B?VjV4RUdhRUxmTEhUeGM5NVVRNkErM0JwclZWTmJQazlEakpIKzAwU04wMmJx?= =?utf-8?B?dUhpQ2xYTmdMcjkxblZRYlcwMm1lbXdHQVJiVGMwamw1RldqZnpLYVk5Z3FT?= =?utf-8?B?SkFQaEsvdlJZdnpYakRTNXBudFZWb1dvSWlIQTRyL25KdC91YTBDWHVlVDdJ?= =?utf-8?B?ZG9mR1o3eFA2ck45TGVXY2J3dFB0UzVFN2k4WFp4S1dmUjdzaUJwY1IrUDZt?= =?utf-8?B?N0NwdkVYTWxycTlvZnVSZ1UxZkRvanJsMXU5akVqeXRxTXJ0SzBIMTZRSlJO?= =?utf-8?B?cVBVUG16cW1mT3dsc0JkR3QxSTFlbjdwUXY5ZnVsMnpoMTNjMTEySno3WkUr?= =?utf-8?B?MFBrR1VlMFY1ekRyOFM1UGN4aHRzNUR5YVo1QUxMTzJUR3BoSit0YlJMcnEz?= =?utf-8?B?UGJxVEtXZHdkdzlmVExyQytITldYM1h4WUZic2FuSzlmY3hiYm1JTnU0bXYr?= =?utf-8?B?a1lORkkwL1RTdS9DdlBZbTZ6d2RhN1VTdHduOEE5RDc4eFhTK1FZcGtRNTRQ?= =?utf-8?B?U0hnY3I2V0RFMldEaEk1WVFCbDFhRCtjWkFBclJYalpGaUNMTm5EZGdDbUFD?= =?utf-8?B?UjVIZVg3YW1rNkJEQ3hWTGZXL2l1M0I5SklZNkNSVUs1N2RIUT09?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c2fc8195-ff41-4188-33ab-08d9c357ec98 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Dec 2021 01:27:45.0947 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR03MB3525 Subject: Re: [FFmpeg-devel] [PATCH v5 12/13] avdevice/dshow: discover source color range/space/etc X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Diederick Niehorster: > 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 > Signed-off-by: Diederick Niehorster > --- > libavdevice/dshow.c | 255 +++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 254 insertions(+), 1 deletion(-) > > diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c > index fa3a06c077..4ad6ae102c 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; > +#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; > + } > +} > + > +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 > + 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 > + 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; > +} > + > +static enum AVColorPrimaries dshow_color_primaries(DXVA2_ExtendedFormat *fmt_info) > +{ > + switch (fmt_info->VideoPrimaries) > + { > + case DXVA2_VideoPrimaries_Unknown: > + return AVCOL_PRI_UNSPECIFIED; > + case DXVA2_VideoPrimaries_reserved: > + return AVCOL_PRI_RESERVED; > + case DXVA2_VideoPrimaries_BT709: > + return AVCOL_PRI_BT709; > + case DXVA2_VideoPrimaries_BT470_2_SysM: > + return AVCOL_PRI_BT470M; > + case DXVA2_VideoPrimaries_BT470_2_SysBG: > + case DXVA2_VideoPrimaries_EBU3213: // this is PAL > + return AVCOL_PRI_BT470BG; > + case DXVA2_VideoPrimaries_SMPTE170M: > + case DXVA2_VideoPrimaries_SMPTE_C: > + return AVCOL_PRI_SMPTE170M; > + case DXVA2_VideoPrimaries_SMPTE240M: > + return AVCOL_PRI_SMPTE240M; > + > + // values from MediaFoundation SDK (mfobjects.h) > + case 9: // MFVideoPrimaries_BT2020 > + return AVCOL_PRI_BT2020; > + case 10: // MFVideoPrimaries_XYZ > + return AVCOL_PRI_SMPTE428; > + case 11: // MFVideoPrimaries_DCI_P3 > + return AVCOL_PRI_SMPTE431; > + case 12: // MFVideoPrimaries_ACES (Academy Color Encoding System) > + // not an FFmpeg color primary > + return AVCOL_PRI_UNSPECIFIED; > + > + default: > + return AVCOL_PRI_UNSPECIFIED; > + } > +} > + > +static enum AVColorTransferCharacteristic dshow_color_trc(DXVA2_ExtendedFormat *fmt_info) > +{ > + switch (fmt_info->VideoTransferFunction) > + { > + case DXVA2_VideoTransFunc_Unknown: > + return AVCOL_TRC_UNSPECIFIED; > + case DXVA2_VideoTransFunc_10: > + return AVCOL_TRC_LINEAR; > + case DXVA2_VideoTransFunc_18: > + // not an FFmpeg transfer characteristic > + return AVCOL_TRC_UNSPECIFIED; > + case DXVA2_VideoTransFunc_20: > + // not an FFmpeg transfer characteristic > + return AVCOL_TRC_UNSPECIFIED; > + case DXVA2_VideoTransFunc_22: > + return AVCOL_TRC_GAMMA22; > + case DXVA2_VideoTransFunc_709: > + return AVCOL_TRC_BT709; > + case DXVA2_VideoTransFunc_240M: > + return AVCOL_TRC_SMPTE240M; > + case DXVA2_VideoTransFunc_sRGB: > + return AVCOL_TRC_IEC61966_2_1; > + case DXVA2_VideoTransFunc_28: > + return AVCOL_TRC_GAMMA28; > + > + // values from MediaFoundation SDK (mfobjects.h) > + case 9: // MFVideoTransFunc_Log_100 > + return AVCOL_TRC_LOG; > + case 10: // MFVideoTransFunc_Log_316 > + return AVCOL_TRC_LOG_SQRT; > + case 11: // MFVideoTransFunc_709_sym > + // not an FFmpeg transfer characteristic > + return AVCOL_TRC_UNSPECIFIED; > + case 12: // MFVideoTransFunc_2020_const > + case 13: // MFVideoTransFunc_2020 > + if (fmt_info->VideoTransferMatrix==5) // MFVideoTransferMatrix_BT2020_12 > + return AVCOL_TRC_BT2020_12; > + else > + return AVCOL_TRC_BT2020_10; > + case 14: // MFVideoTransFunc_26 > + // not an FFmpeg transfer characteristic > + return AVCOL_TRC_UNSPECIFIED; > + case 15: // MFVideoTransFunc_2084 > + return AVCOL_TRC_SMPTEST2084; > + case 16: // MFVideoTransFunc_HLG > + return AVCOL_TRC_ARIB_STD_B67; > + case 17: // MFVideoTransFunc_10_rel > + // not an FFmpeg transfer characteristic? Undocumented also by MS > + return AVCOL_TRC_UNSPECIFIED; > + > + default: > + return AVCOL_TRC_UNSPECIFIED; > + } > +} > + > +static enum AVChromaLocation dshow_chroma_loc(DXVA2_ExtendedFormat *fmt_info) > +{ > + if (fmt_info->VideoChromaSubsampling == DXVA2_VideoChromaSubsampling_Cosited) // that is: (DXVA2_VideoChromaSubsampling_Horizontally_Cosited | DXVA2_VideoChromaSubsampling_Vertically_Cosited | DXVA2_VideoChromaSubsampling_Vertically_AlignedChromaPlanes) > + return AVCHROMA_LOC_TOPLEFT; > + else if (fmt_info->VideoChromaSubsampling == DXVA2_VideoChromaSubsampling_MPEG1) // that is: DXVA2_VideoChromaSubsampling_Vertically_AlignedChromaPlanes > + return AVCHROMA_LOC_CENTER; > + else if (fmt_info->VideoChromaSubsampling == DXVA2_VideoChromaSubsampling_MPEG2) // that is: (DXVA2_VideoChromaSubsampling_Horizontally_Cosited | DXVA2_VideoChromaSubsampling_Vertically_AlignedChromaPlanes) > + return AVCHROMA_LOC_LEFT; > + else if (fmt_info->VideoChromaSubsampling == DXVA2_VideoChromaSubsampling_DV_PAL) // that is: (DXVA2_VideoChromaSubsampling_Horizontally_Cosited | DXVA2_VideoChromaSubsampling_Vertically_Cosited) > + return AVCHROMA_LOC_TOPLEFT; > + else > + // unknown > + return AVCHROMA_LOC_UNSPECIFIED; > +} > + > static int > dshow_read_close(AVFormatContext *s) > { > @@ -517,6 +728,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, > VIDEO_STREAM_CONFIG_CAPS *vcaps = caps; > BITMAPINFOHEADER *bih; > int64_t *fr; > + DXVA2_ExtendedFormat *extended_format_info = NULL; > const AVCodecTag *const tags[] = { avformat_get_riff_video_tags(), NULL }; > #if DSHOWDEBUG > ff_print_VIDEO_STREAM_CONFIG_CAPS(vcaps); > @@ -529,6 +741,8 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, > VIDEOINFOHEADER2 *v = (void *) type->pbFormat; > fr = &v->AvgTimePerFrame; > bih = &v->bmiHeader; > + if (v->dwControlFlags & AMCONTROL_COLORINFO_PRESENT) > + extended_format_info = (DXVA2_ExtendedFormat *) &v->dwControlFlags; > } else { > goto next; > } > @@ -545,11 +759,40 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype, > } else { > av_log(avctx, AV_LOG_INFO, " pixel_format=%s", av_get_pix_fmt_name(pix_fmt)); > } > - av_log(avctx, AV_LOG_INFO, " min s=%ldx%ld fps=%g max s=%ldx%ld fps=%g\n", > + av_log(avctx, AV_LOG_INFO, " min s=%ldx%ld fps=%g max s=%ldx%ld fps=%g", > vcaps->MinOutputSize.cx, vcaps->MinOutputSize.cy, > 1e7 / vcaps->MaxFrameInterval, > vcaps->MaxOutputSize.cx, vcaps->MaxOutputSize.cy, > 1e7 / vcaps->MinFrameInterval); > + if (extended_format_info) { > + enum AVColorRange col_range = dshow_color_range(extended_format_info); > + enum AVColorSpace col_space = dshow_color_space(extended_format_info); > + enum AVColorPrimaries col_prim = dshow_color_primaries(extended_format_info); > + enum AVColorTransferCharacteristic col_trc = dshow_color_trc(extended_format_info); > + enum AVChromaLocation chroma_loc = dshow_chroma_loc(extended_format_info); > + if (col_range != AVCOL_RANGE_UNSPECIFIED || col_space != AVCOL_SPC_UNSPECIFIED || col_prim != AVCOL_PRI_UNSPECIFIED || col_trc != AVCOL_TRC_UNSPECIFIED) { > + const char *range = av_color_range_name(col_range); > + const char *space = av_color_space_name(col_space); > + const char *prim = av_color_primaries_name(col_prim); > + const char *trc = av_color_transfer_name(col_trc); > + av_log(avctx, AV_LOG_INFO, " (%s, %s/%s/%s", > + range ? range : "unknown", > + space ? space : "unknown", > + prim ? prim : "unknown", > + trc ? trc : "unknown"); > + if (chroma_loc != AVCHROMA_LOC_UNSPECIFIED) { > + const char *chroma = av_chroma_location_name(chroma_loc); > + av_log(avctx, AV_LOG_INFO, ", %s", chroma ? chroma : "unknown"); > + } > + av_log(avctx, AV_LOG_INFO, ")"); > + } > + else if (chroma_loc != AVCHROMA_LOC_UNSPECIFIED) { > + const char *chroma = av_chroma_location_name(chroma_loc); > + av_log(avctx, AV_LOG_INFO, "(%s)", chroma ? chroma : "unknown"); > + } This looks an awful lot like avcodec_string(). > + } > + > + av_log(avctx, AV_LOG_INFO, "\n"); > continue; > } > if (ctx->video_codec_id != AV_CODEC_ID_RAWVIDEO) { > @@ -1118,6 +1361,7 @@ dshow_add_device(AVFormatContext *avctx, > if (devtype == VideoDevice) { > BITMAPINFOHEADER *bih = NULL; > AVRational time_base; > + DXVA2_ExtendedFormat *extended_format_info = NULL; > > if (IsEqualGUID(&type.formattype, &FORMAT_VideoInfo)) { > VIDEOINFOHEADER *v = (void *) type.pbFormat; > @@ -1127,6 +1371,8 @@ dshow_add_device(AVFormatContext *avctx, > VIDEOINFOHEADER2 *v = (void *) type.pbFormat; > time_base = (AVRational) { v->AvgTimePerFrame, 10000000 }; > bih = &v->bmiHeader; > + if (v->dwControlFlags & AMCONTROL_COLORINFO_PRESENT) > + extended_format_info = (DXVA2_ExtendedFormat *) &v->dwControlFlags; > } > if (!bih) { > av_log(avctx, AV_LOG_ERROR, "Could not get media type.\n"); > @@ -1145,6 +1391,13 @@ dshow_add_device(AVFormatContext *avctx, > av_log(avctx, AV_LOG_DEBUG, "attempt to use full range for HDYC...\n"); > par->color_range = AVCOL_RANGE_MPEG; // just in case it needs this... > } > + if (extended_format_info) { > + par->color_range = dshow_color_range(extended_format_info); > + par->color_space = dshow_color_space(extended_format_info); > + par->color_primaries = dshow_color_primaries(extended_format_info); > + par->color_trc = dshow_color_trc(extended_format_info); > + par->chroma_location = dshow_chroma_loc(extended_format_info); > + } > if (par->format == AV_PIX_FMT_NONE) { > const AVCodecTag *const tags[] = { avformat_get_riff_video_tags(), NULL }; > par->codec_id = av_codec_get_id(tags, bih->biCompression); > _______________________________________________ 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".