[FFmpeg-cvslog] w64: fact guid support

Paul B Mahol git at videolan.org
Mon Jan 7 11:20:21 CET 2013


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sat Jan  5 15:02:08 2013 +0000| [3174137d411df054d81110d5fe08a2565fe0f9cc] | committer: Paul B Mahol

w64: fact guid support

Signed-off-by: Paul B Mahol <onemda at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3174137d411df054d81110d5fe08a2565fe0f9cc
---

 libavformat/w64.c    |    3 +++
 libavformat/w64.h    |    1 +
 libavformat/wavdec.c |    6 ++++++
 libavformat/wavenc.c |   20 +++++++++++++++++++-
 4 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/libavformat/w64.c b/libavformat/w64.c
index dc0f63c..7bf5502 100644
--- a/libavformat/w64.c
+++ b/libavformat/w64.c
@@ -29,6 +29,9 @@ const uint8_t ff_w64_guid_wave[16] = { 'w', 'a', 'v', 'e',
 const uint8_t ff_w64_guid_fmt [16] = { 'f', 'm', 't', ' ',
     0xF3, 0xAC, 0xD3, 0x11, 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A };
 
+const uint8_t ff_w64_guid_fact[16] = { 'f', 'a', 'c', 't',
+    0xF3, 0xAC, 0xD3, 0x11, 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A };
+
 const uint8_t ff_w64_guid_data[16] = { 'd', 'a', 't', 'a',
     0xF3, 0xAC, 0xD3, 0x11, 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A };
 
diff --git a/libavformat/w64.h b/libavformat/w64.h
index e9f6d2b..0ec3fa9 100644
--- a/libavformat/w64.h
+++ b/libavformat/w64.h
@@ -24,6 +24,7 @@
 extern const uint8_t ff_w64_guid_riff[16];
 extern const uint8_t ff_w64_guid_wave[16];
 extern const uint8_t ff_w64_guid_fmt [16];
+extern const uint8_t ff_w64_guid_fact[16];
 extern const uint8_t ff_w64_guid_data[16];
 extern const uint8_t ff_w64_guid_summarylist[16];
 
diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c
index 4511877..782fa64 100644
--- a/libavformat/wavdec.c
+++ b/libavformat/wavdec.c
@@ -610,6 +610,12 @@ static int w64_read_header(AVFormatContext *s)
             avio_skip(pb, FFALIGN(size, INT64_C(8)) - size);
 
             avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
+        } else if (!memcmp(guid, ff_w64_guid_fact, 16)) {
+            int64_t samples;
+
+            samples = avio_rl64(pb);
+            if (samples > 0)
+                st->duration = samples;
         } else if (!memcmp(guid, ff_w64_guid_data, 16)) {
             wav->data_end = avio_tell(pb) + size - 24;
 
diff --git a/libavformat/wavenc.c b/libavformat/wavenc.c
index 79e3713..2e80a75 100644
--- a/libavformat/wavenc.c
+++ b/libavformat/wavenc.c
@@ -263,6 +263,14 @@ static int w64_write_header(AVFormatContext *s)
         return ret;
     }
     end_guid(pb, start);
+
+    if (s->streams[0]->codec->codec_tag != 0x01 /* hence for all other than PCM */
+        && s->pb->seekable) {
+        start_guid(pb, ff_w64_guid_fact, &wav->fact_pos);
+        avio_wl64(pb, 0);
+        end_guid(pb, wav->fact_pos);
+    }
+
     start_guid(pb, ff_w64_guid_data, &wav->data);
 
     return 0;
@@ -280,8 +288,18 @@ static int w64_write_trailer(AVFormatContext *s)
         file_size = avio_tell(pb);
         avio_seek(pb, 16, SEEK_SET);
         avio_wl64(pb, file_size);
-        avio_seek(pb, file_size, SEEK_SET);
 
+        if (s->streams[0]->codec->codec_tag != 0x01) {
+            int64_t number_of_samples;
+
+            number_of_samples = av_rescale(wav->maxpts - wav->minpts + wav->last_duration,
+                                           s->streams[0]->codec->sample_rate * (int64_t)s->streams[0]->time_base.num,
+                                           s->streams[0]->time_base.den);
+            avio_seek(pb, wav->fact_pos + 24, SEEK_SET);
+            avio_wl64(pb, number_of_samples);
+        }
+
+        avio_seek(pb, file_size, SEEK_SET);
         avio_flush(pb);
     }
 



More information about the ffmpeg-cvslog mailing list