3 * Copyright (c) 2001, 2002 Fabrice Bellard
7 * Copyright (c) 2009 Daniel Verkamp
9 * This file is part of FFmpeg.
11 * FFmpeg is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * FFmpeg is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with FFmpeg; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 #include "libavutil/avassert.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/intreadwrite.h"
31 #include "libavutil/log.h"
32 #include "libavutil/mathematics.h"
33 #include "libavutil/opt.h"
36 #include "avio_internal.h"
44 typedef struct WAVDemuxContext
{
50 int smv_frames_per_jpeg
;
59 int unaligned
; // e.g. if an odd number of bytes ID3 tag was prepended
60 int rifx
; // RIFX: integer byte order for parameters is big endian
63 static void set_spdif(AVFormatContext
*s
, WAVDemuxContext
*wav
)
65 if (CONFIG_SPDIF_DEMUXER
&& s
->streams
[0]->codecpar
->codec_tag
== 1) {
69 int ret
= ffio_ensure_seekback(s
->pb
, len
);
70 int64_t pos
= avio_tell(s
->pb
);
75 buf
= av_malloc(len
+ AV_INPUT_BUFFER_PADDING_SIZE
);
77 ret
= AVERROR(ENOMEM
);
81 len
= ret
= avio_read(s
->pb
, buf
, len
);
85 ret
= ff_spdif_probe(buf
, len
, &codec
);
86 if (ret
> AVPROBE_SCORE_EXTENSION
) {
87 s
->streams
[0]->codecpar
->codec_id
= codec
;
91 avio_seek(s
->pb
, pos
, SEEK_SET
);
93 av_log(s
, AV_LOG_WARNING
, "Cannot check for SPDIF\n");
98 #if CONFIG_WAV_DEMUXER
100 static int64_t next_tag(AVIOContext
*pb
, uint32_t *tag
, int big_endian
)
102 *tag
= avio_rl32(pb
);
104 return avio_rl32(pb
);
106 return avio_rb32(pb
);
110 /* RIFF chunks are always at even offsets relative to where they start. */
111 static int64_t wav_seek_tag(WAVDemuxContext
* wav
, AVIOContext
*s
, int64_t offset
, int whence
)
113 offset
+= offset
< INT64_MAX
&& offset
+ wav
->unaligned
& 1;
115 return avio_seek(s
, offset
, whence
);
118 /* return the size of the found tag */
119 static int64_t find_tag(WAVDemuxContext
* wav
, AVIOContext
*pb
, uint32_t tag1
)
127 size
= next_tag(pb
, &tag
, wav
->rifx
);
130 wav_seek_tag(wav
, pb
, size
, SEEK_CUR
);
135 static int wav_probe(AVProbeData
*p
)
137 /* check file header */
138 if (p
->buf_size
<= 32)
140 if (!memcmp(p
->buf
+ 8, "WAVE", 4)) {
141 if (!memcmp(p
->buf
, "RIFF", 4) || !memcmp(p
->buf
, "RIFX", 4))
142 /* Since the ACT demuxer has a standard WAV header at the top of
143 * its own, the returned score is decreased to avoid a probe
144 * conflict between ACT and WAV. */
145 return AVPROBE_SCORE_MAX
- 1;
146 else if (!memcmp(p
->buf
, "RF64", 4) &&
147 !memcmp(p
->buf
+ 12, "ds64", 4))
148 return AVPROBE_SCORE_MAX
;
153 static void handle_stream_probing(AVStream
*st
)
155 if (st
->codecpar
->codec_id
== AV_CODEC_ID_PCM_S16LE
) {
156 st
->request_probe
= AVPROBE_SCORE_EXTENSION
;
157 st
->probe_packets
= FFMIN(st
->probe_packets
, 32);
161 static int wav_parse_fmt_tag(AVFormatContext
*s
, int64_t size
, AVStream
**st
)
163 AVIOContext
*pb
= s
->pb
;
164 WAVDemuxContext
*wav
= s
->priv_data
;
167 /* parse fmt header */
168 *st
= avformat_new_stream(s
, NULL
);
170 return AVERROR(ENOMEM
);
172 ret
= ff_get_wav_header(s
, pb
, (*st
)->codecpar
, size
, wav
->rifx
);
175 handle_stream_probing(*st
);
177 (*st
)->need_parsing
= AVSTREAM_PARSE_FULL_RAW
;
179 avpriv_set_pts_info(*st
, 64, 1, (*st
)->codecpar
->sample_rate
);
184 static int wav_parse_xma2_tag(AVFormatContext
*s
, int64_t size
, AVStream
**st
)
186 AVIOContext
*pb
= s
->pb
;
187 int num_streams
, i
, channels
= 0;
190 return AVERROR_INVALIDDATA
;
192 *st
= avformat_new_stream(s
, NULL
);
194 return AVERROR(ENOMEM
);
196 (*st
)->codecpar
->codec_type
= AVMEDIA_TYPE_AUDIO
;
197 (*st
)->codecpar
->codec_id
= AV_CODEC_ID_XMA2
;
198 (*st
)->need_parsing
= AVSTREAM_PARSE_FULL_RAW
;
201 num_streams
= avio_r8(pb
);
202 if (size
< 40 + num_streams
* 4)
203 return AVERROR_INVALIDDATA
;
205 (*st
)->codecpar
->sample_rate
= avio_rb32(pb
);
207 (*st
)->duration
= avio_rb32(pb
);
210 for (i
= 0; i
< num_streams
; i
++) {
211 channels
+= avio_r8(pb
);
214 (*st
)->codecpar
->channels
= channels
;
216 if ((*st
)->codecpar
->channels
<= 0 || (*st
)->codecpar
->sample_rate
<= 0)
217 return AVERROR_INVALIDDATA
;
219 avpriv_set_pts_info(*st
, 64, 1, (*st
)->codecpar
->sample_rate
);
220 if (ff_alloc_extradata((*st
)->codecpar
, 34))
221 return AVERROR(ENOMEM
);
222 memset((*st
)->codecpar
->extradata
, 0, 34);
227 static inline int wav_parse_bext_string(AVFormatContext
*s
, const char *key
,
233 av_assert0(length
< sizeof(temp
));
234 if ((ret
= avio_read(s
->pb
, temp
, length
)) != length
)
235 return ret
< 0 ? ret
: AVERROR_INVALIDDATA
;
240 return av_dict_set(&s
->metadata
, key
, temp
, 0);
245 static int wav_parse_bext_tag(AVFormatContext
*s
, int64_t size
)
247 char temp
[131], *coding_history
;
249 uint64_t time_reference
;
250 int64_t umid_parts
[8], umid_mask
= 0;
252 if ((ret
= wav_parse_bext_string(s
, "description", 256)) < 0 ||
253 (ret
= wav_parse_bext_string(s
, "originator", 32)) < 0 ||
254 (ret
= wav_parse_bext_string(s
, "originator_reference", 32)) < 0 ||
255 (ret
= wav_parse_bext_string(s
, "origination_date", 10)) < 0 ||
256 (ret
= wav_parse_bext_string(s
, "origination_time", 8)) < 0)
259 time_reference
= avio_rl64(s
->pb
);
260 snprintf(temp
, sizeof(temp
), "%"PRIu64
, time_reference
);
261 if ((ret
= av_dict_set(&s
->metadata
, "time_reference", temp
, 0)) < 0)
264 /* check if version is >= 1, in which case an UMID may be present */
265 if (avio_rl16(s
->pb
) >= 1) {
266 for (x
= 0; x
< 8; x
++)
267 umid_mask
|= umid_parts
[x
] = avio_rb64(s
->pb
);
270 /* the string formatting below is per SMPTE 330M-2004 Annex C */
271 if (umid_parts
[4] == 0 && umid_parts
[5] == 0 &&
272 umid_parts
[6] == 0 && umid_parts
[7] == 0) {
274 snprintf(temp
, sizeof(temp
),
275 "0x%016"PRIX64
"%016"PRIX64
"%016"PRIX64
"%016"PRIX64
,
276 umid_parts
[0], umid_parts
[1],
277 umid_parts
[2], umid_parts
[3]);
280 snprintf(temp
, sizeof(temp
),
281 "0x%016"PRIX64
"%016"PRIX64
"%016"PRIX64
"%016"PRIX64
282 "%016"PRIX64
"%016"PRIX64
"%016"PRIX64
"%016"PRIX64
,
283 umid_parts
[0], umid_parts
[1],
284 umid_parts
[2], umid_parts
[3],
285 umid_parts
[4], umid_parts
[5],
286 umid_parts
[6], umid_parts
[7]);
289 if ((ret
= av_dict_set(&s
->metadata
, "umid", temp
, 0)) < 0)
293 avio_skip(s
->pb
, 190);
295 avio_skip(s
->pb
, 254);
298 /* CodingHistory present */
301 if (!(coding_history
= av_malloc(size
+ 1)))
302 return AVERROR(ENOMEM
);
304 if ((ret
= avio_read(s
->pb
, coding_history
, size
)) != size
) {
305 av_free(coding_history
);
306 return ret
< 0 ? ret
: AVERROR_INVALIDDATA
;
309 coding_history
[size
] = 0;
310 if ((ret
= av_dict_set(&s
->metadata
, "coding_history", coding_history
,
311 AV_DICT_DONT_STRDUP_VAL
)) < 0)
318 static const AVMetadataConv wav_metadata_conv
[] = {
319 { "description", "comment" },
320 { "originator", "encoded_by" },
321 { "origination_date", "date" },
322 { "origination_time", "creation_time" },
327 static int wav_read_header(AVFormatContext
*s
)
329 int64_t size
, av_uninit(data_size
);
330 int64_t sample_count
= 0;
334 AVIOContext
*pb
= s
->pb
;
336 WAVDemuxContext
*wav
= s
->priv_data
;
337 int ret
, got_fmt
= 0, got_xma2
= 0;
338 int64_t next_tag_ofs
, data_ofs
= -1;
340 wav
->unaligned
= avio_tell(s
->pb
) & 1;
342 wav
->smv_data_ofs
= -1;
347 case MKTAG('R', 'I', 'F', 'F'):
349 case MKTAG('R', 'I', 'F', 'X'):
352 case MKTAG('R', 'F', '6', '4'):
356 av_get_codec_tag_string(start_code
, sizeof(start_code
), tag
);
357 av_log(s
, AV_LOG_ERROR
, "invalid start code %s in RIFF header\n", start_code
);
358 return AVERROR_INVALIDDATA
;
361 /* read chunk size */
365 if (avio_rl32(pb
) != MKTAG('W', 'A', 'V', 'E')) {
366 av_log(s
, AV_LOG_ERROR
, "invalid format in RIFF header\n");
367 return AVERROR_INVALIDDATA
;
371 if (avio_rl32(pb
) != MKTAG('d', 's', '6', '4'))
372 return AVERROR_INVALIDDATA
;
373 size
= avio_rl32(pb
);
375 return AVERROR_INVALIDDATA
;
376 avio_rl64(pb
); /* RIFF size */
378 data_size
= avio_rl64(pb
);
379 sample_count
= avio_rl64(pb
);
381 if (data_size
< 0 || sample_count
< 0) {
382 av_log(s
, AV_LOG_ERROR
, "negative data_size and/or sample_count in "
383 "ds64: data_size = %"PRId64
", sample_count = %"PRId64
"\n",
384 data_size
, sample_count
);
385 return AVERROR_INVALIDDATA
;
387 avio_skip(pb
, size
- 24); /* skip rest of ds64 chunk */
393 size
= next_tag(pb
, &tag
, wav
->rifx
);
394 next_tag_ofs
= avio_tell(pb
) + size
;
400 case MKTAG('f', 'm', 't', ' '):
401 /* only parse the first 'fmt ' tag found */
402 if (!got_xma2
&& !got_fmt
&& (ret
= wav_parse_fmt_tag(s
, size
, &st
)) < 0) {
405 av_log(s
, AV_LOG_WARNING
, "found more than one 'fmt ' tag\n");
409 case MKTAG('X', 'M', 'A', '2'):
410 /* only parse the first 'XMA2' tag found */
411 if (!got_fmt
&& !got_xma2
&& (ret
= wav_parse_xma2_tag(s
, size
, &st
)) < 0) {
414 av_log(s
, AV_LOG_WARNING
, "found more than one 'XMA2' tag\n");
418 case MKTAG('d', 'a', 't', 'a'):
419 if (!pb
->seekable
&& !got_fmt
&& !got_xma2
) {
420 av_log(s
, AV_LOG_ERROR
,
421 "found no 'fmt ' tag before the 'data' tag\n");
422 return AVERROR_INVALIDDATA
;
426 next_tag_ofs
= wav
->data_end
= avio_tell(pb
) + data_size
;
427 } else if (size
!= 0xFFFFFFFF) {
429 next_tag_ofs
= wav
->data_end
= size
? next_tag_ofs
: INT64_MAX
;
431 av_log(s
, AV_LOG_WARNING
, "Ignoring maximum wav data size, "
432 "file may be invalid\n");
434 next_tag_ofs
= wav
->data_end
= INT64_MAX
;
437 data_ofs
= avio_tell(pb
);
439 /* don't look for footer metadata if we can't seek or if we don't
440 * know where the data tag ends
442 if (!pb
->seekable
|| (!rf64
&& !size
))
445 case MKTAG('f', 'a', 'c', 't'):
447 sample_count
= (!wav
->rifx
? avio_rl32(pb
) : avio_rb32(pb
));
449 case MKTAG('b', 'e', 'x', 't'):
450 if ((ret
= wav_parse_bext_tag(s
, size
)) < 0)
453 case MKTAG('S','M','V','0'):
455 av_log(s
, AV_LOG_ERROR
, "found no 'fmt ' tag before the 'SMV0' tag\n");
456 return AVERROR_INVALIDDATA
;
458 // SMV file, a wav file with video appended.
459 if (size
!= MKTAG('0','2','0','0')) {
460 av_log(s
, AV_LOG_ERROR
, "Unknown SMV version found\n");
463 av_log(s
, AV_LOG_DEBUG
, "Found SMV data\n");
464 wav
->smv_given_first
= 0;
465 vst
= avformat_new_stream(s
, NULL
);
467 return AVERROR(ENOMEM
);
470 vst
->codecpar
->codec_type
= AVMEDIA_TYPE_VIDEO
;
471 vst
->codecpar
->codec_id
= AV_CODEC_ID_SMVJPEG
;
472 vst
->codecpar
->width
= avio_rl24(pb
);
473 vst
->codecpar
->height
= avio_rl24(pb
);
474 if (ff_alloc_extradata(vst
->codecpar
, 4)) {
475 av_log(s
, AV_LOG_ERROR
, "Could not allocate extradata.\n");
476 return AVERROR(ENOMEM
);
478 size
= avio_rl24(pb
);
479 wav
->smv_data_ofs
= avio_tell(pb
) + (size
- 5) * 3;
481 wav
->smv_block_size
= avio_rl24(pb
);
482 if (!wav
->smv_block_size
)
483 return AVERROR_INVALIDDATA
;
484 avpriv_set_pts_info(vst
, 32, 1, avio_rl24(pb
));
485 vst
->duration
= avio_rl24(pb
);
488 wav
->smv_frames_per_jpeg
= avio_rl24(pb
);
489 if (wav
->smv_frames_per_jpeg
> 65536) {
490 av_log(s
, AV_LOG_ERROR
, "too many frames per jpeg\n");
491 return AVERROR_INVALIDDATA
;
493 AV_WL32(vst
->codecpar
->extradata
, wav
->smv_frames_per_jpeg
);
496 case MKTAG('L', 'I', 'S', 'T'):
498 av_log(s
, AV_LOG_ERROR
, "too short LIST tag\n");
499 return AVERROR_INVALIDDATA
;
501 switch (avio_rl32(pb
)) {
502 case MKTAG('I', 'N', 'F', 'O'):
503 ff_read_riff_info(s
, size
- 4);
508 /* seek to next tag unless we know that we'll run into EOF */
509 if ((avio_size(pb
) > 0 && next_tag_ofs
>= avio_size(pb
)) ||
510 wav_seek_tag(wav
, pb
, next_tag_ofs
, SEEK_SET
) < 0) {
516 if (!got_fmt
&& !got_xma2
) {
517 av_log(s
, AV_LOG_ERROR
, "no 'fmt ' or 'XMA2' tag found\n");
518 return AVERROR_INVALIDDATA
;
522 av_log(s
, AV_LOG_ERROR
, "no 'data' tag found\n");
523 return AVERROR_INVALIDDATA
;
526 avio_seek(pb
, data_ofs
, SEEK_SET
);
528 if (data_size
> (INT64_MAX
>>3)) {
529 av_log(s
, AV_LOG_WARNING
, "Data size %"PRId64
" is too large\n", data_size
);
533 if ( st
->codecpar
->bit_rate
> 0 && data_size
> 0
534 && st
->codecpar
->sample_rate
> 0
535 && sample_count
> 0 && st
->codecpar
->channels
> 1
536 && sample_count
% st
->codecpar
->channels
== 0) {
537 if (fabs(8.0 * data_size
* st
->codecpar
->channels
* st
->codecpar
->sample_rate
/
538 sample_count
/st
->codecpar
->bit_rate
- 1.0) < 0.3)
539 sample_count
/= st
->codecpar
->channels
;
542 if ( data_size
> 0 && sample_count
&& st
->codecpar
->channels
543 && (data_size
<< 3) / sample_count
/ st
->codecpar
->channels
> st
->codecpar
->bits_per_coded_sample
+ 1) {
544 av_log(s
, AV_LOG_WARNING
, "ignoring wrong sample_count %"PRId64
"\n", sample_count
);
548 /* G.729 hack (for Ticket4577)
549 * FIXME: Come up with cleaner, more general solution */
550 if (st
->codecpar
->codec_id
== AV_CODEC_ID_G729
&& sample_count
&& (data_size
<< 3) > sample_count
) {
551 av_log(s
, AV_LOG_WARNING
, "ignoring wrong sample_count %"PRId64
"\n", sample_count
);
555 if (!sample_count
|| av_get_exact_bits_per_sample(st
->codecpar
->codec_id
) > 0)
556 if ( st
->codecpar
->channels
558 && av_get_bits_per_sample(st
->codecpar
->codec_id
)
559 && wav
->data_end
<= avio_size(pb
))
560 sample_count
= (data_size
<< 3)
562 (st
->codecpar
->channels
* (uint64_t)av_get_bits_per_sample(st
->codecpar
->codec_id
));
565 st
->duration
= sample_count
;
567 ff_metadata_conv_ctx(s
, NULL
, wav_metadata_conv
);
568 ff_metadata_conv_ctx(s
, NULL
, ff_riff_info_conv
);
576 * Find chunk with w64 GUID by skipping over other chunks.
577 * @return the size of the found chunk
579 static int64_t find_guid(AVIOContext
*pb
, const uint8_t guid1
[16])
584 while (!avio_feof(pb
)) {
585 avio_read(pb
, guid
, 16);
586 size
= avio_rl64(pb
);
587 if (size
<= 24 || size
> INT64_MAX
- 8)
588 return AVERROR_INVALIDDATA
;
589 if (!memcmp(guid
, guid1
, 16))
591 avio_skip(pb
, FFALIGN(size
, INT64_C(8)) - 24);
596 #define MAX_SIZE 4096
598 static int wav_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
603 WAVDemuxContext
*wav
= s
->priv_data
;
605 if (CONFIG_SPDIF_DEMUXER
&& wav
->spdif
== 1)
606 return ff_spdif_read_packet(s
, pkt
);
608 if (wav
->smv_data_ofs
> 0) {
609 int64_t audio_dts
, video_dts
;
611 audio_dts
= (int32_t)s
->streams
[0]->cur_dts
;
612 video_dts
= (int32_t)s
->streams
[1]->cur_dts
;
614 if (audio_dts
!= AV_NOPTS_VALUE
&& video_dts
!= AV_NOPTS_VALUE
) {
615 /*We always return a video frame first to get the pixel format first*/
616 wav
->smv_last_stream
= wav
->smv_given_first
?
617 av_compare_ts(video_dts
, s
->streams
[1]->time_base
,
618 audio_dts
, s
->streams
[0]->time_base
) > 0 : 0;
619 wav
->smv_given_first
= 1;
621 wav
->smv_last_stream
= !wav
->smv_last_stream
;
622 wav
->smv_last_stream
|= wav
->audio_eof
;
623 wav
->smv_last_stream
&= !wav
->smv_eof
;
624 if (wav
->smv_last_stream
) {
625 uint64_t old_pos
= avio_tell(s
->pb
);
626 uint64_t new_pos
= wav
->smv_data_ofs
+
627 wav
->smv_block
* (int64_t)wav
->smv_block_size
;
628 if (avio_seek(s
->pb
, new_pos
, SEEK_SET
) < 0) {
632 size
= avio_rl24(s
->pb
);
633 ret
= av_get_packet(s
->pb
, pkt
, size
);
637 pkt
->pts
= wav
->smv_block
* wav
->smv_frames_per_jpeg
+ wav
->smv_cur_pt
;
639 if (wav
->smv_frames_per_jpeg
> 0)
640 wav
->smv_cur_pt
%= wav
->smv_frames_per_jpeg
;
641 if (!wav
->smv_cur_pt
)
644 pkt
->stream_index
= 1;
646 avio_seek(s
->pb
, old_pos
, SEEK_SET
);
647 if (ret
== AVERROR_EOF
) {
657 left
= wav
->data_end
- avio_tell(s
->pb
);
658 if (wav
->ignore_length
)
661 if (CONFIG_W64_DEMUXER
&& wav
->w64
)
662 left
= find_guid(s
->pb
, ff_w64_guid_data
) - 24;
664 left
= find_tag(wav
, s
->pb
, MKTAG('d', 'a', 't', 'a'));
667 if (wav
->smv_data_ofs
> 0 && !wav
->smv_eof
)
671 wav
->data_end
= avio_tell(s
->pb
) + left
;
675 if (st
->codecpar
->block_align
> 1) {
676 if (size
< st
->codecpar
->block_align
)
677 size
= st
->codecpar
->block_align
;
678 size
= (size
/ st
->codecpar
->block_align
) * st
->codecpar
->block_align
;
680 size
= FFMIN(size
, left
);
681 ret
= av_get_packet(s
->pb
, pkt
, size
);
684 pkt
->stream_index
= 0;
689 static int wav_read_seek(AVFormatContext
*s
,
690 int stream_index
, int64_t timestamp
, int flags
)
692 WAVDemuxContext
*wav
= s
->priv_data
;
696 if (wav
->smv_data_ofs
> 0) {
697 int64_t smv_timestamp
= timestamp
;
698 if (stream_index
== 0)
699 smv_timestamp
= av_rescale_q(timestamp
, s
->streams
[0]->time_base
, s
->streams
[1]->time_base
);
701 timestamp
= av_rescale_q(smv_timestamp
, s
->streams
[1]->time_base
, s
->streams
[0]->time_base
);
702 if (wav
->smv_frames_per_jpeg
> 0) {
703 wav
->smv_block
= smv_timestamp
/ wav
->smv_frames_per_jpeg
;
704 wav
->smv_cur_pt
= smv_timestamp
% wav
->smv_frames_per_jpeg
;
709 switch (st
->codecpar
->codec_id
) {
710 case AV_CODEC_ID_MP2
:
711 case AV_CODEC_ID_MP3
:
712 case AV_CODEC_ID_AC3
:
713 case AV_CODEC_ID_DTS
:
714 /* use generic seeking with dynamically generated indexes */
719 return ff_pcm_read_seek(s
, stream_index
, timestamp
, flags
);
722 #define OFFSET(x) offsetof(WAVDemuxContext, x)
723 #define DEC AV_OPT_FLAG_DECODING_PARAM
724 static const AVOption demux_options
[] = {
725 { "ignore_length", "Ignore length", OFFSET(ignore_length
), AV_OPT_TYPE_BOOL
, { .i64
= 0 }, 0, 1, DEC
},
729 static const AVClass wav_demuxer_class
= {
730 .class_name
= "WAV demuxer",
731 .item_name
= av_default_item_name
,
732 .option
= demux_options
,
733 .version
= LIBAVUTIL_VERSION_INT
,
735 AVInputFormat ff_wav_demuxer
= {
737 .long_name
= NULL_IF_CONFIG_SMALL("WAV / WAVE (Waveform Audio)"),
738 .priv_data_size
= sizeof(WAVDemuxContext
),
739 .read_probe
= wav_probe
,
740 .read_header
= wav_read_header
,
741 .read_packet
= wav_read_packet
,
742 .read_seek
= wav_read_seek
,
743 .flags
= AVFMT_GENERIC_INDEX
,
744 .codec_tag
= (const AVCodecTag
* const []) { ff_codec_wav_tags
, 0 },
745 .priv_class
= &wav_demuxer_class
,
747 #endif /* CONFIG_WAV_DEMUXER */
749 #if CONFIG_W64_DEMUXER
750 static int w64_probe(AVProbeData
*p
)
752 if (p
->buf_size
<= 40)
754 if (!memcmp(p
->buf
, ff_w64_guid_riff
, 16) &&
755 !memcmp(p
->buf
+ 24, ff_w64_guid_wave
, 16))
756 return AVPROBE_SCORE_MAX
;
761 static int w64_read_header(AVFormatContext
*s
)
763 int64_t size
, data_ofs
= 0;
764 AVIOContext
*pb
= s
->pb
;
765 WAVDemuxContext
*wav
= s
->priv_data
;
770 avio_read(pb
, guid
, 16);
771 if (memcmp(guid
, ff_w64_guid_riff
, 16))
772 return AVERROR_INVALIDDATA
;
774 /* riff + wave + fmt + sizes */
775 if (avio_rl64(pb
) < 16 + 8 + 16 + 8 + 16 + 8)
776 return AVERROR_INVALIDDATA
;
778 avio_read(pb
, guid
, 16);
779 if (memcmp(guid
, ff_w64_guid_wave
, 16)) {
780 av_log(s
, AV_LOG_ERROR
, "could not find wave guid\n");
781 return AVERROR_INVALIDDATA
;
786 st
= avformat_new_stream(s
, NULL
);
788 return AVERROR(ENOMEM
);
790 while (!avio_feof(pb
)) {
791 if (avio_read(pb
, guid
, 16) != 16)
793 size
= avio_rl64(pb
);
794 if (size
<= 24 || INT64_MAX
- size
< avio_tell(pb
))
795 return AVERROR_INVALIDDATA
;
797 if (!memcmp(guid
, ff_w64_guid_fmt
, 16)) {
798 /* subtract chunk header size - normal wav file doesn't count it */
799 ret
= ff_get_wav_header(s
, pb
, st
->codecpar
, size
- 24, 0);
802 avio_skip(pb
, FFALIGN(size
, INT64_C(8)) - size
);
804 avpriv_set_pts_info(st
, 64, 1, st
->codecpar
->sample_rate
);
805 } else if (!memcmp(guid
, ff_w64_guid_fact
, 16)) {
808 samples
= avio_rl64(pb
);
810 st
->duration
= samples
;
811 } else if (!memcmp(guid
, ff_w64_guid_data
, 16)) {
812 wav
->data_end
= avio_tell(pb
) + size
- 24;
814 data_ofs
= avio_tell(pb
);
818 avio_skip(pb
, size
- 24);
819 } else if (!memcmp(guid
, ff_w64_guid_summarylist
, 16)) {
820 int64_t start
, end
, cur
;
821 uint32_t count
, chunk_size
, i
;
822 int64_t filesize
= avio_size(s
->pb
);
824 start
= avio_tell(pb
);
825 end
= start
+ FFALIGN(size
, INT64_C(8)) - 24;
826 count
= avio_rl32(pb
);
828 for (i
= 0; i
< count
; i
++) {
829 char chunk_key
[5], *value
;
831 if (avio_feof(pb
) || (cur
= avio_tell(pb
)) < 0 || cur
> end
- 8 /* = tag + size */)
835 avio_read(pb
, chunk_key
, 4);
836 chunk_size
= avio_rl32(pb
);
837 if (chunk_size
== UINT32_MAX
|| (filesize
>= 0 && chunk_size
> filesize
))
838 return AVERROR_INVALIDDATA
;
840 value
= av_mallocz(chunk_size
+ 1);
842 return AVERROR(ENOMEM
);
844 ret
= avio_get_str16le(pb
, chunk_size
, value
, chunk_size
);
849 avio_skip(pb
, chunk_size
- ret
);
851 av_dict_set(&s
->metadata
, chunk_key
, value
, AV_DICT_DONT_STRDUP_VAL
);
854 avio_skip(pb
, end
- avio_tell(pb
));
856 av_log(s
, AV_LOG_DEBUG
, "unknown guid: "FF_PRI_GUID
"\n", FF_ARG_GUID(guid
));
857 avio_skip(pb
, FFALIGN(size
, INT64_C(8)) - 24);
864 ff_metadata_conv_ctx(s
, NULL
, wav_metadata_conv
);
865 ff_metadata_conv_ctx(s
, NULL
, ff_riff_info_conv
);
867 handle_stream_probing(st
);
868 st
->need_parsing
= AVSTREAM_PARSE_FULL_RAW
;
870 avio_seek(pb
, data_ofs
, SEEK_SET
);
877 AVInputFormat ff_w64_demuxer
= {
879 .long_name
= NULL_IF_CONFIG_SMALL("Sony Wave64"),
880 .priv_data_size
= sizeof(WAVDemuxContext
),
881 .read_probe
= w64_probe
,
882 .read_header
= w64_read_header
,
883 .read_packet
= wav_read_packet
,
884 .read_seek
= wav_read_seek
,
885 .flags
= AVFMT_GENERIC_INDEX
,
886 .codec_tag
= (const AVCodecTag
* const []) { ff_codec_wav_tags
, 0 },
888 #endif /* CONFIG_W64_DEMUXER */