]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/wavdec.c
udp: Use the logging context
[ffmpeg] / libavformat / wavdec.c
index bc5288734e7af16fd741c20306d6e1818293b427..83c860d3cdc83f5b857c255ee38446a3ac92e08b 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <stdint.h>
+
 #include "libavutil/avassert.h"
 #include "libavutil/dict.h"
 #include "libavutil/log.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/opt.h"
 #include "avformat.h"
-#include "internal.h"
+#include "avio.h"
 #include "avio_internal.h"
+#include "internal.h"
+#include "metadata.h"
 #include "pcm.h"
 #include "riff.h"
-#include "avio.h"
-#include "metadata.h"
 
 typedef struct WAVDemuxContext {
     int64_t data_end;
     int w64;
 } WAVDemuxContext;
 
-
 #if CONFIG_WAV_DEMUXER
 
 static int64_t next_tag(AVIOContext *pb, uint32_t *tag)
@@ -50,6 +51,12 @@ static int64_t next_tag(AVIOContext *pb, uint32_t *tag)
     return avio_rl32(pb);
 }
 
+/* RIFF chunks are always on a even offset. */
+static int64_t wav_seek_tag(AVIOContext *s, int64_t offset, int whence)
+{
+    return avio_seek(s, offset + (offset & 1), whence);
+}
+
 /* return the size of the found tag */
 static int64_t find_tag(AVIOContext *pb, uint32_t tag1)
 {
@@ -62,7 +69,7 @@ static int64_t find_tag(AVIOContext *pb, uint32_t tag1)
         size = next_tag(pb, &tag);
         if (tag == tag1)
             break;
-        avio_skip(pb, size);
+        wav_seek_tag(pb, size, SEEK_CUR);
     }
     return size;
 }
