annotate wav.c @ 6119:16ca32d9c5f0 libavformat

Use a bitstream filter for converting the extradata syntax when generating an SDP. This allows to generate correct SDPs for H.264 video in "MP4 syntax".
author lucabe
date Fri, 11 Jun 2010 08:01:45 +0000
parents f3c5f3b0eb0d
children 67c36f475c54
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 874
diff changeset
1 /*
1415
3b00fb8ef8e4 replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents: 1358
diff changeset
2 * WAV muxer and demuxer
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4206
diff changeset
3 * Copyright (c) 2001, 2002 Fabrice Bellard
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
5126
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
5 * Sony Wave64 demuxer
5267
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
6 * RF64 demuxer
5126
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
7 * Copyright (c) 2009 Daniel Verkamp
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
8 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
9 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
10 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
11 * FFmpeg is free software; you can redistribute it and/or
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
14 * version 2.1 of the License, or (at your option) any later version.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
16 * FFmpeg is distributed in the hope that it will be useful,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
19 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
22 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 893
diff changeset
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 #include "avformat.h"
2545
213268d7594e move unrelated functions declarations out of allformats.h
aurel
parents: 2274
diff changeset
26 #include "raw.h"
1172
6a5e58d2114b move common stuff from avienc.c and wav.c to new file riff.c
mru
parents: 1169
diff changeset
27 #include "riff.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 typedef struct {
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3934
diff changeset
30 int64_t data;
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3934
diff changeset
31 int64_t data_end;
1781
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
32 int64_t minpts;
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
33 int64_t maxpts;
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
34 int last_duration;
5126
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
35 int w64;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36 } WAVContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 3973
diff changeset
38 #if CONFIG_WAV_MUXER
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 static int wav_write_header(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 WAVContext *wav = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
42 ByteIOContext *pb = s->pb;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3934
diff changeset
43 int64_t fmt, fact;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 put_tag(pb, "RIFF");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46 put_le32(pb, 0); /* file length */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47 put_tag(pb, "WAVE");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 /* format header */
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5001
diff changeset
50 fmt = ff_start_tag(pb, "fmt ");
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5001
diff changeset
51 if (ff_put_wav_header(pb, s->streams[0]->codec) < 0) {
3925
dfd3033e7de7 add error message for unsupported codecs in WAVE.
jbr
parents: 3871
diff changeset
52 av_log(s, AV_LOG_ERROR, "%s codec not supported in WAVE format\n",
3934
1aa5e41ceaef Avoid segfault due to not set AVCodec.
michael
parents: 3925
diff changeset
53 s->streams[0]->codec->codec ? s->streams[0]->codec->codec->name : "NONE");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 av_free(wav);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56 }
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5001
diff changeset
57 ff_end_tag(pb, fmt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58
5127
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
59 if (s->streams[0]->codec->codec_tag != 0x01 /* hence for all other than PCM */
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
60 && !url_is_streamed(s->pb)) {
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5001
diff changeset
61 fact = ff_start_tag(pb, "fact");
1781
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
62 put_le32(pb, 0);
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5001
diff changeset
63 ff_end_tag(pb, fact);
1781
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
64 }
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
65
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 817
diff changeset
66 av_set_pts_info(s->streams[0], 64, 1, s->streams[0]->codec->sample_rate);
1781
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
67 wav->maxpts = wav->last_duration = 0;
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
68 wav->minpts = INT64_MAX;
645
9fc2d2cc4608 wav timestamp truncation fix by (Wolfram Gloger <wmglo dent.med.uni-muenchen de>)
michael
parents: 587
diff changeset
69
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70 /* data header */
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5001
diff changeset
71 wav->data = ff_start_tag(pb, "data");
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 874
diff changeset
72
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 413
diff changeset
78 static int wav_write_packet(AVFormatContext *s, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 {
5127
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
80 ByteIOContext *pb = s->pb;
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
81 WAVContext *wav = s->priv_data;
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 413
diff changeset
82 put_buffer(pb, pkt->data, pkt->size);
1781
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
83 if(pkt->pts != AV_NOPTS_VALUE) {
5127
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
84 wav->minpts = FFMIN(wav->minpts, pkt->pts);
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
85 wav->maxpts = FFMAX(wav->maxpts, pkt->pts);
1781
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
86 wav->last_duration = pkt->duration;
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
87 } else
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
88 av_log(s, AV_LOG_ERROR, "wav_write_packet: NOPTS\n");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 static int wav_write_trailer(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 {
5127
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
94 ByteIOContext *pb = s->pb;
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
95 WAVContext *wav = s->priv_data;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3934
diff changeset
96 int64_t file_size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
98 if (!url_is_streamed(s->pb)) {
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5001
diff changeset
99 ff_end_tag(pb, wav->data);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 /* update file size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 file_size = url_ftell(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 url_fseek(pb, 4, SEEK_SET);
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 0
diff changeset
104 put_le32(pb, (uint32_t)(file_size - 8));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 url_fseek(pb, file_size, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 put_flush_packet(pb);
1781
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
108
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
109 if(s->streams[0]->codec->codec_tag != 0x01) {
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
110 /* Update num_samps in fact chunk */
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
111 int number_of_samples;
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
112 number_of_samples = av_rescale(wav->maxpts - wav->minpts + wav->last_duration,
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
113 s->streams[0]->codec->sample_rate * (int64_t)s->streams[0]->time_base.num,
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
114 s->streams[0]->time_base.den);
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
115 url_fseek(pb, wav->data-12, SEEK_SET);
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
116 put_le32(pb, number_of_samples);
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
117 url_fseek(pb, file_size, SEEK_SET);
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
118 put_flush_packet(pb);
ce4617062f7b Add FACT chunk for non-PCM wav formats
mbardiaux
parents: 1756
diff changeset
119 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 }
5225
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
123
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
124 AVOutputFormat wav_muxer = {
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
125 "wav",
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
126 NULL_IF_CONFIG_SMALL("WAV format"),
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
127 "audio/x-wav",
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
128 "wav",
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
129 sizeof(WAVContext),
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
130 CODEC_ID_PCM_S16LE,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
131 CODEC_ID_NONE,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
132 wav_write_header,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
133 wav_write_packet,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
134 wav_write_trailer,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
135 .codec_tag= (const AVCodecTag* const []){ff_codec_wav_tags, 0},
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
136 };
3871
e6aeb2733e34 Replace generic CONFIG_MUXERS preprocessor conditionals by more specific
diego
parents: 3766
diff changeset
137 #endif /* CONFIG_WAV_MUXER */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138
5225
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
139
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
140 #if CONFIG_WAV_DEMUXER
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 /* return the size of the found tag */
5001
4da68099d180 Change find_tag return type to int64_t, fix a bug
bcoudurier
parents: 4251
diff changeset
142 static int64_t find_tag(ByteIOContext *pb, uint32_t tag1)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 unsigned int tag;
5001
4da68099d180 Change find_tag return type to int64_t, fix a bug
bcoudurier
parents: 4251
diff changeset
145 int64_t size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146
5127
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
147 for (;;) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148 if (url_feof(pb))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 return -1;
5127
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
150 tag = get_le32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151 size = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 if (tag == tag1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 url_fseek(pb, size, SEEK_CUR);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 return size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 static int wav_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 /* check file header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 if (p->buf_size <= 32)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163 return 0;
5267
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
164 if (!memcmp(p->buf + 8, "WAVE", 4)) {
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
165 if (!memcmp(p->buf, "RIFF", 4))
5268
6156f7337ce8 Reindent
daniel
parents: 5267
diff changeset
166 /*
6156f7337ce8 Reindent
daniel
parents: 5267
diff changeset
167 Since ACT demuxer has standard WAV header at top of it's own,
6156f7337ce8 Reindent
daniel
parents: 5267
diff changeset
168 returning score is decreased to avoid probe conflict
6156f7337ce8 Reindent
daniel
parents: 5267
diff changeset
169 between ACT and WAV.
6156f7337ce8 Reindent
daniel
parents: 5267
diff changeset
170 */
6156f7337ce8 Reindent
daniel
parents: 5267
diff changeset
171 return AVPROBE_SCORE_MAX - 1;
5267
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
172 else if (!memcmp(p->buf, "RF64", 4) &&
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
173 !memcmp(p->buf + 12, "ds64", 4))
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
174 return AVPROBE_SCORE_MAX;
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
175 }
5268
6156f7337ce8 Reindent
daniel
parents: 5267
diff changeset
176 return 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
178
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 /* wav input */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 static int wav_read_header(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
181 AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
182 {
5267
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
183 int64_t size, av_uninit(data_size);
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
184 int rf64;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 unsigned int tag;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
186 ByteIOContext *pb = s->pb;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
187 AVStream *st;
1136
d65cd7c3573e dont read over the end of a data chunk and at the end search for the next
michael
parents: 1122
diff changeset
188 WAVContext *wav = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 /* check RIFF header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 tag = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192
5267
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
193 rf64 = tag == MKTAG('R', 'F', '6', '4');
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
194 if (!rf64 && tag != MKTAG('R', 'I', 'F', 'F'))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196 get_le32(pb); /* file size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 tag = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198 if (tag != MKTAG('W', 'A', 'V', 'E'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 874
diff changeset
200
5267
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
201 if (rf64) {
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
202 if (get_le32(pb) != MKTAG('d', 's', '6', '4'))
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
203 return -1;
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
204 size = get_le32(pb);
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
205 if (size < 16)
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
206 return -1;
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
207 get_le64(pb); /* RIFF size */
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
208 data_size = get_le64(pb);
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
209 url_fskip(pb, size - 16); /* skip rest of ds64 chunk */
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
210 }
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
211
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 /* parse fmt header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213 size = find_tag(pb, MKTAG('f', 'm', 't', ' '));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 if (size < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
215 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 st = av_new_stream(s, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2023
diff changeset
218 return AVERROR(ENOMEM);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
219
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5001
diff changeset
220 ff_get_wav_header(pb, st->codec, size);
2023
a3e79d6e4e3c add an enum for need_parsing
aurel
parents: 1781
diff changeset
221 st->need_parsing = AVSTREAM_PARSE_FULL;
567
23b915bb10f5 set correct timebase
michael
parents: 564
diff changeset
222
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 817
diff changeset
223 av_set_pts_info(st, 64, 1, st->codec->sample_rate);
567
23b915bb10f5 set correct timebase
michael
parents: 564
diff changeset
224
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
225 size = find_tag(pb, MKTAG('d', 'a', 't', 'a'));
5267
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
226 if (rf64)
8e4a6428f7d7 Add RF64 support to wav demuxer.
daniel
parents: 5259
diff changeset
227 size = data_size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
228 if (size < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
229 return -1;
5648
e73024c5cb80 Fix demuxing of wav files with broken data header
daniel
parents: 5268
diff changeset
230 if (!size) {
e73024c5cb80 Fix demuxing of wav files with broken data header
daniel
parents: 5268
diff changeset
231 wav->data_end = INT64_MAX;
e73024c5cb80 Fix demuxing of wav files with broken data header
daniel
parents: 5268
diff changeset
232 } else
5649
f3c5f3b0eb0d Reindent
daniel
parents: 5648
diff changeset
233 wav->data_end= url_ftell(pb) + size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236
5126
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
237 /** Find chunk with w64 GUID by skipping over other chunks
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
238 * @return the size of the found chunk
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
239 */
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
240 static int64_t find_guid(ByteIOContext *pb, const uint8_t guid1[16])
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
241 {
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
242 uint8_t guid[16];
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
243 int64_t size;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
244
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
245 while (!url_feof(pb)) {
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
246 get_buffer(pb, guid, 16);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
247 size = get_le64(pb);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
248 if (size <= 24)
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
249 return -1;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
250 if (!memcmp(guid, guid1, 16))
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
251 return size;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
252 url_fskip(pb, FFALIGN(size, INT64_C(8)) - 24);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
253 }
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
254 return -1;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
255 }
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
256
5224
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
257 static const uint8_t guid_data[16] = { 'd', 'a', 't', 'a',
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
258 0xF3, 0xAC, 0xD3, 0x11, 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A };
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
259
5225
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
260 #define MAX_SIZE 4096
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
261
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
262 static int wav_read_packet(AVFormatContext *s,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
263 AVPacket *pkt)
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
264 {
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
265 int ret, size;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
266 int64_t left;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
267 AVStream *st;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
268 WAVContext *wav = s->priv_data;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
269
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
270 st = s->streams[0];
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
271
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
272 left = wav->data_end - url_ftell(s->pb);
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
273 if (left <= 0){
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
274 if (CONFIG_W64_DEMUXER && wav->w64)
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
275 left = find_guid(s->pb, guid_data) - 24;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
276 else
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
277 left = find_tag(s->pb, MKTAG('d', 'a', 't', 'a'));
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
278 if (left < 0)
5259
1c4c83a0fd96 wav demuxer: return AVERROR_EOF instead of AVERROR(EIO) when the end of
reimar
parents: 5258
diff changeset
279 return AVERROR_EOF;
5225
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
280 wav->data_end= url_ftell(s->pb) + left;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
281 }
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
282
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
283 size = MAX_SIZE;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
284 if (st->codec->block_align > 1) {
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
285 if (size < st->codec->block_align)
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
286 size = st->codec->block_align;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
287 size = (size / st->codec->block_align) * st->codec->block_align;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
288 }
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
289 size = FFMIN(size, left);
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
290 ret = av_get_packet(s->pb, pkt, size);
5258
98cdc18246fe wav: return av_get_packet errors unchanged.
reimar
parents: 5257
diff changeset
291 if (ret < 0)
98cdc18246fe wav: return av_get_packet errors unchanged.
reimar
parents: 5257
diff changeset
292 return ret;
5225
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
293 pkt->stream_index = 0;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
294
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
295 return ret;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
296 }
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
297
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
298 static int wav_read_seek(AVFormatContext *s,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
299 int stream_index, int64_t timestamp, int flags)
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
300 {
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
301 AVStream *st;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
302
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
303 st = s->streams[0];
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
304 switch (st->codec->codec_id) {
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
305 case CODEC_ID_MP2:
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
306 case CODEC_ID_MP3:
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
307 case CODEC_ID_AC3:
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
308 case CODEC_ID_DTS:
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
309 /* use generic seeking with dynamically generated indexes */
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
310 return -1;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
311 default:
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
312 break;
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
313 }
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
314 return pcm_read_seek(s, stream_index, timestamp, flags);
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
315 }
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
316
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
317 AVInputFormat wav_demuxer = {
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
318 "wav",
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
319 NULL_IF_CONFIG_SMALL("WAV format"),
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
320 sizeof(WAVContext),
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
321 wav_probe,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
322 wav_read_header,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
323 wav_read_packet,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
324 NULL,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
325 wav_read_seek,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
326 .flags= AVFMT_GENERIC_INDEX,
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
327 .codec_tag= (const AVCodecTag* const []){ff_codec_wav_tags, 0},
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
328 };
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
329 #endif /* CONFIG_WAV_DEMUXER */
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
330
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
331
5224
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
332 #if CONFIG_W64_DEMUXER
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
333 static const uint8_t guid_riff[16] = { 'r', 'i', 'f', 'f',
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
334 0x2E, 0x91, 0xCF, 0x11, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 };
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
335
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
336 static const uint8_t guid_wave[16] = { 'w', 'a', 'v', 'e',
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
337 0xF3, 0xAC, 0xD3, 0x11, 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A };
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
338
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
339 static const uint8_t guid_fmt [16] = { 'f', 'm', 't', ' ',
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
340 0xF3, 0xAC, 0xD3, 0x11, 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A };
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
341
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
342 static int w64_probe(AVProbeData *p)
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
343 {
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
344 if (p->buf_size <= 40)
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
345 return 0;
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
346 if (!memcmp(p->buf, guid_riff, 16) &&
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
347 !memcmp(p->buf + 24, guid_wave, 16))
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
348 return AVPROBE_SCORE_MAX;
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
349 else
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
350 return 0;
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
351 }
c2881eee05b7 Move find_guid function and guid_data array to a globally available place.
diego
parents: 5127
diff changeset
352
5126
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
353 static int w64_read_header(AVFormatContext *s, AVFormatParameters *ap)
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
354 {
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
355 int64_t size;
5127
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
356 ByteIOContext *pb = s->pb;
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
357 WAVContext *wav = s->priv_data;
5126
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
358 AVStream *st;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
359 uint8_t guid[16];
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
360
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
361 get_buffer(pb, guid, 16);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
362 if (memcmp(guid, guid_riff, 16))
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
363 return -1;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
364
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
365 if (get_le64(pb) < 16 + 8 + 16 + 8 + 16 + 8) /* riff + wave + fmt + sizes */
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
366 return -1;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
367
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
368 get_buffer(pb, guid, 16);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
369 if (memcmp(guid, guid_wave, 16)) {
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
370 av_log(s, AV_LOG_ERROR, "could not find wave guid\n");
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
371 return -1;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
372 }
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
373
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
374 size = find_guid(pb, guid_fmt);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
375 if (size < 0) {
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
376 av_log(s, AV_LOG_ERROR, "could not find fmt guid\n");
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
377 return -1;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
378 }
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
379
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
380 st = av_new_stream(s, 0);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
381 if (!st)
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
382 return AVERROR(ENOMEM);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
383
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
384 /* subtract chunk header size - normal wav file doesn't count it */
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
385 ff_get_wav_header(pb, st->codec, size - 24);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
386 url_fskip(pb, FFALIGN(size, INT64_C(8)) - size);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
387
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
388 st->need_parsing = AVSTREAM_PARSE_FULL;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
389
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
390 av_set_pts_info(st, 64, 1, st->codec->sample_rate);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
391
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
392 size = find_guid(pb, guid_data);
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
393 if (size < 0) {
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
394 av_log(s, AV_LOG_ERROR, "could not find data guid\n");
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
395 return -1;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
396 }
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
397 wav->data_end = url_ftell(pb) + size - 24;
5127
e73c5f33463b cosmetics: whitespace, prettyprinting, coding style fixes
diego
parents: 5126
diff changeset
398 wav->w64 = 1;
5126
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
399
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
400 return 0;
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
401 }
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
402
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
403 AVInputFormat w64_demuxer = {
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
404 "w64",
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
405 NULL_IF_CONFIG_SMALL("Sony Wave64 format"),
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
406 sizeof(WAVContext),
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
407 w64_probe,
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
408 w64_read_header,
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
409 wav_read_packet,
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
410 NULL,
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
411 wav_read_seek,
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
412 .flags = AVFMT_GENERIC_INDEX,
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
413 .codec_tag = (const AVCodecTag* const []){ff_codec_wav_tags, 0},
789e13163b3b Sony Wave64 demuxer
diego
parents: 5058
diff changeset
414 };
5225
117ab940d1b9 Rearrange wav_muxer and {wav|w64}_demuxer blocks to be under proper #ifdefs.
diego
parents: 5224
diff changeset
415 #endif /* CONFIG_W64_DEMUXER */