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:
|
||||
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();
|
||||
|
||||
|
||||
@ -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()) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user