summaryrefslogtreecommitdiff
path: root/sys/mediafoundation/gstmfutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sys/mediafoundation/gstmfutils.cpp')
-rw-r--r--sys/mediafoundation/gstmfutils.cpp304
1 files changed, 304 insertions, 0 deletions
diff --git a/sys/mediafoundation/gstmfutils.cpp b/sys/mediafoundation/gstmfutils.cpp
index 684855f64..1e4e3f8a4 100644
--- a/sys/mediafoundation/gstmfutils.cpp
+++ b/sys/mediafoundation/gstmfutils.cpp
@@ -393,3 +393,307 @@ _gst_mf_result (HRESULT hr, GstDebugCategory * cat, const gchar * file,
#endif
}
+/* Reference:
+ * https://docs.microsoft.com/en-us/windows/win32/medfound/media-type-debugging-code */
+#define GST_MF_IF_EQUAL_RETURN(guid,val) G_STMT_START { \
+ if (IsEqualGUID (guid, val)) \
+ return G_STRINGIFY (val); \
+} G_STMT_END
+
+static const gchar *
+gst_mf_guid_to_static_string (const GUID& guid)
+{
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MAJOR_TYPE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MAJOR_TYPE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_SUBTYPE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_ALL_SAMPLES_INDEPENDENT);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_FIXED_SIZE_SAMPLES);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_COMPRESSED);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_SAMPLE_SIZE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_WRAPPED_TYPE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_NUM_CHANNELS);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_SAMPLES_PER_SECOND);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_AVG_BYTES_PER_SECOND);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_BLOCK_ALIGNMENT);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_BITS_PER_SAMPLE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_VALID_BITS_PER_SAMPLE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_SAMPLES_PER_BLOCK);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_CHANNEL_MASK);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_FOLDDOWN_MATRIX);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_PEAKREF);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_PEAKTARGET);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_AVGREF);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_AVGTARGET);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AUDIO_PREFER_WAVEFORMATEX);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AAC_PAYLOAD_TYPE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_FRAME_SIZE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE_RANGE_MAX);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE_RANGE_MIN);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_PIXEL_ASPECT_RATIO);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_DRM_FLAGS);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_PAD_CONTROL_FLAGS);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_SOURCE_CONTENT_HINT);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_VIDEO_CHROMA_SITING);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_INTERLACE_MODE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_TRANSFER_FUNCTION);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_VIDEO_PRIMARIES);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_CUSTOM_VIDEO_PRIMARIES);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_YUV_MATRIX);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_VIDEO_LIGHTING);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_VIDEO_NOMINAL_RANGE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_GEOMETRIC_APERTURE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MINIMUM_DISPLAY_APERTURE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_PAN_SCAN_APERTURE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_PAN_SCAN_ENABLED);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AVG_BITRATE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AVG_BIT_ERROR_RATE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MAX_KEYFRAME_SPACING);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_DEFAULT_STRIDE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_PALETTE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_USER_DATA);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_AM_FORMAT_TYPE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MPEG_START_TIME_CODE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MPEG2_PROFILE);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MPEG2_LEVEL);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MPEG2_FLAGS);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MPEG_SEQUENCE_HEADER);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_SRC_PACK_0);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_CTRL_PACK_0);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_SRC_PACK_1);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_CTRL_PACK_1);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_DV_VAUX_SRC_PACK);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_DV_VAUX_CTRL_PACK);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_ARBITRARY_HEADER);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_ARBITRARY_FORMAT);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_IMAGE_LOSS_TOLERANT);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MPEG4_SAMPLE_DESCRIPTION);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_4CC);
+ GST_MF_IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_WAVE_FORMAT_TAG);
+
+ GST_MF_IF_EQUAL_RETURN(guid, MFMediaType_Audio);
+ GST_MF_IF_EQUAL_RETURN(guid, MFMediaType_Video);
+ GST_MF_IF_EQUAL_RETURN(guid, MFMediaType_Protected);
+ GST_MF_IF_EQUAL_RETURN(guid, MFMediaType_SAMI);
+ GST_MF_IF_EQUAL_RETURN(guid, MFMediaType_Script);
+ GST_MF_IF_EQUAL_RETURN(guid, MFMediaType_Image);
+ GST_MF_IF_EQUAL_RETURN(guid, MFMediaType_HTML);
+ GST_MF_IF_EQUAL_RETURN(guid, MFMediaType_Binary);
+ GST_MF_IF_EQUAL_RETURN(guid, MFMediaType_FileTransfer);
+
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_AI44);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_ARGB32);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_AYUV);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_DV25);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_DV50);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_DVH1);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_DVSD);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_DVSL);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_H264);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_H265);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_HEVC);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_HEVC_ES);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_I420);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_IYUV);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_M4S2);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_MJPG);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_MP43);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_MP4S);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_MP4V);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_MPG1);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_MSS1);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_MSS2);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_NV11);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_NV12);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_P010);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_P016);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_P210);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_P216);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_RGB24);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_RGB32);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_RGB555);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_RGB565);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_RGB8);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_UYVY);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_v210);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_v410);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_VP80);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_VP90);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_WMV1);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_WMV2);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_WMV3);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_WVC1);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_Y210);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_Y216);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_Y410);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_Y416);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_Y41P);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_Y41T);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_YUY2);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_YV12);
+ GST_MF_IF_EQUAL_RETURN(guid, MFVideoFormat_YVYU);
+
+ /* WAVE_FORMAT_PCM */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_PCM);
+ /* WAVE_FORMAT_IEEE_FLOAT */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_Float);
+ /* WAVE_FORMAT_DTS */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_DTS);
+ /* WAVE_FORMAT_DOLBY_AC3_SPDIF */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_Dolby_AC3_SPDIF);
+ /* WAVE_FORMAT_DRM */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_DRM);
+ /* WAVE_FORMAT_WMAUDIO2 */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV8);
+ /* WAVE_FORMAT_WMAUDIO3 */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV9);
+ /* WAVE_FORMAT_WMAUDIO_LOSSLESS */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudio_Lossless);
+ /* WAVE_FORMAT_WMASPDIF */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_WMASPDIF);
+ /* WAVE_FORMAT_WMAVOICE9 */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_MSP1);
+ /* WAVE_FORMAT_MPEGLAYER3 */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_MP3);
+ /* WAVE_FORMAT_MPEG */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_MPEG);
+ /* WAVE_FORMAT_MPEG_HEAAC */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_AAC);
+ /* WAVE_FORMAT_MPEG_ADTS_AAC */
+ GST_MF_IF_EQUAL_RETURN(guid, MFAudioFormat_ADTS);
+
+ return NULL;
+}
+
+static gchar *
+gst_mf_guid_to_string (const GUID& guid)
+{
+ const gchar *str = NULL;
+ HRESULT hr;
+ WCHAR *name = NULL;
+ gchar *ret = NULL;
+
+ str = gst_mf_guid_to_static_string (guid);
+ if (str)
+ return g_strdup (str);
+
+ hr = StringFromCLSID (guid, &name);
+ if (gst_mf_result (hr) && name) {
+ ret = g_utf16_to_utf8 ((const gunichar2 *) name, -1, NULL, NULL, NULL);
+ CoTaskMemFree (name);
+
+ if (ret)
+ return ret;
+ }
+
+ ret = g_strdup_printf
+ ("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
+ (guint) guid.Data1, (guint) guid.Data2, (guint) guid.Data3,
+ guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
+ guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
+
+ return ret;
+}
+
+static gchar *
+gst_mf_attribute_value_to_string (const GUID& guid, const PROPVARIANT& var)
+{
+ if (IsEqualGUID (guid, MF_MT_FRAME_RATE) ||
+ IsEqualGUID (guid, MF_MT_FRAME_RATE_RANGE_MAX) ||
+ IsEqualGUID (guid, MF_MT_FRAME_RATE_RANGE_MIN) ||
+ IsEqualGUID (guid, MF_MT_FRAME_SIZE) ||
+ IsEqualGUID (guid, MF_MT_PIXEL_ASPECT_RATIO)) {
+ UINT32 high = 0, low = 0;
+
+ Unpack2UINT32AsUINT64(var.uhVal.QuadPart, &high, &low);
+ return g_strdup_printf ("%dx%d", high, low);
+ }
+
+ if (IsEqualGUID (guid, MF_MT_GEOMETRIC_APERTURE) ||
+ IsEqualGUID (guid, MF_MT_MINIMUM_DISPLAY_APERTURE) ||
+ IsEqualGUID (guid, MF_MT_PAN_SCAN_APERTURE)) {
+ /* FIXME: Not our usecase for now */
+ return g_strup ("Not parsed");
+ }
+
+ switch (var.vt) {
+ case VT_UI4:
+ return g_strdup_printf ("%d", var.ulVal);
+ case VT_UI8:
+ return g_strdup_printf ("%" G_GUINT64_FORMAT, var.uhVal);
+ case VT_R8:
+ return g_strdup_printf ("%f", var.dblVal);
+ case VT_CLSID:
+ return gst_mf_guid_to_string (*var.puuid);
+ case VT_LPWSTR:
+ return g_utf16_to_utf8 ((const gunichar2 *) var.pwszVal,
+ -1, NULL, NULL, NULL);
+ case VT_UNKNOWN:
+ return g_strdup ("IUnknown");
+ default:
+ return g_strdup_printf ("Unhandled type (vt = %d)", var.vt);
+ }
+
+ return NULL;
+}
+
+static void
+gst_mf_dump_attribute_value_by_index (IMFAttributes * attr, const gchar * msg,
+ guint index, GstDebugLevel level, GstDebugCategory * cat, const gchar * file,
+ const gchar * function, gint line)
+{
+ gchar *guid_name = NULL;
+ gchar *value = NULL;
+ GUID guid = GUID_NULL;
+ HRESULT hr;
+
+ PROPVARIANT var;
+ PropVariantInit(&var);
+
+ hr = attr->GetItemByIndex(index, &guid, &var);
+ if (!gst_mf_result (hr))
+ goto done;
+
+ guid_name = gst_mf_guid_to_string (guid);
+ if (!guid_name)
+ goto done;
+
+ value = gst_mf_attribute_value_to_string (guid, var);
+ if (!value)
+ goto done;
+
+ gst_debug_log (cat, level, file, function, line,
+ NULL, "%s attribute %d, %s: %s", msg ? msg : "", index, guid_name,
+ value);
+
+done:
+ PropVariantClear(&var);
+ g_free (guid_name);
+ g_free (value);
+}
+
+void
+_gst_mf_dump_attributes (IMFAttributes * attr, const gchar * msg,
+ GstDebugLevel level, GstDebugCategory * cat, const gchar * file,
+ const gchar * function, gint line)
+{
+#ifndef GST_DISABLE_GST_DEBUG
+ HRESULT hr;
+ UINT32 count = 0, i;
+
+ if (!attr)
+ return;
+
+ hr = attr->GetCount (&count);
+ if (!gst_mf_result (hr) || count == 0)
+ return;
+
+ for (i = 0; i < count; i++) {
+ gst_mf_dump_attribute_value_by_index (attr,
+ msg, i, level, cat, file, function, line);
+ }
+#endif
+} \ No newline at end of file