void MP4RtpAtom::WriteHntiType() { // since length of string is implicit in size of atom // we need to handle this specially, and not write the terminating \0 MP4StringProperty* pSdp = (MP4StringProperty*)m_pProperties[1]; pSdp->SetFixedLength(strlen(pSdp->GetValue())); MP4Atom::Write(); pSdp->SetFixedLength(0); }
void MP4SdpAtom::Write() { // since length of string is implicit in size of atom // we need to handle this specially, and not write the terminating \0 MP4StringProperty* pSdp = (MP4StringProperty*)m_pProperties[0]; const char* sdpText = pSdp->GetValue(); if (sdpText) { pSdp->SetFixedLength(strlen(sdpText)); } MP4Atom::Write(); pSdp->SetFixedLength(0); }
FILE* MP4Track::GetSampleFile(MP4SampleId sampleId) { u_int32_t stscIndex = GetSampleStscIndex(sampleId); u_int32_t stsdIndex = m_pStscSampleDescrIndexProperty->GetValue(stscIndex); // check if the answer will be the same as last time if (m_lastStsdIndex && stsdIndex == m_lastStsdIndex) { return m_lastSampleFile; } MP4Atom* pStsdAtom = m_pTrakAtom->FindAtom("trak.mdia.minf.stbl.stsd"); ASSERT(pStsdAtom); MP4Atom* pStsdEntryAtom = pStsdAtom->GetChildAtom(stsdIndex - 1); ASSERT(pStsdEntryAtom); MP4Integer16Property* pDrefIndexProperty = NULL; pStsdEntryAtom->FindProperty( "*.dataReferenceIndex", (MP4Property**)&pDrefIndexProperty); if (pDrefIndexProperty == NULL) { throw new MP4Error("invalid stsd entry", "GetSampleFile"); } u_int32_t drefIndex = pDrefIndexProperty->GetValue(); MP4Atom* pDrefAtom = m_pTrakAtom->FindAtom("trak.mdia.minf.dinf.dref"); ASSERT(pDrefAtom); MP4Atom* pUrlAtom = pDrefAtom->GetChildAtom(drefIndex - 1); ASSERT(pUrlAtom); FILE* pFile; if (pUrlAtom->GetFlags() & 1) { pFile = NULL; // self-contained } else { #ifndef USE_FILE_CALLBACKS MP4StringProperty* pLocationProperty = NULL; pUrlAtom->FindProperty( "*.location", (MP4Property**)&pLocationProperty); ASSERT(pLocationProperty); const char* url = pLocationProperty->GetValue(); VERBOSE_READ_SAMPLE(m_pFile->GetVerbosity(), printf("dref url = %s\n", url)); pFile = (FILE*)-1; // attempt to open url if it's a file url // currently this is the only thing we understand if (!strncmp(url, "file:", 5)) { const char* fileName = url + 5; if (!strncmp(fileName, "//", 2)) { fileName = strchr(fileName + 2, '/'); } if (fileName) { pFile = fopen(fileName, "rb"); if (!pFile) { pFile = (FILE*)-1; } } } #else throw new MP4Error(errno, "Function not supported when using callbacks", "GetSampleFile"); #endif } if (m_lastSampleFile) { #ifndef USE_FILE_CALLBACKS fclose(m_lastSampleFile); #else throw new MP4Error(errno, "Function not supported when using callbacks", "GetSampleFile"); #endif } // cache the answer m_lastStsdIndex = stsdIndex; m_lastSampleFile = pFile; return pFile; }