qtmobility/plugins/multimedia/qt7/qt7playermetadata.mm
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
child 15 1f895d8a5b2b
equal deleted inserted replaced
11:06b8e2af4411 14:6fbed849b4f4
    52 #endif
    52 #endif
    53 
    53 
    54 QT_USE_NAMESPACE
    54 QT_USE_NAMESPACE
    55 
    55 
    56 QT7PlayerMetaDataControl::QT7PlayerMetaDataControl(QT7PlayerSession *session, QObject *parent)
    56 QT7PlayerMetaDataControl::QT7PlayerMetaDataControl(QT7PlayerSession *session, QObject *parent)
    57     :QMetaDataControl(parent), m_session(session)
    57     :QMetaDataReaderControl(parent), m_session(session)
    58 {
    58 {
    59 }
    59 }
    60 
    60 
    61 QT7PlayerMetaDataControl::~QT7PlayerMetaDataControl()
    61 QT7PlayerMetaDataControl::~QT7PlayerMetaDataControl()
    62 {
    62 {
    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 }