Allow custom writing application

This commit is contained in:
Martchus 2018-03-20 21:41:05 +01:00
parent 3e85eba00f
commit cbb54d5aeb
2 changed files with 46 additions and 7 deletions

View File

@ -33,10 +33,6 @@ using namespace ChronoUtilities;
namespace TagParser {
constexpr const char appInfo[] = APP_NAME " v" APP_VERSION;
constexpr uint64 appInfoElementDataSize = sizeof(appInfo) - 1;
constexpr uint64 appInfoElementTotalSize = 2 + 1 + appInfoElementDataSize;
/*!
* \class Media::MatroskaContainer
* \brief Implementation of GenericContainer<MediaFileInfo, MatroskaTag, MatroskaTrack, EbmlElement>.
@ -931,6 +927,16 @@ void MatroskaContainer::internalMakeFile(Diagnostics &diag, AbortableProgressFee
ebmlHeaderDataSize += EbmlElement::calculateSizeDenotationLength(m_doctype.size());
const uint64 ebmlHeaderSize = 4 + EbmlElement::calculateSizeDenotationLength(ebmlHeaderDataSize) + ebmlHeaderDataSize;
// calculate size of "WritingLib"-element
constexpr const char muxingAppName[] = APP_NAME " v" APP_VERSION;
constexpr uint64 muxingAppElementDataSize = sizeof(muxingAppName) - 1;
constexpr uint64 muxingAppElementTotalSize = 2 + 1 + muxingAppElementDataSize;
// calculate size of "WritingApp"-element
const uint64 writingAppElementDataSize
= fileInfo().writingApplication().empty() ? muxingAppElementDataSize : fileInfo().writingApplication().size() - 1;
const uint64 writingAppElementTotalSize = 2 + 1 + writingAppElementDataSize;
try {
// calculate size of "Tags"-element
for (auto &tag : tags()) {
@ -1103,7 +1109,7 @@ void MatroskaContainer::internalMakeFile(Diagnostics &diag, AbortableProgressFee
} else {
// add size of "SegmentInfo"-element
// -> size of "MuxingApp"- and "WritingApp"-element
segment.infoDataSize = 2 * appInfoElementTotalSize;
segment.infoDataSize = muxingAppElementTotalSize + writingAppElementTotalSize;
// -> add size of "Title"-element
if (segmentIndex < m_titles.size()) {
const auto &title = m_titles[segmentIndex];
@ -1617,8 +1623,9 @@ void MatroskaContainer::internalMakeFile(Diagnostics &diag, AbortableProgressFee
}
}
// -> write "MuxingApp"- and "WritingApp"-element
EbmlElement::makeSimpleElement(outputStream, MatroskaIds::MuxingApp, appInfo, appInfoElementDataSize);
EbmlElement::makeSimpleElement(outputStream, MatroskaIds::WrittingApp, appInfo, appInfoElementDataSize);
EbmlElement::makeSimpleElement(outputStream, MatroskaIds::MuxingApp, muxingAppName, muxingAppElementDataSize);
EbmlElement::makeSimpleElement(outputStream, MatroskaIds::WrittingApp,
fileInfo().writingApplication().empty() ? muxingAppName : fileInfo().writingApplication().data(), writingAppElementDataSize);
}
// write "Tracks"-element

View File

@ -122,6 +122,9 @@ public:
// methods to get, set object behaviour
const std::string &saveFilePath() const;
void setSaveFilePath(const std::string &saveFilePath);
const std::string writingApplication() const;
void setWritingApplication(const std::string &writingApplication);
void setWritingApplication(const char *writingApplication);
bool isForcingFullParse() const;
void setForceFullParse(bool forceFullParse);
bool isForcingRewrite() const;
@ -174,6 +177,7 @@ private:
// fields specifying object behaviour
std::string m_saveFilePath;
std::string m_writingApplication;
size_t m_minPadding;
size_t m_maxPadding;
size_t m_preferredPadding;
@ -363,6 +367,34 @@ inline void MediaFileInfo::setSaveFilePath(const std::string &saveFilePath)
m_saveFilePath = saveFilePath;
}
/*!
* \brief Sets the writing application as container-level meta-data.
* \remarks This is not read from the file when parsing and only used when saving changes.
* \sa setWritingApplication() for more details
*/
inline const std::string MediaFileInfo::writingApplication() const
{
return m_writingApplication;
}
/*!
* \brief Sets the writing application as container-level meta-data. Put the name of your application here.
* \remarks Might not be used (depends on the format).
*/
inline void MediaFileInfo::setWritingApplication(const std::string &writingApplication)
{
m_writingApplication = writingApplication;
}
/*!
* \brief Sets the writing application as container-level meta-data. Put the name of your application here.
* \remarks Might not be used (depends on the format).
*/
inline void MediaFileInfo::setWritingApplication(const char *writingApplication)
{
m_writingApplication = writingApplication;
}
/*!
* \brief Returns the container for the current file.
*