70 bool QT7PlayerMetaDataControl::isWritable() const |
70 bool QT7PlayerMetaDataControl::isWritable() const |
71 { |
71 { |
72 return false; |
72 return false; |
73 } |
73 } |
74 |
74 |
75 QVariant QT7PlayerMetaDataControl::metaData(QtMediaServices::MetaData key) const |
75 QVariant QT7PlayerMetaDataControl::metaData(QtMultimedia::MetaData key) const |
76 { |
76 { |
77 return m_tags.value(key); |
77 return m_tags.value(key); |
78 } |
78 } |
79 |
79 |
80 void QT7PlayerMetaDataControl::setMetaData(QtMediaServices::MetaData key, QVariant const &value) |
80 QList<QtMultimedia::MetaData> QT7PlayerMetaDataControl::availableMetaData() const |
81 { |
|
82 Q_UNUSED(key); |
|
83 Q_UNUSED(value); |
|
84 } |
|
85 |
|
86 QList<QtMediaServices::MetaData> QT7PlayerMetaDataControl::availableMetaData() const |
|
87 { |
81 { |
88 return m_tags.keys(); |
82 return m_tags.keys(); |
89 } |
83 } |
90 |
84 |
91 QVariant QT7PlayerMetaDataControl::extendedMetaData(const QString &key) const |
85 QVariant QT7PlayerMetaDataControl::extendedMetaData(const QString &key) const |
92 { |
86 { |
93 Q_UNUSED(key); |
87 Q_UNUSED(key); |
94 return QVariant(); |
88 return QVariant(); |
95 } |
|
96 |
|
97 void QT7PlayerMetaDataControl::setExtendedMetaData(const QString &key, QVariant const &value) |
|
98 { |
|
99 Q_UNUSED(key); |
|
100 Q_UNUSED(value); |
|
101 } |
89 } |
102 |
90 |
103 QStringList QT7PlayerMetaDataControl::availableExtendedMetaData() const |
91 QStringList QT7PlayerMetaDataControl::availableExtendedMetaData() const |
104 { |
92 { |
105 return QStringList(); |
93 return QStringList(); |
130 QTPropertyValueType type; |
118 QTPropertyValueType type; |
131 ByteCount propSize; |
119 ByteCount propSize; |
132 UInt32 propFlags; |
120 UInt32 propFlags; |
133 OSStatus err = QTMetaDataGetItemPropertyInfo(metaDataRef, item, propClass, id, &type, &propSize, &propFlags); |
121 OSStatus err = QTMetaDataGetItemPropertyInfo(metaDataRef, item, propClass, id, &type, &propSize, &propFlags); |
134 |
122 |
135 |
123 if (err == noErr) { |
136 *value = malloc(propSize); |
124 *value = malloc(propSize); |
137 |
125 if (*value != 0) { |
138 err = QTMetaDataGetItemProperty(metaDataRef, item, propClass, id, propSize, *value, size); |
126 err = QTMetaDataGetItemProperty(metaDataRef, item, propClass, id, propSize, *value, size); |
139 |
127 |
140 if (type == 'code' || type == 'itsk' || type == 'itlk') { |
128 if (err == noErr && (type == 'code' || type == 'itsk' || type == 'itlk')) { |
141 // convert from native endian to big endian |
129 // convert from native endian to big endian |
142 OSTypePtr pType = (OSTypePtr)*value; |
130 OSTypePtr pType = (OSTypePtr)*value; |
143 *pType = EndianU32_NtoB(*pType); |
131 *pType = EndianU32_NtoB(*pType); |
|
132 } |
|
133 } |
|
134 else |
|
135 return -1; |
144 } |
136 } |
145 |
137 |
146 return err; |
138 return err; |
147 } |
139 } |
148 |
140 |
151 QTPropertyValuePtr value = 0; |
143 QTPropertyValuePtr value = 0; |
152 ByteCount ignore = 0; |
144 ByteCount ignore = 0; |
153 OSStatus err = readMetaValue( |
145 OSStatus err = readMetaValue( |
154 metaDataRef, item, kPropertyClass_MetaDataItem, kQTMetaDataItemPropertyID_DataType, &value, &ignore); |
146 metaDataRef, item, kPropertyClass_MetaDataItem, kQTMetaDataItemPropertyID_DataType, &value, &ignore); |
155 |
147 |
156 UInt32 type = *((UInt32 *) value); |
148 if (err == noErr) { |
157 if (value) |
149 UInt32 type = *((UInt32 *) value); |
158 free(value); |
150 if (value) |
159 return type; |
151 free(value); |
|
152 return type; |
|
153 } |
|
154 |
|
155 return 0; |
160 } |
156 } |
161 |
157 |
162 static QString cFStringToQString(CFStringRef str) |
158 static QString cFStringToQString(CFStringRef str) |
163 { |
159 { |
164 if(!str) |
160 if(!str) |
177 static QString getMetaValue(QTMetaDataRef metaDataRef, QTMetaDataItem item, SInt32 id) |
173 static QString getMetaValue(QTMetaDataRef metaDataRef, QTMetaDataItem item, SInt32 id) |
178 { |
174 { |
179 QTPropertyValuePtr value = 0; |
175 QTPropertyValuePtr value = 0; |
180 ByteCount size = 0; |
176 ByteCount size = 0; |
181 OSStatus err = readMetaValue(metaDataRef, item, kPropertyClass_MetaDataItem, id, &value, &size); |
177 OSStatus err = readMetaValue(metaDataRef, item, kPropertyClass_MetaDataItem, id, &value, &size); |
182 |
|
183 QString string; |
178 QString string; |
184 UInt32 dataType = getMetaType(metaDataRef, item); |
179 |
185 switch (dataType){ |
180 if (err == noErr) { |
186 case kQTMetaDataTypeUTF8: |
181 UInt32 dataType = getMetaType(metaDataRef, item); |
187 case kQTMetaDataTypeMacEncodedText: |
182 switch (dataType){ |
188 string = cFStringToQString(CFStringCreateWithBytes(0, (UInt8*)value, size, kCFStringEncodingUTF8, false)); |
183 case kQTMetaDataTypeUTF8: |
189 break; |
184 case kQTMetaDataTypeMacEncodedText: |
190 case kQTMetaDataTypeUTF16BE: |
185 string = cFStringToQString(CFStringCreateWithBytes(0, (UInt8*)value, size, kCFStringEncodingUTF8, false)); |
191 string = cFStringToQString(CFStringCreateWithBytes(0, (UInt8*)value, size, kCFStringEncodingUTF16BE, false)); |
186 break; |
192 break; |
187 case kQTMetaDataTypeUTF16BE: |
193 default: |
188 string = cFStringToQString(CFStringCreateWithBytes(0, (UInt8*)value, size, kCFStringEncodingUTF16BE, false)); |
194 break; |
189 break; |
195 } |
190 default: |
196 |
191 break; |
197 if (value) |
192 } |
198 free(value); |
193 |
|
194 if (value) |
|
195 free(value); |
|
196 } |
|
197 |
199 return string; |
198 return string; |
200 } |
199 } |
201 |
200 |
202 |
201 |
203 static void readFormattedData(QTMetaDataRef metaDataRef, OSType format, QMultiMap<QString, QString> &result) |
202 static void readFormattedData(QTMetaDataRef metaDataRef, OSType format, QMultiMap<QString, QString> &result) |
232 QMultiMap<QString, QString> metaMap; |
231 QMultiMap<QString, QString> metaMap; |
233 |
232 |
234 #ifdef QUICKTIME_C_API_AVAILABLE |
233 #ifdef QUICKTIME_C_API_AVAILABLE |
235 QTMetaDataRef metaDataRef; |
234 QTMetaDataRef metaDataRef; |
236 OSStatus err = QTCopyMovieMetaData([movie quickTimeMovie], &metaDataRef); |
235 OSStatus err = QTCopyMovieMetaData([movie quickTimeMovie], &metaDataRef); |
237 |
236 if (err == noErr) { |
238 readFormattedData(metaDataRef, kQTMetaDataStorageFormatUserData, metaMap); |
237 readFormattedData(metaDataRef, kQTMetaDataStorageFormatUserData, metaMap); |
239 readFormattedData(metaDataRef, kQTMetaDataStorageFormatQuickTime, metaMap); |
238 readFormattedData(metaDataRef, kQTMetaDataStorageFormatQuickTime, metaMap); |
240 readFormattedData(metaDataRef, kQTMetaDataStorageFormatiTunes, metaMap); |
239 readFormattedData(metaDataRef, kQTMetaDataStorageFormatiTunes, metaMap); |
|
240 } |
241 #else |
241 #else |
|
242 AutoReleasePool pool; |
242 NSString *name = [movie attributeForKey:@"QTMovieDisplayNameAttribute"]; |
243 NSString *name = [movie attributeForKey:@"QTMovieDisplayNameAttribute"]; |
243 metaMap.insert(QLatin1String("nam"), QString::fromUtf8([name UTF8String])); |
244 metaMap.insert(QLatin1String("nam"), QString::fromUtf8([name UTF8String])); |
244 #endif // QUICKTIME_C_API_AVAILABLE |
245 #endif // QUICKTIME_C_API_AVAILABLE |
245 |
246 |
246 m_tags.insert(QtMediaServices::AlbumArtist, metaMap.value(QLatin1String("ART"))); |
247 m_tags.insert(QtMultimedia::AlbumArtist, metaMap.value(QLatin1String("ART"))); |
247 m_tags.insert(QtMediaServices::AlbumTitle, metaMap.value(QLatin1String("alb"))); |
248 m_tags.insert(QtMultimedia::AlbumTitle, metaMap.value(QLatin1String("alb"))); |
248 m_tags.insert(QtMediaServices::Title, metaMap.value(QLatin1String("nam"))); |
249 m_tags.insert(QtMultimedia::Title, metaMap.value(QLatin1String("nam"))); |
249 m_tags.insert(QtMediaServices::Date, metaMap.value(QLatin1String("day"))); |
250 m_tags.insert(QtMultimedia::Date, metaMap.value(QLatin1String("day"))); |
250 m_tags.insert(QtMediaServices::Genre, metaMap.value(QLatin1String("gnre"))); |
251 m_tags.insert(QtMultimedia::Genre, metaMap.value(QLatin1String("gnre"))); |
251 m_tags.insert(QtMediaServices::TrackNumber, metaMap.value(QLatin1String("trk"))); |
252 m_tags.insert(QtMultimedia::TrackNumber, metaMap.value(QLatin1String("trk"))); |
252 m_tags.insert(QtMediaServices::Description, metaMap.value(QLatin1String("des"))); |
253 m_tags.insert(QtMultimedia::Description, metaMap.value(QLatin1String("des"))); |
253 } |
254 } |
254 |
255 |
255 if (!wasEmpty || !m_tags.isEmpty()) |
256 if (!wasEmpty || !m_tags.isEmpty()) |
256 emit metaDataChanged(); |
257 emit metaDataChanged(); |
257 } |
258 } |