add test/data for video support : delete riff HeaderReader

This commit is contained in:
Mohamed Ali Chebbi 2023-02-04 23:46:18 +01:00
parent 19f8b437c3
commit 0f715288e7
2 changed files with 39 additions and 59 deletions

View File

@ -52,25 +52,9 @@ class EXIV2API RiffVideo : public Image {
//@} //@}
protected: protected:
class HeaderReader { void readList(uint64_t size, const std::string& id);
std::string id_ = "";
uint64_t size_ = 0;
public: void readChunk(uint64_t size, const std::string& id);
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 decodeBlocks(); void decodeBlocks();

View File

@ -380,20 +380,15 @@ void RiffVideo::readMetadata() {
xmpData_["Xmp.video.FileSize"] = io_->size(); xmpData_["Xmp.video.FileSize"] = io_->size();
xmpData_["Xmp.video.MimeType"] = mimeType(); xmpData_["Xmp.video.MimeType"] = mimeType();
HeaderReader header(io_); xmpData_["Xmp.video.Container"] = readStringTag(io_);
xmpData_["Xmp.video.Container"] = header.getId();
io_->seekOrThrow(io_->tell() + DWORD, BasicIo::beg, ErrorCode::kerFailedToReadImageData); // skeep id
xmpData_["Xmp.video.FileType"] = readStringTag(io_); xmpData_["Xmp.video.FileType"] = readStringTag(io_);
decodeBlocks(); decodeBlocks();
} // RiffVideo::readMetadata } // 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) { bool RiffVideo::equal(const std::string& str1, const std::string& str2) {
if (str1.size() != str2.size()) if (str1.size() != str2.size())
return false; return false;
@ -403,63 +398,64 @@ bool RiffVideo::equal(const std::string& str1, const std::string& str2) {
return true; return true;
} }
void RiffVideo::readList(HeaderReader& header_) { void RiffVideo::readList(uint64_t size, const std::string& id) {
DataBuf FormTypeBuf_ = io_->read(DWORD); DataBuf FormTypeBuf_ = io_->read(DWORD);
#ifdef EXIV2_DEBUG_MESSAGES #ifdef EXIV2_DEBUG_MESSAGES
EXV_DEBUG << "-> Reading list : id= " << header_.getId() << " type= " << Exiv2::toString(FormTypeBuf_.data()) EXV_DEBUG << "-> Reading list : id= " << id << " type= " << Exiv2::toString(FormTypeBuf_.data()) << " size= " << size
<< " size= " << header_.getSize() << "(" << io_->tell() << "/" << io_->size() << ")" << std::endl; << "(" << io_->tell() << "/" << io_->size() << ")" << std::endl;
#endif #endif
if (equal(Exiv2::toString(FormTypeBuf_.data()), CHUNK_ID_INFO)) if (equal(Exiv2::toString(FormTypeBuf_.data()), CHUNK_ID_INFO))
readInfoListChunk(header_.getSize()); readInfoListChunk(size);
else if (equal(Exiv2::toString(FormTypeBuf_.data()), CHUNK_ID_MOVI)) { 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 #ifdef EXIV2_DEBUG_MESSAGES
EXV_DEBUG << "--> Reading Chunk : [" << header_.getId() << "] size= " << header_.getSize() << "(" << io_->tell() EXV_DEBUG << "--> Reading Chunk : [" << id << "] size= " << size << "(" << io_->tell() << "/" << io_->size() << ")"
<< "/" << io_->size() << ")" << std::endl; << std::endl;
#endif #endif
if (equal(header_.getId(), CHUNK_ID_AVIH)) if (equal(id, CHUNK_ID_AVIH))
readAviHeader(); readAviHeader();
else if (equal(header_.getId(), CHUNK_ID_STRH)) else if (equal(id, CHUNK_ID_STRH))
readStreamHeader(); readStreamHeader();
else if (equal(header_.getId(), CHUNK_ID_STRF)) else if (equal(id, CHUNK_ID_STRF))
readStreamFormat(header_.getSize()); readStreamFormat(size);
else if (equal(header_.getId(), CHUNK_ID_FMT)) { else if (equal(id, CHUNK_ID_FMT)) {
streamType_ = Audio; streamType_ = Audio;
readStreamFormat(header_.getSize()); readStreamFormat(size);
} else if (equal(header_.getId(), CHUNK_ID_STRD)) } else if (equal(id, CHUNK_ID_STRD))
readStreamData(header_.getSize()); readStreamData(size);
else if (equal(header_.getId(), CHUNK_ID_STRN)) else if (equal(id, CHUNK_ID_STRN))
StreamName(header_.getSize()); StreamName(size);
else if (equal(header_.getId(), CHUNK_ID_VPRP)) else if (equal(id, CHUNK_ID_VPRP))
readVPRPChunk(header_.getSize()); readVPRPChunk(size);
else if (equal(header_.getId(), CHUNK_ID_IDX1)) else if (equal(id, CHUNK_ID_IDX1))
readIndexChunk(header_.getSize()); readIndexChunk(size);
else if (equal(header_.getId(), CHUNK_ID_DATA)) else if (equal(id, CHUNK_ID_DATA))
readDataChunk(header_.getSize()); readDataChunk(size);
else if (equal(header_.getId(), CHUNK_ID_JUNK)) else if (equal(id, CHUNK_ID_JUNK))
readJunk(header_.getSize()); readJunk(size);
else { else {
#ifdef EXIV2_DEBUG_MESSAGES #ifdef EXIV2_DEBUG_MESSAGES
EXV_DEBUG << "--> Ignoring Chunk : " << header_.getId() << "] size= " << header_.getSize() << "(" << io_->tell() EXV_DEBUG << "--> Ignoring Chunk : " << id << "] size= " << size << "(" << io_->tell() << "/" << io_->size() << ")"
<< "/" << io_->size() << ")" << std::endl; << std::endl;
#endif #endif
io_->seekOrThrow(io_->tell() + header_.getSize(), BasicIo::beg, ErrorCode::kerFailedToReadImageData); io_->seekOrThrow(io_->tell() + size, BasicIo::beg, ErrorCode::kerFailedToReadImageData);
} }
} }
void RiffVideo::decodeBlocks() { void RiffVideo::decodeBlocks() {
HeaderReader header(io_); std::string id = readStringTag(io_);
if (equal(header.getId(), CHUNK_ID_LIST)) { uint64_t size = readDWORDTag(io_);
readList(header); if (equal(id, CHUNK_ID_LIST)) {
readList(size, id);
} else { } else {
readChunk(header); readChunk(size, id);
} }
if (!io_->eof() && io_->tell() < io_->size()) { if (!io_->eof() && io_->tell() < io_->size()) {