implement XMP data

This commit is contained in:
2019-03-03 02:01:19 +01:00
parent f10552c711
commit ddd6a096be
8 changed files with 1211 additions and 90 deletions
+600 -70
View File
@@ -32,66 +32,179 @@ bool cEXIF::fromFile(const QString& szFileName)
m_szFileName = "";
Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open(szFileName.toLocal8Bit().toStdString());
if(!image.get())
return(false);
image->readMetadata();
Exiv2::ExifData& exifData = image->exifData();
m_iWidth = image->pixelWidth();
m_iHeight = image->pixelHeight();
m_szFileName = szFileName;
if(!exifData.empty())
try
{
Exiv2::ExifData::const_iterator end = exifData.end();
for(Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i)
{
cEXIFTag* lpTag = m_exifTagList.find(i->tag(), i->ifdId());
Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open(szFileName.toLocal8Bit().toStdString());
if(!image.get())
return(false);
if(lpTag)
image->readMetadata();
Exiv2::ExifData& exifData = image->exifData();
Exiv2::IptcData& iptcData = image->iptcData();
Exiv2::XmpData& xmpData = image->xmpData();
m_iWidth = image->pixelWidth();
m_iHeight = image->pixelHeight();
m_szFileName = szFileName;
if(!iptcData.empty())
{
Exiv2::IptcData::const_iterator end = iptcData.end();
for(Exiv2::IptcData::const_iterator i = iptcData.begin(); i != end; ++i)
{
cEXIFValue* lpValue = m_exifValueList.add(lpTag);
if(lpValue)
lpValue->setValue(QString::fromStdString(i->value().toString()), i->typeId(), i->count());
cIPTCTag* lpTag = m_iptcTagList.find(i->tag());
if(lpTag)
{
cIPTCValue* lpValue = m_iptcValueList.add(lpTag);
if(lpValue)
lpValue->setValue(QString::fromStdString(i->value().toString()), i->typeId(), i->count());
}
}
Exiv2::PreviewManager previewManager(*image);
Exiv2::PreviewPropertiesList previewPropertiesList = previewManager.getPreviewProperties();
for(Exiv2::PreviewPropertiesList::const_iterator i = previewPropertiesList.begin();i != previewPropertiesList.end();i++)
{
Exiv2::PreviewImage previewImage = previewManager.getPreviewImage(*i);
QImage image;
image.loadFromData(static_cast<const uchar*>(previewImage.pData()), static_cast<qint32>(previewImage.size()));
QTransform rotation;
int angle = 0;
switch(imageOrientation())
{
case 8:
angle = 270;
break;
case 3:
angle = 180;
break;
case 6:
angle = 90;
break;
}
if(angle != 0)
{
rotation.rotate(angle);
image = image.transformed(rotation);
}
m_previewList.append(image);
}
}
Exiv2::PreviewManager previewManager(*image);
Exiv2::PreviewPropertiesList previewPropertiesList = previewManager.getPreviewProperties();
for(Exiv2::PreviewPropertiesList::const_iterator i = previewPropertiesList.begin();i != previewPropertiesList.end();i++)
if(!xmpData.empty())
{
Exiv2::PreviewImage previewImage = previewManager.getPreviewImage(*i);
QImage image;
image.loadFromData(static_cast<const uchar*>(previewImage.pData()), static_cast<qint32>(previewImage.size()));
Exiv2::XmpData::const_iterator end = xmpData.end();
QTransform rotation;
int angle = 0;
switch(imageOrientation())
for(Exiv2::XmpData::const_iterator i = xmpData.begin(); i != end; ++i)
{
case 8:
angle = 270;
break;
case 3:
angle = 180;
break;
case 6:
angle = 90;
break;
cXMPTag* lpTag = m_xmpTagList.find(QString::fromStdString(i->key()));
if(lpTag)
{
cXMPValue* lpValue = m_xmpValueList.add(lpTag);
if(lpValue)
lpValue->setValue(QString::fromStdString(i->value().toString()), i->typeId(), i->count());
}
}
if(angle != 0)
{
rotation.rotate(angle);
image = image.transformed(rotation);
}
Exiv2::PreviewManager previewManager(*image);
Exiv2::PreviewPropertiesList previewPropertiesList = previewManager.getPreviewProperties();
m_previewList.append(image);
for(Exiv2::PreviewPropertiesList::const_iterator i = previewPropertiesList.begin();i != previewPropertiesList.end();i++)
{
Exiv2::PreviewImage previewImage = previewManager.getPreviewImage(*i);
QImage image;
image.loadFromData(static_cast<const uchar*>(previewImage.pData()), static_cast<qint32>(previewImage.size()));
QTransform rotation;
int angle = 0;
switch(imageOrientation())
{
case 8:
angle = 270;
break;
case 3:
angle = 180;
break;
case 6:
angle = 90;
break;
}
if(angle != 0)
{
rotation.rotate(angle);
image = image.transformed(rotation);
}
m_previewList.append(image);
}
}
if(!exifData.empty())
{
Exiv2::ExifData::const_iterator end = exifData.end();
for(Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i)
{
cEXIFTag* lpTag = m_exifTagList.find(i->tag(), i->ifdId());
if(lpTag)
{
cEXIFValue* lpValue = m_exifValueList.add(lpTag);
if(lpValue)
lpValue->setValue(QString::fromStdString(i->value().toString()), i->typeId(), i->count());
}
}
Exiv2::PreviewManager previewManager(*image);
Exiv2::PreviewPropertiesList previewPropertiesList = previewManager.getPreviewProperties();
for(Exiv2::PreviewPropertiesList::const_iterator i = previewPropertiesList.begin();i != previewPropertiesList.end();i++)
{
Exiv2::PreviewImage previewImage = previewManager.getPreviewImage(*i);
QImage image;
image.loadFromData(static_cast<const uchar*>(previewImage.pData()), static_cast<qint32>(previewImage.size()));
QTransform rotation;
int angle = 0;
switch(imageOrientation())
{
case 8:
angle = 270;
break;
case 3:
angle = 180;
break;
case 6:
angle = 90;
break;
}
if(angle != 0)
{
rotation.rotate(angle);
image = image.transformed(rotation);
}
m_previewList.append(image);
}
}
}
catch (Exiv2::AnyError& e)
{
qDebug() << "Caught Exiv2 exception '" << e.what();
return(false);
}
if(!m_previewList.count())
@@ -174,7 +287,12 @@ qint32 cEXIF::imageWidth()
if(m_iWidth)
return(m_iWidth);
return(getTag(0x0100, 1).value<qint32>());
qint32 iWidth = getEXIFTag(0x0100, 1).value<qint32>();
if(iWidth)
return(iWidth);
return(getXMPTag("Xmp.video.Width").value<qint32>());
}
qint32 cEXIF::imageHeight()
@@ -182,69 +300,91 @@ qint32 cEXIF::imageHeight()
if(m_iHeight)
return(m_iHeight);
return(getTag(0x0101, 1).value<qint32>());
qint32 iHeight = getEXIFTag(0x0101, 1).value<qint32>();
if(iHeight)
return(iHeight);
return(getXMPTag("Xmp.video.Height").value<qint32>());
}
qint16 cEXIF::imageOrientation()
{
return(getTag(0x0112, 1).value<qint16>());
return(getEXIFTag(0x0112, 1).value<qint16>());
}
QString cEXIF::cameraMake()
{
return(getTag(0x010f, 1).value<QString>());
QString szCameraMake = getEXIFTag(0x010f, 1).toString();
if(!szCameraMake.isEmpty())
return(szCameraMake);
return(getXMPTag("Xmp.video.MajorBrand").toString());
}
QString cEXIF::cameraModel()
{
return(getTag(0x0110, 1).value<QString>());
QString szCameraModel = getEXIFTag(0x0110, 1).toString();
if(!szCameraModel.isEmpty())
return(szCameraModel);
return(getXMPTag("Xmp.video.MajorBrand").toString());
}
QDateTime cEXIF::dateTime()
{
QDateTime dateTime = QDateTime::fromString(getTag(0x0132, 1).value<QString>(), "yyyy:MM:dd hh:mm:ss");
QDateTime dateTime = QDateTime::fromString(getEXIFTag(0x0132, 1).value<QString>(), "yyyy:MM:dd hh:mm:ss");
if(dateTime.isValid())
return(dateTime);
return(dateTime);
dateTime = QDateTime::fromString(getXMPTag("Xmp.video.DateTimeDigitized").toString(), "yyyy-MM-ddThh:mm:ssZ");
if(dateTime.isValid())
return(dateTime);
QFileInfo info(m_szFileName);
return(info.birthTime());
}
QString cEXIF::fNumber()
{
return(getTag(0x829d, 5).value<QString>());
return(getEXIFTag(0x829d, 5).value<QString>());
}
qint32 cEXIF::iso()
{
return(getTag(0x8827, 5).value<qint32>());
return(getEXIFTag(0x8827, 5).value<qint32>());
}
QString cEXIF::flash()
{
return(m_exifFlashList.flash(getTag(0x9209, 5).value<qint32>()));
return(m_exifFlashList.flash(getEXIFTag(0x9209, 5).value<qint32>()));
}
qint32 cEXIF::flashID()
{
return(getTag(0x9209, 5).value<qint32>());
return(getEXIFTag(0x9209, 5).value<qint32>());
}
qreal cEXIF::focalLength()
{
return(getTag(0x920a, 5).value<qreal>());
return(getEXIFTag(0x920a, 5).value<qreal>());
}
QString cEXIF::lensMake()
{
return(getTag(0xa433, 5).value<QString>());
return(getEXIFTag(0xa433, 5).value<QString>());
}
QString cEXIF::lensModel()
{
return(getTag(0xa434, 5).value<QString>());
return(getEXIFTag(0xa434, 5).value<QString>());
}
QString cEXIF::exposureTime()
{
qreal value = getTag(0x829a, 5).value<qreal>();
qreal value = getEXIFTag(0x829a, 5).value<qreal>();
if(value == 0.0)
return("error");
@@ -257,32 +397,32 @@ QString cEXIF::exposureTime()
qint32 cEXIF::exposureBias()
{
return(getTag(0x9204, 5).value<qint32>());
return(getEXIFTag(0x9204, 5).value<qint32>());
}
QString cEXIF::exifVersion()
{
return(getTag(0x9000, 5).value<QString>());
return(getEXIFTag(0x9000, 5).value<QString>());
}
QDateTime cEXIF::dateTimeOriginal()
{
return(QDateTime::fromString(getTag(0x9003, 5).value<QString>(), "yyyy:MM:dd hh:mm:ss"));
return(QDateTime::fromString(getEXIFTag(0x9003, 5).value<QString>(), "yyyy:MM:dd hh:mm:ss"));
}
QDateTime cEXIF::dateTimeDigitized()
{
return(QDateTime::fromString(getTag(0x9004, 5).value<QString>(), "yyyy:MM:dd hh:mm:ss"));
return(QDateTime::fromString(getEXIFTag(0x9004, 5).value<QString>(), "yyyy:MM:dd hh:mm:ss"));
}
qint32 cEXIF::whiteBalance()
{
return(getTag(0xa403, 5).value<qint32>());
return(getEXIFTag(0xa403, 5).value<qint32>());
}
qreal cEXIF::focalLength35()
{
return(getTag(0xa405, 5).value<qreal>());
return(getEXIFTag(0xa405, 5).value<qreal>());
}
QString cEXIF::gps()
@@ -295,7 +435,7 @@ QString cEXIF::gps()
if(eList.count() != 3)
return("");
QString szGPS = QString("%1 %2° %3' %4\" %5 %6° %7' %8\"").arg(getTag(0x0001, 6).value<QString>()).arg(nList[0].value<QString>()).arg(nList[1].value<QString>()).arg(nList[2].value<QString>()).arg(getTag(0x0001, 6).value<QString>()).arg(eList[0].value<QString>()).arg(eList[1].value<QString>()).arg(eList[2].value<QString>());
QString szGPS = QString("%1 %2° %3' %4\" %5 %6° %7' %8\"").arg(getEXIFTag(0x0001, 6).value<QString>()).arg(nList[0].value<QString>()).arg(nList[1].value<QString>()).arg(nList[2].value<QString>()).arg(getEXIFTag(0x0001, 6).value<QString>()).arg(eList[0].value<QString>()).arg(eList[1].value<QString>()).arg(eList[2].value<QString>());
return(szGPS);
}
@@ -314,7 +454,7 @@ QImage cEXIF::thumbnail()
return(m_thumbnail);
}
QVariant cEXIF::getTag(qint32 iTAGID, qint32 iIFDID)
QVariant cEXIF::getEXIFTag(qint32 iTAGID, qint32 iIFDID)
{
cEXIFTag* lpTag = m_exifTagList.find(iTAGID, iIFDID);
@@ -329,6 +469,36 @@ QVariant cEXIF::getTag(qint32 iTAGID, qint32 iIFDID)
return(lpValue->value());
}
QVariant cEXIF::getIPTCTag(qint32 iTAGID)
{
cIPTCTag* lpTag = m_iptcTagList.find(iTAGID);
if(!lpTag)
return(QVariant());
cIPTCValue* lpValue = m_iptcValueList.find(lpTag);
if(!lpValue)
return(QVariant());
return(lpValue->value());
}
QVariant cEXIF::getXMPTag(const QString& szTAGName)
{
cXMPTag* lpTag = m_xmpTagList.find(szTAGName);
if(!lpTag)
return(QVariant());
cXMPValue* lpValue = m_xmpValueList.find(lpTag);
if(!lpValue)
return(QVariant());
return(lpValue->value());
}
QList<QVariant> cEXIF::getTagList(qint32 iTAGID, qint32 iIFDID)
{
cEXIFTag* lpTag = m_exifTagList.find(iTAGID, iIFDID);
@@ -1015,3 +1185,363 @@ cEXIFValue* cEXIFValueList::find(cEXIFTag* lpEXIFTag)
}
return(nullptr);
}
cIPTCTag::cIPTCTag(const qint32& iTAGID, const QString& szTAGName, const qint32& iTypeID, const QString& szDescription) :
m_iTAGID(iTAGID),
m_szTAGName(szTAGName),
m_iTypeID(iTypeID),
m_szDescription(szDescription)
{
}
cIPTCTagList::cIPTCTagList()
{
// add(0x000b, QObject::tr("ProcessingSoftware"), 1, 2, QObject::tr("The name and version of the software used to post-process the picture."));
}
cIPTCTag* cIPTCTagList::add(const qint32& iTAGID, const QString& szTAGName, const qint32& iTypeID, const QString& szDescription)
{
cIPTCTag* lpNew = find(iTAGID);
if(lpNew)
return(nullptr);
lpNew = new cIPTCTag(iTAGID, szTAGName, iTypeID, szDescription);
append(lpNew);
return(lpNew);
}
cIPTCTag* cIPTCTagList::find(const qint32& iTAGID)
{
for(int x = 0;x < count();x++)
{
cIPTCTag* lpTag = at(x);
if(lpTag->m_iTAGID == iTAGID)
return(lpTag);
}
return(nullptr);
}
cIPTCTag* cIPTCValue::iptcTag()
{
return(m_lpIPTCTag);
}
cIPTCValue::cIPTCValue(cIPTCTag* lpIPTCTag) :
m_lpIPTCTag(lpIPTCTag)
{
}
QVariant cIPTCValue::convertValue(const QString& szValue, qint32 iTypeId)
{
QVariant variant;
switch(iTypeId)
{
case 1: //byte
case 3: //short
case 4: //long
case 8: //signed short
variant = QVariant::fromValue(szValue.toLong());
break;
case 5: //rational
case 10: //signed rational
case 11: //float
if(szValue.contains("/"))
{
QStringList tmp = szValue.split("/");
variant = QVariant::fromValue(tmp[0].toDouble()/tmp[1].toDouble());
}
else
variant = QVariant::fromValue(szValue.toDouble());
break;
default:
variant = szValue;
}
return(variant);
}
void cIPTCValue::setValue(const QString& szValue, qint32 iTypeId, qint32 iCount)
{
if(iCount == 1 || iTypeId == 2 || iTypeId == 7)
{
m_valueList.append(convertValue(szValue, iTypeId));
return;
}
QStringList valueList = szValue.split(" ");
if(valueList.count() != iCount)
return;
for(int x = 0;x < iCount;x++)
m_valueList.append(convertValue(valueList[x], iTypeId));
}
QVariant cIPTCValue::value()
{
if(m_valueList.count())
return(m_valueList[0]);
return(QVariant());
}
QList<QVariant> cIPTCValue::valueList()
{
return(m_valueList);
}
cIPTCValueList::cIPTCValueList()
{
}
cIPTCValue* cIPTCValueList::add(cIPTCTag* lpIPTCTag)
{
cIPTCValue* lpNew = find(lpIPTCTag);
if(lpNew)
return(nullptr);
lpNew = new cIPTCValue(lpIPTCTag);
append(lpNew);
return(lpNew);
}
cIPTCValue* cIPTCValueList::find(cIPTCTag* lpIPTCTag)
{
for(int x = 0;x < count();x++)
{
cIPTCValue* lpValue = at(x);
if(lpValue->iptcTag() == lpIPTCTag)
return(lpValue);
}
return(nullptr);
}
cXMPTag::cXMPTag(const QString& szTAGName, const qint32& iTypeID, const QString& szDescription) :
m_szTAGName(szTAGName),
m_iTypeID(iTypeID),
m_szDescription(szDescription)
{
}
cXMPTagList::cXMPTagList()
{
add("Xmp.video.FileSize", 65541, QObject::tr("File Size"));
add("Xmp.video.FileName", 65541, QObject::tr("File Name"));
add("Xmp.video.MimeType", 65541, QObject::tr("Mime Type"));
add("Xmp.video.Container", 65541, QObject::tr("Container Type"));
add("Xmp.video.FileType", 65541, QObject::tr("File Type"));
add("Xmp.video.MicroSecPerFrame", 65541, QObject::tr("Micro Seconds Per Frame"));
add("Xmp.video.MaxDataRate", 65541, QObject::tr("Maximum Data Rate"));
add("Xmp.video.FrameCount", 65541, QObject::tr("Frame Count"));
add("Xmp.video.StreamCount", 65541, QObject::tr("Stream Count"));
add("Xmp.video.Width", 65541, QObject::tr("Video Width"));
add("Xmp.video.Height", 65541, QObject::tr("Video Height"));
add("Xmp.video.AspectRatio", 65541, QObject::tr("Video Aspect Ratio"));
add("Xmp.video.FileDataRate", 65541, QObject::tr("File Data Rate"));
add("Xmp.video.Duration", 65541, QObject::tr("Duration"));
add("Xmp.video.Codec", 65541, QObject::tr("Video Codec"));
add("Xmp.video.FrameRate", 65541, QObject::tr("Video Frame Rate"));
add("Xmp.video.VideoQuality", 65541, QObject::tr("Video Quality"));
add("Xmp.video.VideoSampleSize", 65541, QObject::tr("Video Sample Size"));
add("Xmp.video.Planes", 65541, QObject::tr("Planes"));
add("Xmp.video.PixelDepth", 65541, QObject::tr("Video Pixel Depth"));
add("Xmp.video.Compressor", 65541, QObject::tr("Compressor"));
add("Xmp.video.ImageLength", 65541, QObject::tr("Image Length"));
add("Xmp.video.PixelPerMeterX", 65541, QObject::tr("Pixels Per Meter X"));
add("Xmp.video.PixelPerMeterY", 65541, QObject::tr("Pixels Per Meter Y"));
add("Xmp.video.NumOfColours", 65541, QObject::tr("Number Of Colours"));
add("Xmp.video.NumOfImpColours", 65541, QObject::tr("Number Of Important Colours"));
add("Xmp.audio.Codec", 65541, QObject::tr("Audio Codec"));
add("Xmp.audio.SampleRate", 65541, QObject::tr("Audio Sample Rate"));
add("Xmp.audio.SampleCount", 65541, QObject::tr("Audio Sample Count"));
add("Xmp.audio.Compressor", 65541, QObject::tr("Audio Compressor"));
add("Xmp.audio.ChannelType", 65541, QObject::tr("Audio Channel Type"));
add("Xmp.audio.SampleType", 65541, QObject::tr("Audio Sample Type"));
add("Xmp.audio.BitsPerSample", 65541, QObject::tr("Bits Per Sample/ Bit Rate"));
add("Xmp.video.TotalFrameCount", 65541, QObject::tr("Total Frame Count"));
add("Xmp.video.DateTimeDigitized", 65541, QObject::tr("Date and Time Digitized"));
add("Xmp.video.Junk", 65541, QObject::tr("Junk Data"));
add("Xmp.video.MajorBrand", 65541, QObject::tr("QTime Major FileType Brand"));
add("Xmp.video.MinorVersion", 65541, QObject::tr("QTime Minor FileType Version"));
add("Xmp.video.CompatibleBrands", 65544, QObject::tr("QTime Compatible FileType Brand"));
add("Xmp.video.CompressorVersion", 65541, QObject::tr("Compressor Version"));
add("Xmp.video.HandlerType", 65541, QObject::tr("Handler Type"));
add("Xmp.video.PreviewDate", 65541, QObject::tr("Preview Date"));
add("Xmp.video.PreviewVersion", 65541, QObject::tr("Preview Version"));
add("Xmp.video.PreviewAtomType", 65541, QObject::tr("Preview Atom Type"));
add("Xmp.video.MovieHeaderVersion", 65541, QObject::tr("Movie Header Version"));
add("Xmp.video.DateUTC", 65541, QObject::tr("Date"));
add("Xmp.video.ModificationDate", 65541, QObject::tr("Modification Date"));
add("Xmp.video.TimeScale", 65541, QObject::tr("Time Scale"));
add("Xmp.video.PreferredRate", 65541, QObject::tr("Preferred Rate"));
add("Xmp.video.PreferredVolume", 65541, QObject::tr("Preferred Volume"));
add("Xmp.video.PreviewTime", 65541, QObject::tr("Preview Time"));
add("Xmp.video.PreviewDuration", 65541, QObject::tr("Preview Duration"));
add("Xmp.video.PosterTime", 65541, QObject::tr("Poster Time"));
add("Xmp.video.SelectionTime", 65541, QObject::tr("Selection Time"));
add("Xmp.video.SelectionDuration", 65541, QObject::tr("Selection Duration"));
add("Xmp.video.CurrentTime", 65541, QObject::tr("Current Time"));
add("Xmp.video.NextTrackID", 65541, QObject::tr("Next Track ID"));
add("Xmp.video.TrackHeaderVersion", 65541, QObject::tr("Track Header Version"));
add("Xmp.video.TrackCreateDate", 65541, QObject::tr("Video Track Create Date"));
add("Xmp.video.TrackModifyDate", 65541, QObject::tr("Video Track Modify Date"));
add("Xmp.video.TrackID", 65541, QObject::tr("Track ID"));
add("Xmp.video.TrackDuration", 65541, QObject::tr("Video Track Duration"));
add("Xmp.video.TrackLayer", 65541, QObject::tr("Video Track Layer"));
add("Xmp.video.TrackVolume", 65541, QObject::tr("Track Volume"));
add("Xmp.video.MediaHeaderVersion", 65541, QObject::tr("Media Header Version"));
add("Xmp.video.MediaCreateDate", 65541, QObject::tr("Media Track Create Date"));
add("Xmp.video.MediaModifyDate", 65541, QObject::tr("Media Track Modify Date"));
add("Xmp.video.MediaTimeScale", 65541, QObject::tr("Media Time Scale"));
add("Xmp.video.MediaDuration", 65541, QObject::tr("Media Track Duration"));
add("Xmp.video.MediaLangCode", 65541, QObject::tr("Media Language Code"));
add("Xmp.video.HandlerClass", 65541, QObject::tr("Handler Class"));
add("Xmp.video.GraphicsMode", 65541, QObject::tr("Graphics Mode"));
add("Xmp.video.OpColor", 65541, QObject::tr("Operation Colours"));
add("Xmp.video.SourceImageWidth", 65541, QObject::tr("Source Image Width"));
add("Xmp.video.SourceImageHeight", 65541, QObject::tr("Source Image Height"));
add("Xmp.video.XResolution", 65541, QObject::tr("X Resolution"));
add("Xmp.video.YResolution", 65541, QObject::tr("Y Resolution"));
add("Xmp.video.BitDepth", 65541, QObject::tr("Bit Depth"));
add("Xmp.audio.TrackHeaderVersion", 65541, QObject::tr("Track Header Version"));
add("Xmp.audio.TrackCreateDate", 65541, QObject::tr("Audio Track Create Date"));
add("Xmp.audio.TrackModifyDate", 65541, QObject::tr("Audio Track Modify Date"));
add("Xmp.audio.TrackID", 65541, QObject::tr("Track ID"));
add("Xmp.audio.TrackDuration", 65541, QObject::tr("Audio Track Duration"));
add("Xmp.audio.TrackLayer", 65541, QObject::tr("Audio Track Layer"));
add("Xmp.audio.MediaHeaderVersion", 65541, QObject::tr("Media Header Version"));
add("Xmp.audio.MediaCreateDate", 65541, QObject::tr("Media Track Create Date"));
add("Xmp.audio.MediaModifyDate", 65541, QObject::tr("Media Track Modify Date"));
add("Xmp.audio.MediaTimeScale", 65541, QObject::tr("Media Time Scale"));
add("Xmp.audio.MediaDuration", 65541, QObject::tr("Media Track Duration"));
add("Xmp.audio.MediaLangCode", 65541, QObject::tr("Media Language Code"));
add("Xmp.audio.HandlerClass", 65541, QObject::tr("Handler Class"));
add("Xmp.audio.HandlerType", 65541, QObject::tr("Handler Type"));
add("Xmp.audio.Balance", 65541, QObject::tr("Balance"));
}
cXMPTag* cXMPTagList::add(const QString& szTAGName, const qint32& iTypeID, const QString& szDescription)
{
cXMPTag* lpNew = find(szTAGName);
if(lpNew)
return(nullptr);
lpNew = new cXMPTag(szTAGName, iTypeID, szDescription);
append(lpNew);
return(lpNew);
}
cXMPTag* cXMPTagList::find(const QString& szTAGName)
{
for(int x = 0;x < count();x++)
{
cXMPTag* lpTag = at(x);
if(lpTag->m_szTAGName == szTAGName)
return(lpTag);
}
return(nullptr);
}
cXMPTag* cXMPValue::xmpTag()
{
return(m_lpXMPTag);
}
cXMPValue::cXMPValue(cXMPTag* lpXMPTag) :
m_lpXMPTag(lpXMPTag)
{
}
QVariant cXMPValue::convertValue(const QString& szValue, qint32 iTypeId)
{
QVariant variant;
switch(iTypeId)
{
case 1: //byte
case 3: //short
case 4: //long
case 8: //signed short
variant = QVariant::fromValue(szValue.toLong());
break;
case 5: //rational
case 10: //signed rational
case 11: //float
if(szValue.contains("/"))
{
QStringList tmp = szValue.split("/");
variant = QVariant::fromValue(tmp[0].toDouble()/tmp[1].toDouble());
}
else
variant = QVariant::fromValue(szValue.toDouble());
break;
default:
variant = szValue;
}
return(variant);
}
void cXMPValue::setValue(const QString& szValue, qint32 iTypeId, qint32 iCount)
{
// if(iCount == 1 || iTypeId == 2 || iTypeId == 7)
// {
// m_valueList.append(convertValue(szValue, iTypeId));
// return;
// }
// QStringList valueList = szValue.split(" ");
// if(valueList.count() != iCount)
// return;
// for(int x = 0;x < iCount;x++)
// m_valueList.append(convertValue(valueList[x], iTypeId));
m_valueList.append(convertValue(szValue, iTypeId));
}
QVariant cXMPValue::value()
{
if(m_valueList.count())
return(m_valueList[0]);
return(QVariant());
}
QList<QVariant> cXMPValue::valueList()
{
return(m_valueList);
}
cXMPValueList::cXMPValueList()
{
}
cXMPValue* cXMPValueList::add(cXMPTag* lpXMPTag)
{
cXMPValue* lpNew = find(lpXMPTag);
if(lpNew)
return(nullptr);
lpNew = new cXMPValue(lpXMPTag);
append(lpNew);
return(lpNew);
}
cXMPValue* cXMPValueList::find(cXMPTag* lpXMPTag)
{
for(int x = 0;x < count();x++)
{
cXMPValue* lpValue = at(x);
if(lpValue->xmpTag() == lpXMPTag)
return(lpValue);
}
return(nullptr);
}