diff options
Diffstat (limited to 'src/plugins/directshow/player/directshowmetadatacontrol.cpp')
-rw-r--r-- | src/plugins/directshow/player/directshowmetadatacontrol.cpp | 400 |
1 files changed, 324 insertions, 76 deletions
diff --git a/src/plugins/directshow/player/directshowmetadatacontrol.cpp b/src/plugins/directshow/player/directshowmetadatacontrol.cpp index 341d2cf1d..3c81ae180 100644 --- a/src/plugins/directshow/player/directshowmetadatacontrol.cpp +++ b/src/plugins/directshow/player/directshowmetadatacontrol.cpp @@ -39,6 +39,12 @@ ** ****************************************************************************/ +#include <QtMultimedia/qmediametadata.h> +#include <QtCore/qcoreapplication.h> +#include <QSize> +#include <qdatetime.h> +#include <qimage.h> + #include <dshow.h> #include <initguid.h> #include <qnetwork.h> @@ -46,8 +52,56 @@ #include "directshowmetadatacontrol.h" #include "directshowplayerservice.h" -#include <QtMultimedia/qmediametadata.h> -#include <QtCore/qcoreapplication.h> +#ifndef QT_NO_WMSDK +#include <wmsdk.h> +#endif + +#ifndef QT_NO_SHELLITEM +#include <ShlObj.h> +#include <propkeydef.h> +#include <private/qsystemlibrary_p.h> + +DEFINE_PROPERTYKEY(PKEY_Author, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 4); +DEFINE_PROPERTYKEY(PKEY_Title, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 2); +DEFINE_PROPERTYKEY(PKEY_Media_SubTitle, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 38); +DEFINE_PROPERTYKEY(PKEY_ParentalRating, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 21); +DEFINE_PROPERTYKEY(PKEY_Comment, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 6); +DEFINE_PROPERTYKEY(PKEY_Copyright, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 11); +DEFINE_PROPERTYKEY(PKEY_Media_ProviderStyle, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 40); +DEFINE_PROPERTYKEY(PKEY_Media_Year, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 5); +DEFINE_PROPERTYKEY(PKEY_Media_DateEncoded, 0x2E4B640D, 0x5019, 0x46D8, 0x88, 0x81, 0x55, 0x41, 0x4C, 0xC5, 0xCA, 0xA0, 100); +DEFINE_PROPERTYKEY(PKEY_Rating, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 9); +DEFINE_PROPERTYKEY(PKEY_Keywords, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 5); +DEFINE_PROPERTYKEY(PKEY_Language, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 28); +DEFINE_PROPERTYKEY(PKEY_Media_Publisher, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 30); +DEFINE_PROPERTYKEY(PKEY_Media_Duration, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 3); +DEFINE_PROPERTYKEY(PKEY_Audio_EncodingBitrate, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 4); +DEFINE_PROPERTYKEY(PKEY_Media_AverageLevel, 0x09EDD5B6, 0xB301, 0x43C5, 0x99, 0x90, 0xD0, 0x03, 0x02, 0xEF, 0xFD, 0x46, 100); +DEFINE_PROPERTYKEY(PKEY_Audio_ChannelCount, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 7); +DEFINE_PROPERTYKEY(PKEY_Audio_PeakValue, 0x2579E5D0, 0x1116, 0x4084, 0xBD, 0x9A, 0x9B, 0x4F, 0x7C, 0xB4, 0xDF, 0x5E, 100); +DEFINE_PROPERTYKEY(PKEY_Audio_SampleRate, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 5); +DEFINE_PROPERTYKEY(PKEY_Music_AlbumTitle, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 4); +DEFINE_PROPERTYKEY(PKEY_Music_AlbumArtist, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 13); +DEFINE_PROPERTYKEY(PKEY_Music_Artist, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 2); +DEFINE_PROPERTYKEY(PKEY_Music_Composer, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 19); +DEFINE_PROPERTYKEY(PKEY_Music_Conductor, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 36); +DEFINE_PROPERTYKEY(PKEY_Music_Lyrics, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 12); +DEFINE_PROPERTYKEY(PKEY_Music_Mood, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 39); +DEFINE_PROPERTYKEY(PKEY_Music_TrackNumber, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 7); +DEFINE_PROPERTYKEY(PKEY_Music_Genre, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 11); +DEFINE_PROPERTYKEY(PKEY_ThumbnailStream, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 27); +DEFINE_PROPERTYKEY(PKEY_Video_FrameHeight, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 4); +DEFINE_PROPERTYKEY(PKEY_Video_FrameWidth, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 3); +DEFINE_PROPERTYKEY(PKEY_Video_HorizontalAspectRatio, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 42); +DEFINE_PROPERTYKEY(PKEY_Video_VerticalAspectRatio, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 45); +DEFINE_PROPERTYKEY(PKEY_Video_FrameRate, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 6); +DEFINE_PROPERTYKEY(PKEY_Video_EncodingBitrate, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 8); +DEFINE_PROPERTYKEY(PKEY_Video_Director, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 20); +DEFINE_PROPERTYKEY(PKEY_Media_Writer, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 23); + +typedef HRESULT (WINAPI *q_SHCreateItemFromParsingName)(PCWSTR, IBindCtx *, const GUID&, void **); +static q_SHCreateItemFromParsingName sHCreateItemFromParsingName = 0; +#endif #ifndef QT_NO_WMSDK namespace @@ -70,12 +124,12 @@ static const QWMMetaDataKeyLookup qt_wmMetaDataKeys[] = { QMediaMetaData::Genre, L"WM/Genre" }, //{ QMediaMetaData::Date, 0 }, { QMediaMetaData::Year, L"WM/Year" }, - { QMediaMetaData::UserRating, L"UserRating" }, + { QMediaMetaData::UserRating, L"Rating" }, //{ QMediaMetaData::MetaDatawords, 0 }, - { QMediaMetaData::Language, L"Language" }, + { QMediaMetaData::Language, L"WM/Language" }, { QMediaMetaData::Publisher, L"WM/Publisher" }, { QMediaMetaData::Copyright, L"Copyright" }, - { QMediaMetaData::ParentalRating, L"ParentalRating" }, + { QMediaMetaData::ParentalRating, L"WM/ParentalRating" }, //{ QMediaMetaData::RatingOrganisation, L"RatingOrganisation" }, // Media @@ -103,11 +157,11 @@ static const QWMMetaDataKeyLookup qt_wmMetaDataKeys[] = //{ QMediaMetaData::CoverArtUriLarge, 0 }, // Image/Video - //{ QMediaMetaData::Resolution, 0 }, - //{ QMediaMetaData::PixelAspectRatio, 0 }, + { QMediaMetaData::Resolution, L"WM/VideoHeight" }, + { QMediaMetaData::PixelAspectRatio, L"AspectRatioX" }, // Video - //{ QMediaMetaData::FrameRate, 0 }, + { QMediaMetaData::VideoFrameRate, L"WM/VideoFrameRate" }, { QMediaMetaData::VideoBitRate, L"VideoBitRate" }, { QMediaMetaData::VideoCodec, L"VideoCodec" }, @@ -118,12 +172,6 @@ static const QWMMetaDataKeyLookup qt_wmMetaDataKeys[] = { QMediaMetaData::Director, L"WM/Director" }, { QMediaMetaData::LeadPerformer, L"LeadPerformer" }, { QMediaMetaData::Writer, L"WM/Writer" }, - - // Photos - { QMediaMetaData::CameraManufacturer, L"CameraManufacturer" }, - { QMediaMetaData::CameraModel, L"CameraModel" }, - { QMediaMetaData::Event, L"Event" }, - { QMediaMetaData::Subject, L"Subject" } }; static QVariant getValue(IWMHeaderInfo *header, const wchar_t *key) @@ -150,7 +198,7 @@ static QVariant getValue(IWMHeaderInfo *header, const wchar_t *key) case WMT_TYPE_STRING: { QString string; - string.resize(size / 2 - 1); + string.resize(size / 2); // size is in bytes, string is in UTF16 if (header->GetAttributeByName( &streamNumber, @@ -227,12 +275,58 @@ static QVariant getValue(IWMHeaderInfo *header, const wchar_t *key) } #endif +#ifndef QT_NO_SHELLITEM +static QVariant convertValue(const PROPVARIANT& var) +{ + QVariant value; + switch (var.vt) { + case VT_LPWSTR: + value = QString::fromUtf16(reinterpret_cast<const ushort*>(var.pwszVal)); + break; + case VT_UI4: + value = uint(var.ulVal); + break; + case VT_UI8: + value = qulonglong(var.uhVal.QuadPart); + break; + case VT_BOOL: + value = bool(var.boolVal); + break; + case VT_FILETIME: + SYSTEMTIME sysDate; + if (!FileTimeToSystemTime(&var.filetime, &sysDate)) + break; + value = QDate(sysDate.wYear, sysDate.wMonth, sysDate.wDay); + break; + case VT_STREAM: + { + STATSTG stat; + if (FAILED(var.pStream->Stat(&stat, STATFLAG_NONAME))) + break; + void *data = malloc(stat.cbSize.QuadPart); + ULONG read = 0; + if (FAILED(var.pStream->Read(data, stat.cbSize.QuadPart, &read))) { + free(data); + break; + } + value = QImage::fromData(reinterpret_cast<const uchar*>(data), read); + free(data); + } + break; + case VT_VECTOR | VT_LPWSTR: + QStringList vList; + for (ULONG i = 0; i < var.calpwstr.cElems; ++i) + vList.append(QString::fromUtf16(reinterpret_cast<const ushort*>(var.calpwstr.pElems[i]))); + value = vList; + break; + } + return value; +} +#endif + DirectShowMetaDataControl::DirectShowMetaDataControl(QObject *parent) : QMetaDataReaderControl(parent) - , m_content(0) -#ifndef QT_NO_WMSDK - , m_headerInfo(0) -#endif + , m_available(false) { } @@ -242,75 +336,229 @@ DirectShowMetaDataControl::~DirectShowMetaDataControl() bool DirectShowMetaDataControl::isMetaDataAvailable() const { -#ifndef QT_NO_WMSDK - return m_content || m_headerInfo; -#else - return m_content; -#endif + return m_available; } QVariant DirectShowMetaDataControl::metaData(const QString &key) const { - QVariant value; + return m_metadata.value(key); +} + +QStringList DirectShowMetaDataControl::availableMetaData() const +{ + return m_metadata.keys(); +} + +static QString convertBSTR(BSTR *string) +{ + QString value = QString::fromUtf16(reinterpret_cast<ushort *>(*string), + ::SysStringLen(*string)); + + ::SysFreeString(*string); + string = 0; + + return value; +} + +void DirectShowMetaDataControl::updateGraph(IFilterGraph2 *graph, IBaseFilter *source, const QString &fileSrc) +{ + m_metadata.clear(); + +#ifndef QT_NO_SHELLITEM + if (!sHCreateItemFromParsingName) { + QSystemLibrary lib(QStringLiteral("shell32")); + sHCreateItemFromParsingName = (q_SHCreateItemFromParsingName)(lib.resolve("SHCreateItemFromParsingName")); + } + + if (!fileSrc.isEmpty() && sHCreateItemFromParsingName) { + IShellItem2* shellItem = 0; + if (sHCreateItemFromParsingName(reinterpret_cast<const WCHAR*>(fileSrc.utf16()), + 0, IID_PPV_ARGS(&shellItem)) == S_OK) { + + IPropertyStore *pStore = 0; + if (shellItem->GetPropertyStore(GPS_DEFAULT, IID_PPV_ARGS(&pStore)) == S_OK) { + DWORD cProps; + if (SUCCEEDED(pStore->GetCount(&cProps))) { + for (DWORD i = 0; i < cProps; ++i) + { + PROPERTYKEY key; + PROPVARIANT var; + PropVariantInit(&var); + if (FAILED(pStore->GetAt(i, &key))) + continue; + if (FAILED(pStore->GetValue(key, &var))) + continue; + + if (key == PKEY_Author) { + m_metadata.insert(QMediaMetaData::Author, convertValue(var)); + } else if (key == PKEY_Title) { + m_metadata.insert(QMediaMetaData::Title, convertValue(var)); + } else if (key == PKEY_Media_SubTitle) { + m_metadata.insert(QMediaMetaData::SubTitle, convertValue(var)); + } else if (key == PKEY_ParentalRating) { + m_metadata.insert(QMediaMetaData::ParentalRating, convertValue(var)); + } else if (key == PKEY_Comment) { + m_metadata.insert(QMediaMetaData::Description, convertValue(var)); + } else if (key == PKEY_Copyright) { + m_metadata.insert(QMediaMetaData::Copyright, convertValue(var)); + } else if (key == PKEY_Media_ProviderStyle) { + m_metadata.insert(QMediaMetaData::Genre, convertValue(var)); + } else if (key == PKEY_Media_Year) { + m_metadata.insert(QMediaMetaData::Year, convertValue(var)); + } else if (key == PKEY_Media_DateEncoded) { + m_metadata.insert(QMediaMetaData::Date, convertValue(var)); + } else if (key == PKEY_Rating) { + m_metadata.insert(QMediaMetaData::UserRating, + int((convertValue(var).toUInt() - 1) / qreal(98) * 100)); + } else if (key == PKEY_Keywords) { + m_metadata.insert(QMediaMetaData::Keywords, convertValue(var)); + } else if (key == PKEY_Language) { + m_metadata.insert(QMediaMetaData::Language, convertValue(var)); + } else if (key == PKEY_Media_Publisher) { + m_metadata.insert(QMediaMetaData::Publisher, convertValue(var)); + } else if (key == PKEY_Media_Duration) { + m_metadata.insert(QMediaMetaData::Duration, + (convertValue(var).toLongLong() + 10000) / 10000); + } else if (key == PKEY_Audio_EncodingBitrate) { + m_metadata.insert(QMediaMetaData::AudioBitRate, convertValue(var)); + } else if (key == PKEY_Media_AverageLevel) { + m_metadata.insert(QMediaMetaData::AverageLevel, convertValue(var)); + } else if (key == PKEY_Audio_ChannelCount) { + m_metadata.insert(QMediaMetaData::ChannelCount, convertValue(var)); + } else if (key == PKEY_Audio_PeakValue) { + m_metadata.insert(QMediaMetaData::PeakValue, convertValue(var)); + } else if (key == PKEY_Audio_SampleRate) { + m_metadata.insert(QMediaMetaData::SampleRate, convertValue(var)); + } else if (key == PKEY_Music_AlbumTitle) { + m_metadata.insert(QMediaMetaData::AlbumTitle, convertValue(var)); + } else if (key == PKEY_Music_AlbumArtist) { + m_metadata.insert(QMediaMetaData::AlbumArtist, convertValue(var)); + } else if (key == PKEY_Music_Artist) { + m_metadata.insert(QMediaMetaData::ContributingArtist, convertValue(var)); + } else if (key == PKEY_Music_Composer) { + m_metadata.insert(QMediaMetaData::Composer, convertValue(var)); + } else if (key == PKEY_Music_Conductor) { + m_metadata.insert(QMediaMetaData::Conductor, convertValue(var)); + } else if (key == PKEY_Music_Lyrics) { + m_metadata.insert(QMediaMetaData::Lyrics, convertValue(var)); + } else if (key == PKEY_Music_Mood) { + m_metadata.insert(QMediaMetaData::Mood, convertValue(var)); + } else if (key == PKEY_Music_TrackNumber) { + m_metadata.insert(QMediaMetaData::TrackNumber, convertValue(var)); + } else if (key == PKEY_Music_Genre) { + m_metadata.insert(QMediaMetaData::Genre, convertValue(var)); + } else if (key == PKEY_ThumbnailStream) { + m_metadata.insert(QMediaMetaData::ThumbnailImage, convertValue(var)); + } else if (key == PKEY_Video_FrameHeight) { + QSize res; + res.setHeight(convertValue(var).toUInt()); + if (SUCCEEDED(pStore->GetValue(PKEY_Video_FrameWidth, &var))) + res.setWidth(convertValue(var).toUInt()); + m_metadata.insert(QMediaMetaData::Resolution, res); + } else if (key == PKEY_Video_HorizontalAspectRatio) { + QSize aspectRatio; + aspectRatio.setWidth(convertValue(var).toUInt()); + if (SUCCEEDED(pStore->GetValue(PKEY_Video_VerticalAspectRatio, &var))) + aspectRatio.setHeight(convertValue(var).toUInt()); + m_metadata.insert(QMediaMetaData::PixelAspectRatio, aspectRatio); + } else if (key == PKEY_Video_FrameRate) { + m_metadata.insert(QMediaMetaData::VideoFrameRate, + convertValue(var).toReal() / 1000); + } else if (key == PKEY_Video_EncodingBitrate) { + m_metadata.insert(QMediaMetaData::VideoBitRate, convertValue(var)); + } else if (key == PKEY_Video_Director) { + m_metadata.insert(QMediaMetaData::Director, convertValue(var)); + } else if (key == PKEY_Media_Writer) { + m_metadata.insert(QMediaMetaData::Writer, convertValue(var)); + } + + PropVariantClear(&var); + } + } + + pStore->Release(); + } + + shellItem->Release(); + } + } + + if (!m_metadata.isEmpty()) + goto send_event; +#endif #ifndef QT_NO_WMSDK - if (m_headerInfo) { + IWMHeaderInfo *info = com_cast<IWMHeaderInfo>(source, IID_IWMHeaderInfo); + + if (info) { static const int count = sizeof(qt_wmMetaDataKeys) / sizeof(QWMMetaDataKeyLookup); for (int i = 0; i < count; ++i) { - if (qt_wmMetaDataKeys[i].key == key) { - value = getValue(m_headerInfo, qt_wmMetaDataKeys[i].token); - break; + QVariant var = getValue(info, qt_wmMetaDataKeys[i].token); + if (var.isValid()) { + QString key = qt_wmMetaDataKeys[i].key; + + if (key == QMediaMetaData::Duration) { + // duration is provided in 100-nanosecond units, convert to milliseconds + var = (var.toLongLong() + 10000) / 10000; + } else if (key == QMediaMetaData::Resolution) { + QSize res; + res.setHeight(var.toUInt()); + res.setWidth(getValue(info, L"WM/VideoWidth").toUInt()); + var = res; + } else if (key == QMediaMetaData::VideoFrameRate) { + var = var.toReal() / 1000.f; + } else if (key == QMediaMetaData::PixelAspectRatio) { + QSize aspectRatio; + aspectRatio.setWidth(var.toUInt()); + aspectRatio.setHeight(getValue(info, L"AspectRatioY").toUInt()); + var = aspectRatio; + } else if (key == QMediaMetaData::UserRating) { + var = (var.toUInt() - 1) / qreal(98) * 100; + } + + m_metadata.insert(key, var); } } - } else if (m_content) { -#else - if (m_content) { + + info->Release(); + } + + if (!m_metadata.isEmpty()) + goto send_event; #endif - BSTR string = 0; - - if (key == QMediaMetaData::Author) - m_content->get_AuthorName(&string); - else if (key == QMediaMetaData::Title) - m_content->get_Title(&string); - else if (key == QMediaMetaData::ParentalRating) - m_content->get_Rating(&string); - else if (key == QMediaMetaData::Description) - m_content->get_Description(&string); - else if (key == QMediaMetaData::Copyright) - m_content->get_Copyright(&string); - - if (string) { - value = QString::fromUtf16(reinterpret_cast<ushort *>(string), ::SysStringLen(string)); - - ::SysFreeString(string); + { + IAMMediaContent *content = 0; + + if ((!graph || graph->QueryInterface( + IID_IAMMediaContent, reinterpret_cast<void **>(&content)) != S_OK) + && (!source || source->QueryInterface( + IID_IAMMediaContent, reinterpret_cast<void **>(&content)) != S_OK)) { + content = 0; } - } - return value; -} -QStringList DirectShowMetaDataControl::availableMetaData() const -{ - return QStringList(); -} + if (content) { + BSTR string = 0; -void DirectShowMetaDataControl::updateGraph(IFilterGraph2 *graph, IBaseFilter *source) -{ - if (m_content) - m_content->Release(); + if (content->get_AuthorName(&string) == S_OK) + m_metadata.insert(QMediaMetaData::Author, convertBSTR(&string)); - if (!graph || graph->QueryInterface( - IID_IAMMediaContent, reinterpret_cast<void **>(&m_content)) != S_OK) { - m_content = 0; - } + if (content->get_Title(&string) == S_OK) + m_metadata.insert(QMediaMetaData::Title, convertBSTR(&string)); -#ifdef QT_NO_WMSDK - Q_UNUSED(source); -#else - if (m_headerInfo) - m_headerInfo->Release(); + if (content->get_Description(&string) == S_OK) + m_metadata.insert(QMediaMetaData::Description, convertBSTR(&string)); - m_headerInfo = com_cast<IWMHeaderInfo>(source, IID_IWMHeaderInfo); -#endif + if (content->get_Rating(&string) == S_OK) + m_metadata.insert(QMediaMetaData::UserRating, convertBSTR(&string)); + + if (content->get_Copyright(&string) == S_OK) + m_metadata.insert(QMediaMetaData::Copyright, convertBSTR(&string)); + + content->Release(); + } + } + +send_event: // DirectShowMediaPlayerService holds a lock at this point so defer emitting signals to a later // time. QCoreApplication::postEvent(this, new QEvent(QEvent::Type(MetaDataChanged))); @@ -321,12 +569,12 @@ void DirectShowMetaDataControl::customEvent(QEvent *event) if (event->type() == QEvent::Type(MetaDataChanged)) { event->accept(); + bool oldAvailable = m_available; + m_available = !m_metadata.isEmpty(); + if (m_available != oldAvailable) + emit metaDataAvailableChanged(m_available); + emit metaDataChanged(); -#ifndef QT_NO_WMSDK - emit metaDataAvailableChanged(m_content || m_headerInfo); -#else - emit metaDataAvailableChanged(m_content); -#endif } else { QMetaDataReaderControl::customEvent(event); } |