File indexing completed on 2025-03-09 03:52:56
0001 /* ============================================================ 0002 * 0003 * This file is a part of digiKam project 0004 * https://www.digikam.org 0005 * 0006 * Date : 2007-09-19 0007 * Description : Scanning a single item - video metadata helper. 0008 * 0009 * SPDX-FileCopyrightText: 2007-2013 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de> 0010 * SPDX-FileCopyrightText: 2013-2024 by Gilles Caulier <caulier dot gilles at gmail dot com> 0011 * 0012 * SPDX-License-Identifier: GPL-2.0-or-later 0013 * 0014 * ============================================================ */ 0015 0016 #include "itemscanner_p.h" 0017 0018 namespace Digikam 0019 { 0020 0021 void ItemScanner::fillVideoMetadataContainer(qlonglong imageid, VideoMetadataContainer* const container) 0022 { 0023 // read from database 0024 0025 QVariantList fields = CoreDbAccess().db()->getVideoMetadata(imageid); 0026 0027 // check we have at least one valid field 0028 0029 container->allFieldsNull = !hasValidField(fields); 0030 0031 if (container->allFieldsNull) 0032 { 0033 return; 0034 } 0035 0036 // Metadata container does all translation work 0037 0038 QStringList strings = DMetadata::valuesToString(fields, allVideoMetadataFields()); 0039 0040 // Associate with hard-coded variables 0041 0042 container->aspectRatio = strings.at(0); 0043 container->audioBitRate = strings.at(1); 0044 container->audioChannelType = strings.at(2); 0045 container->audioCodec = strings.at(3); 0046 container->duration = strings.at(4); 0047 container->frameRate = strings.at(5); 0048 container->videoCodec = strings.at(6); 0049 } 0050 0051 QString ItemScanner::detectVideoFormat() const 0052 { 0053 QString suffix = d->fileInfo.suffix().toUpper(); 0054 0055 if ( 0056 (suffix == QLatin1String("MPEG")) || 0057 (suffix == QLatin1String("MPG")) || 0058 (suffix == QLatin1String("MPE")) 0059 ) 0060 { 0061 return QLatin1String("MPEG"); 0062 } 0063 0064 if ( 0065 (suffix == QLatin1String("ASF")) || 0066 (suffix == QLatin1String("WMV")) 0067 ) 0068 { 0069 return QLatin1String("WMV"); 0070 } 0071 0072 if ( 0073 (suffix == QLatin1String("AVI")) || 0074 (suffix == QLatin1String("DIVX")) 0075 ) 0076 { 0077 return QLatin1String("AVI"); 0078 } 0079 0080 if ( 0081 (suffix == QLatin1String("MKV")) || 0082 (suffix == QLatin1String("MKS")) 0083 ) 0084 { 0085 return QLatin1String("MKV"); 0086 } 0087 0088 if ( 0089 (suffix == QLatin1String("M4V")) || 0090 (suffix == QLatin1String("MOV")) || 0091 (suffix == QLatin1String("M2V")) 0092 ) 0093 { 0094 return QLatin1String("MOV"); 0095 } 0096 0097 if ( 0098 (suffix == QLatin1String("3GP")) || 0099 (suffix == QLatin1String("3G2")) 0100 ) 0101 { 0102 return QLatin1String("3GP"); 0103 } 0104 0105 return suffix; 0106 } 0107 0108 QString ItemScanner::detectAudioFormat() const 0109 { 0110 return d->fileInfo.suffix().toUpper(); 0111 } 0112 0113 MetadataFields ItemScanner::allVideoMetadataFields() 0114 { 0115 // This list must reflect the order required by CoreDB::addVideoMetadata 0116 0117 MetadataFields fields; 0118 fields << MetadataInfo::AspectRatio 0119 << MetadataInfo::AudioBitRate 0120 << MetadataInfo::AudioChannelType 0121 << MetadataInfo::AudioCodec 0122 << MetadataInfo::Duration 0123 << MetadataInfo::FrameRate 0124 << MetadataInfo::VideoCodec; 0125 0126 return fields; 0127 } 0128 0129 void ItemScanner::scanVideoInformation() 0130 { 0131 d->commit.commitItemInformation = true; 0132 0133 if ((d->scanMode == NewScan) || 0134 (d->scanMode == Rescan) || 0135 (d->scanMode == CleanScan)) 0136 { 0137 MetadataFields fields; 0138 fields << MetadataInfo::Rating 0139 << MetadataInfo::CreationDate 0140 << MetadataInfo::DigitizationDate 0141 << MetadataInfo::Orientation; 0142 QVariantList metadataInfos = d->metadata->getMetadataFields(fields); 0143 0144 d->commit.imageInformationFields = DatabaseFields::Rating | 0145 DatabaseFields::CreationDate | 0146 DatabaseFields::DigitizationDate | 0147 DatabaseFields::Orientation; 0148 0149 checkCreationDateFromMetadata(metadataInfos[1]); 0150 0151 if (!checkRatingFromMetadata(metadataInfos.at(0))) 0152 { 0153 d->commit.imageInformationFields &= ~DatabaseFields::Rating; 0154 metadataInfos.removeAt(0); 0155 } 0156 0157 d->commit.imageInformationInfos = metadataInfos; 0158 } 0159 0160 d->commit.imageInformationInfos << d->metadata->getMetadataField(MetadataInfo::VideoWidth) 0161 << d->metadata->getMetadataField(MetadataInfo::VideoHeight); 0162 d->commit.imageInformationFields |= DatabaseFields::Width | DatabaseFields::Height; 0163 0164 // TODO: Please check / improve / rewrite detectVideoFormat(). 0165 // The format strings shall be uppercase, and a clearly defined set 0166 // (all format strings used in the database should be defined in advance) 0167 0168 if (d->scanInfo.category == DatabaseItem::Video) 0169 { 0170 d->commit.imageInformationInfos << detectVideoFormat(); 0171 } 0172 else 0173 { 0174 d->commit.imageInformationInfos << detectAudioFormat(); 0175 } 0176 0177 d->commit.imageInformationFields |= DatabaseFields::Format; 0178 0179 d->commit.imageInformationInfos << d->metadata->getMetadataField(MetadataInfo::VideoBitDepth); 0180 d->commit.imageInformationFields |= DatabaseFields::ColorDepth; 0181 0182 d->commit.imageInformationInfos << d->metadata->getMetadataField(MetadataInfo::VideoColorSpace); 0183 d->commit.imageInformationFields |= DatabaseFields::ColorModel; 0184 } 0185 0186 // commitItemInformation method is reused 0187 0188 void ItemScanner::scanVideoMetadata() 0189 { 0190 QVariantList metadataInfos = d->metadata->getMetadataFields(allVideoMetadataFields()); 0191 0192 if (hasValidField(metadataInfos)) 0193 { 0194 d->commit.commitVideoMetadata = true; 0195 0196 // reuse imageMetadataInfos field 0197 0198 d->commit.imageMetadataInfos = metadataInfos; 0199 } 0200 } 0201 0202 void ItemScanner::commitVideoMetadata() 0203 { 0204 CoreDbAccess().db()->addVideoMetadata(d->scanInfo.id, d->commit.imageMetadataInfos); 0205 } 0206 0207 } // namespace Digikam