本文整理汇总了C++中XMP_IO类的典型用法代码示例。如果您正苦于以下问题:C++ XMP_IO类的具体用法?C++ XMP_IO怎么用?C++ XMP_IO使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了XMP_IO类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: WriteTempFile
void TIFF_MetaHandler::WriteTempFile ( XMP_IO* tempRef )
{
XMP_IO* origRef = this->parent->ioRef;
XMP_AbortProc abortProc = this->parent->abortProc;
void * abortArg = this->parent->abortArg;
XMP_Int64 fileLen = origRef->Length();
if ( fileLen > 0xFFFFFFFFLL ) { // Check before making a copy of the file.
XMP_Throw ( "TIFF fles can't exceed 4GB", kXMPErr_BadTIFF );
}
XMP_ProgressTracker* progressTracker = this->parent->progressTracker;
if ( progressTracker != 0 ) progressTracker->BeginWork ( (float)fileLen );
origRef->Rewind ( );
tempRef->Truncate ( 0 );
XIO::Copy ( origRef, tempRef, fileLen, abortProc, abortArg );
try {
this->parent->ioRef = tempRef; // ! Make UpdateFile update the temp.
this->UpdateFile ( false );
this->parent->ioRef = origRef;
} catch ( ... ) {
this->parent->ioRef = origRef;
throw;
}
if ( progressTracker != 0 ) progressTracker->WorkComplete();
} // TIFF_MetaHandler::WriteTempFile
开发者ID:AospPlus,项目名称:android_external_Focal,代码行数:31,代码来源:TIFF_Handler.cpp
示例2: IgnoreParam
void GIF_MetaHandler::UpdateFile ( bool doSafeUpdate )
{
IgnoreParam(doSafeUpdate);
XMP_Assert( !doSafeUpdate ); // This should only be called for "unsafe" updates.
if ( ! this->needsUpdate ) return;
XMP_IO * fileRef = this->parent->ioRef;
/*XMP_StringPtr packetStr = xmpPacket.c_str();*/
XMP_StringLen newPacketLength = (XMP_StringLen)xmpPacket.size();
if ( newPacketLength == XMPPacketLength )
{
this->SeekFile( fileRef, this->packetInfo.offset, kXMP_SeekFromStart );
fileRef->Write( this->xmpPacket.c_str(), newPacketLength );
}
else
{
XMP_IO* tempFile = fileRef->DeriveTemp();
if ( tempFile == 0 ) XMP_Throw( "Failure creating GIF temp file", kXMPErr_InternalFailure );
this->WriteTempFile( tempFile );
fileRef->AbsorbTemp();
}
this->needsUpdate = false;
} // GIF_MetaHandler::UpdateFile
开发者ID:hfiguiere,项目名称:exempi,代码行数:29,代码来源:GIF_Handler.cpp
示例3: CacheFileData
void RIFF_MetaHandler::CacheFileData()
{
this->containsXMP = false; //assume for now
XMP_IO* file = this->parent->ioRef;
this->oldFileSize = file ->Length();
if ( (this->parent->format == kXMP_WAVFile) && (this->oldFileSize > 0xFFFFFFFF) )
XMP_Throw ( "RIFF_MetaHandler::CacheFileData: WAV Files larger 4GB not supported", kXMPErr_Unimplemented );
file ->Rewind();
this->level = 0;
// parse top-level chunks (most likely just one, except large avi files)
XMP_Int64 filePos = 0;
while ( filePos < this->oldFileSize )
{
this->riffChunks.push_back( (RIFF::ContainerChunk*) RIFF::getChunk( NULL, this ) );
// Tolerate limited forms of trailing garbage in a file. Some apps append private data.
filePos = file->Offset();
XMP_Int64 fileTail = this->oldFileSize - filePos;
if ( fileTail != 0 ) {
if ( fileTail < 12 ) {
this->oldFileSize = filePos; // Pretend the file is smaller.
this->trailingGarbageSize = fileTail;
} else if ( this->parent->format == kXMP_WAVFile ) {
if ( fileTail < 1024*1024 ) {
this->oldFileSize = filePos; // Pretend the file is smaller.
this->trailingGarbageSize = fileTail;
} else {
XMP_Throw ( "Excessive garbage at end of file", kXMPErr_BadFileFormat )
}
} else {
XMP_Int32 chunkInfo [3];
file->ReadAll ( &chunkInfo, 12 );
file->Seek ( -12, kXMP_SeekFromCurrent );
if ( (GetUns32LE ( &chunkInfo[0] ) != RIFF::kChunk_RIFF) || (GetUns32LE ( &chunkInfo[2] ) != RIFF::kType_AVIX) ) {
if ( fileTail < 1024*1024 ) {
this->oldFileSize = filePos; // Pretend the file is smaller.
this->trailingGarbageSize = fileTail;
} else {
XMP_Throw ( "Excessive garbage at end of file", kXMPErr_BadFileFormat )
}
}
}
}
}
开发者ID:AospPlus,项目名称:android_external_Focal,代码行数:59,代码来源:RIFF_Handler.cpp
示例4: SafeWriteFile
bool ASF_MetaHandler::SafeWriteFile()
{
XMP_IO* originalFile = this->parent->ioRef;
XMP_IO* tempFile = originalFile->DeriveTemp();
if ( tempFile == 0 ) XMP_Throw ( "Failure creating ASF temp file", kXMPErr_InternalFailure );
this->WriteTempFile ( tempFile );
originalFile->AbsorbTemp();
return true;
} // ASF_MetaHandler::SafeWriteFile
开发者ID:vb0067,项目名称:XMPToolkitSDK,代码行数:12,代码来源:ASF_Handler.cpp
示例5: IgnoreParam
void Trivial_MetaHandler::UpdateFile ( bool doSafeUpdate )
{
IgnoreParam ( doSafeUpdate );
XMP_Assert ( ! doSafeUpdate ); // Not supported at this level.
if ( ! this->needsUpdate ) return;
XMP_IO* fileRef = this->parent->ioRef;
XMP_PacketInfo & packetInfo = this->packetInfo;
std::string & xmpPacket = this->xmpPacket;
fileRef->Seek ( packetInfo.offset, kXMP_SeekFromStart );
fileRef->Write ( xmpPacket.c_str(), packetInfo.length );
XMP_Assert ( xmpPacket.size() == (size_t)packetInfo.length );
this->needsUpdate = false;
} // Trivial_MetaHandler::UpdateFile
开发者ID:vb0067,项目名称:XMPToolkitSDK,代码行数:17,代码来源:Trivial_Handler.cpp
示例6: Chunk
// b) parse
XMPChunk::XMPChunk( ContainerChunk* parent_, RIFF_MetaHandler* handler ) : Chunk( parent_, handler, false, chunk_XMP )
{
chunkType = chunk_XMP;
XMP_IO* file = handler->parent->ioRef;
/*XMP_Uns8 level = handler->level*/;
handler->packetInfo.offset = this->oldPos + 8;
handler->packetInfo.length = (XMP_Int32) this->oldSize - 8;
handler->xmpPacket.reserve ( handler->packetInfo.length );
handler->xmpPacket.assign ( handler->packetInfo.length, ' ' );
file->ReadAll ( (void*)handler->xmpPacket.data(), handler->packetInfo.length );
handler->containsXMP = true; // last, after all possible failure
// pointer for later processing
handler->xmpChunk = this;
}
开发者ID:hfiguiere,项目名称:exempi,代码行数:19,代码来源:RIFF.cpp
示例7: XMP_Assert
void GIF_MetaHandler::WriteTempFile ( XMP_IO* tempRef )
{
XMP_Assert( this->needsUpdate );
XMP_IO* originalRef = this->parent->ioRef;
originalRef->Rewind();
tempRef->Truncate ( 0 );
if ( XMPPacketOffset != 0 )
{
// Copying blocks before XMP Application Block
XIO::Copy( originalRef, tempRef, XMPPacketOffset );
// Writing XMP Packet
tempRef->Write( this->xmpPacket.c_str(), (XMP_Uns32)this->xmpPacket.size() );
// Copying Rest of the file
originalRef->Seek( XMPPacketLength, kXMP_SeekFromCurrent );
XIO::Copy( originalRef, tempRef, originalRef->Length() - originalRef->Offset() );
}
else
{
if ( trailerOffset == 0 )
XMP_Throw( "Not able to write XMP packet in GIF file", kXMPErr_BadFileFormat );
// Copying blocks before XMP Application Block
XIO::Copy( originalRef, tempRef, trailerOffset );
// Writing Extension Introducer
XIO::WriteUns8( tempRef, kXMP_block_Extension );
// Writing Application Extension label
XIO::WriteUns8( tempRef, 0xFF );
// Writing Application Extension label
XIO::WriteUns8( tempRef, APP_ID_LEN );
// Writing Application Extension label
tempRef->Write( XMP_APP_ID_DATA, APP_ID_LEN );
// Writing XMP Packet
tempRef->Write( this->xmpPacket.c_str(), (XMP_Uns32)this->xmpPacket.size() );
// Writing Magic trailer
XMP_Uns8 magicByte = 0x01;
tempRef->Write( &magicByte, 1 );
for ( magicByte = 0xFF; magicByte != 0x00; --magicByte )
tempRef->Write( &magicByte, 1 );
tempRef->Write( &magicByte, 1 );
tempRef->Write( &magicByte, 1 );
// Copying Rest of the file
XIO::Copy( originalRef, tempRef, originalRef->Length() - originalRef->Offset() );
}
} // GIF_MetaHandler::WriteTempFile
开发者ID:hfiguiere,项目名称:exempi,代码行数:59,代码来源:GIF_Handler.cpp
示例8: XMP_Assert
void Matroska_MetaHandler::WriteTempFile(XMP_IO* tempRef)
{
XMP_Assert(needsUpdate);
XMP_IO* originalRef = parent->ioRef;
bool localProgressTracking(false);
XMP_ProgressTracker* progressTracker = parent->progressTracker;
if (progressTracker)
{
float xmpSize = static_cast<float>(xmpPacket.size());
if (progressTracker->WorkInProgress())
{
progressTracker->AddTotalWork(xmpSize);
}
else
{
localProgressTracking = true;
progressTracker->BeginWork(xmpSize);
}
}
XMP_Assert(tempRef);
XMP_Assert(originalRef);
tempRef->Rewind();
originalRef->Rewind();
XIO::Copy(originalRef, tempRef, originalRef->Length(), parent->abortProc, parent->abortArg);
try
{
parent->ioRef = tempRef; // ! Fool UpdateFile into using the temp file.
UpdateFile(false);
parent->ioRef = originalRef;
}
catch (...)
{
parent->ioRef = originalRef;
throw;
}
if (localProgressTracking) progressTracker->WorkComplete();
}
开发者ID:SSE4,项目名称:vmf-1,代码行数:42,代码来源:Matroska_Handler.cpp
示例9:
// parsing creation
Chunk::Chunk( ContainerChunk* parent_, RIFF_MetaHandler* handler, bool skip, ChunkType c )
{
chunkType = c; // base class assumption
this->parent = parent_;
this->oldSize = 0;
this->hasChange = false; // [2414649] valid assumption at creation time
XMP_IO* file = handler->parent->ioRef;
this->oldPos = file->Offset();
this->id = XIO::ReadUns32_LE( file );
this->oldSize = XIO::ReadUns32_LE( file );
this->oldSize += 8;
// Make sure the size is within expected bounds.
XMP_Int64 chunkEnd = this->oldPos + this->oldSize;
XMP_Int64 chunkLimit = handler->oldFileSize;
if ( parent_ != 0 ) chunkLimit = parent_->oldPos + parent_->oldSize;
if ( chunkEnd > chunkLimit ) {
bool isUpdate = XMP_OptionIsSet ( handler->parent->openFlags, kXMPFiles_OpenForUpdate );
bool repairFile = XMP_OptionIsSet ( handler->parent->openFlags, kXMPFiles_OpenRepairFile );
if ( (! isUpdate) || (repairFile && (parent_ == 0)) ) {
this->oldSize = chunkLimit - this->oldPos;
} else {
XMP_Throw ( "Bad RIFF chunk size", kXMPErr_BadFileFormat );
}
}
this->newSize = this->oldSize;
this->needSizeFix = false;
if ( skip ) file->Seek ( (this->oldSize - 8), kXMP_SeekFromCurrent );
// "good parenting", essential for latter destruction.
if ( this->parent != NULL )
{
this->parent->children.push_back( this );
if( this->chunkType == chunk_VALUE )
this->parent->childmap.insert( std::make_pair( this->id, (ValueChunk*) this ) );
}
}
开发者ID:hfiguiere,项目名称:exempi,代码行数:42,代码来源:RIFF.cpp
示例10: CacheFileData
void GIF_MetaHandler::CacheFileData()
{
this->containsXMP = false;
XMP_IO * fileRef = this->parent->ioRef;
// Try to navigate through the blocks to find the XMP block.
if ( this->ParseGIFBlocks( fileRef ) )
{
// XMP packet present
this->xmpPacket.assign( XMPPacketLength, ' ' );
// 13 bytes for the block size and 2 bytes for Extension ID and Label
this->SeekFile( fileRef, XMPPacketOffset, kXMP_SeekFromStart );
fileRef->ReadAll( ( void* )this->xmpPacket.data(), XMPPacketLength );
this->packetInfo.offset = XMPPacketOffset;
this->packetInfo.length = XMPPacketLength;
this->containsXMP = true;
}
// else no XMP
} // GIF_MetaHandler::CacheFileData
开发者ID:hfiguiere,项目名称:exempi,代码行数:23,代码来源:GIF_Handler.cpp
示例11: UpdateXMP
void Matroska_MetaHandler::UpdateXMP()
{
XMP_IO* fileRef = parent->ioRef;
fileRef->Seek(fileRef->Length(), kXMP_SeekFromStart);
for (auto segment : _dom->_root->getElementsById(kSegment))
{
for (auto tags : segment->getElementsById(kTags))
{
for (auto tag : tags->getElementsById(kTag))
{
for (auto simple_tag : tag->getElementsById(kSimpleTag))
{
auto tag_name = simple_tag->getElementById(kTagName);
if (tag_name->_value.StringValue == "XMP")
{
auto tag_string = simple_tag->getElementById(kTagString);
// we have found valid XMP, and if it's in the very end of file, we can truncate segment
if (tag_string->_offset + tag_string->size() == fileRef->Length())
{
segment->_size._value -= tags->size();
fileRef->Truncate(tags->_offset);
fileRef->Seek(tags->_offset, kXMP_SeekFromStart);
}
// otherwise, make old XMP tag Void and create new one from the scratch
else
{
tags->wipe(fileRef);
}
}
}
}
}
}
auto segments = _dom->_root->getElementsById(kSegment);
auto segment = segments.back();
auto tag_name = std::make_shared<ebml_element_t>(kTagName, ebml_variant_t("XMP"));
auto tag_string = std::make_shared<ebml_element_t>(kTagString, ebml_variant_t(xmpPacket));
auto tag_language = std::make_shared<ebml_element_t>(kTagLanguage, ebml_variant_t("eng"));
auto tag_default = std::make_shared<ebml_element_t>(kTagDefault, ebml_variant_t(1ULL));
auto simple_tag = std::make_shared<ebml_element_t>(kSimpleTag, ebml_element_t::vec{ tag_language, tag_default, tag_name, tag_string });
auto tag = std::make_shared<ebml_element_t>(kTag, simple_tag);
auto tags = std::make_shared<ebml_element_t>(kTags, tag);
tags->write(fileRef);
segment->_size._value += tags->size();
segment->update_header(fileRef);
}
开发者ID:SSE4,项目名称:vmf-1,代码行数:53,代码来源:Matroska_Handler.cpp
示例12: XMP_Assert
void FLV_MetaHandler::UpdateFile ( bool doSafeUpdate )
{
if ( ! this->needsUpdate ) return;
XMP_Assert ( ! doSafeUpdate ); // This should only be called for "unsafe" updates.
XMP_AbortProc abortProc = this->parent->abortProc;
void * abortArg = this->parent->abortArg;
const bool checkAbort = (abortProc != 0);
XMP_IO* fileRef = this->parent->ioRef;
XMP_Uns64 fileSize = fileRef->Length();
// Make sure the XMP has a legacy digest if appropriate.
if ( ! this->onMetaData.empty() ) {
std::string newDigest;
this->MakeLegacyDigest ( &newDigest );
this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests",
kXMP_NS_XMP, "FLV", newDigest.c_str(), kXMP_DeleteExisting );
try {
XMP_StringLen xmpLen = (XMP_StringLen)this->xmpPacket.size();
this->xmpObj.SerializeToBuffer ( &this->xmpPacket, (kXMP_UseCompactFormat | kXMP_ExactPacketLength), xmpLen );
} catch ( ... ) {
this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
}
}
// Rewrite the packet in-place if it fits. Otherwise rewrite the whole file.
if ( this->xmpPacket.size() == (size_t)this->packetInfo.length ) {
XMP_ProgressTracker* progressTracker = this->parent->progressTracker;
if ( progressTracker != 0 ) progressTracker->BeginWork ( (float)this->xmpPacket.size() );
fileRef->Seek ( this->packetInfo.offset, kXMP_SeekFromStart );
fileRef->Write ( this->xmpPacket.data(), (XMP_Int32)this->xmpPacket.size() );
if ( progressTracker != 0 ) progressTracker->WorkComplete();
} else {
XMP_IO* tempRef = fileRef->DeriveTemp();
if ( tempRef == 0 ) XMP_Throw ( "Failure creating FLV temp file", kXMPErr_InternalFailure );
this->WriteTempFile ( tempRef );
fileRef->AbsorbTemp();
}
this->needsUpdate = false;
} // FLV_MetaHandler::UpdateFile
开发者ID:vb0067,项目名称:XMPToolkitSDK,代码行数:53,代码来源:FLV_Handler.cpp
示例13: CacheFileData
void InDesign_MetaHandler::CacheFileData()
{
XMP_IO* fileRef = this->parent->ioRef;
XMP_PacketInfo & packetInfo = this->packetInfo;
XMP_Assert ( kINDD_PageSize == sizeof(InDesignMasterPage) );
static const size_t kBufferSize = (2 * kINDD_PageSize);
XMP_Uns8 buffer [kBufferSize];
size_t dbPages;
XMP_Uns8 cobjEndian;
XMP_AbortProc abortProc = this->parent->abortProc;
void * abortArg = this->parent->abortArg;
const bool checkAbort = (abortProc != 0);
this->containsXMP = false;
// ---------------------------------------------------------------------------------
// Figure out which master page is active and seek to the contiguous object portion.
{
fileRef->Rewind();
fileRef->ReadAll ( buffer, (2 * kINDD_PageSize) );
InDesignMasterPage * masters = (InDesignMasterPage *) &buffer[0];
XMP_Uns64 seq0 = GetUns64LE ( (XMP_Uns8 *) &masters[0].fSequenceNumber );
XMP_Uns64 seq1 = GetUns64LE ( (XMP_Uns8 *) &masters[1].fSequenceNumber );
dbPages = GetUns32LE ( (XMP_Uns8 *) &masters[0].fFilePages );
cobjEndian = masters[0].fObjectStreamEndian;
if ( seq1 > seq0 ) {
dbPages = GetUns32LE ( (XMP_Uns8 *) &masters[1].fFilePages );
cobjEndian = masters[1].fObjectStreamEndian;
}
}
XMP_Assert ( ! this->streamBigEndian );
if ( cobjEndian == kINDD_BigEndian ) this->streamBigEndian = true;
// ---------------------------------------------------------------------------------------------
// Look for the XMP contiguous object. Each contiguous object has a header and trailer, both of
// the InDesignContigObjMarker structure. The stream size in the header/trailer is the number of
// data bytes between the header and trailer. The XMP stream begins with a 4 byte size of the
// XMP packet. Yes, this is the contiguous object data size minus 4 - silly but true. The XMP
// must have a packet wrapper, the leading xpacket PI is used as the marker of XMP.
XMP_Int64 cobjPos = (XMP_Int64)dbPages * kINDD_PageSize; // ! Use a 64 bit multiply!
cobjPos -= (2 * sizeof(InDesignContigObjMarker)); // ! For the first pass in the loop.
XMP_Uns32 streamLength = 0; // ! For the first pass in the loop.
while ( true ) {
if ( checkAbort && abortProc(abortArg) ) {
XMP_Throw ( "InDesign_MetaHandler::LocateXMP - User abort", kXMPErr_UserAbort );
}
// Fetch the start of the next stream and check the contiguous object header.
// ! The writeable bit of fObjectClassID is ignored, we use the packet trailer flag.
cobjPos += streamLength + (2 * sizeof(InDesignContigObjMarker));
fileRef->Seek ( cobjPos, kXMP_SeekFromStart );
fileRef->ReadAll ( buffer, sizeof(InDesignContigObjMarker) );
const InDesignContigObjMarker * cobjHeader = (const InDesignContigObjMarker *) &buffer[0];
if ( ! CheckBytes ( Uns8Ptr(&cobjHeader->fGUID), kINDDContigObjHeaderGUID, kInDesignGUIDSize ) ) break; // Not a contiguous object header.
this->xmpObjID = cobjHeader->fObjectUID; // Save these now while the buffer is good.
this->xmpClassID = cobjHeader->fObjectClassID;
streamLength = GetUns32LE ( (XMP_Uns8 *) &cobjHeader->fStreamLength );
// See if this is the XMP stream.
if ( streamLength < (4 + kUTF8_PacketHeaderLen + kUTF8_PacketTrailerLen) ) continue; // Too small, can't possibly be XMP.
fileRef->ReadAll ( buffer, (4 + kUTF8_PacketHeaderLen) );
XMP_Uns32 innerLength = GetUns32LE ( &buffer[0] );
if ( this->streamBigEndian ) innerLength = GetUns32BE ( &buffer[0] );
if ( innerLength != (streamLength - 4) ) {
// Be tolerant of a mistake with the endian flag.
innerLength = Flip4 ( innerLength );
if ( innerLength != (streamLength - 4) ) continue; // Not legit XMP.
}
XMP_Uns8 * chPtr = &buffer[4];
size_t startLen = strlen((char*)kUTF8_PacketStart);
size_t idLen = strlen((char*)kUTF8_PacketID);
if ( ! CheckBytes ( chPtr, kUTF8_PacketStart, startLen ) ) continue;
chPtr += startLen;
XMP_Uns8 quote = *chPtr;
if ( (quote != '\'') && (quote != '"') ) continue;
chPtr += 1;
if ( *chPtr != quote ) {
if ( ! CheckBytes ( chPtr, Uns8Ptr("\xEF\xBB\xBF"), 3 ) ) continue;
chPtr += 3;
}
if ( *chPtr != quote ) continue;
chPtr += 1;
//.........这里部分代码省略.........
开发者ID:vb0067,项目名称:XMPToolkitSDK,代码行数:101,代码来源:InDesign_Handler.cpp
示例14: XMP_Assert
void TIFF_MetaHandler::UpdateFile ( bool doSafeUpdate )
{
XMP_Assert ( ! doSafeUpdate ); // This should only be called for "unsafe" updates.
XMP_IO* destRef = this->parent->ioRef;
XMP_AbortProc abortProc = this->parent->abortProc;
void * abortArg = this->parent->abortArg;
XMP_Int64 oldPacketOffset = this->packetInfo.offset;
XMP_Int32 oldPacketLength = this->packetInfo.length;
if ( oldPacketOffset == kXMPFiles_UnknownOffset ) oldPacketOffset = 0; // ! Simplify checks.
if ( oldPacketLength == kXMPFiles_UnknownLength ) oldPacketLength = 0;
bool fileHadXMP = ((oldPacketOffset != 0) && (oldPacketLength != 0));
// Update the IPTC-IIM and native TIFF/Exif metadata. ExportPhotoData also trips the tiff: and
// exif: copies from the XMP, so reserialize the now final XMP packet.
ExportPhotoData ( kXMP_TIFFFile, &this->xmpObj, &this->tiffMgr, this->iptcMgr, this->psirMgr );
try {
XMP_OptionBits options = kXMP_UseCompactFormat;
if ( fileHadXMP ) options |= kXMP_ExactPacketLength;
this->xmpObj.SerializeToBuffer ( &this->xmpPacket, options, oldPacketLength );
} catch ( ... ) {
this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat );
}
// Decide whether to do an in-place update. This can only happen if all of the following are true:
// - There is an XMP packet in the file.
// - The are no changes to the legacy tags. (The IPTC and PSIR are in the TIFF tags.)
// - The new XMP can fit in the old space.
bool doInPlace = (fileHadXMP && (this->xmpPacket.size() <= (size_t)oldPacketLength));
if ( this->tiffMgr.IsLegacyChanged() ) doInPlace = false;
bool localProgressTracking = false;
XMP_ProgressTracker* progressTracker = this->parent->progressTracker;
if ( ! doInPlace ) {
#if GatherPerformanceData
sAPIPerf->back().extraInfo += ", TIFF append update";
#endif
if ( (progressTracker != 0) && (! progressTracker->WorkInProgress()) ) {
localProgressTracking = true;
progressTracker->BeginWork();
}
this->tiffMgr.SetTag ( kTIFF_PrimaryIFD, kTIFF_XMP, kTIFF_UndefinedType, (XMP_Uns32)this->xmpPacket.size(), this->xmpPacket.c_str() );
this->tiffMgr.UpdateFileStream ( destRef, progressTracker );
} else {
#if GatherPerformanceData
sAPIPerf->back().extraInfo += ", TIFF in-place update";
#endif
if ( this->xmpPacket.size() < (size_t)this->packetInfo.length ) {
// They ought to match, cheap to be sure.
size_t extraSpace = (size_t)this->packetInfo.length - this->xmpPacket.size();
this->xmpPacket.append ( extraSpace, ' ' );
}
XMP_IO* liveFile = this->parent->ioRef;
XMP_Assert ( this->xmpPacket.size() == (size_t)oldPacketLength ); // ! Done by common PutXMP logic.
if ( progressTracker != 0 ) {
if ( progressTracker->WorkInProgress() ) {
progressTracker->AddTotalWork ( this->xmpPacket.size() );
} else {
localProgressTracking = true;
progressTracker->BeginWork ( this->xmpPacket.size() );
}
}
liveFile->Seek ( oldPacketOffset, kXMP_SeekFromStart );
liveFile->Write ( this->xmpPacket.c_str(), (XMP_Int32)this->xmpPacket.size() );
}
if ( localProgressTracking ) progressTracker->WorkComplete();
this->needsUpdate = false;
} // TIFF_MetaHandler::UpdateFile
开发者ID:AospPlus,项目名称:android_external_Focal,代码行数:88,代码来源:TIFF_Handler.cpp
示例15: while
void MP3_MetaHandler::CacheFileData()
{
//*** abort procedures
this->containsXMP = false; //assume no XMP for now
XMP_IO* file = this->parent->ioRef;
XMP_PacketInfo &packetInfo = this->packetInfo;
file->Rewind();
this->hasID3Tag = this->id3Header.read( file );
this->majorVersion = this->id3Header.fields[ID3Header::o_vMajor];
this->minorVersion = this->id3Header.fields[ID3Header::o_vMinor];
this->hasExtHeader = (0 != ( 0x40 & this->id3Header.fields[ID3Header::o_flags])); //'naturally' false if no ID3Tag
this->hasFooter = ( 0 != ( 0x10 & this->id3Header.fields[ID3Header::o_flags])); //'naturally' false if no ID3Tag
// stored size is w/o initial header (thus adding 10)
// + but extended header (if existing)
// + padding + frames after unsynchronisation (?)
// (if no ID3 tag existing, constructed default correctly sets size to 10.)
this->oldTagSize = ID3Header::kID3_TagHeaderSize + synchToInt32(GetUns32BE( &id3Header.fields[ID3Header::o_size] ));
if ( ! hasExtHeader ) {
this->extHeaderSize = 0; // := there is no such header.
} else {
this->extHeaderSize = synchToInt32( XIO::ReadInt32_BE( file));
XMP_Uns8 extHeaderNumFlagBytes = XIO::ReadUns8( file );
// v2.3 doesn't include the size, while v2.4 does
if ( this->majorVersion < 4 ) this->extHeaderSize += 4;
XMP_Validate( this->extHeaderSize >= 6, "extHeader size too small", kXMPErr_BadFileFormat );
file->Seek ( this->extHeaderSize - 6, kXMP_SeekFromCurrent );
}
this->framesVector.clear(); //mac precaution
ID3v2Frame* curFrame = 0; // reusable
////////////////////////////////////////////////////
// read frames
XMP_Uns32 xmpID = XMP_V23_ID;
if ( this->majorVersion == 2 ) xmpID = XMP_V22_ID;
while ( file->Offset() < this->oldTagSize ) {
curFrame = new ID3v2Frame();
try {
XMP_Int64 frameSize = curFrame->read ( file, this->majorVersion );
if ( frameSize == 0 ) {
delete curFrame; // ..since not becoming part of vector for latter delete.
break; // not a throw. There's nothing wrong with padding.
}
this->containsXMP = true;
} catch ( ... ) {
delete curFrame;
throw;
}
// these are both pointer assignments, no (copy) construction
// (MemLeak Note: for all things pushed, memory cleanup is taken care of in destructor.)
this->framesVector.push_back ( curFrame );
//remember XMP-Frame, if it occurs:
if ( (curFrame->id ==xmpID) &&
(curFrame->contentSize > 8) && CheckBytes ( &curFrame->content[0], "XMP\0", 4 ) ) {
// be sure that this is the first packet (all else would be illegal format)
XMP_Validate ( this->framesMap[xmpID] == 0, "two XMP packets in one file", kXMPErr_BadFileFormat );
//add this to map, needed on reconciliation
this->framesMap[xmpID] = curFrame;
this->packetInfo.length = curFrame->contentSize - 4; // content minus "XMP\0"
this->packetInfo.offset = ( file->Offset() - this->packetInfo.length );
this->xmpPacket.erase(); //safety
this->xmpPacket.assign( &curFrame->content[4], curFrame->contentSize - 4 );
this->containsXMP = true; // do this last, after all possible failure
}
// No space for another frame? => assume into ID3v2.4 padding.
XMP_Int64 newPos = file->Offset();
XMP_Int64 spaceLeft = this->oldTagSize - newPos; // Depends on first check below!
if ( (newPos > this->oldTagSize) || (spaceLeft < (XMP_Int64)ID3Header::kID3_TagHeaderSize) ) break;
}
////////////////////////////////////////////////////
// padding
this->oldPadding = this->oldTagSize - file->Offset();
this->oldFramesSize = this->oldTagSize - ID3Header::kID3_TagHeaderSize - this->oldPadding;
//.........这里部分代码省略.........
开发者ID:VikingDen,项目名称:android_external_Focal,代码行数:101,代码来源:MP3_Handler.cpp
示例16: CacheFileData
void JPEG_MetaHandler::CacheFileData()
{
XMP_IO* fileRef = this->parent->ioRef;
XMP_PacketInfo & packetInfo = this->packetInfo;
static const size_t kBufferSize = 64*1024; // Enough for maximum segment contents.
XMP_Uns8 buffer [kBufferSize];
psirContents.clear();
exifContents.clear();
XMP_AbortProc abortProc = this->parent->abortProc;
void * abortArg = this->parent->abortArg;
const bool checkAbort = (abortProc != 0);
ExtendedXMPInfo extXMP;
XMP_Assert ( ! this->containsXMP );
// Set containsXMP to true here only if the standard XMP packet is found.
XMP_Assert ( kPSIRSignatureLength == (strlen(kPSIRSignatureString) + 1) );
XMP_Assert ( kMainXMPSignatureLength == (strlen(kMainXMPSignatureString) + 1) );
XMP_Assert ( kExtXMPSignatureLength == (strlen(kExtXMPSignatureString) + 1) );
// -------------------------------------------------------------------------------------------
// Look for any of the Exif, PSIR, main XMP, or extended XMP marker segments. Quit when we hit
// an SOFn, EOI, or invalid/unexpected marker.
fileRef->Seek ( 2, kXMP_SeekFromStart ); // Skip the SOI, CheckFormat made sure it is present.
while ( true ) {
if ( checkAbort && abortProc(abortArg) ) {
XMP_Throw ( "JPEG_MetaHandler::CacheFileData - User abort", kXMPErr_UserAbort );
}
if ( ! XIO::CheckFileSpace ( fileRef, 2 ) ) return; // Quit, don't throw, if the file ends unexpectedly.
XMP_Uns16 marker = XIO::ReadUns16_BE ( fileRef ); // Read the next marker.
if ( marker == 0xFFFF ) {
// Have a pad byte, skip it. These are almost unheard of, so efficiency isn't critical.
fileRef->Seek ( -1, kXMP_SeekFromCurrent ); // Skip the first 0xFF, read the second again.
continue;
}
if ( (marker == 0xFFDA) || (marker == 0xFFD9) ) break; // Quit reading at the first SOS marker or at EOI.
if ( (marker == 0xFF01) || // Ill-formed file if we encounter a TEM or RSTn marker.
((0xFFD0 <= marker) && (marker <= 0xFFD7)) ) return;
XMP_Uns16 contentLen = XIO::ReadUns16_BE ( fileRef ); // Read this segment's length.
if ( contentLen < 2 ) XMP_Throw ( "Invalid JPEG segment length", kXMPErr_BadJPEG );
contentLen -= 2; // Reduce to just the content length.
XMP_Int64 contentOrigin = fileRef->Offset();
size_t signatureLen;
if ( (marker == 0xFFED) && (contentLen >= kPSIRSignatureLength) ) {
// This is an APP13 marker, is it the Photoshop image resources?
signatureLen = fileRef->Read ( buffer, kPSIRSignatureLength );
if ( (signatureLen == kPSIRSignatureLength) &&
CheckBytes ( &buffer[0], kPSIRSignatureString, kPSIRSignatureLength ) ) {
size_t psirLen = contentLen - kPSIRSignatureLength;
fileRef->Seek ( (contentOrigin + kPSIRSignatureLength), kXMP_SeekFromStart );
fileRef->ReadAll ( buffer, psirLen );
this->psirContents.append( (char *) buffer, psirLen );
continue; // Move on to the next marker.
}
} else if ( (marker == 0xFFE1) && (contentLen >= kExifSignatureLength) ) { // Check for the shortest signature.
// This is an APP1 marker, is it the Exif, main XMP, or extended XMP?
// ! Check in that order, which is in increasing signature string length.
XMP_Assert ( (kExifSignatureLength < kMainXMPSignatureLength) &&
(kMainXMPSignatureLength < kExtXMPSignatureLength) );
signatureLen = fileRef->Read ( buffer, kExtXMPSignatureLength ); // Read for the longest signature.
if ( (signatureLen >= kExifSignatureLength) &&
(CheckBytes ( &buffer[0], kExifSignatureString, kExifSignatureLength ) ||
CheckBytes ( &buffer[0], kExifSignatureAltStr, kExifSignatureLength )) ) {
size_t exifLen = contentLen - kExifSignatureLength;
fileRef->Seek ( (contentOrigin + kExifSignatureLength), kXMP_SeekFromStart );
fileRef->ReadAll ( buffer, exifLen );
this->exifContents.append ( (char*)buffer, exifLen );
continue; // Move on to the next marker.
}
if ( (signatureLen >= kMainXMPSignatureLength) &&
CheckBytes ( &buffer[0], kMainXMPSignatureString, kMainXMPSignatureLength ) ) {
this->containsXMP = true; // Found the standard XMP packet.
size_t xmpLen = contentLen - kMainXMPSignatureLength;
fileRef->Seek ( (contentOrigin + kMainXMPSignatureLength), kXMP_SeekFromStart );
//.........这里部分代码省略.........
开发者ID:yanburman,项目名称:xmp_sdk,代码行数:101,代码来源:JPEG_Handler.cpp
示例17: frame
// =================================================================================================
// MP3_MetaHandler::UpdateFile
// ===========================
void MP3_MetaHandler::UpdateFile ( bool doSafeUpdate )
{
if ( doSafeUpdate ) XMP_Throw ( "MP3_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable );
XMP_IO* file = this->parent->ioRef;
// leave 2.3 resp. 2.4 header, since we want to let alone
// and don't know enough about the encoding of unrelated frames...
XMP_Assert( this->containsXMP );
tagIsDirty = false;
mustShift = false;
// write out native properties:
// * update existing ones
// * create new frames as needed
// * delete frames if property is gone!
// see what there is to do for us:
// RECON LOOP START
for (int r = 0; reconProps[r].mainID != 0; r++ ) {
std::string value;
bool needDescriptor = false;
bool needEncodingByte = true;
XMP_Uns32 logicalID = GetUns32BE ( reconProps[r].mainID );
XMP_Uns32 storedID = logicalID;
if ( this->majorVersion == 2 ) storedID = GetUns32BE ( reconProps[r].v22ID );
ID3v2Frame* frame = framesMap[ storedID ]; // the actual frame (if already existing)
// get XMP property
// * honour specific exceptions
// * leave value empty() if it doesn't exist ==> frame must be delete/not created
switch ( logicalID ) {
case 0x54434D50: // TCMP if exists: part of compilation
if ( xmpObj.GetProperty( kXMP_NS_DM, "partOfCompilation", &value, 0 ) && ( 0 == stricmp( value.c_str(), "true" ) )) {
value = "1"; // set a TCMP frame of value 1
} else {
value.erase(); // delete/prevent creation of frame
}
break;
case 0x54495432: // TIT2 -> title["x-default"]
case 0x54434F50: // TCOP -> rights["x-default"]
if (! xmpObj.GetLocalizedText( reconProps[r].ns, reconProps[r].prop, "", "x-default", 0, &value, 0 )) value.erase(); // if not, erase string.
break;
case 0x54434F4E: // TCON -> genre
{
bool found = xmpObj.GetProperty ( reconProps[r].ns, reconProps[r].prop, &value, 0 );
if ( found ) {
std::string xmpValue = value;
ID3_Support::GenreUtils::ConvertGenreToID3 ( xmpValue.c_str(), &value );
}
}
break;
case 0x434F4D4D: // COMM
case 0x55534C54: // USLT, both need descriptor.
needDescriptor = true;
if (! xmpObj.GetProperty( reconProps[r].ns, reconProps[r].prop, &value, 0 )) value.erase();
break;
case 0x54594552: //TYER
case 0x54444154: //TDAT
case 0x54494D45: //TIME
{
if ( majorVersion <= 3 ) { // TYER, TIME and TDAT depricated since v. 2.4 -> else use TDRC
XMP_DateTime dateTime;
if (! xmpObj.GetProperty_Date( reconProps[r].ns, reconProps[r].prop, &dateTime, 0 )) { // nothing found? -> Erase string. (Leads to Unset below)
value.erase();
break;
}
// TYER
if ( logicalID == 0x54594552 ) {
XMP_Validate( dateTime.year <= 9999 && dateTime.year > 0, "Year is out of range", kXMPErr_BadParam);
// get only Year!
SXMPUtils::ConvertFromInt( dateTime.year, "", &value );
break;
} else if ( logicalID == 0x54444154 && dateTime.hasDate ) {
std::string day, month;
SXMPUtils::ConvertFromInt( dateTime.day, "", &day );
SXMPUtils::ConvertFromInt( dateTime.month, "", &month );
if ( dateTime.day < 10 )
value = "0";
value += day;
if ( dateTime.month < 10 )
value += "0";
value += month;
break;
} else if ( logicalID == 0x54494D45 && dateTime.hasTime ) {
std::string hour, minute;
//.........这里部分代码省略.........
开发者ID:VikingDen,项目名称:android_external_Focal,代码行数:101,代码来源:MP3_Handler.cpp
示例18: getChunk
Chunk* getChunk ( ContainerChunk* parent, RIFF_MetaHandler* handler )
{
XMP_IO* file = handler->parent->ioRef;
XMP_Uns8 level = handler->level;
XMP_Uns32 peek = XIO::PeekUns32_LE ( file );
if ( level == 0 )
{
XMP_Validate( peek == kChunk_RIFF, "expected RIFF chunk not found", kXMPErr_BadFileFormat );
XMP_Enforce( parent == NULL );
}
else
{
XMP_Validate( peek != kChunk_RIFF, "unexpected RIFF chunk below top-level", kXMPErr_BadFileFormat );
XMP_Enforce( parent != NULL );
}
switch( peek )
{
case kChunk_RIFF:
return new ContainerChunk( parent, handler );
case kChunk_LIST:
{
if ( level != 1 ) break; // only care on this level
// look further (beyond 4+4 = beyond id+size) to check on relevance
file->Seek ( 8, kXMP_SeekFromCurrent );
XMP_Uns32 containerType = XIO::PeekUns32_LE ( file );
file->Seek ( -8, kXMP_SeekFromCurrent );
bool isRelevantList = ( containerType== kType_INFO || containerType == kType_Tdat || containerType == kType_hdrl );
if ( !isRelevantList ) break;
return new ContainerChunk( parent, handler );
}
case kChunk_XMP:
if ( level != 1 ) break; // ignore on inappropriate levels (might be compound metadata?)
return new XMPChunk( parent, handler );
case kChunk_DISP:
{
if ( level != 1 ) break; // only care on this level
// peek even further to see if type is 0x001 and size is reasonable
file ->Seek ( 4, kXMP_SeekFromCurrent ); // jump DISP
XMP_Uns32 dispSize = XIO::ReadUns32_LE( file );
XMP_Uns32 dispType = XIO::ReadUns32_LE( file );
file ->Seek ( -12, kXMP_SeekFromCurrent ); // rewind, be in front of chunkID again
// only take as a relevant disp if both criteria met,
// otherwise treat as generic chunk!
if ( (dispType == 0x0001) && ( dispSize < 256 * 1024 ) )
{
ValueChunk* r = new ValueChunk( parent, handler );
handler->dispChunk = r;
return r;
}
break; // treat as irrelevant (non-0x1) DISP chunks as generic chunk
}
case kChunk_bext:
{
if ( level != 1 ) break; // only care on this level
// store for now in a value chunk
ValueChunk* r = new ValueChunk( parent, handler );
handler->bextChunk = r;
return r;
}
case kChunk_PrmL:
{
if ( level != 1 ) break; // only care on this level
ValueChunk* r = new ValueChunk( parent, handler );
handler->prmlChunk = r;
return r;
}
case kChunk_Cr8r:
{
if ( level != 1 ) break; // only care on this level
ValueChunk* r = new ValueChunk( parent, handler );
handler->cr8rChunk = r;
return r;
}
case kChunk_JUNQ:
case kChunk_JUNK:
{
JunkChunk* r = new JunkChunk( parent, handler );
return r;
}
case kChunk_IDIT:
{
if ( level != 2 ) break; // only care on this level
ValueChunk* r = new ValueChunk( parent, handler );
handler->iditChunk = r;
return r;
}
}
// this "default:" section must be ouside switch bracket, to be
// reachable by all those break statements above:
// digest 'valuable' container chunks: LIST:INFO, LIST:Tdat
bool insideRelevantList = ( level==2 && parent->id == kChunk_LIST
&& ( parent->containerType== kType_INFO || parent->containerType == kType_Tdat ));
//......
|
请发表评论