wavdec.c
Go to the documentation of this file.
1 /*
2  * WAV demuxer
3  * Copyright (c) 2001, 2002 Fabrice Bellard
4  *
5  * Sony Wave64 demuxer
6  * RF64 demuxer
7  * Copyright (c) 2009 Daniel Verkamp
8  *
9  * This file is part of FFmpeg.
10  *
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.
15  *
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.
20  *
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
24  */
25 
26 #include "libavutil/avassert.h"
27 #include "libavutil/dict.h"
28 #include "libavutil/log.h"
29 #include "libavutil/mathematics.h"
30 #include "libavutil/opt.h"
31 #include "avformat.h"
32 #include "internal.h"
33 #include "avio_internal.h"
34 #include "pcm.h"
35 #include "riff.h"
36 #include "w64.h"
37 #include "avio.h"
38 #include "metadata.h"
39 #include "spdif.h"
40 
41 typedef struct WAVDemuxContext {
42  const AVClass *class;
43  int64_t data_end;
44  int w64;
45  int64_t smv_data_ofs;
48  int smv_block;
50  int smv_eof;
51  int audio_eof;
53  int spdif;
55 
56 
57 #if CONFIG_WAV_DEMUXER
58 
59 static int64_t next_tag(AVIOContext *pb, uint32_t *tag)
60 {
61  *tag = avio_rl32(pb);
62  return avio_rl32(pb);
63 }
64 
65 /* return the size of the found tag */
66 static int64_t find_tag(AVIOContext *pb, uint32_t tag1)
67 {
68  unsigned int tag;
69  int64_t size;
70 
71  for (;;) {
72  if (url_feof(pb))
73  return -1;
74  size = next_tag(pb, &tag);
75  if (tag == tag1)
76  break;
77  avio_skip(pb, size + (size & 1));
78  }
79  return size;
80 }
81 
82 static int wav_probe(AVProbeData *p)
83 {
84  /* check file header */
85  if (p->buf_size <= 32)
86  return 0;
87  if (!memcmp(p->buf + 8, "WAVE", 4)) {
88  if (!memcmp(p->buf, "RIFF", 4))
89  /*
90  Since ACT demuxer has standard WAV header at top of it's own,
91  returning score is decreased to avoid probe conflict
92  between ACT and WAV.
93  */
94  return AVPROBE_SCORE_MAX - 1;
95  else if (!memcmp(p->buf, "RF64", 4) &&
96  !memcmp(p->buf + 12, "ds64", 4))
97  return AVPROBE_SCORE_MAX;
98  }
99  return 0;
100 }
101 
102 static void handle_stream_probing(AVStream *st)
103 {
104  if (st->codec->codec_id == AV_CODEC_ID_PCM_S16LE) {
106  st->probe_packets = FFMIN(st->probe_packets, 4);
107  }
108 }
109 
110 static int wav_parse_fmt_tag(AVFormatContext *s, int64_t size, AVStream **st)
111 {
112  AVIOContext *pb = s->pb;
113  int ret;
114 
115  /* parse fmt header */
116  *st = avformat_new_stream(s, NULL);
117  if (!*st)
118  return AVERROR(ENOMEM);
119 
120  ret = ff_get_wav_header(pb, (*st)->codec, size);
121  if (ret < 0)
122  return ret;
123  handle_stream_probing(*st);
124 
125  (*st)->need_parsing = AVSTREAM_PARSE_FULL_RAW;
126 
127  avpriv_set_pts_info(*st, 64, 1, (*st)->codec->sample_rate);
128 
129  return 0;
130 }
131 
132 static inline int wav_parse_bext_string(AVFormatContext *s, const char *key,
133  int length)
134 {
135  char temp[257];
136  int ret;
137 
138  av_assert0(length <= sizeof(temp));
139  if ((ret = avio_read(s->pb, temp, length)) < 0)
140  return ret;
141 
142  temp[length] = 0;
143 
144  if (strlen(temp))
145  return av_dict_set(&s->metadata, key, temp, 0);
146 
147  return 0;
148 }
149 
150 static int wav_parse_bext_tag(AVFormatContext *s, int64_t size)
151 {
152  char temp[131], *coding_history;
153  int ret, x;
154  uint64_t time_reference;
155  int64_t umid_parts[8], umid_mask = 0;
156 
157  if ((ret = wav_parse_bext_string(s, "description", 256)) < 0 ||
158  (ret = wav_parse_bext_string(s, "originator", 32)) < 0 ||
159  (ret = wav_parse_bext_string(s, "originator_reference", 32)) < 0 ||
160  (ret = wav_parse_bext_string(s, "origination_date", 10)) < 0 ||
161  (ret = wav_parse_bext_string(s, "origination_time", 8)) < 0)
162  return ret;
163 
164  time_reference = avio_rl64(s->pb);
165  snprintf(temp, sizeof(temp), "%"PRIu64, time_reference);
166  if ((ret = av_dict_set(&s->metadata, "time_reference", temp, 0)) < 0)
167  return ret;
168 
169  /* check if version is >= 1, in which case an UMID may be present */
170  if (avio_rl16(s->pb) >= 1) {
171  for (x = 0; x < 8; x++)
172  umid_mask |= umid_parts[x] = avio_rb64(s->pb);
173 
174  if (umid_mask) {
175  /* the string formatting below is per SMPTE 330M-2004 Annex C */
176  if (umid_parts[4] == 0 && umid_parts[5] == 0 && umid_parts[6] == 0 && umid_parts[7] == 0) {
177  /* basic UMID */
178  snprintf(temp, sizeof(temp), "0x%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64,
179  umid_parts[0], umid_parts[1], umid_parts[2], umid_parts[3]);
180  } else {
181  /* extended UMID */
182  snprintf(temp, sizeof(temp), "0x%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64
183  "%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64,
184  umid_parts[0], umid_parts[1], umid_parts[2], umid_parts[3],
185  umid_parts[4], umid_parts[5], umid_parts[6], umid_parts[7]);
186  }
187 
188  if ((ret = av_dict_set(&s->metadata, "umid", temp, 0)) < 0)
189  return ret;
190  }
191 
192  avio_skip(s->pb, 190);
193  } else
194  avio_skip(s->pb, 254);
195 
196  if (size > 602) {
197  /* CodingHistory present */
198  size -= 602;
199 
200  if (!(coding_history = av_malloc(size+1)))
201  return AVERROR(ENOMEM);
202 
203  if ((ret = avio_read(s->pb, coding_history, size)) < 0)
204  return ret;
205 
206  coding_history[size] = 0;
207  if ((ret = av_dict_set(&s->metadata, "coding_history", coding_history,
209  return ret;
210  }
211 
212  return 0;
213 }
214 
215 static const AVMetadataConv wav_metadata_conv[] = {
216  {"description", "comment" },
217  {"originator", "encoded_by" },
218  {"origination_date", "date" },
219  {"origination_time", "creation_time"},
220  {0},
221 };
222 
223 /* wav input */
224 static int wav_read_header(AVFormatContext *s)
225 {
226  int64_t size, av_uninit(data_size);
227  int64_t sample_count=0;
228  int rf64;
229  uint32_t tag;
230  AVIOContext *pb = s->pb;
231  AVStream *st = NULL;
232  WAVDemuxContext *wav = s->priv_data;
233  int ret, got_fmt = 0;
234  int64_t next_tag_ofs, data_ofs = -1;
235 
236  wav->smv_data_ofs = -1;
237 
238  /* check RIFF header */
239  tag = avio_rl32(pb);
240 
241  rf64 = tag == MKTAG('R', 'F', '6', '4');
242  if (!rf64 && tag != MKTAG('R', 'I', 'F', 'F'))
243  return -1;
244  avio_rl32(pb); /* file size */
245  tag = avio_rl32(pb);
246  if (tag != MKTAG('W', 'A', 'V', 'E'))
247  return -1;
248 
249  if (rf64) {
250  if (avio_rl32(pb) != MKTAG('d', 's', '6', '4'))
251  return -1;
252  size = avio_rl32(pb);
253  if (size < 24)
254  return -1;
255  avio_rl64(pb); /* RIFF size */
256  data_size = avio_rl64(pb);
257  sample_count = avio_rl64(pb);
258  if (data_size < 0 || sample_count < 0) {
259  av_log(s, AV_LOG_ERROR, "negative data_size and/or sample_count in "
260  "ds64: data_size = %"PRId64", sample_count = %"PRId64"\n",
261  data_size, sample_count);
262  return AVERROR_INVALIDDATA;
263  }
264  avio_skip(pb, size - 24); /* skip rest of ds64 chunk */
265 
266  }
267 
268  for (;;) {
269  AVStream *vst;
270  size = next_tag(pb, &tag);
271  next_tag_ofs = avio_tell(pb) + size;
272 
273  if (url_feof(pb))
274  break;
275 
276  switch (tag) {
277  case MKTAG('f', 'm', 't', ' '):
278  /* only parse the first 'fmt ' tag found */
279  if (!got_fmt && (ret = wav_parse_fmt_tag(s, size, &st)) < 0) {
280  return ret;
281  } else if (got_fmt)
282  av_log(s, AV_LOG_WARNING, "found more than one 'fmt ' tag\n");
283 
284  got_fmt = 1;
285  break;
286  case MKTAG('d', 'a', 't', 'a'):
287  if (!got_fmt) {
288  av_log(s, AV_LOG_ERROR, "found no 'fmt ' tag before the 'data' tag\n");
289  return AVERROR_INVALIDDATA;
290  }
291 
292  if (rf64) {
293  next_tag_ofs = wav->data_end = avio_tell(pb) + data_size;
294  } else {
295  data_size = size;
296  next_tag_ofs = wav->data_end = size ? next_tag_ofs : INT64_MAX;
297  }
298 
299  data_ofs = avio_tell(pb);
300 
301  /* don't look for footer metadata if we can't seek or if we don't
302  * know where the data tag ends
303  */
304  if (!pb->seekable || (!rf64 && !size))
305  goto break_loop;
306  break;
307  case MKTAG('f','a','c','t'):
308  if (!sample_count)
309  sample_count = avio_rl32(pb);
310  break;
311  case MKTAG('b','e','x','t'):
312  if ((ret = wav_parse_bext_tag(s, size)) < 0)
313  return ret;
314  break;
315  case MKTAG('S','M','V','0'):
316  if (!got_fmt) {
317  av_log(s, AV_LOG_ERROR, "found no 'fmt ' tag before the 'SMV0' tag\n");
318  return AVERROR_INVALIDDATA;
319  }
320  // SMV file, a wav file with video appended.
321  if (size != MKTAG('0','2','0','0')) {
322  av_log(s, AV_LOG_ERROR, "Unknown SMV version found\n");
323  goto break_loop;
324  }
325  av_log(s, AV_LOG_DEBUG, "Found SMV data\n");
326  vst = avformat_new_stream(s, NULL);
327  if (!vst)
328  return AVERROR(ENOMEM);
329  avio_r8(pb);
330  vst->id = 1;
333  vst->codec->width = avio_rl24(pb);
334  vst->codec->height = avio_rl24(pb);
335  size = avio_rl24(pb);
336  wav->smv_data_ofs = avio_tell(pb) + (size - 5) * 3;
337  avio_rl24(pb);
338  wav->smv_block_size = avio_rl24(pb);
339  avpriv_set_pts_info(vst, 32, 1, avio_rl24(pb));
340  vst->duration = avio_rl24(pb);
341  avio_rl24(pb);
342  avio_rl24(pb);
343  wav->smv_frames_per_jpeg = avio_rl24(pb);
344  goto break_loop;
345  case MKTAG('L', 'I', 'S', 'T'):
346  if (size < 4) {
347  av_log(s, AV_LOG_ERROR, "too short LIST tag\n");
348  return AVERROR_INVALIDDATA;
349  }
350  switch (avio_rl32(pb)) {
351  case MKTAG('I', 'N', 'F', 'O'):
352  ff_read_riff_info(s, size - 4);
353  }
354  break;
355  }
356 
357  /* skip padding byte */
358  next_tag_ofs += (next_tag_ofs < INT64_MAX && next_tag_ofs & 1);
359 
360  /* seek to next tag unless we know that we'll run into EOF */
361  if ((avio_size(pb) > 0 && next_tag_ofs >= avio_size(pb)) ||
362  avio_seek(pb, next_tag_ofs, SEEK_SET) < 0) {
363  break;
364  }
365  }
366 break_loop:
367  if (data_ofs < 0) {
368  av_log(s, AV_LOG_ERROR, "no 'data' tag found\n");
369  return AVERROR_INVALIDDATA;
370  }
371 
372  avio_seek(pb, data_ofs, SEEK_SET);
373 
374  if (!sample_count && st->codec->channels && av_get_bits_per_sample(st->codec->codec_id) && wav->data_end <= avio_size(pb))
375  sample_count = (data_size<<3) / (st->codec->channels * (uint64_t)av_get_bits_per_sample(st->codec->codec_id));
376  if (sample_count)
377  st->duration = sample_count;
378 
379  ff_metadata_conv_ctx(s, NULL, wav_metadata_conv);
381 
382  return 0;
383 }
384 
385 /** Find chunk with w64 GUID by skipping over other chunks
386  * @return the size of the found chunk
387  */
388 static int64_t find_guid(AVIOContext *pb, const uint8_t guid1[16])
389 {
390  uint8_t guid[16];
391  int64_t size;
392 
393  while (!url_feof(pb)) {
394  avio_read(pb, guid, 16);
395  size = avio_rl64(pb);
396  if (size <= 24)
397  return -1;
398  if (!memcmp(guid, guid1, 16))
399  return size;
400  avio_skip(pb, FFALIGN(size, INT64_C(8)) - 24);
401  }
402  return -1;
403 }
404 
405 #define MAX_SIZE 4096
406 
407 static int wav_read_packet(AVFormatContext *s,
408  AVPacket *pkt)
409 {
410  int ret, size;
411  int64_t left;
412  AVStream *st;
413  WAVDemuxContext *wav = s->priv_data;
414 
415  if (CONFIG_SPDIF_DEMUXER && wav->spdif == 0 &&
416  s->streams[0]->codec->codec_tag == 1) {
417  enum AVCodecID codec;
418  ret = ff_spdif_probe(s->pb->buffer, s->pb->buf_end - s->pb->buffer,
419  &codec);
420  if (ret > AVPROBE_SCORE_MAX / 2) {
421  s->streams[0]->codec->codec_id = codec;
422  wav->spdif = 1;
423  } else {
424  wav->spdif = -1;
425  }
426  }
427  if (CONFIG_SPDIF_DEMUXER && wav->spdif == 1)
428  return ff_spdif_read_packet(s, pkt);
429 
430  if (wav->smv_data_ofs > 0) {
431  int64_t audio_dts, video_dts;
432 smv_retry:
433  audio_dts = s->streams[0]->cur_dts;
434  video_dts = s->streams[1]->cur_dts;
435  if (audio_dts != AV_NOPTS_VALUE && video_dts != AV_NOPTS_VALUE) {
436  audio_dts = av_rescale_q(audio_dts, s->streams[0]->time_base, AV_TIME_BASE_Q);
437  video_dts = av_rescale_q(video_dts, s->streams[1]->time_base, AV_TIME_BASE_Q);
438  wav->smv_last_stream = video_dts >= audio_dts;
439  }
440  wav->smv_last_stream = !wav->smv_last_stream;
441  wav->smv_last_stream |= wav->audio_eof;
442  wav->smv_last_stream &= !wav->smv_eof;
443  if (wav->smv_last_stream) {
444  uint64_t old_pos = avio_tell(s->pb);
445  uint64_t new_pos = wav->smv_data_ofs +
446  wav->smv_block * wav->smv_block_size;
447  if (avio_seek(s->pb, new_pos, SEEK_SET) < 0) {
448  ret = AVERROR_EOF;
449  goto smv_out;
450  }
451  size = avio_rl24(s->pb);
452  ret = av_get_packet(s->pb, pkt, size);
453  if (ret < 0)
454  goto smv_out;
455  pkt->pos -= 3;
456  pkt->pts = wav->smv_block * wav->smv_frames_per_jpeg;
457  wav->smv_block++;
458  pkt->stream_index = 1;
459 smv_out:
460  avio_seek(s->pb, old_pos, SEEK_SET);
461  if (ret == AVERROR_EOF) {
462  wav->smv_eof = 1;
463  goto smv_retry;
464  }
465  return ret;
466  }
467  }
468 
469  st = s->streams[0];
470 
471  left = wav->data_end - avio_tell(s->pb);
472  if (wav->ignore_length)
473  left= INT_MAX;
474  if (left <= 0){
475  if (CONFIG_W64_DEMUXER && wav->w64)
476  left = find_guid(s->pb, ff_w64_guid_data) - 24;
477  else
478  left = find_tag(s->pb, MKTAG('d', 'a', 't', 'a'));
479  if (left < 0) {
480  wav->audio_eof = 1;
481  if (wav->smv_data_ofs > 0 && !wav->smv_eof)
482  goto smv_retry;
483  return AVERROR_EOF;
484  }
485  wav->data_end= avio_tell(s->pb) + left;
486  }
487 
488  size = MAX_SIZE;
489  if (st->codec->block_align > 1) {
490  if (size < st->codec->block_align)
491  size = st->codec->block_align;
492  size = (size / st->codec->block_align) * st->codec->block_align;
493  }
494  size = FFMIN(size, left);
495  ret = av_get_packet(s->pb, pkt, size);
496  if (ret < 0)
497  return ret;
498  pkt->stream_index = 0;
499 
500  return ret;
501 }
502 
503 static int wav_read_seek(AVFormatContext *s,
504  int stream_index, int64_t timestamp, int flags)
505 {
506  WAVDemuxContext *wav = s->priv_data;
507  AVStream *st;
508  wav->smv_eof = 0;
509  wav->audio_eof = 0;
510  if (wav->smv_data_ofs > 0) {
511  int64_t smv_timestamp = timestamp;
512  if (stream_index == 0)
513  smv_timestamp = av_rescale_q(timestamp, s->streams[0]->time_base, s->streams[1]->time_base);
514  else
515  timestamp = av_rescale_q(smv_timestamp, s->streams[1]->time_base, s->streams[0]->time_base);
516  wav->smv_block = smv_timestamp / wav->smv_frames_per_jpeg;
517  }
518 
519  st = s->streams[0];
520  switch (st->codec->codec_id) {
521  case AV_CODEC_ID_MP2:
522  case AV_CODEC_ID_MP3:
523  case AV_CODEC_ID_AC3:
524  case AV_CODEC_ID_DTS:
525  /* use generic seeking with dynamically generated indexes */
526  return -1;
527  default:
528  break;
529  }
530  return ff_pcm_read_seek(s, stream_index, timestamp, flags);
531 }
532 
533 #define OFFSET(x) offsetof(WAVDemuxContext, x)
534 #define DEC AV_OPT_FLAG_DECODING_PARAM
535 static const AVOption demux_options[] = {
536  { "ignore_length", "Ignore length", OFFSET(ignore_length), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, DEC },
537  { NULL },
538 };
539 
540 static const AVClass wav_demuxer_class = {
541  .class_name = "WAV demuxer",
542  .item_name = av_default_item_name,
543  .option = demux_options,
544  .version = LIBAVUTIL_VERSION_INT,
545 };
546 AVInputFormat ff_wav_demuxer = {
547  .name = "wav",
548  .long_name = NULL_IF_CONFIG_SMALL("WAV / WAVE (Waveform Audio)"),
549  .priv_data_size = sizeof(WAVDemuxContext),
550  .read_probe = wav_probe,
551  .read_header = wav_read_header,
552  .read_packet = wav_read_packet,
553  .read_seek = wav_read_seek,
555  .codec_tag = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 },
556  .priv_class = &wav_demuxer_class,
557 };
558 #endif /* CONFIG_WAV_DEMUXER */
559 
560 
561 #if CONFIG_W64_DEMUXER
562 static int w64_probe(AVProbeData *p)
563 {
564  if (p->buf_size <= 40)
565  return 0;
566  if (!memcmp(p->buf, ff_w64_guid_riff, 16) &&
567  !memcmp(p->buf + 24, ff_w64_guid_wave, 16))
568  return AVPROBE_SCORE_MAX;
569  else
570  return 0;
571 }
572 
573 static int w64_read_header(AVFormatContext *s)
574 {
575  int64_t size, data_ofs = 0;
576  AVIOContext *pb = s->pb;
577  WAVDemuxContext *wav = s->priv_data;
578  AVStream *st;
579  uint8_t guid[16];
580  int ret;
581 
582  avio_read(pb, guid, 16);
583  if (memcmp(guid, ff_w64_guid_riff, 16))
584  return -1;
585 
586  if (avio_rl64(pb) < 16 + 8 + 16 + 8 + 16 + 8) /* riff + wave + fmt + sizes */
587  return -1;
588 
589  avio_read(pb, guid, 16);
590  if (memcmp(guid, ff_w64_guid_wave, 16)) {
591  av_log(s, AV_LOG_ERROR, "could not find wave guid\n");
592  return -1;
593  }
594 
595  wav->w64 = 1;
596 
597  st = avformat_new_stream(s, NULL);
598  if (!st)
599  return AVERROR(ENOMEM);
600 
601  while (!url_feof(pb)) {
602  if (avio_read(pb, guid, 16) != 16)
603  break;
604  size = avio_rl64(pb);
605  if (size <= 24 || INT64_MAX - size < avio_tell(pb))
606  return AVERROR_INVALIDDATA;
607 
608  if (!memcmp(guid, ff_w64_guid_fmt, 16)) {
609  /* subtract chunk header size - normal wav file doesn't count it */
610  ret = ff_get_wav_header(pb, st->codec, size - 24);
611  if (ret < 0)
612  return ret;
613  avio_skip(pb, FFALIGN(size, INT64_C(8)) - size);
614 
615  avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
616  } else if (!memcmp(guid, ff_w64_guid_fact, 16)) {
617  int64_t samples;
618 
619  samples = avio_rl64(pb);
620  if (samples > 0)
621  st->duration = samples;
622  } else if (!memcmp(guid, ff_w64_guid_data, 16)) {
623  wav->data_end = avio_tell(pb) + size - 24;
624 
625  data_ofs = avio_tell(pb);
626  if (!pb->seekable)
627  break;
628 
629  avio_skip(pb, size - 24);
630  } else if (!memcmp(guid, ff_w64_guid_summarylist, 16)) {
631  int64_t start, end, cur;
632  uint32_t count, chunk_size, i;
633 
634  start = avio_tell(pb);
635  end = start + size;
636  count = avio_rl32(pb);
637 
638  for (i = 0; i < count; i++) {
639  char chunk_key[5], *value;
640 
641  if (url_feof(pb) || (cur = avio_tell(pb)) < 0 || cur > end - 8 /* = tag + size */)
642  break;
643 
644  chunk_key[4] = 0;
645  avio_read(pb, chunk_key, 4);
646  chunk_size = avio_rl32(pb);
647 
648  value = av_mallocz(chunk_size + 1);
649  if (!value)
650  return AVERROR(ENOMEM);
651 
652  ret = avio_get_str16le(pb, chunk_size, value, chunk_size);
653  avio_skip(pb, chunk_size - ret);
654 
655  av_dict_set(&s->metadata, chunk_key, value, AV_DICT_DONT_STRDUP_VAL);
656  }
657 
658  avio_skip(pb, end - avio_tell(pb));
659  } else {
660  av_log(s, AV_LOG_DEBUG, "unknown guid: "FF_PRI_GUID"\n", FF_ARG_GUID(guid));
661  avio_skip(pb, size - 24);
662  }
663  }
664 
665  if (!data_ofs)
666  return AVERROR_EOF;
667 
668  ff_metadata_conv_ctx(s, NULL, wav_metadata_conv);
670 
671  handle_stream_probing(st);
673 
674  avio_seek(pb, data_ofs, SEEK_SET);
675 
676  return 0;
677 }
678 
679 AVInputFormat ff_w64_demuxer = {
680  .name = "w64",
681  .long_name = NULL_IF_CONFIG_SMALL("Sony Wave64"),
682  .priv_data_size = sizeof(WAVDemuxContext),
683  .read_probe = w64_probe,
684  .read_header = w64_read_header,
685  .read_packet = wav_read_packet,
686  .read_seek = wav_read_seek,
688  .codec_tag = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 },
689 };
690 #endif /* CONFIG_W64_DEMUXER */
int ff_read_riff_info(AVFormatContext *s, int64_t size)
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
const char * s
Definition: avisynth_c.h:668
Bytestream IO Context.
Definition: avio.h:68
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
void ff_metadata_conv_ctx(AVFormatContext *ctx, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv)
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:261
const uint8_t ff_w64_guid_wave[16]
Definition: w64.c:26
Buffered I/O operations.
int ff_spdif_probe(const uint8_t *p_buf, int buf_size, enum AVCodecID *codec)
Definition: spdifdec.c:112
AVOption.
Definition: opt.h:251
const uint8_t ff_w64_guid_fact[16]
Definition: w64.c:32
av_default_item_name
unsigned char * buf_end
End of the data, may be less than buffer+buffer_size if the read function returned less data than req...
Definition: avio.h:85
int64_t pos
byte position in stream, -1 if unknown
else temp
Definition: vf_mcdeint.c:148
#define FF_ARG_GUID(g)
Definition: riff.h:65
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
int probe_packets
Definition: avformat.h:793
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:153
struct WAVDemuxContext WAVDemuxContext
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:199
int smv_frames_per_jpeg
Definition: wavdec.c:47
unsigned char * buffer
Start of the buffer.
Definition: avio.h:82
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:256
#define MAX_SIZE
Definition: vf_unsharp.c:253
int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen)
Read a UTF-16 string from pb and convert it to UTF-8.
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
int ignore_length
Definition: wavdec.c:52
#define FFALIGN(x, a)
Definition: common.h:63
Format I/O context.
Definition: avformat.h:944
int64_t cur_dts
Definition: avformat.h:785
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:55
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
internal metadata API header see avformat.h or the public API!
Public dictionary API.
uint8_t
AVOptions.
static AVPacket pkt
Definition: demuxing.c:56
enum AVStreamParseType need_parsing
Definition: avformat.h:811
int id
Format-specific stream ID.
Definition: avformat.h:650
end end
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
AVStream ** streams
Definition: avformat.h:992
uint32_t tag
Definition: movenc.c:894
#define AVERROR_EOF
End of file.
Definition: error.h:55
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
uint64_t avio_rb64(AVIOContext *s)
Definition: aviobuf.c:675
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:248
full parsing and repack with timestamp and position generation by parser for raw this assumes that ea...
Definition: avformat.h:586
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:478
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:130
Discrete Time axis x
int ff_spdif_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: spdifdec.c:169
AVCodecID
Identify the syntax and semantics of the bitstream.
int av_get_bits_per_sample(enum AVCodecID codec_id)
Return codec bits per sample.
AVDictionary * metadata
Definition: avformat.h:1092
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:579
int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
preferred ID for decoding MPEG audio layer 1, 2 or 3
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int smv_block_size
Definition: wavdec.c:46
const AVCodecTag ff_codec_wav_tags[]
Definition: riff.c:334
int size
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:469
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
#define CONFIG_W64_DEMUXER
Definition: config.h:1002
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:337
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:336
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:117
#define FFMIN(a, b)
Definition: common.h:58
int smv_last_stream
Definition: wavdec.c:49
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that&#39;s been allocated with av_malloc() and chilren.
Definition: dict.h:72
static int read_probe(AVProbeData *pd)
ret
Definition: avfilter.c:821
int width
picture width / height.
const uint8_t ff_w64_guid_data[16]
Definition: w64.c:35
internal header for RIFF based (de)muxers do NOT include this in end user applications ...
const uint8_t ff_w64_guid_riff[16]
Definition: w64.c:23
int audio_eof
Definition: wavdec.c:51
int ff_pcm_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
int url_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
Definition: aviobuf.c:280
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:517
Stream structure.
Definition: avformat.h:643
NULL
Definition: eval.c:55
enum AVMediaType codec_type
enum AVCodecID codec_id
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:202
int sample_rate
samples per second
AVIOContext * pb
I/O context.
Definition: avformat.h:977
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> (&#39;D&#39;<<24) + (&#39;C&#39;<<16) + (&#39;B&#39;<<8) + &#39;A&#39;).
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition: libcdio.c:114
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:62
double value
Definition: eval.c:82
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
Describe the class of an AVClass context structure.
Definition: log.h:50
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition: avformat.h:353
synthesis window for stochastic i
#define DEC
int64_t smv_data_ofs
Definition: wavdec.c:45
#define snprintf
Definition: snprintf.h:34
This structure contains the data a format has to probe a file.
Definition: avformat.h:334
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
const AVMetadataConv ff_riff_info_conv[]
Definition: riff.c:402
static int flags
Definition: cpu.c:23
const uint8_t ff_w64_guid_fmt[16]
Definition: w64.c:29
#define OFFSET(x)
Definition: ffmpeg_opt.c:2553
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition: avformat.h:696
#define AVPROBE_SCORE_MAX
maximum score, half of that is used for file-extension-based detection
Definition: avformat.h:340
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:563
Main libavformat public API header.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
#define FF_PRI_GUID
Definition: riff.h:63
int64_t data_end
Definition: wavdec.c:43
int smv_block
Definition: wavdec.c:48
int channels
number of audio channels
void * priv_data
Format private data.
Definition: avformat.h:964
const uint8_t ff_w64_guid_summarylist[16]
Definition: w64.c:38
#define av_uninit(x)
Definition: attributes.h:137
Filter the word “frame” indicates either a video frame or a group of audio samples
#define CONFIG_SPDIF_DEMUXER
Definition: config.h:979
void INT64 INT64 count
Definition: avisynth_c.h:594
void INT64 start
Definition: avisynth_c.h:594
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
const char int length
Definition: avisynth_c.h:668
unsigned int avio_rl24(AVIOContext *s)
Definition: aviobuf.c:571
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
Definition: avformat.h:679
#define MKTAG(a, b, c, d)
Definition: common.h:282
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
Definition: avformat.h:834
This structure stores compressed data.
uint64_t avio_rl64(AVIOContext *s)
Definition: aviobuf.c:587
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190