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"
45 typedef struct WAVDemuxContext
{
51 int smv_frames_per_jpeg
;
60 int unaligned
; // e.g. if an odd number of bytes ID3 tag was prepended
61 int rifx
; // RIFX: integer byte order for parameters is big endian
64 static void set_spdif(AVFormatContext
*s
, WAVDemuxContext
*wav
)
66 if (CONFIG_SPDIF_DEMUXER
&& s
->streams
[0]->codecpar
->codec_tag
== 1) {
69 int ret
= ffio_ensure_seekback(s
->pb
, len
);
72 uint8_t *buf
= av_malloc(len
+ AV_INPUT_BUFFER_PADDING_SIZE
);
74 ret
= AVERROR(ENOMEM
);
76 int64_t pos
= avio_tell(s
->pb
);
77 len
= ret
= avio_read(s
->pb
, buf
, len
);
79 ret
= ff_spdif_probe(buf
, len
, &codec
);
80 if (ret
> AVPROBE_SCORE_EXTENSION
) {
81 s
->streams
[0]->codecpar
->codec_id
= codec
;
85 avio_seek(s
->pb
, pos
, SEEK_SET
);
91 av_log(s
, AV_LOG_WARNING
, "Cannot check for SPDIF\n");
95 #if CONFIG_WAV_DEMUXER
97 static int64_t next_tag(AVIOContext
*pb
, uint32_t *tag
, int big_endian
)
101 return avio_rl32(pb
);
103 return avio_rb32(pb
);
107 /* RIFF chunks are always at even offsets relative to where they start. */
108 static int64_t wav_seek_tag(WAVDemuxContext
* wav
, AVIOContext
*s
, int64_t offset
, int whence
)
110 offset
+= offset
< INT64_MAX
&& offset
+ wav
->unaligned
& 1;
112 return avio_seek(s
, offset
, whence
);
115 /* return the size of the found tag */
116 static int64_t find_tag(WAVDemuxContext
* wav
, AVIOContext
*pb
, uint32_t tag1
)
124 size
= next_tag(pb
, &tag
, wav
->rifx
);
127 wav_seek_tag(wav
, pb
, size
, SEEK_CUR
);
132 static int wav_probe(const AVProbeData
*p
)
134 /* check file header */
135 if (p
->buf_size
<= 32)
137 if (!memcmp(p
->buf
+ 8, "WAVE", 4)) {
138 if (!memcmp(p
->buf
, "RIFF", 4) || !memcmp(p
->buf
, "RIFX", 4))
139 /* Since the ACT demuxer has a standard WAV header at the top of
140 * its own, the returned score is decreased to avoid a probe
141 * conflict between ACT and WAV. */
142 return AVPROBE_SCORE_MAX
- 1;
143 else if (!memcmp(p
->buf
, "RF64", 4) &&
144 !memcmp(p
->buf
+ 12, "ds64", 4))
145 return AVPROBE_SCORE_MAX
;
150 static void handle_stream_probing(AVStream
*st
)
152 if (st
->codecpar
->codec_id
== AV_CODEC_ID_PCM_S16LE
) {
153 st
->request_probe
= AVPROBE_SCORE_EXTENSION
;
154 st
->probe_packets
= FFMIN(st
->probe_packets
, 32);
158 static int wav_parse_fmt_tag(AVFormatContext
*s
, int64_t size
, AVStream
**st
)
160 AVIOContext
*pb
= s
->pb
;
161 WAVDemuxContext
*wav
= s
->priv_data
;
164 /* parse fmt header */
165 *st
= avformat_new_stream(s
, NULL
);
167 return AVERROR(ENOMEM
);
169 ret
= ff_get_wav_header(s
, pb
, (*st
)->codecpar
, size
, wav
->rifx
);
172 handle_stream_probing(*st
);
174 (*st
)->need_parsing
= AVSTREAM_PARSE_FULL_RAW
;
176 avpriv_set_pts_info(*st
, 64, 1, (*st
)->codecpar
->sample_rate
);
181 static int wav_parse_xma2_tag(AVFormatContext
*s
, int64_t size
, AVStream
**st
)
183 AVIOContext
*pb
= s
->pb
;
184 int version
, num_streams
, i
, channels
= 0, ret
;
187 return AVERROR_INVALIDDATA
;
189 *st
= avformat_new_stream(s
, NULL
);
191 return AVERROR(ENOMEM
);
193 (*st
)->codecpar
->codec_type
= AVMEDIA_TYPE_AUDIO
;
194 (*st
)->codecpar
->codec_id
= AV_CODEC_ID_XMA2
;
195 (*st
)->need_parsing
= AVSTREAM_PARSE_FULL_RAW
;
197 version
= avio_r8(pb
);
198 if (version
!= 3 && version
!= 4)
199 return AVERROR_INVALIDDATA
;
200 num_streams
= avio_r8(pb
);
201 if (size
!= (32 + ((version
==3)?0:8) + 4*num_streams
))
202 return AVERROR_INVALIDDATA
;
204 (*st
)->codecpar
->sample_rate
= avio_rb32(pb
);
208 (*st
)->duration
= avio_rb32(pb
);
211 for (i
= 0; i
< num_streams
; i
++) {
212 channels
+= avio_r8(pb
);
215 (*st
)->codecpar
->channels
= channels
;
217 if ((*st
)->codecpar
->channels
<= 0 || (*st
)->codecpar
->sample_rate
<= 0)
218 return AVERROR_INVALIDDATA
;
220 avpriv_set_pts_info(*st
, 64, 1, (*st
)->codecpar
->sample_rate
);
222 avio_seek(pb
, -size
, SEEK_CUR
);
223 if ((ret
= ff_get_extradata(s
, (*st
)->codecpar
, pb
, size
)) < 0)
229 static inline int wav_parse_bext_string(AVFormatContext
*s
, const char *key
,
235 av_assert0(length
< sizeof(temp
));
236 if ((ret
= avio_read(s
->pb
, temp
, length
)) != length
)
237 return ret
< 0 ? ret
: AVERROR_INVALIDDATA
;
242 return av_dict_set(&s
->metadata
, key
, temp
, 0);
247 static int wav_parse_bext_tag(AVFormatContext
*s
, int64_t size
)
249 char temp
[131], *coding_history
;
251 uint64_t time_reference
;
252 int64_t umid_parts
[8], umid_mask
= 0;
254 if ((ret
= wav_parse_bext_string(s
, "description", 256)) < 0 ||
255 (ret
= wav_parse_bext_string(s
, "originator", 32)) < 0 ||
256 (ret
= wav_parse_bext_string(s
, "originator_reference", 32)) < 0 ||
257 (ret
= wav_parse_bext_string(s
, "origination_date", 10)) < 0 ||
258 (ret
= wav_parse_bext_string(s
, "origination_time", 8)) < 0)
261 time_reference
= avio_rl64(s
->pb
);
262 snprintf(temp
, sizeof(temp
), "%"PRIu64
, time_reference
);
263 if ((ret
= av_dict_set(&s
->metadata
, "time_reference", temp
, 0)) < 0)
266 /* check if version is >= 1, in which case an UMID may be present */
267 if (avio_rl16(s
->pb
) >= 1) {
268 for (x
= 0; x
< 8; x
++)
269 umid_mask
|= umid_parts
[x
] = avio_rb64(s
->pb
);
272 /* the string formatting below is per SMPTE 330M-2004 Annex C */
273 if (umid_parts
[4] == 0 && umid_parts
[5] == 0 &&
274 umid_parts
[6] == 0 && umid_parts
[7] == 0) {
276 snprintf(temp
, sizeof(temp
),
277 "0x%016"PRIX64
"%016"PRIX64
"%016"PRIX64
"%016"PRIX64
,
278 umid_parts
[0], umid_parts
[1],
279 umid_parts
[2], umid_parts
[3]);
282 snprintf(temp
, sizeof(temp
),
283 "0x%016"PRIX64
"%016"PRIX64
"%016"PRIX64
"%016"PRIX64
284 "%016"PRIX64
"%016"PRIX64
"%016"PRIX64
"%016"PRIX64
,
285 umid_parts
[0], umid_parts
[1],
286 umid_parts
[2], umid_parts
[3],
287 umid_parts
[4], umid_parts
[5],
288 umid_parts
[6], umid_parts
[7]);
291 if ((ret
= av_dict_set(&s
->metadata
, "umid", temp
, 0)) < 0)
295 avio_skip(s
->pb
, 190);
297 avio_skip(s
->pb
, 254);
300 /* CodingHistory present */
303 if (!(coding_history
= av_malloc(size
+ 1)))
304 return AVERROR(ENOMEM
);
306 if ((ret
= avio_read(s
->pb
, coding_history
, size
)) != size
) {
307 av_free(coding_history
);
308 return ret
< 0 ? ret
: AVERROR_INVALIDDATA
;
311 coding_history
[size
] = 0;
312 if ((ret
= av_dict_set(&s
->metadata
, "coding_history", coding_history
,
313 AV_DICT_DONT_STRDUP_VAL
)) < 0)
320 static const AVMetadataConv wav_metadata_conv
[] = {
321 { "description", "comment" },
322 { "originator", "encoded_by" },
323 { "origination_date", "date" },
324 { "origination_time", "creation_time" },
329 static int wav_read_header(AVFormatContext
*s
)
331 int64_t size
, av_uninit(data_size
);
332 int64_t sample_count
= 0;
335 AVIOContext
*pb
= s
->pb
;
337 WAVDemuxContext
*wav
= s
->priv_data
;
338 int ret
, got_fmt
= 0, got_xma2
= 0;
339 int64_t next_tag_ofs
, data_ofs
= -1;
341 wav
->unaligned
= avio_tell(s
->pb
) & 1;
343 wav
->smv_data_ofs
= -1;
348 case MKTAG('R', 'I', 'F', 'F'):
350 case MKTAG('R', 'I', 'F', 'X'):
353 case MKTAG('R', 'F', '6', '4'):
357 av_log(s
, AV_LOG_ERROR
, "invalid start code %s in RIFF header\n",
359 return AVERROR_INVALIDDATA
;
362 /* read chunk size */
366 if (avio_rl32(pb
) != MKTAG('W', 'A', 'V', 'E')) {
367 av_log(s
, AV_LOG_ERROR
, "invalid format in RIFF header\n");
368 return AVERROR_INVALIDDATA
;
372 if (avio_rl32(pb
) != MKTAG('d', 's', '6', '4'))
373 return AVERROR_INVALIDDATA
;
374 size
= avio_rl32(pb
);
376 return AVERROR_INVALIDDATA
;
377 avio_rl64(pb
); /* RIFF size */
379 data_size
= avio_rl64(pb
);
380 sample_count
= avio_rl64(pb
);
382 if (data_size
< 0 || sample_count
< 0) {
383 av_log(s
, AV_LOG_ERROR
, "negative data_size and/or sample_count in "
384 "ds64: data_size = %"PRId64
", sample_count = %"PRId64
"\n",
385 data_size
, sample_count
);
386 return AVERROR_INVALIDDATA
;
388 avio_skip(pb
, size
- 24); /* skip rest of ds64 chunk */
394 size
= next_tag(pb
, &tag
, wav
->rifx
);
395 next_tag_ofs
= avio_tell(pb
) + size
;
401 case MKTAG('f', 'm', 't', ' '):
402 /* only parse the first 'fmt ' tag found */
403 if (!got_xma2
&& !got_fmt
&& (ret
= wav_parse_fmt_tag(s
, size
, &st
)) < 0) {
406 av_log(s
, AV_LOG_WARNING
, "found more than one 'fmt ' tag\n");
410 case MKTAG('X', 'M', 'A', '2'):
411 /* only parse the first 'XMA2' tag found */
412 if (!got_fmt
&& !got_xma2
&& (ret
= wav_parse_xma2_tag(s
, size
, &st
)) < 0) {
415 av_log(s
, AV_LOG_WARNING
, "found more than one 'XMA2' tag\n");
419 case MKTAG('d', 'a', 't', 'a'):
420 if (!(pb
->seekable
& AVIO_SEEKABLE_NORMAL
) && !got_fmt
&& !got_xma2
) {
421 av_log(s
, AV_LOG_ERROR
,
422 "found no 'fmt ' tag before the 'data' tag\n");
423 return AVERROR_INVALIDDATA
;
427 next_tag_ofs
= wav
->data_end
= av_sat_add64(avio_tell(pb
), data_size
);
428 } else if (size
!= 0xFFFFFFFF) {
430 next_tag_ofs
= wav
->data_end
= size
? next_tag_ofs
: INT64_MAX
;
432 av_log(s
, AV_LOG_WARNING
, "Ignoring maximum wav data size, "
433 "file may be invalid\n");
435 next_tag_ofs
= wav
->data_end
= INT64_MAX
;
438 data_ofs
= avio_tell(pb
);
440 /* don't look for footer metadata if we can't seek or if we don't
441 * know where the data tag ends
443 if (!(pb
->seekable
& AVIO_SEEKABLE_NORMAL
) || (!rf64
&& !size
))
446 case MKTAG('f', 'a', 'c', 't'):
448 sample_count
= (!wav
->rifx
? avio_rl32(pb
) : avio_rb32(pb
));
450 case MKTAG('b', 'e', 'x', 't'):
451 if ((ret
= wav_parse_bext_tag(s
, size
)) < 0)
454 case MKTAG('S','M','V','0'):
456 av_log(s
, AV_LOG_ERROR
, "found no 'fmt ' tag before the 'SMV0' tag\n");
457 return AVERROR_INVALIDDATA
;
459 // SMV file, a wav file with video appended.
460 if (size
!= MKTAG('0','2','0','0')) {
461 av_log(s
, AV_LOG_ERROR
, "Unknown SMV version found\n");
464 av_log(s
, AV_LOG_DEBUG
, "Found SMV data\n");
465 wav
->smv_given_first
= 0;
466 vst
= avformat_new_stream(s
, NULL
);
468 return AVERROR(ENOMEM
);
471 vst
->codecpar
->codec_type
= AVMEDIA_TYPE_VIDEO
;
472 vst
->codecpar
->codec_id
= AV_CODEC_ID_SMVJPEG
;
473 vst
->codecpar
->width
= avio_rl24(pb
);
474 vst
->codecpar
->height
= avio_rl24(pb
);
475 if ((ret
= ff_alloc_extradata(vst
->codecpar
, 4)) < 0) {
476 av_log(s
, AV_LOG_ERROR
, "Could not allocate extradata.\n");
479 size
= avio_rl24(pb
);
480 wav
->smv_data_ofs
= avio_tell(pb
) + (size
- 5) * 3;
482 wav
->smv_block_size
= avio_rl24(pb
);
483 if (!wav
->smv_block_size
)
484 return AVERROR_INVALIDDATA
;
485 avpriv_set_pts_info(vst
, 32, 1, avio_rl24(pb
));
486 vst
->duration
= avio_rl24(pb
);
489 wav
->smv_frames_per_jpeg
= avio_rl24(pb
);
490 if (wav
->smv_frames_per_jpeg
> 65536) {
491 av_log(s
, AV_LOG_ERROR
, "too many frames per jpeg\n");
492 return AVERROR_INVALIDDATA
;
494 AV_WL32(vst
->codecpar
->extradata
, wav
->smv_frames_per_jpeg
);
497 case MKTAG('L', 'I', 'S', 'T'):
499 av_log(s
, AV_LOG_ERROR
, "too short LIST tag\n");
500 return AVERROR_INVALIDDATA
;
502 switch (avio_rl32(pb
)) {
503 case MKTAG('I', 'N', 'F', 'O'):
504 ff_read_riff_info(s
, size
- 4);
507 case MKTAG('I', 'D', '3', ' '):
508 case MKTAG('i', 'd', '3', ' '): {
509 ID3v2ExtraMeta
*id3v2_extra_meta
= NULL
;
510 ff_id3v2_read_dict(pb
, &s
->internal
->id3v2_meta
, ID3v2_DEFAULT_MAGIC
, &id3v2_extra_meta
);
511 if (id3v2_extra_meta
) {
512 ff_id3v2_parse_apic(s
, id3v2_extra_meta
);
513 ff_id3v2_parse_chapters(s
, id3v2_extra_meta
);
514 ff_id3v2_parse_priv(s
, id3v2_extra_meta
);
516 ff_id3v2_free_extra_meta(&id3v2_extra_meta
);
521 /* seek to next tag unless we know that we'll run into EOF */
522 if ((avio_size(pb
) > 0 && next_tag_ofs
>= avio_size(pb
)) ||
523 wav_seek_tag(wav
, pb
, next_tag_ofs
, SEEK_SET
) < 0) {
529 if (!got_fmt
&& !got_xma2
) {
530 av_log(s
, AV_LOG_ERROR
, "no 'fmt ' or 'XMA2' tag found\n");
531 return AVERROR_INVALIDDATA
;
535 av_log(s
, AV_LOG_ERROR
, "no 'data' tag found\n");
536 return AVERROR_INVALIDDATA
;
539 avio_seek(pb
, data_ofs
, SEEK_SET
);
541 if (data_size
> (INT64_MAX
>>3)) {
542 av_log(s
, AV_LOG_WARNING
, "Data size %"PRId64
" is too large\n", data_size
);
546 if ( st
->codecpar
->bit_rate
> 0 && data_size
> 0
547 && st
->codecpar
->sample_rate
> 0
548 && sample_count
> 0 && st
->codecpar
->channels
> 1
549 && sample_count
% st
->codecpar
->channels
== 0) {
550 if (fabs(8.0 * data_size
* st
->codecpar
->channels
* st
->codecpar
->sample_rate
/
551 sample_count
/st
->codecpar
->bit_rate
- 1.0) < 0.3)
552 sample_count
/= st
->codecpar
->channels
;
555 if ( data_size
> 0 && sample_count
&& st
->codecpar
->channels
556 && (data_size
<< 3) / sample_count
/ st
->codecpar
->channels
> st
->codecpar
->bits_per_coded_sample
+ 1) {
557 av_log(s
, AV_LOG_WARNING
, "ignoring wrong sample_count %"PRId64
"\n", sample_count
);
561 /* G.729 hack (for Ticket4577)
562 * FIXME: Come up with cleaner, more general solution */
563 if (st
->codecpar
->codec_id
== AV_CODEC_ID_G729
&& sample_count
&& (data_size
<< 3) > sample_count
) {
564 av_log(s
, AV_LOG_WARNING
, "ignoring wrong sample_count %"PRId64
"\n", sample_count
);
568 if (!sample_count
|| av_get_exact_bits_per_sample(st
->codecpar
->codec_id
) > 0)
569 if ( st
->codecpar
->channels
571 && av_get_bits_per_sample(st
->codecpar
->codec_id
)
572 && wav
->data_end
<= avio_size(pb
))
573 sample_count
= (data_size
<< 3)
575 (st
->codecpar
->channels
* (uint64_t)av_get_bits_per_sample(st
->codecpar
->codec_id
));
578 st
->duration
= sample_count
;
580 if (st
->codecpar
->codec_id
== AV_CODEC_ID_PCM_S32LE
&&
581 st
->codecpar
->block_align
== st
->codecpar
->channels
* 4 &&
582 st
->codecpar
->bits_per_coded_sample
== 32 &&
583 st
->codecpar
->extradata_size
== 2 &&
584 AV_RL16(st
->codecpar
->extradata
) == 1) {
585 st
->codecpar
->codec_id
= AV_CODEC_ID_PCM_F16LE
;
586 st
->codecpar
->bits_per_coded_sample
= 16;
587 } else if (st
->codecpar
->codec_id
== AV_CODEC_ID_PCM_S24LE
&&
588 st
->codecpar
->block_align
== st
->codecpar
->channels
* 4 &&
589 st
->codecpar
->bits_per_coded_sample
== 24) {
590 st
->codecpar
->codec_id
= AV_CODEC_ID_PCM_F24LE
;
591 } else if (st
->codecpar
->codec_id
== AV_CODEC_ID_XMA1
||
592 st
->codecpar
->codec_id
== AV_CODEC_ID_XMA2
) {
593 st
->codecpar
->block_align
= 2048;
594 } else if (st
->codecpar
->codec_id
== AV_CODEC_ID_ADPCM_MS
&& st
->codecpar
->channels
> 2 &&
595 st
->codecpar
->block_align
< INT_MAX
/ st
->codecpar
->channels
) {
596 st
->codecpar
->block_align
*= st
->codecpar
->channels
;
599 ff_metadata_conv_ctx(s
, NULL
, wav_metadata_conv
);
600 ff_metadata_conv_ctx(s
, NULL
, ff_riff_info_conv
);
608 * Find chunk with w64 GUID by skipping over other chunks.
609 * @return the size of the found chunk
611 static int64_t find_guid(AVIOContext
*pb
, const uint8_t guid1
[16])
616 while (!avio_feof(pb
)) {
617 avio_read(pb
, guid
, 16);
618 size
= avio_rl64(pb
);
619 if (size
<= 24 || size
> INT64_MAX
- 8)
620 return AVERROR_INVALIDDATA
;
621 if (!memcmp(guid
, guid1
, 16))
623 avio_skip(pb
, FFALIGN(size
, INT64_C(8)) - 24);
628 #define MAX_SIZE 4096
630 static int wav_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
635 WAVDemuxContext
*wav
= s
->priv_data
;
637 if (CONFIG_SPDIF_DEMUXER
&& wav
->spdif
== 1)
638 return ff_spdif_read_packet(s
, pkt
);
640 if (wav
->smv_data_ofs
> 0) {
641 int64_t audio_dts
, video_dts
;
643 audio_dts
= (int32_t)s
->streams
[0]->cur_dts
;
644 video_dts
= (int32_t)s
->streams
[1]->cur_dts
;
646 if (audio_dts
!= AV_NOPTS_VALUE
&& video_dts
!= AV_NOPTS_VALUE
) {
647 /*We always return a video frame first to get the pixel format first*/
648 wav
->smv_last_stream
= wav
->smv_given_first
?
649 av_compare_ts(video_dts
, s
->streams
[1]->time_base
,
650 audio_dts
, s
->streams
[0]->time_base
) > 0 : 0;
651 wav
->smv_given_first
= 1;
653 wav
->smv_last_stream
= !wav
->smv_last_stream
;
654 wav
->smv_last_stream
|= wav
->audio_eof
;
655 wav
->smv_last_stream
&= !wav
->smv_eof
;
656 if (wav
->smv_last_stream
) {
657 uint64_t old_pos
= avio_tell(s
->pb
);
658 uint64_t new_pos
= wav
->smv_data_ofs
+
659 wav
->smv_block
* (int64_t)wav
->smv_block_size
;
660 if (avio_seek(s
->pb
, new_pos
, SEEK_SET
) < 0) {
664 size
= avio_rl24(s
->pb
);
665 if (size
> wav
->smv_block_size
) {
669 ret
= av_get_packet(s
->pb
, pkt
, size
);
673 pkt
->pts
= wav
->smv_block
* wav
->smv_frames_per_jpeg
+ wav
->smv_cur_pt
;
675 if (wav
->smv_frames_per_jpeg
> 0)
676 wav
->smv_cur_pt
%= wav
->smv_frames_per_jpeg
;
677 if (!wav
->smv_cur_pt
)
680 pkt
->stream_index
= 1;
682 avio_seek(s
->pb
, old_pos
, SEEK_SET
);
683 if (ret
== AVERROR_EOF
) {
693 left
= wav
->data_end
- avio_tell(s
->pb
);
694 if (wav
->ignore_length
)
697 if (CONFIG_W64_DEMUXER
&& wav
->w64
)
698 left
= find_guid(s
->pb
, ff_w64_guid_data
) - 24;
700 left
= find_tag(wav
, s
->pb
, MKTAG('d', 'a', 't', 'a'));
703 if (wav
->smv_data_ofs
> 0 && !wav
->smv_eof
)
707 if (INT64_MAX
- left
< avio_tell(s
->pb
))
708 return AVERROR_INVALIDDATA
;
709 wav
->data_end
= avio_tell(s
->pb
) + left
;
713 if (st
->codecpar
->block_align
> 1) {
714 if (size
< st
->codecpar
->block_align
)
715 size
= st
->codecpar
->block_align
;
716 size
= (size
/ st
->codecpar
->block_align
) * st
->codecpar
->block_align
;
718 size
= FFMIN(size
, left
);
719 ret
= av_get_packet(s
->pb
, pkt
, size
);
722 pkt
->stream_index
= 0;
727 static int wav_read_seek(AVFormatContext
*s
,
728 int stream_index
, int64_t timestamp
, int flags
)
730 WAVDemuxContext
*wav
= s
->priv_data
;
734 if (wav
->smv_data_ofs
> 0) {
735 int64_t smv_timestamp
= timestamp
;
736 if (stream_index
== 0)
737 smv_timestamp
= av_rescale_q(timestamp
, s
->streams
[0]->time_base
, s
->streams
[1]->time_base
);
739 timestamp
= av_rescale_q(smv_timestamp
, s
->streams
[1]->time_base
, s
->streams
[0]->time_base
);
740 if (wav
->smv_frames_per_jpeg
> 0) {
741 wav
->smv_block
= smv_timestamp
/ wav
->smv_frames_per_jpeg
;
742 wav
->smv_cur_pt
= smv_timestamp
% wav
->smv_frames_per_jpeg
;
747 switch (st
->codecpar
->codec_id
) {
748 case AV_CODEC_ID_MP2
:
749 case AV_CODEC_ID_MP3
:
750 case AV_CODEC_ID_AC3
:
751 case AV_CODEC_ID_DTS
:
752 case AV_CODEC_ID_XMA2
:
753 /* use generic seeking with dynamically generated indexes */
758 return ff_pcm_read_seek(s
, stream_index
, timestamp
, flags
);
761 #define OFFSET(x) offsetof(WAVDemuxContext, x)
762 #define DEC AV_OPT_FLAG_DECODING_PARAM
763 static const AVOption demux_options
[] = {
764 { "ignore_length", "Ignore length", OFFSET(ignore_length
), AV_OPT_TYPE_BOOL
, { .i64
= 0 }, 0, 1, DEC
},
768 static const AVClass wav_demuxer_class
= {
769 .class_name
= "WAV demuxer",
770 .item_name
= av_default_item_name
,
771 .option
= demux_options
,
772 .version
= LIBAVUTIL_VERSION_INT
,
774 AVInputFormat ff_wav_demuxer
= {
776 .long_name
= NULL_IF_CONFIG_SMALL("WAV / WAVE (Waveform Audio)"),
777 .priv_data_size
= sizeof(WAVDemuxContext
),
778 .read_probe
= wav_probe
,
779 .read_header
= wav_read_header
,
780 .read_packet
= wav_read_packet
,
781 .read_seek
= wav_read_seek
,
782 .flags
= AVFMT_GENERIC_INDEX
,
783 .codec_tag
= (const AVCodecTag
* const []) { ff_codec_wav_tags
, 0 },
784 .priv_class
= &wav_demuxer_class
,
786 #endif /* CONFIG_WAV_DEMUXER */
788 #if CONFIG_W64_DEMUXER
789 static int w64_probe(const AVProbeData
*p
)
791 if (p
->buf_size
<= 40)
793 if (!memcmp(p
->buf
, ff_w64_guid_riff
, 16) &&
794 !memcmp(p
->buf
+ 24, ff_w64_guid_wave
, 16))
795 return AVPROBE_SCORE_MAX
;
800 static int w64_read_header(AVFormatContext
*s
)
802 int64_t size
, data_ofs
= 0;
803 AVIOContext
*pb
= s
->pb
;
804 WAVDemuxContext
*wav
= s
->priv_data
;
809 if (avio_read(pb
, guid
, 16) != 16 || memcmp(guid
, ff_w64_guid_riff
, 16))
810 return AVERROR_INVALIDDATA
;
812 /* riff + wave + fmt + sizes */
813 if (avio_rl64(pb
) < 16 + 8 + 16 + 8 + 16 + 8)
814 return AVERROR_INVALIDDATA
;
816 avio_read(pb
, guid
, 16);
817 if (memcmp(guid
, ff_w64_guid_wave
, 16)) {
818 av_log(s
, AV_LOG_ERROR
, "could not find wave guid\n");
819 return AVERROR_INVALIDDATA
;
824 st
= avformat_new_stream(s
, NULL
);
826 return AVERROR(ENOMEM
);
828 while (!avio_feof(pb
)) {
829 if (avio_read(pb
, guid
, 16) != 16)
831 size
= avio_rl64(pb
);
832 if (size
<= 24 || INT64_MAX
- size
< avio_tell(pb
))
833 return AVERROR_INVALIDDATA
;
835 if (!memcmp(guid
, ff_w64_guid_fmt
, 16)) {
836 /* subtract chunk header size - normal wav file doesn't count it */
837 ret
= ff_get_wav_header(s
, pb
, st
->codecpar
, size
- 24, 0);
840 avio_skip(pb
, FFALIGN(size
, INT64_C(8)) - size
);
842 avpriv_set_pts_info(st
, 64, 1, st
->codecpar
->sample_rate
);
843 } else if (!memcmp(guid
, ff_w64_guid_fact
, 16)) {
846 samples
= avio_rl64(pb
);
848 st
->duration
= samples
;
849 avio_skip(pb
, FFALIGN(size
, INT64_C(8)) - 32);
850 } else if (!memcmp(guid
, ff_w64_guid_data
, 16)) {
851 wav
->data_end
= avio_tell(pb
) + size
- 24;
853 data_ofs
= avio_tell(pb
);
854 if (!(pb
->seekable
& AVIO_SEEKABLE_NORMAL
))
857 avio_skip(pb
, size
- 24);
858 } else if (!memcmp(guid
, ff_w64_guid_summarylist
, 16)) {
859 int64_t start
, end
, cur
;
860 uint32_t count
, chunk_size
, i
;
861 int64_t filesize
= avio_size(s
->pb
);
863 start
= avio_tell(pb
);
864 end
= start
+ FFALIGN(size
, INT64_C(8)) - 24;
865 count
= avio_rl32(pb
);
867 for (i
= 0; i
< count
; i
++) {
868 char chunk_key
[5], *value
;
870 if (avio_feof(pb
) || (cur
= avio_tell(pb
)) < 0 || cur
> end
- 8 /* = tag + size */)
874 avio_read(pb
, chunk_key
, 4);
875 chunk_size
= avio_rl32(pb
);
876 if (chunk_size
== UINT32_MAX
|| (filesize
>= 0 && chunk_size
> filesize
))
877 return AVERROR_INVALIDDATA
;
879 value
= av_mallocz(chunk_size
+ 1);
881 return AVERROR(ENOMEM
);
883 ret
= avio_get_str16le(pb
, chunk_size
, value
, chunk_size
);
888 avio_skip(pb
, chunk_size
- ret
);
890 av_dict_set(&s
->metadata
, chunk_key
, value
, AV_DICT_DONT_STRDUP_VAL
);
893 avio_skip(pb
, end
- avio_tell(pb
));
895 av_log(s
, AV_LOG_DEBUG
, "unknown guid: "FF_PRI_GUID
"\n", FF_ARG_GUID(guid
));
896 avio_skip(pb
, FFALIGN(size
, INT64_C(8)) - 24);
903 ff_metadata_conv_ctx(s
, NULL
, wav_metadata_conv
);
904 ff_metadata_conv_ctx(s
, NULL
, ff_riff_info_conv
);
906 handle_stream_probing(st
);
907 st
->need_parsing
= AVSTREAM_PARSE_FULL_RAW
;
909 avio_seek(pb
, data_ofs
, SEEK_SET
);
916 AVInputFormat ff_w64_demuxer
= {
918 .long_name
= NULL_IF_CONFIG_SMALL("Sony Wave64"),
919 .priv_data_size
= sizeof(WAVDemuxContext
),
920 .read_probe
= w64_probe
,
921 .read_header
= w64_read_header
,
922 .read_packet
= wav_read_packet
,
923 .read_seek
= wav_read_seek
,
924 .flags
= AVFMT_GENERIC_INDEX
,
925 .codec_tag
= (const AVCodecTag
* const []) { ff_codec_wav_tags
, 0 },
927 #endif /* CONFIG_W64_DEMUXER */