本文整理汇总了C++中AP4_Sample::GetDescriptionIndex方法的典型用法代码示例。如果您正苦于以下问题:C++ AP4_Sample::GetDescriptionIndex方法的具体用法?C++ AP4_Sample::GetDescriptionIndex怎么用?C++ AP4_Sample::GetDescriptionIndex使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类AP4_Sample
的用法示例。
在下文中一共展示了AP4_Sample::GetDescriptionIndex方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: 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;
}
示例2: GetSampleCount
//.........这里部分代码省略.........
// reset the run count
current_cts_delta_run = 0;
}
++current_cts_delta_run;
current_cts_delta = new_cts_delta;
// add an entry into the stsz atom
stsz->AddEntry(sample.GetSize());
// update the sync sample table
if (sample.IsSync()) {
stss->AddEntry(i+1);
if (i==0) all_samples_are_sync = true;
} else {
all_samples_are_sync = false;
}
// see in which chunk this sample is
AP4_Ordinal chunk_index = 0;
AP4_Ordinal position_in_chunk = 0;
AP4_Result result = GetSampleChunkPosition(i, chunk_index, position_in_chunk);
if (AP4_SUCCEEDED(result)) {
if (chunk_index != current_chunk_index && current_samples_in_chunk != 0) {
// new chunk
chunk_offsets.Append(current_chunk_offset);
current_chunk_offset += current_chunk_size;
stsc->AddEntry(1,
current_samples_in_chunk,
current_sample_description_index+1);
current_samples_in_chunk = 0;
current_chunk_size = 0;
}
current_chunk_index = chunk_index;
}
// store the sample description index
current_sample_description_index = sample.GetDescriptionIndex();
// adjust the current chunk info
current_chunk_size += sample.GetSize();
++current_samples_in_chunk;
}
// finish the stts table
if (sample_count) stts->AddEntry(current_duration_run, current_duration);
// finish the ctts table if we have one
if (ctts) {
AP4_ASSERT(current_cts_delta_run != 0);
// add a ctts entry
ctts->AddEntry(current_cts_delta_run, current_cts_delta);
}
// process any unfinished chunk
if (current_samples_in_chunk != 0) {
// new chunk
chunk_offsets.Append(current_chunk_offset);
stsc->AddEntry(1,
current_samples_in_chunk,
current_sample_description_index+1);
}
// attach the children of stbl
stbl->AddChild(stsd);
stbl->AddChild(stsz);
stbl->AddChild(stsc);
stbl->AddChild(stts);
if (ctts) stbl->AddChild(ctts);
if (!all_samples_are_sync && stss->GetEntries().ItemCount() != 0) {
stbl->AddChild(stss);
} else {
delete stss;
}
// see if we need a co64 or an stco atom
AP4_Size chunk_count = chunk_offsets.ItemCount();
if (current_chunk_offset <= 0xFFFFFFFF) {
// make an array of 32-bit entries
AP4_UI32* chunk_offsets_32 = new AP4_UI32[chunk_count];
for (unsigned int i=0; i<chunk_count; i++) {
chunk_offsets_32[i] = (AP4_UI32)chunk_offsets[i];
}
// create the stco atom
AP4_StcoAtom* stco = new AP4_StcoAtom(&chunk_offsets_32[0], chunk_count);
stbl->AddChild(stco);
delete[] chunk_offsets_32;
} else {
// create the co64 atom
AP4_Co64Atom* co64 = new AP4_Co64Atom(&chunk_offsets[0], chunk_count);
stbl->AddChild(co64);
}
return AP4_SUCCESS;
}
示例3: failed
/*----------------------------------------------------------------------
| Mp4ParserOutput_GetPacket
+---------------------------------------------------------------------*/
BLT_METHOD
Mp4ParserOutput_GetPacket(BLT_PacketProducer* _self,
BLT_MediaPacket** packet)
{
Mp4ParserOutput* self = ATX_SELF(Mp4ParserOutput, BLT_PacketProducer);
*packet = NULL;
// if we don't have an input yet, we can't produce packets
//if (self->parser->input.mp4_file == NULL) {
// return BLT_ERROR_PORT_HAS_NO_DATA;
//}
if (self->track == NULL) {
return BLT_ERROR_EOS;
} else {
// check for end-of-stream
if (self->sample >= self->track->GetSampleCount()) {
return BLT_ERROR_EOS;
}
// read one sample
AP4_Sample sample;
AP4_DataBuffer* sample_buffer = self->sample_buffer;
AP4_Result result;
if (self->parser->input.reader) {
// linear reader mode
result = self->parser->input.reader->ReadNextSample(self->track->GetId(), sample, *sample_buffer);
if (AP4_SUCCEEDED(result)) self->sample++;
} else {
// normal mode
result = self->track->ReadSample(self->sample++, sample, *sample_buffer);
}
if (AP4_FAILED(result)) {
ATX_LOG_WARNING_1("ReadSample failed (%d)", result);
if (result == AP4_ERROR_EOS || result == ATX_ERROR_OUT_OF_RANGE) {
ATX_LOG_WARNING("incomplete media");
return BLT_ERROR_INCOMPLETE_MEDIA;
} else {
return BLT_ERROR_PORT_HAS_NO_DATA;
}
}
// update the sample description if it has changed
if (sample.GetDescriptionIndex() != self->sample_description_index) {
result = Mp4ParserOutput_SetSampleDescription(self, sample.GetDescriptionIndex());
if (BLT_FAILED(result)) return result;
}
// decrypt the sample if needed
if (self->sample_decrypter) {
self->sample_decrypter->DecryptSampleData(*sample_buffer, *self->sample_decrypted_buffer);
sample_buffer = self->sample_decrypted_buffer;
}
AP4_Size packet_size = sample_buffer->GetDataSize();
result = BLT_Core_CreateMediaPacket(ATX_BASE(self->parser, BLT_BaseMediaNode).core,
packet_size,
(const BLT_MediaType*)self->media_type,
packet);
if (BLT_FAILED(result)) return result;
BLT_MediaPacket_SetPayloadSize(*packet, packet_size);
void* buffer = BLT_MediaPacket_GetPayloadBuffer(*packet);
ATX_CopyMemory(buffer, sample_buffer->GetData(), packet_size);
// set the timestamp
AP4_UI32 media_timescale = self->track->GetMediaTimeScale();
if (media_timescale) {
AP4_UI64 ts = ((AP4_UI64)sample.GetCts())*1000000;
ts /= media_timescale;
BLT_TimeStamp bt_ts = {
(BLT_Int32)(ts / 1000000),
(BLT_Int32)((ts % 1000000)*1000)
};
BLT_MediaPacket_SetTimeStamp(*packet, bt_ts);
}
// set packet flags
if (self->sample == 1) {
BLT_MediaPacket_SetFlags(*packet, BLT_MEDIA_PACKET_FLAG_START_OF_STREAM);
}
return BLT_SUCCESS;
}
}