@@ -74,11 +81,9 @@ static int wav_probe(AVProbeData *p)
         return 0;
     if (!memcmp(p->buf + 8, "WAVE", 4)) {
         if (!memcmp(p->buf, "RIFF", 4))
-            /*
-              Since ACT demuxer has standard WAV header at top of it's own,
-              returning score is decreased to avoid probe conflict
-              between ACT and WAV.
-            */
+            /* Since the ACT demuxer has a standard WAV header at the top of
+             * its own, the returned score is decreased to avoid a probe
+             * conflict between ACT and WAV. */
             return AVPROBE_SCORE_MAX - 1;
         else if (!memcmp(p->buf,      "RF64", 4) &&
                  !memcmp(p->buf + 12, "ds64", 4))
@@ -97,7 +102,7 @@ static int wav_parse_fmt_tag(AVFormatContext *s, int64_t size, AVStream **st)
     if (!*st)
         return AVERROR(ENOMEM);
 
-    ret = ff_get_wav_header(pb, (*st)->codec, size);
+    ret = ff_get_wav_header(s, pb, (*st)->codec, size);
     if (ret < 0)
         return ret;
     (*st)->need_parsing = AVSTREAM_PARSE_FULL;
@@ -151,16 +156,22 @@ static int wav_parse_bext_tag(AVFormatContext *s, int64_t size)
 
         if (umid_mask) {
             /* the string formatting below is per SMPTE 330M-2004 Annex C */
-            if (umid_parts[4] == 0 && umid_parts[5] == 0 && umid_parts[6] == 0 && umid_parts[7] == 0) {
+            if (umid_parts[4] == 0 && umid_parts[5] == 0 &&
+                umid_parts[6] == 0 && umid_parts[7] == 0) {
                 /* basic UMID */
-                snprintf(temp, sizeof(temp), "0x%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64,
-                         umid_parts[0], umid_parts[1], umid_parts[2], umid_parts[3]);
+                snprintf(temp, sizeof(temp),
+                         "0x%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64,
+                         umid_parts[0], umid_parts[1],
+                         umid_parts[2], umid_parts[3]);
             } else {
                 /* extended UMID */
-                snprintf(temp, sizeof(temp), "0x%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64
-                                             "0x%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64,
-                         umid_parts[0], umid_parts[1], umid_parts[2], umid_parts[3],
-                         umid_parts[4], umid_parts[5], umid_parts[6], umid_parts[7]);
+                snprintf(temp, sizeof(temp),
+                         "0x%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64
+                         "0x%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64,
+                         umid_parts[0], umid_parts[1],
+                         umid_parts[2], umid_parts[3],
+                         umid_parts[4], umid_parts[5],
+                         umid_parts[6], umid_parts[7]);
             }
 
             if ((ret = av_dict_set(&s->metadata, "umid", temp, 0)) < 0)
@@ -175,7 +186,7 @@ static int wav_parse_bext_tag(AVFormatContext *s, int64_t size)
         /* CodingHistory present */
         size -= 602;
 
-        if (!(coding_history = av_malloc(size+1)))
+        if (!(coding_history = av_malloc(size + 1)))
             return AVERROR(ENOMEM);
 
         if ((ret = avio_read(s->pb, coding_history, size)) < 0)
@@ -191,22 +202,22 @@ static int wav_parse_bext_tag(AVFormatContext *s, int64_t size)
 }
 
 static const AVMetadataConv wav_metadata_conv[] = {
-    {"description",      "comment"      },
-    {"originator",       "encoded_by"   },
-    {"origination_date", "date"         },
-    {"origination_time", "creation_time"},
-    {0},
+    { "description",      "comment"       },
+    { "originator",       "encoded_by"    },
+    { "origination_date", "date"          },
+    { "origination_time", "creation_time" },
+    { 0 },
 };
 
 /* wav input */
 static int wav_read_header(AVFormatContext *s)
 {
     int64_t size, av_uninit(data_size);
-    int64_t sample_count=0;
+    int64_t sample_count = 0;
     int rf64;
-    uint32_t tag, list_type;
-    AVIOContext *pb = s->pb;
-    AVStream *st = NULL;
+    uint32_t tag;
+    AVIOContext *pb      = s->pb;
+    AVStream *st         = NULL;
     WAVDemuxContext *wav = s->priv_data;
     int ret, got_fmt = 0;
     int64_t next_tag_ofs, data_ofs = -1;
@@ -216,21 +227,23 @@ static int wav_read_header(AVFormatContext *s)
 
     rf64 = tag == MKTAG('R', 'F', '6', '4');
     if (!rf64 && tag != MKTAG('R', 'I', 'F', 'F'))
-        return -1;
+        return AVERROR_INVALIDDATA;
     avio_rl32(pb); /* file size */
     tag = avio_rl32(pb);
     if (tag != MKTAG('W', 'A', 'V', 'E'))
-        return -1;
+        return AVERROR_INVALIDDATA;
 
     if (rf64) {
         if (avio_rl32(pb) != MKTAG('d', 's', '6', '4'))
-            return -1;
+            return AVERROR_INVALIDDATA;
         size = avio_rl32(pb);
         if (size < 16)
-            return -1;
+            return AVERROR_INVALIDDATA;
         avio_rl64(pb); /* RIFF size */
-        data_size = avio_rl64(pb);
+
+        data_size    = avio_rl64(pb);
         sample_count = avio_rl64(pb);
+
         if (data_size < 0 || sample_count < 0) {
             av_log(s, AV_LOG_ERROR, "negative data_size and/or sample_count in "
                    "ds64: data_size = %"PRId64", sample_count = %"PRId64"\n",
@@ -241,7 +254,7 @@ static int wav_read_header(AVFormatContext *s)
     }
 
     for (;;) {
-        size = next_tag(pb, &tag);
+        size         = next_tag(pb, &tag);
         next_tag_ofs = avio_tell(pb) + size;
 
         if (pb->eof_reached)
@@ -259,14 +272,15 @@ static int wav_read_header(AVFormatContext *s)
             break;
         case MKTAG('d', 'a', 't', 'a'):
             if (!got_fmt) {
-                av_log(s, AV_LOG_ERROR, "found no 'fmt ' tag before the 'data' tag\n");
+                av_log(s, AV_LOG_ERROR,
+                       "found no 'fmt ' tag before the 'data' tag\n");
                 return AVERROR_INVALIDDATA;
             }
 
             if (rf64) {
                 next_tag_ofs = wav->data_end = avio_tell(pb) + data_size;
             } else {
-                data_size = size;
+                data_size    = size;
                 next_tag_ofs = wav->data_end = size ? next_tag_ofs : INT64_MAX;
             }
 
@@ -278,21 +292,20 @@ static int wav_read_header(AVFormatContext *s)
             if (!pb->seekable || (!rf64 && !size))
                 goto break_loop;
             break;
-        case MKTAG('f','a','c','t'):
+        case MKTAG('f', 'a', 'c', 't'):
             if (!sample_count)
                 sample_count = avio_rl32(pb);
             break;
-        case MKTAG('b','e','x','t'):
+        case MKTAG('b', 'e', 'x', 't'):
             if ((ret = wav_parse_bext_tag(s, size)) < 0)
                 return ret;
             break;
         case MKTAG('L', 'I', 'S', 'T'):
-            list_type = avio_rl32(pb);
-            if (size <= 4) {
+            if (size < 4) {
                 av_log(s, AV_LOG_ERROR, "too short LIST");
                 return AVERROR_INVALIDDATA;
             }
-            switch (list_type) {
+            switch (avio_rl32(pb)) {
             case MKTAG('I', 'N', 'F', 'O'):
                 if ((ret = ff_read_riff_info(s, size - 4)) < 0)
                     return ret;
@@ -302,10 +315,11 @@ static int wav_read_header(AVFormatContext *s)
 
         /* seek to next tag unless we know that we'll run into EOF */
         if ((avio_size(pb) > 0 && next_tag_ofs >= avio_size(pb)) ||
-            avio_seek(pb, next_tag_ofs, SEEK_SET) < 0) {
+            wav_seek_tag(pb, next_tag_ofs, SEEK_SET) < 0) {
             break;
         }
     }
+
 break_loop:
     if (data_ofs < 0) {
         av_log(s, AV_LOG_ERROR, "no 'data' tag found\n");
@@ -314,8 +328,11 @@ break_loop:
 
     avio_seek(pb, data_ofs, SEEK_SET);
 
-    if (!sample_count && st->codec->channels && av_get_bits_per_sample(st->codec->codec_id))
-        sample_count = (data_size<<3) / (st->codec->channels * (uint64_t)av_get_bits_per_sample(st->codec->codec_id));
+    if (!sample_count && st->codec->channels &&
+        av_get_bits_per_sample(st->codec->codec_id))
+        sample_count = (data_size << 3) /
+                       (st->codec->channels *
+                        (uint64_t)av_get_bits_per_sample(st->codec->codec_id));
     if (sample_count)
         st->duration = sample_count;
 
@@ -325,7 +342,8 @@ break_loop:
     return 0;
 }
 
-/** Find chunk with w64 GUID by skipping over other chunks
+/**
+ * Find chunk with w64 GUID by skipping over other chunks.
  * @return the size of the found chunk
  */
 static int64_t find_guid(AVIOContext *pb, const uint8_t guid1[16])
@@ -345,13 +363,14 @@ static int64_t find_guid(AVIOContext *pb, const uint8_t guid1[16])
     return -1;
 }
 
-static const uint8_t guid_data[16] = { 'd', 'a', 't', 'a',
-    0xF3, 0xAC, 0xD3, 0x11, 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A };
+static const uint8_t guid_data[16] = {
+    'd',  'a',  't',  'a',
+    0xF3, 0xAC, 0xD3, 0x11,0x8C,  0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A
+};
 
 #define MAX_SIZE 4096
 
-static int wav_read_packet(AVFormatContext *s,
-                           AVPacket *pkt)
+static int wav_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     int ret, size;
     int64_t left;
@@ -361,14 +380,14 @@ static int wav_read_packet(AVFormatContext *s,
     st = s->streams[0];
 
     left = wav->data_end - avio_tell(s->pb);
-    if (left <= 0){
+    if (left <= 0) {
         if (CONFIG_W64_DEMUXER && wav->w64)
             left = find_guid(s->pb, guid_data) - 24;
         else
             left = find_tag(s->pb, MKTAG('d', 'a', 't', 'a'));
         if (left < 0)
             return AVERROR_EOF;
-        wav->data_end= avio_tell(s->pb) + left;
+        wav->data_end = avio_tell(s->pb) + left;
     }
 
     size = MAX_SIZE;
@@ -414,20 +433,25 @@ AVInputFormat ff_wav_demuxer = {
     .read_packet    = wav_read_packet,
     .read_seek      = wav_read_seek,
     .flags          = AVFMT_GENERIC_INDEX,
-    .codec_tag      = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 },
+    .codec_tag      = (const AVCodecTag * const []) { ff_codec_wav_tags,  0 },
 };
 #endif /* CONFIG_WAV_DEMUXER */
 
-
 #if CONFIG_W64_DEMUXER
-static const uint8_t guid_riff[16] = { 'r', 'i', 'f', 'f',
-    0x2E, 0x91, 0xCF, 0x11, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 };
+static const uint8_t guid_riff[16] = {
+    'r',  'i',  'f',  'f',
+    0x2E, 0x91, 0xCF, 0x11,0xA5,  0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+};
 
-static const uint8_t guid_wave[16] = { 'w', 'a', 'v', 'e',
-    0xF3, 0xAC, 0xD3, 0x11, 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A };
+static const uint8_t guid_wave[16] = {
+    'w',  'a',  'v',  'e',
+    0xF3, 0xAC, 0xD3, 0x11,0x8C,  0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A
+};
 
-static const uint8_t guid_fmt [16] = { 'f', 'm', 't', ' ',
-    0xF3, 0xAC, 0xD3, 0x11, 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A };
+static const uint8_t guid_fmt[16] = {
+    'f',  'm',  't',  ' ',
+    0xF3, 0xAC, 0xD3, 0x11,0x8C,  0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A
+};
 
 static int w64_probe(AVProbeData *p)
 {
@@ -443,29 +467,30 @@ static int w64_probe(AVProbeData *p)
 static int w64_read_header(AVFormatContext *s)
 {
     int64_t size;
-    AVIOContext *pb  = s->pb;
-    WAVDemuxContext    *wav = s->priv_data;
+    AVIOContext *pb      = s->pb;
+    WAVDemuxContext *wav = s->priv_data;
     AVStream *st;
     uint8_t guid[16];
     int ret;
 
     avio_read(pb, guid, 16);
     if (memcmp(guid, guid_riff, 16))
-        return -1;
+        return AVERROR_INVALIDDATA;
 
-    if (avio_rl64(pb) < 16 + 8 + 16 + 8 + 16 + 8) /* riff + wave + fmt + sizes */
-        return -1;
+    /* riff + wave + fmt + sizes */
+    if (avio_rl64(pb) < 16 + 8 + 16 + 8 + 16 + 8)
+        return AVERROR_INVALIDDATA;
 
     avio_read(pb, guid, 16);
     if (memcmp(guid, guid_wave, 16)) {
         av_log(s, AV_LOG_ERROR, "could not find wave guid\n");
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     size = find_guid(pb, guid_fmt);
     if (size < 0) {
         av_log(s, AV_LOG_ERROR, "could not find fmt guid\n");
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     st = avformat_new_stream(s, NULL);
@@ -473,7 +498,7 @@ static int w64_read_header(AVFormatContext *s)
         return AVERROR(ENOMEM);
 
     /* subtract chunk header size - normal wav file doesn't count it */
-    ret = ff_get_wav_header(pb, st->codec, size - 24);
+    ret = ff_get_wav_header(s, pb, st->codec, size - 24);
     if (ret < 0)
         return ret;
     avio_skip(pb, FFALIGN(size, INT64_C(8)) - size);
@@ -485,7 +510,7 @@ static int w64_read_header(AVFormatContext *s)
     size = find_guid(pb, guid_data);
     if (size < 0) {
         av_log(s, AV_LOG_ERROR, "could not find data guid\n");
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
     wav->data_end = avio_tell(pb) + size - 24;
     wav->w64      = 1;
@@ -502,6 +527,6 @@ AVInputFormat ff_w64_demuxer = {
     .read_packet    = wav_read_packet,
     .read_seek      = wav_read_seek,
     .flags          = AVFMT_GENERIC_INDEX,
-    .codec_tag      = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 },
+    .codec_tag      = (const AVCodecTag * const []) { ff_codec_wav_tags, 0 },
 };
 #endif /* CONFIG_W64_DEMUXER */