From 0f715288e7085e9cda83a9ffc373259d39b846a1 Mon Sep 17 00:00:00 2001 From: Mohamed Ali Chebbi Date: Sat, 4 Feb 2023 23:46:18 +0100 Subject: [PATCH] add test/data for video support : delete riff HeaderReader --- include/exiv2/riffvideo.hpp | 20 +--------- src/riffvideo.cpp | 78 ++++++++++++++++++------------------- 2 files changed, 39 insertions(+), 59 deletions(-) diff --git a/include/exiv2/riffvideo.hpp b/include/exiv2/riffvideo.hpp index e4677158..43752a5a 100644 --- a/include/exiv2/riffvideo.hpp +++ b/include/exiv2/riffvideo.hpp @@ -52,25 +52,9 @@ class EXIV2API RiffVideo : public Image { //@} protected: - class HeaderReader { - std::string id_ = ""; - uint64_t size_ = 0; + void readList(uint64_t size, const std::string& id); - public: - explicit HeaderReader(BasicIo::UniquePtr& io); - - [[nodiscard]] uint64_t getSize() const { - return size_; - } - - [[nodiscard]] std::string& getId() { - return id_; - } - }; - - void readList(HeaderReader& header_); - - void readChunk(HeaderReader& header_); + void readChunk(uint64_t size, const std::string& id); void decodeBlocks(); diff --git a/src/riffvideo.cpp b/src/riffvideo.cpp index 0cc935c3..584a537f 100644 --- a/src/riffvideo.cpp +++ b/src/riffvideo.cpp @@ -380,20 +380,15 @@ void RiffVideo::readMetadata() { xmpData_["Xmp.video.FileSize"] = io_->size(); xmpData_["Xmp.video.MimeType"] = mimeType(); - HeaderReader header(io_); - xmpData_["Xmp.video.Container"] = header.getId(); + xmpData_["Xmp.video.Container"] = readStringTag(io_); + + io_->seekOrThrow(io_->tell() + DWORD, BasicIo::beg, ErrorCode::kerFailedToReadImageData); // skeep id xmpData_["Xmp.video.FileType"] = readStringTag(io_); decodeBlocks(); } // RiffVideo::readMetadata -RiffVideo::HeaderReader::HeaderReader(BasicIo::UniquePtr& io) { - Internal::enforce(io->size() > io->tell() + DWORD + DWORD, Exiv2::ErrorCode::kerCorruptedMetadata); - id_ = readStringTag(io); - size_ = readDWORDTag(io); -} - bool RiffVideo::equal(const std::string& str1, const std::string& str2) { if (str1.size() != str2.size()) return false; @@ -403,63 +398,64 @@ bool RiffVideo::equal(const std::string& str1, const std::string& str2) { return true; } -void RiffVideo::readList(HeaderReader& header_) { +void RiffVideo::readList(uint64_t size, const std::string& id) { DataBuf FormTypeBuf_ = io_->read(DWORD); #ifdef EXIV2_DEBUG_MESSAGES - EXV_DEBUG << "-> Reading list : id= " << header_.getId() << " type= " << Exiv2::toString(FormTypeBuf_.data()) - << " size= " << header_.getSize() << "(" << io_->tell() << "/" << io_->size() << ")" << std::endl; + EXV_DEBUG << "-> Reading list : id= " << id << " type= " << Exiv2::toString(FormTypeBuf_.data()) << " size= " << size + << "(" << io_->tell() << "/" << io_->size() << ")" << std::endl; #endif if (equal(Exiv2::toString(FormTypeBuf_.data()), CHUNK_ID_INFO)) - readInfoListChunk(header_.getSize()); + readInfoListChunk(size); else if (equal(Exiv2::toString(FormTypeBuf_.data()), CHUNK_ID_MOVI)) { - readMoviList(header_.getSize()); + readMoviList(size); } } -void RiffVideo::readChunk(HeaderReader& header_) { +void RiffVideo::readChunk(uint64_t size, const std::string& id) { #ifdef EXIV2_DEBUG_MESSAGES - EXV_DEBUG << "--> Reading Chunk : [" << header_.getId() << "] size= " << header_.getSize() << "(" << io_->tell() - << "/" << io_->size() << ")" << std::endl; + EXV_DEBUG << "--> Reading Chunk : [" << id << "] size= " << size << "(" << io_->tell() << "/" << io_->size() << ")" + << std::endl; #endif - if (equal(header_.getId(), CHUNK_ID_AVIH)) + if (equal(id, CHUNK_ID_AVIH)) readAviHeader(); - else if (equal(header_.getId(), CHUNK_ID_STRH)) + else if (equal(id, CHUNK_ID_STRH)) readStreamHeader(); - else if (equal(header_.getId(), CHUNK_ID_STRF)) - readStreamFormat(header_.getSize()); - else if (equal(header_.getId(), CHUNK_ID_FMT)) { + else if (equal(id, CHUNK_ID_STRF)) + readStreamFormat(size); + else if (equal(id, CHUNK_ID_FMT)) { streamType_ = Audio; - readStreamFormat(header_.getSize()); - } else if (equal(header_.getId(), CHUNK_ID_STRD)) - readStreamData(header_.getSize()); - else if (equal(header_.getId(), CHUNK_ID_STRN)) - StreamName(header_.getSize()); - else if (equal(header_.getId(), CHUNK_ID_VPRP)) - readVPRPChunk(header_.getSize()); - else if (equal(header_.getId(), CHUNK_ID_IDX1)) - readIndexChunk(header_.getSize()); - else if (equal(header_.getId(), CHUNK_ID_DATA)) - readDataChunk(header_.getSize()); - else if (equal(header_.getId(), CHUNK_ID_JUNK)) - readJunk(header_.getSize()); + readStreamFormat(size); + } else if (equal(id, CHUNK_ID_STRD)) + readStreamData(size); + else if (equal(id, CHUNK_ID_STRN)) + StreamName(size); + else if (equal(id, CHUNK_ID_VPRP)) + readVPRPChunk(size); + else if (equal(id, CHUNK_ID_IDX1)) + readIndexChunk(size); + else if (equal(id, CHUNK_ID_DATA)) + readDataChunk(size); + else if (equal(id, CHUNK_ID_JUNK)) + readJunk(size); else { #ifdef EXIV2_DEBUG_MESSAGES - EXV_DEBUG << "--> Ignoring Chunk : " << header_.getId() << "] size= " << header_.getSize() << "(" << io_->tell() - << "/" << io_->size() << ")" << std::endl; + EXV_DEBUG << "--> Ignoring Chunk : " << id << "] size= " << size << "(" << io_->tell() << "/" << io_->size() << ")" + << std::endl; #endif - io_->seekOrThrow(io_->tell() + header_.getSize(), BasicIo::beg, ErrorCode::kerFailedToReadImageData); + io_->seekOrThrow(io_->tell() + size, BasicIo::beg, ErrorCode::kerFailedToReadImageData); } } void RiffVideo::decodeBlocks() { - HeaderReader header(io_); - if (equal(header.getId(), CHUNK_ID_LIST)) { - readList(header); + std::string id = readStringTag(io_); + uint64_t size = readDWORDTag(io_); + if (equal(id, CHUNK_ID_LIST)) { + readList(size, id); } else { - readChunk(header); + readChunk(size, id); } if (!io_->eof() && io_->tell() < io_->size()) {