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