diff --git a/src/asfvideo.cpp b/src/asfvideo.cpp index 5cd6f811..197d8b49 100644 --- a/src/asfvideo.cpp +++ b/src/asfvideo.cpp @@ -281,9 +281,9 @@ namespace Exiv2 { uint64_t getUint64_t(Exiv2::DataBuf& buf) { uint64_t temp = 0; - for(int i = 0; i < 8; ++i) - temp = temp + buf.pData_[i]*(pow(256,i)); - + for(int i = 0; i < 8; ++i){ + temp = temp + static_cast(buf.pData_[i]*(pow(static_cast(256), i))); + } return temp; } @@ -334,7 +334,7 @@ namespace Exiv2 { void AsfVideo::decodeBlock() { - const long bufMinSize = 8; + const long bufMinSize = 9; DataBuf buf(bufMinSize); unsigned long size = 0; buf.pData_[8] = '\0' ; @@ -349,14 +349,14 @@ namespace Exiv2 { return; } - char GUID[33] = ""; + char GUID[37] = ""; //the getGUID function write the GUID[36], getGUID(guidBuf, GUID); tv = find( GUIDReferenceTags, GUID); std::memset(buf.pData_, 0x0, buf.size_); io_->read(buf.pData_, 8); - size = getUint64_t(buf); + size = static_cast(getUint64_t(buf)); if(tv) tagDecoder(tv,size-24); @@ -487,7 +487,7 @@ namespace Exiv2 { buf.pData_[8] = '\0' ; byte guidBuf[16]; int stream = 0; io_->read(guidBuf, 16); - char streamType[33] = ""; + char streamType[37] = ""; Exiv2::RiffVideo *test = NULL; getGUID(guidBuf, streamType); @@ -599,7 +599,7 @@ namespace Exiv2 { io_->read(buf.pData_, 2); int recordCount = Exiv2::getUShort(buf.pData_, littleEndian), nameLength = 0, dataLength = 0, dataType = 0; Exiv2::Value::AutoPtr v = Exiv2::Value::create(Exiv2::xmpSeq); - byte guidBuf[16]; char fileID[33] = ""; + byte guidBuf[16]; char fileID[37] = ""; while(recordCount--) { std::memset(buf.pData_, 0x0, buf.size_); @@ -670,12 +670,12 @@ namespace Exiv2 { void AsfVideo::fileProperties() { - DataBuf buf(8); + DataBuf buf(9); buf.pData_[8] = '\0' ; byte guidBuf[16]; io_->read(guidBuf, 16); - char fileID[33] = ""; int count = 7; + char fileID[37] = ""; int count = 7; getGUID(guidBuf, fileID); xmpData_["Xmp.video.FileID"] = fileID; diff --git a/src/basicio.cpp b/src/basicio.cpp index bddc3ad5..8c0038d4 100644 --- a/src/basicio.cpp +++ b/src/basicio.cpp @@ -833,6 +833,25 @@ namespace Exiv2 { return std::fseek(p_->fp_, offset, fileSeek); } + int FileIo::seek( uint64_t offset, Position pos ) + { + assert(p_->fp_ != 0); + + int fileSeek = 0; + switch (pos) { + case BasicIo::cur: fileSeek = SEEK_CUR; break; + case BasicIo::beg: fileSeek = SEEK_SET; break; + case BasicIo::end: fileSeek = SEEK_END; break; + } + + if (p_->switchMode(Impl::opSeek) != 0) return 1; +#ifdef _MSC_VER + return _fseeki64(p_->fp_, offset, fileSeek); +#else + return std::fseeko(p_->fp_, offset, fileSeek); +#endif + } + long FileIo::tell() const { assert(p_->fp_ != 0); @@ -1122,6 +1141,22 @@ namespace Exiv2 { return 0; } + int MemIo::seek( uint64_t offset, Position pos ) + { + uint64_t newIdx = 0; + + switch (pos) { + case BasicIo::cur: newIdx = p_->idx_ + offset; break; + case BasicIo::beg: newIdx = offset; break; + case BasicIo::end: newIdx = p_->size_ + offset; break; + } + + if (newIdx < 0 || newIdx > p_->size_) return 1; + p_->idx_ = static_cast(newIdx); //not very sure about this. need more test!! - note by Shawn fly2xj@gmail.com //TODO + p_->eof_ = false; + return 0; + } + byte* MemIo::mmap(bool /*isWriteable*/) { return p_->data_; diff --git a/src/basicio.hpp b/src/basicio.hpp index 7b94cce6..8fda2ea6 100644 --- a/src/basicio.hpp +++ b/src/basicio.hpp @@ -170,6 +170,23 @@ namespace Exiv2 { Nonzero if failure; */ virtual int seek(long offset, Position pos) = 0; + /*! + @brief Move the current IO position. + @param offset Number of bytes to move the position relative + to the starting position specified by \em pos + @param pos Position from which the seek should start + @return 0 if successful;
+ Nonzero if failure; + */ + virtual int seek(uint64_t offset, Position pos) = 0; + +#if defined(_MSC_VER)// && defined(_WIN64) + int seek( int offset, Position pos) + {return seek(static_cast(offset),pos);} + int seek(uint32_t offset, Position pos) + {return seek(static_cast(offset),pos);} +#endif + /*! @brief Direct access to the IO data. For files, this is done by mapping the file into the process's address space; for memory @@ -425,6 +442,15 @@ namespace Exiv2 { Nonzero if failure; */ virtual int seek(long offset, Position pos); + /*! + @brief Move the current file position. + @param offset Number of bytes to move the file position + relative to the starting position specified by \em pos + @param pos Position from which the seek should start + @return 0 if successful;
+ Nonzero if failure; + */ + virtual int seek(uint64_t offset, Position pos); /*! @brief Map the file into the process's address space. The file must be open before mmap() is called. If the mapped area is writeable, @@ -633,6 +659,15 @@ namespace Exiv2 { Nonzero if failure; */ virtual int seek(long offset, Position pos); + /*! + @brief Move the current IO position. + @param offset Number of bytes to move the IO position + relative to the starting position specified by \em pos + @param pos Position from which the seek should start + @return 0 if successful;
+ Nonzero if failure; + */ + virtual int seek(uint64_t offset, Position pos); /*! @brief Allow direct access to the underlying data buffer. The buffer is not protected against write access in any way, the argument diff --git a/src/jp2image.cpp b/src/jp2image.cpp index ae738507..005eb716 100644 --- a/src/jp2image.cpp +++ b/src/jp2image.cpp @@ -352,7 +352,7 @@ namespace Exiv2 // Move to the next box. - io_->seek(position - sizeof(box) + box.boxLength, BasicIo::beg); + io_->seek(static_cast(position - sizeof(box) + box.boxLength), BasicIo::beg); if (io_->error() || io_->eof()) throw Error(14); } diff --git a/src/matroskavideo.cpp b/src/matroskavideo.cpp index 7f32c727..fc28dea3 100644 --- a/src/matroskavideo.cpp +++ b/src/matroskavideo.cpp @@ -457,7 +457,7 @@ namespace Exiv2 { int64_t temp = 0; for(int i = size-1; i >= 0; i--) { - temp = temp + buf[i]*(pow(256,size-i-1)); + temp = temp + static_cast(buf[i]*(pow(256.0, size-i-1))); } std::cerr << "size = " << size << ", val = " << temp << std::hex << " (0x" << temp << std::dec << ")"; @@ -534,8 +534,8 @@ namespace Exiv2 { return; } - bool skip = find(compositeTagsList, mt->val_); - bool ignore = find(ignoredTagsList, mt->val_); + bool skip = find(compositeTagsList, mt->val_) != 0; + bool ignore = find(ignoredTagsList, mt->val_) != 0; io_->read(buf, 1); sz = findBlockSize(buf[0]); // 0-8 @@ -560,8 +560,9 @@ namespace Exiv2 { DataBuf buf2(bufMinSize); std::memset(buf2.pData_, 0x0, buf2.size_); - io_->read(buf2.pData_, size); - contentManagement(mt, buf2.pData_, size); + long s = static_cast(size) ; + io_->read(buf2.pData_,s); + contentManagement(mt, buf2.pData_,s); } // MatroskaVideo::decodeBlock void MatroskaVideo::contentManagement(const MatroskaTags* mt, const byte* buf, long size) @@ -648,10 +649,10 @@ namespace Exiv2 { switch (mt->val_) { case 0x0489: if(size <= 4) { - duration_in_ms = getFloat(buf, bigEndian) * time_code_scale * 1000; + duration_in_ms = static_cast(getFloat(buf, bigEndian) * time_code_scale * 1000); } else { - duration_in_ms = getDouble(buf, bigEndian) * time_code_scale * 1000; + duration_in_ms = static_cast(getDouble(buf, bigEndian) * time_code_scale * 1000); } break; case 0x0461: { @@ -673,7 +674,7 @@ namespace Exiv2 { case 0x0003: internalMt = find(matroskaTrackType, returnValue(buf, size)); - stream = internalMt->val_; + stream = static_cast(internalMt->val_); break; case 0x3e383: case 0x383e3: @@ -681,7 +682,7 @@ namespace Exiv2 { if (returnValue(buf, size)) { switch (stream) { case 1: temp = (double)1000000000/(double)returnValue(buf, size); break; - case 2: temp = returnValue(buf, size)/1000; break; + case 2: temp = static_cast(returnValue(buf, size) / 1000); break; } if (internalMt) xmpData_[internalMt->label_] = temp; } diff --git a/src/quicktimevideo.cpp b/src/quicktimevideo.cpp index 3bd65b00..5a05ad3b 100644 --- a/src/quicktimevideo.cpp +++ b/src/quicktimevideo.cpp @@ -1,4 +1,4 @@ -// ***************************************************************** -*- C++ -*- +// ***************************************************************** -*- C++ -*- /* * Copyright (C) 2004-2012 Andreas Huggel * @@ -555,7 +555,11 @@ namespace Exiv2 { int64_t returnBufValue(Exiv2::DataBuf& buf, int n = 4) { int64_t temp = 0; for(int i = n - 1; i >= 0; i--) - temp = temp + buf.pData_[i]*(pow(256,n-i-1)); +#ifdef _MSC_VER + temp = temp + static_cast(buf.pData_[i]*(pow(static_cast(256), n-i-1))); +#else + temp = temp + buf.pData_[i]*(pow(256,n-i-1)); +#endif return temp; } @@ -569,7 +573,11 @@ namespace Exiv2 { uint64_t returnUnsignedBufValue(Exiv2::DataBuf& buf, int n = 4) { uint64_t temp = 0; for(int i = n-1; i >= 0; i--) - temp = temp + buf.pData_[i]*(pow(256,n-i-1)); +#if _MSC_VER + temp = temp + static_cast(buf.pData_[i]*(pow(static_cast(256), n-i-1))); +#else + temp = temp + buf.pData_[i]*(pow(256,n-i-1)); +#endif return temp; } @@ -640,7 +648,7 @@ namespace Exiv2 { void QuickTimeVideo::decodeBlock() { - const long bufMinSize = 4; + const long bufMinSize = 5; DataBuf buf(bufMinSize); unsigned long size = 0; buf.pData_[4] = '\0' ; @@ -773,10 +781,10 @@ namespace Exiv2 { byte n = 3; while(n--) { - io_->seek(4, BasicIo::cur); io_->read(buf.pData_, 4); + io_->seek(static_cast(4), BasicIo::cur); io_->read(buf.pData_, 4); if(equalsQTimeTag(buf, "clef")) { - io_->seek(4, BasicIo::cur); + io_->seek(static_cast(4), BasicIo::cur); io_->read(buf.pData_, 2); io_->read(buf2.pData_, 2); xmpData_["Xmp.video.CleanApertureWidth"] = Exiv2::toString(getUShort(buf.pData_, bigEndian)) + "." + Exiv2::toString(getUShort(buf2.pData_, bigEndian)); @@ -786,7 +794,7 @@ namespace Exiv2 { } else if(equalsQTimeTag(buf, "prof")) { - io_->seek(4, BasicIo::cur); + io_->seek(static_cast(4), BasicIo::cur); io_->read(buf.pData_, 2); io_->read(buf2.pData_, 2); xmpData_["Xmp.video.ProductionApertureWidth"] = Exiv2::toString(getUShort(buf.pData_, bigEndian)) + "." + Exiv2::toString(getUShort(buf2.pData_, bigEndian)); @@ -796,7 +804,7 @@ namespace Exiv2 { } else if(equalsQTimeTag(buf, "enof")) { - io_->seek(4, BasicIo::cur); + io_->seek(static_cast(4), BasicIo::cur); io_->read(buf.pData_, 2); io_->read(buf2.pData_, 2); xmpData_["Xmp.video.EncodedPixelsWidth"] = Exiv2::toString(getUShort(buf.pData_, bigEndian)) + "." + Exiv2::toString(getUShort(buf2.pData_, bigEndian)); @@ -805,7 +813,7 @@ namespace Exiv2 { + "." + Exiv2::toString(getUShort(buf2.pData_, bigEndian)); } } - io_->seek(cur_pos + size, BasicIo::beg); + io_->seek(static_cast(cur_pos + size), BasicIo::beg); } // QuickTimeVideo::trackApertureTagDecoder void QuickTimeVideo::CameraTagsDecoder(unsigned long size_external) @@ -834,7 +842,7 @@ namespace Exiv2 { xmpData_["Xmp.video.WhiteBalance"] = exvGettext(td->label_); io_->read(buf.pData_, 4); io_->read(buf2.pData_, 4); xmpData_["Xmp.video.FocalLength"] = getULong(buf.pData_, littleEndian) / (double)getULong(buf2.pData_, littleEndian) ; - io_->seek(95, BasicIo::cur); + io_->seek(static_cast(95), BasicIo::cur); io_->read(buf.pData_, 48); xmpData_["Xmp.video.Software"] = Exiv2::toString(buf.pData_); io_->read(buf.pData_, 4); @@ -1104,7 +1112,7 @@ namespace Exiv2 { io_->read(buf.pData_, 4); uint64_t noOfEntries, totalframes = 0, timeOfFrames = 0; noOfEntries = returnUnsignedBufValue(buf); - int temp; + uint64_t temp; for(unsigned long i = 1; i <= noOfEntries; i++) { io_->read(buf.pData_, 4); @@ -1171,7 +1179,7 @@ namespace Exiv2 { break; } } - io_->read(buf.pData_, size % 4); + io_->read(buf.pData_, static_cast(size % 4)); //cause size is so small, this cast should be right. } // QuickTimeVideo::audioDescDecoder void QuickTimeVideo::imageDescDecoder() @@ -1219,7 +1227,7 @@ namespace Exiv2 { break; } } - io_->read(buf.pData_, size % 4); + io_->read(buf.pData_, static_cast(size % 4)); xmpData_["Xmp.video.BitDepth"] = returnBufValue(buf, 1); } // QuickTimeVideo::imageDescDecoder @@ -1237,7 +1245,7 @@ namespace Exiv2 { } // QuickTimeVideo::multipleEntriesDecoder void QuickTimeVideo::videoHeaderDecoder(unsigned long size) { - DataBuf buf(2); + DataBuf buf(3); std::memset(buf.pData_, 0x0, buf.size_); buf.pData_[2] = '\0'; currentStream_ = Video; @@ -1309,7 +1317,7 @@ namespace Exiv2 { } // QuickTimeVideo::handlerDecoder void QuickTimeVideo::fileTypeDecoder(unsigned long size) { - DataBuf buf(4); + DataBuf buf(5); std::memset(buf.pData_, 0x0, buf.size_); buf.pData_[4] = '\0'; Exiv2::Value::AutoPtr v = Exiv2::Value::create(Exiv2::xmpSeq); @@ -1340,10 +1348,10 @@ namespace Exiv2 { } // QuickTimeVideo::fileTypeDecoder void QuickTimeVideo::mediaHeaderDecoder(unsigned long size) { - DataBuf buf(4); + DataBuf buf(5); std::memset(buf.pData_, 0x0, buf.size_); buf.pData_[4] = '\0'; - int time_scale = 1; + int64_t time_scale = 1; for (int i = 0; size/4 != 0 ; size -=4, i++) { io_->read(buf.pData_, 4); @@ -1397,10 +1405,10 @@ namespace Exiv2 { } // QuickTimeVideo::mediaHeaderDecoder void QuickTimeVideo::trackHeaderDecoder(unsigned long size) { - DataBuf buf(4); + DataBuf buf(5); std::memset(buf.pData_, 0x0, buf.size_); buf.pData_[4] = '\0'; - uint64_t temp = 0; + int64_t temp = 0; for (int i = 0; size/4 != 0 ; size -=4, i++) { io_->read(buf.pData_, 4); @@ -1452,14 +1460,14 @@ namespace Exiv2 { break; case ImageWidth: if(currentStream_ == Video) { - temp = returnBufValue(buf, 2) + ((buf.pData_[2] * 256 + buf.pData_[3]) * 0.01); + temp = returnBufValue(buf, 2) + static_cast((buf.pData_[2] * 256 + buf.pData_[3]) * 0.01); xmpData_["Xmp.video.Width"] = temp; width_ = temp; } break; case ImageHeight: if(currentStream_ == Video) { - temp = returnBufValue(buf, 2) + ((buf.pData_[2] * 256 + buf.pData_[3]) * 0.01); + temp = returnBufValue(buf, 2) + static_cast((buf.pData_[2] * 256 + buf.pData_[3]) * 0.01); xmpData_["Xmp.video.Height"] = temp; height_ = temp; } @@ -1472,7 +1480,7 @@ namespace Exiv2 { } // QuickTimeVideo::trackHeaderDecoder void QuickTimeVideo::movieHeaderDecoder(unsigned long size) { - DataBuf buf(4); + DataBuf buf(5); std::memset(buf.pData_, 0x0, buf.size_); buf.pData_[4] = '\0'; @@ -1557,10 +1565,11 @@ namespace Exiv2 { bool matched = isQuickTimeType(buf[0], buf[1], buf[2], buf[3]); if (!advance || !matched) { - iIo.seek(0, BasicIo::beg); + iIo.seek(static_cast(0), BasicIo::beg); } return matched; } } // namespace Exiv2 + diff --git a/src/riffvideo.cpp b/src/riffvideo.cpp index 2fd001a0..93e118f7 100644 --- a/src/riffvideo.cpp +++ b/src/riffvideo.cpp @@ -537,7 +537,7 @@ namespace Exiv2 { const long bufMinSize = 4; DataBuf buf(bufMinSize); - buf.pData_[4] = '\0'; + buf.pData_[3] = '\0'; io_->read(buf.pData_, bufMinSize); xmpData_["Xmp.video.Container"] = buf.pData_; @@ -551,7 +551,7 @@ namespace Exiv2 { void RiffVideo::decodeBlock() { - const long bufMinSize = 4; + const long bufMinSize = 5; DataBuf buf(bufMinSize); DataBuf buf2(bufMinSize); unsigned long size = 0; @@ -718,7 +718,7 @@ namespace Exiv2 { void RiffVideo::skipListData() { - const long bufMinSize = 4; + const long bufMinSize = 5; DataBuf buf(bufMinSize); buf.pData_[4] = '\0'; io_->seek(-12, BasicIo::cur); @@ -854,9 +854,9 @@ namespace Exiv2 { void RiffVideo::junkHandler(long size) { const long bufMinSize = size; - DataBuf buf(bufMinSize), buf2(4); + DataBuf buf(bufMinSize), buf2(5); std::memset(buf.pData_, 0x0, buf.size_); - buf.pData_[4] = '\0'; + buf2.pData_[4] = '\0'; uint64_t cur_pos = io_->tell(); io_->read(buf.pData_, 4); @@ -922,7 +922,7 @@ namespace Exiv2 { void RiffVideo::aviHeaderTagsHandler(long size) { - const long bufMinSize = 4; + const long bufMinSize = 5; DataBuf buf(bufMinSize); buf.pData_[4] = '\0'; long width = 0, height = 0, frame_count = 0; @@ -968,7 +968,7 @@ namespace Exiv2 { void RiffVideo::streamHandler(long size) { - const long bufMinSize = 4; + const long bufMinSize = 5; DataBuf buf(bufMinSize); buf.pData_[4]='\0'; long divisor = 1; @@ -1032,7 +1032,7 @@ namespace Exiv2 { void RiffVideo::streamFormatHandler(long size) { - const long bufMinSize = 4; + const long bufMinSize = 5; DataBuf buf(bufMinSize); buf.pData_[4] = '\0'; uint64_t cur_pos = io_->tell(); @@ -1163,7 +1163,7 @@ namespace Exiv2 { if(frame_rate == 0) return; - uint64_t duration = (double)frame_count * (double)1000 / (double)frame_rate; + uint64_t duration = static_cast((double)frame_count * (double)1000 / (double)frame_rate); xmpData_["Xmp.video.FileDataRate"] = (double)io_->size()/(double)(1048576*duration); xmpData_["Xmp.video.Duration"] = duration; //Duration in number of seconds } // RiffVideo::fillDuration