source: trunk/src/3rdparty/phonon/qt7/quicktimemetadata.mm@ 5

Last change on this file since 5 was 2, checked in by Dmitry A. Kuminov, 17 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 6.4 KB
Line 
1/* This file is part of the KDE project.
2
3 Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4
5 This library is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation, either version 2.1 or 3 of the License.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public License
15 along with this library. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#include "quicktimemetadata.h"
19#include "quicktimevideoplayer.h"
20
21QT_BEGIN_NAMESPACE
22
23namespace Phonon
24{
25namespace QT7
26{
27
28QuickTimeMetaData::QuickTimeMetaData()
29{
30 m_videoPlayer = 0;
31 m_movieChanged = false;
32}
33
34QuickTimeMetaData::~QuickTimeMetaData()
35{
36}
37
38void QuickTimeMetaData::setVideo(QuickTimeVideoPlayer *videoPlayer)
39{
40 m_videoPlayer = videoPlayer;
41 m_movieChanged = true;
42 m_metaData.clear();
43}
44
45#ifdef QUICKTIME_C_API_AVAILABLE
46
47QString QuickTimeMetaData::stripCopyRightSymbol(const QString &key)
48{
49 return key.right(key.length()-1);
50}
51
52QString QuickTimeMetaData::convertQuickTimeKeyToUserKey(const QString &key)
53{
54 if (key == QLatin1String("com.apple.quicktime.displayname"))
55 return QLatin1String("nam");
56 else if (key == QLatin1String("com.apple.quicktime.album"))
57 return QLatin1String("alb");
58 else if (key == QLatin1String("com.apple.quicktime.artist"))
59 return QLatin1String("ART");
60 else
61 return QLatin1String("???");
62}
63
64OSStatus QuickTimeMetaData::readMetaValue(QTMetaDataRef metaDataRef, QTMetaDataItem item, QTPropertyClass propClass,
65 QTPropertyID id, QTPropertyValuePtr *value, ByteCount *size)
66{
67 QTPropertyValueType type;
68 ByteCount propSize;
69 UInt32 propFlags;
70 OSStatus err = QTMetaDataGetItemPropertyInfo(metaDataRef, item, propClass, id, &type, &propSize, &propFlags);
71 BACKEND_ASSERT3(err == noErr, "Could not read meta data value size", NORMAL_ERROR, err)
72
73 *value = malloc(propSize);
74
75 err = QTMetaDataGetItemProperty(metaDataRef, item, propClass, id, propSize, *value, size);
76 BACKEND_ASSERT3(err == noErr, "Could not read meta data value", NORMAL_ERROR, err)
77
78 if (type == 'code' || type == 'itsk' || type == 'itlk') {
79 // convert from native endian to big endian
80 OSTypePtr pType = (OSTypePtr)*value;
81 *pType = EndianU32_NtoB(*pType);
82 }
83
84 return err;
85}
86
87UInt32 QuickTimeMetaData::getMetaType(QTMetaDataRef metaDataRef, QTMetaDataItem item)
88{
89 QTPropertyValuePtr value = 0;
90 ByteCount ignore = 0;
91 OSStatus err = readMetaValue(
92 metaDataRef, item, kPropertyClass_MetaDataItem, kQTMetaDataItemPropertyID_DataType, &value, &ignore);
93 BACKEND_ASSERT3(err == noErr, "Could not read meta data type", NORMAL_ERROR, 0)
94 UInt32 type = *((UInt32 *) value);
95 if (value)
96 free(value);
97 return type;
98}
99
100QString QuickTimeMetaData::getMetaValue(QTMetaDataRef metaDataRef, QTMetaDataItem item, SInt32 id)
101{
102 QTPropertyValuePtr value = 0;
103 ByteCount size = 0;
104 OSStatus err = readMetaValue(metaDataRef, item, kPropertyClass_MetaDataItem, id, &value, &size);
105 BACKEND_ASSERT3(err == noErr, "Could not read meta data item", NORMAL_ERROR, QString())
106 BACKEND_ASSERT3(value != 0, "Could not read meta data item", NORMAL_ERROR, QString())
107
108 QString string;
109 UInt32 dataType = getMetaType(metaDataRef, item);
110 switch (dataType){
111 case kQTMetaDataTypeUTF8:
112 case kQTMetaDataTypeMacEncodedText:
113 string = PhononCFString::toQString(CFStringCreateWithBytes(0, (UInt8*)value, size, kCFStringEncodingUTF8, false));
114 break;
115 case kQTMetaDataTypeUTF16BE:
116 string = PhononCFString::toQString(CFStringCreateWithBytes(0, (UInt8*)value, size, kCFStringEncodingUTF16BE, false));
117 break;
118 default:
119 break;
120 }
121
122 if (value)
123 free(value);
124 return string;
125}
126
127void QuickTimeMetaData::readFormattedData(QTMetaDataRef metaDataRef, OSType format, QMultiMap<QString, QString> &result)
128{
129 QTMetaDataItem item = kQTMetaDataItemUninitialized;
130 OSStatus err = QTMetaDataGetNextItem(metaDataRef, format, item, kQTMetaDataKeyFormatWildcard, 0, 0, &item);
131 while (err == noErr){
132 QString key = getMetaValue(metaDataRef, item, kQTMetaDataItemPropertyID_Key);
133 if (format == kQTMetaDataStorageFormatQuickTime)
134 key = convertQuickTimeKeyToUserKey(key);
135 else
136 key = stripCopyRightSymbol(key);
137
138 if (!result.contains(key)){
139 QString val = getMetaValue(metaDataRef, item, kQTMetaDataItemPropertyID_Value);
140 result.insert(key, val);
141 }
142 err = QTMetaDataGetNextItem(metaDataRef, format, item, kQTMetaDataKeyFormatWildcard, 0, 0, &item);
143 }
144}
145
146#endif // QUICKTIME_C_API_AVAILABLE
147
148void QuickTimeMetaData::readMetaData()
149{
150 if (!m_videoPlayer)
151 return;
152 QMultiMap<QString, QString> metaMap;
153
154#ifdef QUICKTIME_C_API_AVAILABLE
155 QTMetaDataRef metaDataRef;
156 OSStatus err = QTCopyMovieMetaData([m_videoPlayer->qtMovie() quickTimeMovie], &metaDataRef);
157 BACKEND_ASSERT2(err == noErr, "Could not read QuickTime meta data", NORMAL_ERROR)
158
159 readFormattedData(metaDataRef, kQTMetaDataStorageFormatUserData, metaMap);
160 readFormattedData(metaDataRef, kQTMetaDataStorageFormatQuickTime, metaMap);
161 readFormattedData(metaDataRef, kQTMetaDataStorageFormatiTunes, metaMap);
162#else
163 NSString *name = [m_videoPlayer->qtMovie() attributeForKey:@"QTMovieDisplayNameAttribute"];
164 metaMap.insert(QLatin1String("nam"), QString::fromUtf8([name UTF8String]));
165#endif // QUICKTIME_C_API_AVAILABLE
166
167 m_metaData.insert(QLatin1String("ARTIST"), metaMap.value(QLatin1String("ART")));
168 m_metaData.insert(QLatin1String("ALBUM"), metaMap.value(QLatin1String("alb")));
169 m_metaData.insert(QLatin1String("TITLE"), metaMap.value(QLatin1String("nam")));
170 m_metaData.insert(QLatin1String("DATE"), metaMap.value(QLatin1String("day")));
171 m_metaData.insert(QLatin1String("GENRE"), metaMap.value(QLatin1String("gnre")));
172 m_metaData.insert(QLatin1String("TRACKNUMBER"), metaMap.value(QLatin1String("trk")));
173 m_metaData.insert(QLatin1String("DESCRIPTION"), metaMap.value(QLatin1String("des")));
174}
175
176QMultiMap<QString, QString> QuickTimeMetaData::metaData()
177{
178 if (m_videoPlayer && m_videoPlayer->hasMovie() && m_movieChanged)
179 readMetaData();
180 return m_metaData;
181}
182
183}}
184
185QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.