void MP4Track::UpdateModificationTimes() { // update media and track modification times MP4Timestamp now = MP4GetAbsTimestamp(); m_pMediaModificationProperty->SetValue(now); m_pTrackModificationProperty->SetValue(now); }
void MP4MvhdAtom::Generate() { u_int8_t version = m_pFile->Use64Bits(GetType()) ? 1 : 0; SetVersion(version); AddProperties(version); MP4Atom::Generate(); // set creation and modification times MP4Timestamp now = MP4GetAbsTimestamp(); if (version == 1) { ((MP4Integer64Property*)m_pProperties[2])->SetValue(now); ((MP4Integer64Property*)m_pProperties[3])->SetValue(now); } else { ((MP4Integer32Property*)m_pProperties[2])->SetValue(now); ((MP4Integer32Property*)m_pProperties[3])->SetValue(now); } ((MP4Integer32Property*)m_pProperties[4])->SetValue(1000); ((MP4Float32Property*)m_pProperties[6])->SetValue(1.0); ((MP4Float32Property*)m_pProperties[7])->SetValue(1.0); // property reserved has non-zero fixed values static u_int8_t reserved[70] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; m_pProperties[8]->SetReadOnly(false); ((MP4BytesProperty*)m_pProperties[8])-> SetValue(reserved, sizeof(reserved)); m_pProperties[8]->SetReadOnly(true); // set next track id ((MP4Integer32Property*)m_pProperties[9])->SetValue(1); }
void MP4TkhdAtom::Generate() { uint8_t version = m_File.Use64Bits(GetType()) ? 1 : 0; SetVersion(version); AddProperties(version); MP4Atom::Generate(); MP4Timestamp now = 0; if(1) {//»ñµÃʱ¼ä now = m_File.GetAllCreateTime(); } else { // set creation and modification times now = MP4GetAbsTimestamp(); } if (version == 1) { ((MP4Integer64Property*)m_pProperties[2])->SetValue(now); ((MP4Integer64Property*)m_pProperties[3])->SetValue(now); } else { ((MP4Integer32Property*)m_pProperties[2])->SetValue(now); ((MP4Integer32Property*)m_pProperties[3])->SetValue(now); } // property "matrix" has non-zero fixed values // this default identity matrix indicates no transformation, i.e. // 1, 0, 0 // 0, 1, 0 // 0, 0, 1 // see http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap4/chapter_5_section_4.html static uint8_t matrix[36] = { 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, }; ((MP4BytesProperty*)m_pProperties[12])-> SetValue(matrix, sizeof(matrix)); }
void MP4MdhdAtom::Generate() { u_int8_t version = m_pFile->Use64Bits(GetType()) ? 1 : 0; SetVersion(version); AddProperties(version); MP4Atom::Generate(); // set creation and modification times MP4Timestamp now = MP4GetAbsTimestamp(); if (version == 1) { ((MP4Integer64Property*)m_pProperties[2])->SetValue(now); ((MP4Integer64Property*)m_pProperties[3])->SetValue(now); } else { ((MP4Integer32Property*)m_pProperties[2])->SetValue(now); ((MP4Integer32Property*)m_pProperties[3])->SetValue(now); } }
void MP4TkhdAtom::Generate() { u_int8_t version = m_pFile->Use64Bits(GetType()) ? 1 : 0; SetVersion(version); AddProperties(version); MP4Atom::Generate(); // set creation and modification times MP4Timestamp now = MP4GetAbsTimestamp(); if (version == 1) { ((MP4Integer64Property*)m_pProperties[2])->SetValue(now); ((MP4Integer64Property*)m_pProperties[3])->SetValue(now); } else { ((MP4Integer32Property*)m_pProperties[2])->SetValue(now); ((MP4Integer32Property*)m_pProperties[3])->SetValue(now); } // property reserved3 has non-zero fixed values static u_int8_t reserved3[38] = { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, }; m_pProperties[9]->SetReadOnly(false); ((MP4BytesProperty*)m_pProperties[9])-> SetValue(reserved3, sizeof(reserved3)); m_pProperties[9]->SetReadOnly(true); }
void MP4File::Make3GPCompliant(const char* fileName, char* majorBrand, u_int32_t minorVersion, char** supportedBrands, u_int32_t supportedBrandsCount, bool deleteIodsAtom) { char brand[5] = "3gp5"; char* _3gpSupportedBrands[1] = { (char*)&brand }; if (majorBrand) { if (!supportedBrands || !supportedBrandsCount) { throw new MP4Error("Invalid parameters", "MP4File::Make3GPCompliant"); } } m_fileName = MP4Stralloc(fileName); m_mode = 'r'; // first load meta-info into memory Open("rb"); ReadFromFile(); CacheProperties(); // of moov atom // now switch over to writing the new file MP4Free(m_fileName); // create a temporary file m_fileName = MP4Stralloc(TempFileName()); MakeFtypAtom( majorBrand ? majorBrand : (char*)brand, majorBrand ? minorVersion : _3GP_MINOR_VERSION, majorBrand ? supportedBrands : (char**)_3gpSupportedBrands, majorBrand ? supportedBrandsCount : 1); if (deleteIodsAtom) { // Delete the iods atom, if it exists.... MP4Atom* iodsAtom = m_pRootAtom->FindAtom("moov.iods"); if (iodsAtom) { MP4Atom* moovAtom = m_pRootAtom->FindAtom("moov"); ASSERT(moovAtom); moovAtom->DeleteChildAtom(iodsAtom); } } FILE* pReadFile = m_pFile; m_pFile = NULL; m_mode = 'w'; Open("wb"); SetIntegerProperty("moov.mvhd.modificationTime", MP4GetAbsTimestamp()); // writing meta info in the optimal order ((MP4RootAtom*)m_pRootAtom)->BeginOptimalWrite(); // write data in optimal order RewriteMdat(pReadFile, m_pFile); // finish writing ((MP4RootAtom*)m_pRootAtom)->FinishOptimalWrite(); // cleanup fclose(m_pFile); m_pFile = NULL; fclose(pReadFile); // move temporary file into place Rename(m_fileName, fileName); }