本文整理汇总了C++中AP4_Sample::GetDts方法的典型用法代码示例。如果您正苦于以下问题:C++ AP4_Sample::GetDts方法的具体用法?C++ AP4_Sample::GetDts怎么用?C++ AP4_Sample::GetDts使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类AP4_Sample
的用法示例。
在下文中一共展示了AP4_Sample::GetDts方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: fprintf
/*----------------------------------------------------------------------
| AutoDetectFragmentDuration
+---------------------------------------------------------------------*/
static unsigned int
AutoDetectFragmentDuration(TrackCursor* cursor)
{
AP4_Sample sample;
unsigned int sample_count = cursor->m_Samples->GetSampleCount();
// get the first sample as the starting point
AP4_Result result = cursor->m_Samples->GetSample(0, sample);
if (AP4_FAILED(result)) {
fprintf(stderr, "ERROR: failed to read first sample\n");
return 0;
}
if (!sample.IsSync()) {
fprintf(stderr, "ERROR: first sample is not an I frame\n");
return 0;
}
for (unsigned int interval = 1; interval < sample_count; interval++) {
bool irregular = false;
unsigned int sync_count = 0;
unsigned int i;
for (i = 0; i < sample_count; i += interval) {
result = cursor->m_Samples->GetSample(i, sample);
if (AP4_FAILED(result)) {
fprintf(stderr, "ERROR: failed to read sample %d\n", i);
return 0;
}
if (!sample.IsSync()) {
irregular = true;
break;
}
++sync_count;
}
if (sync_count < 1) continue;
if (!irregular) {
// found a pattern
AP4_UI64 duration = sample.GetDts();
double fps = (double)(interval*(sync_count-1))/((double)duration/(double)cursor->m_Track->GetMediaTimeScale());
if (Options.verbosity > 0) {
printf("found regular I-frame interval: %d frames (at %.3f frames per second)\n",
interval, (float)fps);
}
return (unsigned int)(1000.0*(double)interval/fps);
}
}
return 0;
}
示例2:
/*----------------------------------------------------------------------
| TrackCursor::SetSampleIndex
+---------------------------------------------------------------------*/
AP4_Result
TrackCursor::SetSampleIndex(AP4_Ordinal sample_index)
{
m_SampleIndex = sample_index;
// check if we're at the end
if (sample_index >= m_Samples->GetSampleCount()) {
AP4_UI64 end_dts = m_Sample.GetDts()+m_Sample.GetDuration();
m_Sample.Reset();
m_Sample.SetDts(end_dts);
m_Eos = true;
} else {
return m_Samples->GetSample(m_SampleIndex, m_Sample);
}
return AP4_SUCCESS;
}
示例3: GetSampleDescription
/*----------------------------------------------------------------------
| AP4_Track::Clone
+---------------------------------------------------------------------*/
AP4_Track*
AP4_Track::Clone(AP4_Result* result)
{
AP4_SyntheticSampleTable* sample_table = new AP4_SyntheticSampleTable();
// default return value
if (result) *result = AP4_SUCCESS;
// add clones of the sample descriptions to the new sample table
for (unsigned int i=0; ;i++) {
AP4_SampleDescription* sample_description = GetSampleDescription(i);
if (sample_description == NULL) break;
sample_table->AddSampleDescription(sample_description->Clone());
}
AP4_Sample sample;
AP4_Ordinal index = 0;
while (AP4_SUCCEEDED(GetSample(index, sample))) {
AP4_ByteStream* data_stream;
data_stream = sample.GetDataStream();
sample_table->AddSample(*data_stream,
sample.GetOffset(),
sample.GetSize(),
sample.GetDuration(),
sample.GetDescriptionIndex(),
sample.GetDts(),
sample.GetCtsDelta(),
sample.IsSync());
AP4_RELEASE(data_stream); // release our ref, the table has kept its own ref.
index++;
}
// create the cloned track
AP4_Track* clone = new AP4_Track(GetType(),
sample_table,
GetId(),
GetMovieTimeScale(),
GetDuration(),
GetMediaTimeScale(),
GetMediaDuration(),
GetTrackLanguage(),
GetWidth(),
GetHeight());
return clone;
}
示例4:
/*----------------------------------------------------------------------
| ReadSample
+---------------------------------------------------------------------*/
static AP4_Result
ReadSample(SampleReader& reader,
AP4_Track& track,
AP4_Sample& sample,
AP4_DataBuffer& sample_data,
double& ts,
bool& eos)
{
AP4_Result result = reader.ReadSample(sample, sample_data);
if (AP4_FAILED(result)) {
if (result == AP4_ERROR_EOS) {
eos = true;
} else {
return result;
}
}
ts = (double)sample.GetDts()/(double)track.GetMediaTimeScale();
return AP4_SUCCESS;
}
示例5: printf
/*----------------------------------------------------------------------
| ShowSample
+---------------------------------------------------------------------*/
static void
ShowSample(AP4_Sample& sample, unsigned int index, AP4_SampleDecrypter* sample_decrypter)
{
printf("[%06d] size=%6d duration=%6d",
index,
(int)sample.GetSize(),
(int)sample.GetDuration());
printf(" offset=%10lld dts=%10lld cts=%10lld ",
sample.GetOffset(),
sample.GetDts(),
sample.GetCts());
if (sample.IsSync()) {
printf(" [S] ");
} else {
printf(" ");
}
AP4_DataBuffer sample_data;
sample.ReadData(sample_data);
AP4_DataBuffer* data = &sample_data;
AP4_DataBuffer decrypted_sample_data;
if (sample_decrypter) {
sample_decrypter->DecryptSampleData(sample_data, decrypted_sample_data);
data = & decrypted_sample_data;
}
unsigned int show = data->GetDataSize();
if (show > 12) show = 12; // max first 12 chars
for (unsigned int i=0; i<show; i++) {
printf("%02x", data->GetData()[i]);
}
if (show == data->GetDataSize()) {
printf("\n");
} else {
printf("...\n");
}
}
示例6: mfra
//.........这里部分代码省略.........
break;
}
}
// check if we found a non-anchor cursor to use
if (cursor == NULL) {
// the anchor should be used in this round, check if we can use it
if (anchor_cursor->m_Eos) {
// the anchor is done, pick a new anchor unless we need to trim
anchor_cursor = NULL;
if (!Options.trim) {
for (unsigned int i=0; i<cursors.ItemCount(); i++) {
if (track_id && cursors[i]->m_Track->GetId() != track_id) continue;
if (cursors[i]->m_Eos) continue;
if (anchor_cursor == NULL ||
cursors[i]->m_Track->GetType() == AP4_Track::TYPE_VIDEO ||
cursors[i]->m_Track->GetType() == AP4_Track::TYPE_AUDIO) {
anchor_cursor = cursors[i];
if (Options.debug) {
printf("+++ New anchor: Track ID %d\n", anchor_cursor->m_Track->GetId());
}
}
}
}
}
cursor = anchor_cursor;
}
if (cursor == NULL) break; // all done
// decide how many samples go into this fragment
AP4_UI64 target_dts;
if (cursor == anchor_cursor) {
// compute the current dts in milliseconds
AP4_UI64 anchor_dts_ms = AP4_ConvertTime(cursor->m_Sample.GetDts(),
cursor->m_Track->GetMediaTimeScale(),
1000);
// round to the nearest multiple of fragment_duration
AP4_UI64 anchor_position = (anchor_dts_ms + (fragment_duration/2))/fragment_duration;
// pick the next fragment_duration multiple at our target
target_dts = AP4_ConvertTime(fragment_duration*(anchor_position+1),
1000,
cursor->m_Track->GetMediaTimeScale());
} else {
target_dts = AP4_ConvertTime(anchor_cursor->m_Sample.GetDts(),
anchor_cursor->m_Track->GetMediaTimeScale(),
cursor->m_Track->GetMediaTimeScale());
if (target_dts <= cursor->m_Sample.GetDts()) {
// we must be at the end, past the last anchor sample, just use the target duration
target_dts = AP4_ConvertTime(fragment_duration*(cursor->m_FragmentIndex+1),
1000,
cursor->m_Track->GetMediaTimeScale());
if (target_dts <= cursor->m_Sample.GetDts()) {
// we're still behind, there may have been an alignment/rounding error, just advance by one segment duration
target_dts = cursor->m_Sample.GetDts()+AP4_ConvertTime(fragment_duration,
1000,
cursor->m_Track->GetMediaTimeScale());
}
}
}
unsigned int end_sample_index = cursor->m_Samples->GetSampleCount();
AP4_UI64 smallest_diff = (AP4_UI64)(0xFFFFFFFFFFFFFFFFULL);
AP4_Sample sample;
for (unsigned int i=cursor->m_SampleIndex+1; i<=cursor->m_Samples->GetSampleCount(); i++) {
示例7: if
static prMALError
SDKImportAudio7(
imStdParms *stdParms,
imFileRef SDKfileRef,
imImportAudioRec7 *audioRec7)
{
prMALError result = malNoError;
// privateData
ImporterLocalRec8H ldataH = reinterpret_cast<ImporterLocalRec8H>(audioRec7->privateData);
stdParms->piSuites->memFuncs->lockHandle(reinterpret_cast<char**>(ldataH));
ImporterLocalRec8Ptr localRecP = reinterpret_cast<ImporterLocalRec8Ptr>( *ldataH );
if(localRecP && localRecP->audio_track && localRecP->alac)
{
assert(localRecP->reader != NULL);
assert(localRecP->file != NULL && localRecP->file->GetMovie() != NULL);
assert(audioRec7->position >= 0); // Do they really want contiguous samples?
assert(audioRec7->position < localRecP->duration);
if(audioRec7->size > localRecP->duration - audioRec7->position)
{
// this does happen, we get asked for audio data past the duration
// let's make sure there's no garbage there and re-set audioRec7->size
for(int c=0; c < localRecP->numChannels; c++)
{
memset(audioRec7->buffer[c], 0, sizeof(float) * audioRec7->size);
}
audioRec7->size = localRecP->duration - audioRec7->position;
}
const AP4_UI32 timestamp_ms = audioRec7->position * 1000 / localRecP->audioSampleRate;
const size_t bytes_per_sample = (localRecP->alac->mConfig.bitDepth <= 16 ? 2 : 4);
const size_t alac_buf_size = localRecP->alac->mConfig.frameLength * localRecP->alac->mConfig.numChannels *
bytes_per_sample + kALACMaxEscapeHeaderBytes;
uint8_t *alac_buffer = (uint8_t *)malloc(alac_buf_size);
AP4_Ordinal sample_index = 0;
AP4_Result ap4_result = localRecP->audio_track->GetSampleIndexForTimeStampMs(timestamp_ms, sample_index);
if(ap4_result == AP4_SUCCESS)
{
// for surround channels
// Premiere uses Left, Right, Left Rear, Right Rear, Center, LFE
// ALAC uses Center, Left, Right, Left Rear, Right Rear, LFE
// http://alac.macosforge.org/trac/browser/trunk/ReadMe.txt
static const int surround_swizzle[] = {4, 0, 1, 2, 3, 5};
static const int stereo_swizzle[] = {0, 1, 2, 3, 4, 5}; // no swizzle, actually
const int *swizzle = localRecP->numChannels > 2 ? surround_swizzle : stereo_swizzle;
csSDK_uint32 samples_needed = audioRec7->size;
PrAudioSample pos = 0;
AP4_DataBuffer dataBuffer;
while(samples_needed > 0 && ap4_result == AP4_SUCCESS && result == malNoError)
{
AP4_Sample sample;
ap4_result = localRecP->audio_track->ReadSample(sample_index, sample, dataBuffer);
if(ap4_result == AP4_SUCCESS)
{
const PrAudioSample sample_pos = sample.GetDts() *
localRecP->audioSampleRate /
localRecP->audio_track->GetMediaTimeScale();
const PrAudioSample sample_len = sample.GetDuration() *
localRecP->audioSampleRate /
localRecP->audio_track->GetMediaTimeScale();
const PrAudioSample skip_samples = (audioRec7->position > sample_pos) ? (audioRec7->position - sample_pos) : 0;
long samples_to_read = sample_len - skip_samples;
if(samples_to_read > samples_needed)
samples_to_read = samples_needed;
else if(samples_to_read < 0)
samples_to_read = 0;
if(samples_to_read > 0)
{
BitBuffer bits;
BitBufferInit(&bits, dataBuffer.UseData(), dataBuffer.GetDataSize());
uint32_t outSamples = 0;
//.........这里部分代码省略.........
示例8: CreateFragmentHandler
//.........这里部分代码省略.........
base_data_offset = moof_out_start;
}
// build a list of all trun atoms
AP4_Array<AP4_TrunAtom*> truns;
for (AP4_List<AP4_Atom>::Item* child_item = traf->GetChildren().FirstItem();
child_item;
child_item = child_item->GetNext()) {
AP4_Atom* child_atom = child_item->GetData();
if (child_atom->GetType() == AP4_ATOM_TYPE_TRUN) {
AP4_TrunAtom* trun = AP4_DYNAMIC_CAST(AP4_TrunAtom, child_atom);
truns.Append(trun);
}
}
AP4_Ordinal trun_index = 0;
AP4_Ordinal trun_sample_index = 0;
AP4_TrunAtom* trun = truns[0];
trun->SetDataOffset((AP4_SI32)((mdat_out_start+mdat_size)-base_data_offset));
// write the mdat
for (unsigned int j=0; j<sample_tables[i]->GetSampleCount(); j++, trun_sample_index++) {
// advance the trun index if necessary
if (trun_sample_index >= trun->GetEntries().ItemCount()) {
trun = truns[++trun_index];
trun->SetDataOffset((AP4_SI32)((mdat_out_start+mdat_size)-base_data_offset));
trun_sample_index = 0;
}
// get the next sample
result = sample_tables[i]->GetSample(j, sample);
if (AP4_FAILED(result)) return result;
sample.ReadData(sample_data_in);
m_TrackData[sample_tables[i]->GetInteralTrackId()].dts = sample.GetDts();
// process the sample data
if (handler) {
result = handler->ProcessSample(sample_data_in, sample_data_out);
if (AP4_FAILED(result)) return result;
// write the sample data
result = output.Write(sample_data_out.GetData(), sample_data_out.GetDataSize());
if (AP4_FAILED(result)) return result;
// update the mdat size
mdat_size += sample_data_out.GetDataSize();
// update the trun entry
trun->UseEntries()[trun_sample_index].sample_size = sample_data_out.GetDataSize();
} else {
// write the sample data (unmodified)
result = output.Write(sample_data_in.GetData(), sample_data_in.GetDataSize());
if (AP4_FAILED(result)) return result;
// update the mdat size
mdat_size += sample_data_in.GetDataSize();
}
}
if (handler) {
// update the tfhd header
if (tfhd->GetFlags() & AP4_TFHD_FLAG_BASE_DATA_OFFSET_PRESENT) {
tfhd->SetBaseDataOffset(mdat_out_start+AP4_ATOM_HEADER_SIZE);
}
if (tfhd->GetFlags() & AP4_TFHD_FLAG_DEFAULT_SAMPLE_SIZE_PRESENT) {
tfhd->SetDefaultSampleSize(trun->GetEntries()[0].sample_size);