1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
/*****************************************************************
|
| AP4 - Synthetic Sample Table
|
| Copyright 2002-2008 Axiomatic Systems, LLC
|
|
| This file is part of Bento4/AP4 (MP4 Atom Processing Library).
|
| Unless you have obtained Bento4 under a difference license,
| this version of Bento4 is Bento4|GPL.
| Bento4|GPL is free software; you can redistribute it and/or modify
| it under the terms of the GNU General Public License as published by
| the Free Software Foundation; either version 2, or (at your option)
| any later version.
|
| Bento4|GPL is distributed in the hope that it will be useful,
| but WITHOUT ANY WARRANTY; without even the implied warranty of
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| GNU General Public License for more details.
|
| You should have received a copy of the GNU General Public License
| along with Bento4|GPL; see the file COPYING. If not, write to the
| Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
| 02111-1307, USA.
|
****************************************************************/
#ifndef _AP4_SYNTHETIC_SAMPLE_TABLE_H_
#define _AP4_SYNTHETIC_SAMPLE_TABLE_H_
/*----------------------------------------------------------------------
| includes
+---------------------------------------------------------------------*/
#include "Ap4Array.h"
#include "Ap4List.h"
#include "Ap4Sample.h"
#include "Ap4SampleTable.h"
#include "Ap4SampleDescription.h"
/*----------------------------------------------------------------------
| forward declarations
+---------------------------------------------------------------------*/
class AP4_ByteStream;
/*----------------------------------------------------------------------
| constants
+---------------------------------------------------------------------*/
const AP4_Cardinal AP4_SYNTHETIC_SAMPLE_TABLE_DEFAULT_CHUNK_SIZE = 10;
/*----------------------------------------------------------------------
| AP4_SyntheticSampleTable
+---------------------------------------------------------------------*/
class AP4_SyntheticSampleTable : public AP4_SampleTable
{
public:
// methods
AP4_SyntheticSampleTable(AP4_Cardinal chunk_size
= AP4_SYNTHETIC_SAMPLE_TABLE_DEFAULT_CHUNK_SIZE);
virtual ~AP4_SyntheticSampleTable();
// AP4_SampleTable methods
virtual AP4_Result GetSample(AP4_Ordinal index, AP4_Sample& sample);
virtual AP4_Cardinal GetSampleCount();
virtual AP4_Result GetSampleChunkPosition(AP4_Ordinal sample_index,
AP4_Ordinal& chunk_index,
AP4_Ordinal& position_in_chunk);
virtual AP4_Cardinal GetSampleDescriptionCount();
virtual AP4_SampleDescription* GetSampleDescription(AP4_Ordinal index);
virtual AP4_Result GetSampleIndexForTimeStamp(AP4_UI64 ts, AP4_Ordinal& index);
virtual AP4_Ordinal GetNearestSyncSampleIndex(AP4_Ordinal index, bool before);
// methods
/**
* Add a sample description to the sample table.
* Each added sample description will have the next available index, starting at 0
*
* @param description Pointer to the sample description to add
* @param transfer_ownership Boolean flag indicating whether the ownership of the
* sample description object is transfered to the sample table object (true by default).
* If true, the sample table object will own the sample description object, and will
* delete it when it is itself deleted. If false, the ownership remains with the caller,
* and only a referencing pointer is kept, thus the caller must ensure that the object
* is not deleted before the sample table is deleted.
*/
virtual AP4_Result AddSampleDescription(AP4_SampleDescription* description,
bool transfer_ownership=true);
/**
* Add a sample to the sample table, where the sample duration is given
*
* @param data_stream The byte stream that contains the sample data. The sample
* object added to the track will keep a reference to that byte stream.
* @param offset Position of the first byte of sample data within the stream
* @param size Size in bytes of the sample data
* @param duration Duration of the sample (in the timescale of the media). This
* value can be 0 if the duration is not known. In that case, the next sample
* added to the table MUST have a non-zero value for the DTS (decoding timestamp),
* which will allow the actual duration of this sample to be computed.
* @param description_index Index of the sample description that applies to
* this sample (typically 0).
* @param dts DTS (decoding timestamp) of the sample. If this value is 0, and there
* already are samples in the table, the DTS of the sample will be automatically
* computed based on the DTS and duration of the preceding sample. If this value is
* not equal to the DTS+duration of the preceding sample, the duration of the
* preceding sample is automatically adjusted, unless it has a non-zero value, in which
* case AP4_ERROR_INVALID_PARAMETERS is returned.
* The DTS of the first sample in the table MUST always be 0.
* @param cts_delta Difference between the CTS (composition/display timestamp) and DTS
* (decoding timestamp) of the sample (in the timescale of the media)
* @param sync Boolean flag indicating whether this is a sync sample or not.
*/
virtual AP4_Result AddSample(AP4_ByteStream& data_stream,
AP4_Position offset,
AP4_Size size,
AP4_UI32 duration,
AP4_Ordinal description_index,
AP4_UI64 dts,
AP4_UI32 cts_delta,
bool sync);
virtual AP4_Result AddSample(const AP4_Sample& sample);
/**
* Get a reference to a sample for the purpose of modifying it
*/
AP4_Sample& UseSample(AP4_Ordinal index) { return m_Samples[index]; }
private:
// classes
class SampleDescriptionHolder {
public:
SampleDescriptionHolder(AP4_SampleDescription* description, bool is_owned) :
m_SampleDescription(description), m_IsOwned(is_owned) {}
~SampleDescriptionHolder() { if (m_IsOwned) delete m_SampleDescription; }
AP4_SampleDescription* m_SampleDescription;
bool m_IsOwned;
};
// members
AP4_Array<AP4_Sample> m_Samples;
AP4_List<SampleDescriptionHolder> m_SampleDescriptions;
AP4_Cardinal m_ChunkSize;
AP4_Array<AP4_UI32> m_SamplesInChunk;
struct {
AP4_Ordinal m_Sample;
AP4_Ordinal m_Chunk;
} m_LookupCache;
};
#endif // _AP4_SYNTHETIC_SAMPLE_TABLE_H_
|