本文整理汇总了C++中AP4_Sample::ReadData方法的典型用法代码示例。如果您正苦于以下问题:C++ AP4_Sample::ReadData方法的具体用法?C++ AP4_Sample::ReadData怎么用?C++ AP4_Sample::ReadData使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类AP4_Sample
的用法示例。
在下文中一共展示了AP4_Sample::ReadData方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
/*----------------------------------------------------------------------
| AP4_MarlinIpmpTrackDecrypter:GetProcessedSampleSize
+---------------------------------------------------------------------*/
AP4_Size
AP4_MarlinIpmpTrackDecrypter::GetProcessedSampleSize(AP4_Sample& sample)
{
// with CBC, we need to decrypt the last block to know what the padding was
AP4_Size encrypted_size = sample.GetSize()-AP4_AES_BLOCK_SIZE;
AP4_DataBuffer encrypted;
AP4_DataBuffer decrypted;
AP4_Size decrypted_size = AP4_CIPHER_BLOCK_SIZE;
if (sample.GetSize() < 2*AP4_CIPHER_BLOCK_SIZE) {
return 0;
}
AP4_Size offset = sample.GetSize()-2*AP4_CIPHER_BLOCK_SIZE;
if (AP4_FAILED(sample.ReadData(encrypted, 2*AP4_CIPHER_BLOCK_SIZE, offset))) {
return 0;
}
decrypted.Reserve(decrypted_size);
m_Cipher->SetIV(encrypted.GetData());
if (AP4_FAILED(m_Cipher->ProcessBuffer(encrypted.GetData()+AP4_CIPHER_BLOCK_SIZE,
AP4_CIPHER_BLOCK_SIZE,
decrypted.UseData(),
&decrypted_size,
true))) {
return 0;
}
unsigned int padding_size = AP4_CIPHER_BLOCK_SIZE-decrypted_size;
return encrypted_size-padding_size;
}
示例2: buffer
/*----------------------------------------------------------------------
| AP4_HintTrackReader::WriteSampleRtpData
+---------------------------------------------------------------------*/
AP4_Result
AP4_HintTrackReader::WriteSampleRtpData(AP4_SampleRtpConstructor* constructor,
AP4_ByteStream* data_stream)
{
AP4_Track* referenced_track = NULL;
if (constructor->GetTrackRefIndex() == 0xFF) {
// data is in the hint track
referenced_track = &m_HintTrack;
} else {
// check if we have a media track
if (m_MediaTrack == NULL) return AP4_FAILURE;
referenced_track = m_MediaTrack;
}
// write the sample data
AP4_Sample sample;
AP4_Result result = referenced_track->GetSample(constructor->GetSampleNum()-1, // adjust
sample);
if (AP4_FAILED(result)) return result;
AP4_DataBuffer buffer(constructor->GetLength());
result = sample.ReadData(
buffer, constructor->GetLength(), constructor->GetSampleOffset());
if (AP4_FAILED(result)) return result;
// write the data
return data_stream->Write(buffer.GetData(), buffer.GetDataSize());
}
示例3:
/*----------------------------------------------------------------------
| AP4_OmaDcfCbcSampleDecrypter::GetDecryptedSampleSize
+---------------------------------------------------------------------*/
AP4_Size
AP4_OmaDcfCbcSampleDecrypter::GetDecryptedSampleSize(AP4_Sample& sample)
{
if (m_Cipher == NULL) return 0;
// decide if this sample is encrypted or not
bool is_encrypted;
if (m_SelectiveEncryption) {
// read the first byte to see if the sample is encrypted or not
AP4_Byte h;
AP4_DataBuffer peek_buffer;
peek_buffer.SetBuffer(&h, 1);
sample.ReadData(peek_buffer, 1);
is_encrypted = ((h&0x80)!=0);
} else {
is_encrypted = true;
}
if (is_encrypted) {
// with CBC, we need to decrypt the last block to know what the padding was
AP4_Size crypto_header_size = (m_SelectiveEncryption?1:0)+m_IvLength;
AP4_Size encrypted_size = sample.GetSize()-crypto_header_size;
AP4_DataBuffer encrypted;
AP4_DataBuffer decrypted;
AP4_Size decrypted_size = AP4_CIPHER_BLOCK_SIZE;
if (sample.GetSize() < crypto_header_size+AP4_CIPHER_BLOCK_SIZE) {
return 0;
}
AP4_Size offset = sample.GetSize()-2*AP4_CIPHER_BLOCK_SIZE;
if (AP4_FAILED(sample.ReadData(encrypted, 2*AP4_CIPHER_BLOCK_SIZE, offset))) {
return 0;
}
decrypted.Reserve(decrypted_size);
m_Cipher->SetIV(encrypted.GetData());
if (AP4_FAILED(m_Cipher->ProcessBuffer(encrypted.GetData()+AP4_CIPHER_BLOCK_SIZE,
AP4_CIPHER_BLOCK_SIZE,
decrypted.UseData(),
&decrypted_size,
true))) {
return 0;
}
unsigned int padding_size = AP4_CIPHER_BLOCK_SIZE-decrypted_size;
return encrypted_size-padding_size;
} else {
return sample.GetSize()-(m_SelectiveEncryption?1:0);
}
}
示例4:
/*----------------------------------------------------------------------
| AP4_DecryptingSampleReader::ReadSampleData
+---------------------------------------------------------------------*/
AP4_Result
AP4_DecryptingSampleReader::ReadSampleData(AP4_Sample& sample,
AP4_DataBuffer& sample_data)
{
AP4_Result result = sample.ReadData(m_DataBuffer);
if (AP4_FAILED(result)) return result;
return m_Decrypter->DecryptSampleData(m_DataBuffer, sample_data);
}
示例5: while
/*----------------------------------------------------------------------
| IsIFrame
+---------------------------------------------------------------------*/
static bool
IsIFrame(AP4_Sample& sample, AP4_AvcSampleDescription* avc_desc) {
AP4_DataBuffer sample_data;
if (AP4_FAILED(sample.ReadData(sample_data))) {
return false;
}
const unsigned char* data = sample_data.GetData();
AP4_Size size = sample_data.GetDataSize();
while (size >= avc_desc->GetNaluLengthSize()) {
unsigned int nalu_length = 0;
if (avc_desc->GetNaluLengthSize() == 1) {
nalu_length = *data++;
--size;
} else if (avc_desc->GetNaluLengthSize() == 2) {
nalu_length = AP4_BytesToUInt16BE(data);
data += 2;
size -= 2;
} else if (avc_desc->GetNaluLengthSize() == 4) {
nalu_length = AP4_BytesToUInt32BE(data);
data += 4;
size -= 4;
} else {
return false;
}
if (nalu_length <= size) {
size -= nalu_length;
} else {
size = 0;
}
switch (*data & 0x1F) {
case 1: {
AP4_BitStream bits;
bits.WriteBytes(data+1, 8);
ReadGolomb(bits);
unsigned int slice_type = ReadGolomb(bits);
if (slice_type == 2 || slice_type == 7) {
return true;
} else {
return false; // only show first slice type
}
}
case 5:
return true;
}
data += nalu_length;
}
return false;
}
示例6: GetSample
/*----------------------------------------------------------------------
| AP4_Track::ReadSample
+---------------------------------------------------------------------*/
AP4_Result
AP4_Track::ReadSample(AP4_Ordinal index,
AP4_Sample& sample,
AP4_DataBuffer& data)
{
AP4_Result result;
// get the sample
result = GetSample(index, sample);
if (AP4_FAILED(result)) return result;
// read the data
return sample.ReadData(data);
}
示例7: 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");
}
}
示例8: StoreSample
AP4_Result SampleFileStorage::StoreSample(AP4_Sample& from_sample, AP4_Sample& to_sample) {
// clone the sample fields
to_sample = from_sample;
// read the sample data
AP4_DataBuffer sample_data;
AP4_Result result = from_sample.ReadData(sample_data);
if (AP4_FAILED(result)) return result;
// mark where we are going to store the sample data
AP4_Position position;
m_Stream->Tell(position);
to_sample.SetOffset(position);
// write the sample data
result = m_Stream->Write(sample_data.GetData(), sample_data.GetDataSize());
if (AP4_FAILED(result)) return result;
// update the stream for the new sample
to_sample.SetDataStream(*m_Stream);
return AP4_SUCCESS;
}
示例9: mfra
//.........这里部分代码省略.........
0,
0);
// reserve space for the entries now, but they will be computed and updated later
sidx->SetReferenceCount(fragments.ItemCount());
sidx->Write(output_stream);
}
// write all fragments
for (AP4_List<FragmentInfo>::Item* item = fragments.FirstItem();
item;
item = item->GetNext()) {
FragmentInfo* fragment = item->GetData();
// remember the time and position of this fragment
output_stream.Tell(fragment->m_MoofPosition);
fragment->m_Tfra->AddEntry(fragment->m_Timestamp, fragment->m_MoofPosition);
// write the moof
fragment->m_Moof->Write(output_stream);
// write mdat
output_stream.WriteUI32(fragment->m_MdatSize);
output_stream.WriteUI32(AP4_ATOM_TYPE_MDAT);
AP4_DataBuffer sample_data;
AP4_Sample sample;
for (unsigned int i=0; i<fragment->m_SampleIndexes.ItemCount(); i++) {
// get the sample
result = fragment->m_Samples->GetSample(fragment->m_SampleIndexes[i], sample);
if (AP4_FAILED(result)) {
fprintf(stderr, "ERROR: failed to get sample %d (%d)\n", fragment->m_SampleIndexes[i], result);
return;
}
// read the sample data
result = sample.ReadData(sample_data);
if (AP4_FAILED(result)) {
fprintf(stderr, "ERROR: failed to read sample data for sample %d (%d)\n", fragment->m_SampleIndexes[i], result);
return;
}
// write the sample data
result = output_stream.Write(sample_data.GetData(), sample_data.GetDataSize());
if (AP4_FAILED(result)) {
fprintf(stderr, "ERROR: failed to write sample data (%d)\n", result);
return;
}
}
}
// update the index and re-write it if needed
if (create_segment_index) {
unsigned int segment_index = 0;
AP4_SidxAtom::Reference reference;
for (AP4_List<FragmentInfo>::Item* item = fragments.FirstItem();
item;
item = item->GetNext()) {
FragmentInfo* fragment = item->GetData();
reference.m_ReferencedSize = (AP4_UI32)(fragment->m_Moof->GetSize()+fragment->m_MdatSize);
reference.m_SubsegmentDuration = fragment->m_Duration;
reference.m_StartsWithSap = true;
sidx->SetReference(segment_index++, reference);
}
AP4_Position here = 0;
output_stream.Tell(here);
output_stream.Seek(sidx_position);
sidx->Write(output_stream);
output_stream.Seek(here);
delete sidx;
}
// create an mfra container and write out the index
AP4_ContainerAtom mfra(AP4_ATOM_TYPE_MFRA);
for (unsigned int i=0; i<cursors.ItemCount(); i++) {
if (track_id && cursors[i]->m_Track->GetId() != track_id) {
continue;
}
mfra.AddChild(cursors[i]->m_Tfra);
cursors[i]->m_Tfra = NULL;
}
AP4_MfroAtom* mfro = new AP4_MfroAtom((AP4_UI32)mfra.GetSize()+16);
mfra.AddChild(mfro);
result = mfra.Write(output_stream);
if (AP4_FAILED(result)) {
fprintf(stderr, "ERROR: failed to write 'mfra' (%d)\n", result);
return;
}
// cleanup
fragments.DeleteReferences();
for (unsigned int i=0; i<cursors.ItemCount(); i++) {
delete cursors[i];
}
for (AP4_List<FragmentInfo>::Item* item = fragments.FirstItem();
item;
item = item->GetNext()) {
FragmentInfo* fragment = item->GetData();
delete fragment->m_Moof;
}
delete output_movie;
}
示例10: CreateFragmentHandler
//.........这里部分代码省略.........
base_data_offset = mdat_out_start+AP4_ATOM_HEADER_SIZE;
} else {
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);
}
示例11: CreateFragmentHandler
/*----------------------------------------------------------------------
| AP4_Processor::ProcessFragments
+---------------------------------------------------------------------*/
AP4_Result
AP4_Processor::ProcessFragments(AP4_MoovAtom* moov,
AP4_List<AP4_MoofLocator>& moofs,
AP4_ContainerAtom* mfra,
AP4_ByteStream& input,
AP4_ByteStream& output)
{
// FIXME: this only works for non-changing moofs
for (AP4_List<AP4_MoofLocator>::Item* item = moofs.FirstItem();
item;
item = item->GetNext()) {
AP4_MoofLocator* locator = item->GetData();
AP4_ContainerAtom* moof = locator->m_Moof;
AP4_UI64 moof_offset = locator->m_Offset;
AP4_UI64 mdat_payload_offset = moof_offset+moof->GetSize()+8;
AP4_MovieFragment* fragment = new AP4_MovieFragment(moof);
AP4_Sample sample;
AP4_DataBuffer sample_data_in;
AP4_DataBuffer sample_data_out;
AP4_Result result;
// process all the traf atoms
AP4_Array<AP4_Processor::FragmentHandler*> handlers;
for (;AP4_Atom* atom = moof->GetChild(AP4_ATOM_TYPE_TRAF, handlers.ItemCount());) {
AP4_ContainerAtom* traf = AP4_DYNAMIC_CAST(AP4_ContainerAtom, atom);
AP4_Processor::FragmentHandler* handler = CreateFragmentHandler(traf);
if (handler) result = handler->ProcessFragment();
handlers.Append(handler);
}
// write the moof
AP4_UI64 moof_out_start = 0;
output.Tell(moof_out_start);
bool moof_has_changed = false;
moof->Write(output);
// process all track runs
for (unsigned int i=0; i<handlers.ItemCount(); i++) {
AP4_FragmentSampleTable* sample_table = NULL;
AP4_Processor::FragmentHandler* handler = handlers[i];
// get the track ID
AP4_ContainerAtom* traf = AP4_DYNAMIC_CAST(AP4_ContainerAtom, moof->GetChild(AP4_ATOM_TYPE_TRAF, i));
AP4_TfhdAtom* tfhd = AP4_DYNAMIC_CAST(AP4_TfhdAtom, traf->GetChild(AP4_ATOM_TYPE_TFHD, i));
// create a sample table object so we can read the sample data
result = fragment->CreateSampleTable(moov, tfhd->GetTrackId(), &input, moof_offset, mdat_payload_offset, sample_table);
if (AP4_FAILED(result)) return result;
// compute the mdat size
AP4_UI64 mdat_size = 0;
for (unsigned int j=0; j<sample_table->GetSampleCount(); j++) {
result = sample_table->GetSample(j, sample);
if (AP4_FAILED(result)) return result;
mdat_size += sample.GetSize();
}
// write an mdat header
if (mdat_size > 0xFFFFFFFF-8) {
// we don't support large mdat fragments
return AP4_ERROR_OUT_OF_RANGE;
}
if (mdat_size) {
output.WriteUI32((AP4_UI32)(8+mdat_size));
output.WriteUI32(AP4_ATOM_TYPE_MDAT);
}
#if defined(AP4_DEBUG)
AP4_Position before;
output.Tell(before);
#endif
// write the mdat
for (unsigned int j=0; j<sample_table->GetSampleCount(); j++) {
result = sample_table->GetSample(j, sample);
if (AP4_FAILED(result)) return result;
sample.ReadData(sample_data_in);
// 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;
// give the handler a chance to update the atoms
result = handler->FinishFragment();
if (AP4_SUCCEEDED(result)) moof_has_changed = true;
} else {
// write the sample data (unmodified)
result = output.Write(sample_data_in.GetData(), sample_data_in.GetDataSize());
if (AP4_FAILED(result)) return result;
}
}
//.........这里部分代码省略.........