59 #if CONFIG_WAV_DEMUXER
70 offset += offset < INT64_MAX && offset & 1;
76 static int64_t find_tag(
AVIOContext *pb, uint32_t tag1)
84 size = next_tag(pb, &tag);
87 wav_seek_tag(pb, size, SEEK_CUR);
97 if (!memcmp(p->
buf + 8,
"WAVE", 4)) {
98 if (!memcmp(p->
buf,
"RIFF", 4))
103 else if (!memcmp(p->
buf,
"RF64", 4) &&
104 !memcmp(p->
buf + 12,
"ds64", 4))
110 static void handle_stream_probing(
AVStream *st)
131 handle_stream_probing(*st);
140 static inline int wav_parse_bext_string(
AVFormatContext *s,
const char *key,
160 char temp[131], *coding_history;
162 uint64_t time_reference;
163 int64_t umid_parts[8], umid_mask = 0;
165 if ((ret = wav_parse_bext_string(s,
"description", 256)) < 0 ||
166 (ret = wav_parse_bext_string(s,
"originator", 32)) < 0 ||
167 (ret = wav_parse_bext_string(s,
"originator_reference", 32)) < 0 ||
168 (ret = wav_parse_bext_string(s,
"origination_date", 10)) < 0 ||
169 (ret = wav_parse_bext_string(s,
"origination_time", 8)) < 0)
173 snprintf(temp,
sizeof(temp),
"%"PRIu64, time_reference);
179 for (x = 0; x < 8; x++)
184 if (umid_parts[4] == 0 && umid_parts[5] == 0 &&
185 umid_parts[6] == 0 && umid_parts[7] == 0) {
188 "0x%016"PRIX64
"%016"PRIX64
"%016"PRIX64
"%016"PRIX64,
189 umid_parts[0], umid_parts[1],
190 umid_parts[2], umid_parts[3]);
194 "0x%016"PRIX64
"%016"PRIX64
"%016"PRIX64
"%016"PRIX64
195 "%016"PRIX64
"%016"PRIX64
"%016"PRIX64
"%016"PRIX64,
196 umid_parts[0], umid_parts[1],
197 umid_parts[2], umid_parts[3],
198 umid_parts[4], umid_parts[5],
199 umid_parts[6], umid_parts[7]);
214 if (!(coding_history =
av_malloc(size + 1)))
217 if ((ret =
avio_read(s->
pb, coding_history, size)) < 0)
220 coding_history[
size] = 0;
230 {
"description",
"comment" },
231 {
"originator",
"encoded_by" },
232 {
"origination_date",
"date" },
233 {
"origination_time",
"creation_time" },
241 int64_t sample_count = 0;
247 int ret, got_fmt = 0;
248 int64_t next_tag_ofs, data_ofs = -1;
255 rf64 = tag ==
MKTAG(
'R',
'F',
'6',
'4');
256 if (!rf64 && tag !=
MKTAG(
'R',
'I',
'F',
'F'))
260 if (tag !=
MKTAG(
'W',
'A',
'V',
'E'))
274 if (data_size < 0 || sample_count < 0) {
276 "ds64: data_size = %"PRId64
", sample_count = %"PRId64
"\n",
277 data_size, sample_count);
286 size = next_tag(pb, &tag);
293 case MKTAG(
'f',
'm',
't',
' '):
295 if (!got_fmt && (ret = wav_parse_fmt_tag(s, size, &st)) < 0) {
302 case MKTAG(
'd',
'a',
't',
'a'):
305 "found no 'fmt ' tag before the 'data' tag\n");
313 next_tag_ofs = wav->
data_end = size ? next_tag_ofs : INT64_MAX;
321 if (!pb->
seekable || (!rf64 && !size))
324 case MKTAG(
'f',
'a',
'c',
't'):
328 case MKTAG(
'b',
'e',
'x',
't'):
329 if ((ret = wav_parse_bext_tag(s, size)) < 0)
332 case MKTAG(
'S',
'M',
'V',
'0'):
338 if (size !=
MKTAG(
'0',
'2',
'0',
'0')) {
372 case MKTAG(
'L',
'I',
'S',
'T'):
378 case MKTAG(
'I',
'N',
'F',
'O'):
386 wav_seek_tag(pb, next_tag_ofs, SEEK_SET) < 0) {
401 sample_count = (data_size << 3) /
427 if (!memcmp(guid, guid1, 16))
434 #define MAX_SIZE 4096
443 if (CONFIG_SPDIF_DEMUXER && wav->
spdif == 0 &&
455 if (CONFIG_SPDIF_DEMUXER && wav->
spdif == 1)
459 int64_t audio_dts, video_dts;
511 if (CONFIG_W64_DEMUXER && wav->
w64)
514 left = find_tag(s->
pb,
MKTAG(
'd',
'a',
't',
'a'));
526 if (size < st->codec->block_align)
530 size =
FFMIN(size, left);
540 int stream_index, int64_t timestamp,
int flags)
547 int64_t smv_timestamp = timestamp;
548 if (stream_index == 0)
572 #define OFFSET(x) offsetof(WAVDemuxContext, x)
573 #define DEC AV_OPT_FLAG_DECODING_PARAM
574 static const AVOption demux_options[] = {
579 static const AVClass wav_demuxer_class = {
582 .option = demux_options,
595 .priv_class = &wav_demuxer_class,
599 #if CONFIG_W64_DEMUXER
613 int64_t
size, data_ofs = 0;
625 if (
avio_rl64(pb) < 16 + 8 + 16 + 8 + 16 + 8)
644 if (size <= 24 || INT64_MAX - size <
avio_tell(pb))
671 uint32_t
count, chunk_size, i;
677 for (i = 0; i <
count; i++) {
678 char chunk_key[5], *
value;
710 handle_stream_probing(st);