本文整理汇总了C++中AP4_Sample::SetDuration方法的典型用法代码示例。如果您正苦于以下问题:C++ AP4_Sample::SetDuration方法的具体用法?C++ AP4_Sample::SetDuration怎么用?C++ AP4_Sample::SetDuration使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类AP4_Sample
的用法示例。
在下文中一共展示了AP4_Sample::SetDuration方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: if
/*----------------------------------------------------------------------
| AP4_AtomSampleTable::GetSample
+---------------------------------------------------------------------*/
AP4_Result
AP4_AtomSampleTable::GetSample(AP4_Ordinal index,
AP4_Sample& sample)
{
AP4_Result result;
// check that we have a chunk offset table
if (m_StcoAtom == NULL && m_Co64Atom == NULL) {
return AP4_ERROR_INVALID_FORMAT;
}
// MP4 uses 1-based indexes internally, so adjust by one
index++;
// find out in which chunk this sample is located
AP4_Ordinal chunk, skip, desc;
result = m_StscAtom->GetChunkForSample(index, chunk, skip, desc);
if (AP4_FAILED(result)) return result;
// check that the result is within bounds
if (skip > index) return AP4_ERROR_INTERNAL;
// get the atom offset for this chunk
AP4_Offset offset = 0;
if (m_StcoAtom) result = m_StcoAtom->GetChunkOffset(chunk, offset);
else if (m_Co64Atom) result = m_Co64Atom->GetChunkOffset(chunk, offset);
else result = AP4_ERROR_INTERNAL;
if (AP4_FAILED(result)) return result;
/*
// compute the additional offset inside the chunk
for (unsigned int i = index-skip; i < index; i++) {
AP4_Size size;
result = m_StszAtom->GetSampleSize(i, size);
if (AP4_FAILED(result)) return result;
offset += size;
}
*/
AP4_Size size;
result = m_StszAtom->GetSampleSize(index - skip, index, size);
if (AP4_FAILED(result)) return result;
offset += size;
// set the description index
sample.SetDescriptionIndex(desc-1); // adjust for 0-based indexes
// set the dts and cts
AP4_TimeStamp dts;
AP4_Duration duration;
result = m_SttsAtom->GetDts(index, dts, duration);
if (AP4_FAILED(result)) return result;
sample.SetDts(dts);
sample.SetDuration(duration);
if (m_CttsAtom == NULL) {
sample.SetCts(dts);
} else {
AP4_UI32 cts_offset;
result = m_CttsAtom->GetCtsOffset(index, cts_offset);
if (AP4_FAILED(result)) return result;
sample.SetCts(dts + *((signed long*)&cts_offset)); // HACK: it shouldn't be signed, but such files exist unfortunatelly
}
// set the size
AP4_Size sample_size;
result = m_StszAtom->GetSampleSize(index, sample_size);
if (AP4_FAILED(result)) return result;
sample.SetSize(sample_size);
// set the offset
sample.SetOffset(offset);
// set the data stream
sample.SetDataStream(m_SampleStream);
return AP4_SUCCESS;
}