summaryrefslogtreecommitdiff
path: root/libavformat/wavenc.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2013-01-05 15:02:08 +0000
committerPaul B Mahol <onemda@gmail.com>2013-01-07 10:08:38 +0000
commit3174137d411df054d81110d5fe08a2565fe0f9cc (patch)
tree4d9ef6dbe9f87e262e39d8d1acb12173b0c47327 /libavformat/wavenc.c
parente13c5abbd70440a02e00d7392738a36356481a78 (diff)
downloadffmpeg-3174137d411df054d81110d5fe08a2565fe0f9cc.tar.gz
w64: fact guid support
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavformat/wavenc.c')
-rw-r--r--libavformat/wavenc.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/libavformat/wavenc.c b/libavformat/wavenc.c
index 79e3713a9b..2e80a75b6e 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);
}