14namespace quickstart_detail {
19 ->
decltype(std::declval<U&>().quickStart(), std::true_type());
21 static std::false_type test(...);
28typename std::enable_if<HasQuickStart<T>::value,
bool>::type
30 return writer.quickStart();
34typename std::enable_if<!HasQuickStart<T>::value,
bool>::type
71 virtual T
get(
size_t index) = 0;
96 size_t size()
override {
return (
size_t)
data.size(); }
97 T
get(
size_t index)
override {
return data[(int)index]; }
130template <
typename T,
size_t ChunkSize = 4096>
142 size_t chunk_idx =
count / ChunkSize;
143 size_t local_pos =
count % ChunkSize;
145 chunks[(int)chunk_idx][local_pos] = value;
151 T
get(
size_t index)
override {
152 return chunks[(int)(index / ChunkSize)][index % ChunkSize];
171 virtual bool seek(
size_t pos) = 0;
172 virtual size_t readBytes(uint8_t* data,
size_t len) = 0;
209template <
typename FileT,
typename WriterT>
218 bool quickStart =
true)
223 writer.setSeekSource(*
this);
226 bool seek(
size_t pos)
override {
228 bool ok =
p_file->seek(pos);
230 LOGI(
"FileSeekableSource: seek(%u) saved_pos=%u post-seek position()=%u ok=%d",
231 (
unsigned)pos, (
unsigned)
saved_pos, (
unsigned)
p_file->position(), (
int)ok);
239 size_t pre_pos =
p_file->position();
240 size_t n =
p_file->readBytes((
char*)data, len);
242 LOGI(
"FileSeekableSource: readBytes len=%u pre_pos=%u got=%u restoring to saved_pos=%u",
243 (
unsigned)len, (
unsigned)pre_pos, (
unsigned)n, (
unsigned)
saved_pos);
271 if (to_read == 0)
return 0;
274 while (written < to_read) {
275 size_t w =
p_writer->write(buffer + written, to_read - written);
278 LOGW(
"FileSeekableSource::copy(): writer stalled after accepting %u of %u "
279 "bytes (%d attempt(s)) - dropping the remaining %u bytes",
280 (
unsigned)written, (
unsigned)to_read, attempts, (
unsigned)(to_read - written));
286 LOGI(
"FileSeekableSource::copy() needed %d attempts for to_read=%u", attempts, (
unsigned)to_read);
353 T (*decoder)(
const uint8_t*),
354 size_t cacheEntries = 64)
359 cache(new T[cacheEntries]),
393 T
get(
size_t index)
override {
407 for (
size_t i = 0; i < got_entries; i++)
436 virtual size_t write(
const uint8_t* data,
size_t len) = 0;
445template <
typename FileT>
452 return p_file->readBytes((
char*)data, len);
454 size_t write(
const uint8_t* data,
size_t len)
override {
455 return p_file->write(data, len);
497 if (
p_spool ==
nullptr)
return;
505 T
get(
size_t index)
override {
507 if (
p_spool ==
nullptr)
return value;
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define LOGI(...)
Definition AudioLoggerIDF.h:28
SampleTableKind
Identifies which of a track's four sample tables a SpoolStorageFactory is being asked to provide stor...
Definition SampleTableStore.h:523
TrackKind
Video vs. audio track classification - lives here (rather than nested inside DemuxerMP4::Track,...
Definition SampleTableStore.h:46
@ Audio
Definition Video.h:19
@ Video
Definition Video.h:19