add test/data for video support : delete riff HeaderReader
This commit is contained in:
parent
19f8b437c3
commit
0f715288e7
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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()) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user