On 26.02.2015 00:51, Michael Niedermayer wrote:
On Wed, Feb 25, 2015 at 05:35:33PM +0100, Tobias Rapp wrote:
avienc.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
09f8c8250ce5ec1bdad79a1bf280028c9d3af376
0001-libavformat-avienc-Fix-duration-for-audio-stream-Ope.patch
From 3a8e15598fa3e044f3ef65b5063c633cb4b3afed Mon Sep 17 00:00:00 2001
From: Tobias Rapp <t.r...@noa-audio.com>
Date: Wed, 25 Feb 2015 17:10:13 +0100
Subject: [PATCH] libavformat/avienc: Fix duration for audio stream OpenDML
super index
Fixes the duration field of the OpenDML super index "indx" chunk to
contain the number of samples instead of the number of packets for
(linear/PCM) audio streams.
This matches the OpenDML V1.02 standard text which states that the
duration field shall contain "time span in stream ticks".
---
libavformat/avienc.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/libavformat/avienc.c b/libavformat/avienc.c
index 53c2fe7..b77b295 100644
--- a/libavformat/avienc.c
+++ b/libavformat/avienc.c
@@ -49,6 +49,7 @@ typedef struct AVIIentry {
typedef struct AVIIndex {
int64_t indx_start;
+ int64_t audio_strm_offset;
int entry;
int ents_allocated;
AVIIentry** cluster;
@@ -91,6 +92,7 @@ static int64_t avi_start_new_riff(AVFormatContext *s,
AVIOContext *pb,
avi->riff_id++;
for (i = 0; i < s->nb_streams; i++) {
AVIStream *avist = s->streams[i]->priv_data;
+ avist->indexes.audio_strm_offset = avist->audio_strm_length;
avist->indexes.entry = 0;
}
@@ -476,6 +478,7 @@ static int avi_write_ix(AVFormatContext *s)
for (i = 0; i < s->nb_streams; i++) {
AVIStream *avist = s->streams[i]->priv_data;
int64_t ix, pos;
+ int au_byterate, au_ssize, au_scale;
avi_stream2fourcc(tag, i, s->streams[i]->codec->codec_type);
ix_tag[3] = '0' + i;
@@ -511,7 +514,11 @@ static int avi_write_ix(AVFormatContext *s)
avio_skip(pb, 16 * avi->riff_id);
avio_wl64(pb, ix); /* qwOffset */
avio_wl32(pb, pos - ix); /* dwSize */
- avio_wl32(pb, avist->indexes.entry); /* dwDuration */
+ ff_parse_specific_params(s->streams[i], &au_byterate, &au_ssize,
&au_scale);
+ if (au_ssize == 0)
+ avio_wl32(pb, avist->indexes.entry); /* dwDuration (packet count)
*/
+ else
+ avio_wl32(pb, (avist->audio_strm_length -
avist->indexes.audio_strm_offset) / au_ssize); /* dwDuration (sample count) */
the rounding here is wrong
the index to be useable needs to have segments duration summable
as is this would lead to significangt errors if many of these
durations would be summed up
something like
avist->audio_strm_length / au_ssize - avist->indexes.audio_strm_offset /
au_ssize
might avoid that but ive not tested it
My assumption was that a stream packet contains only whole samples for
linear/uncompressed audio (PCM) and that only for linear audio the
expression "au_ssize > 0" evaluates to TRUE.
If that is not the case I can do the rounding as suggested or maybe
introduce some separate stream duration counter based on AVPacket.duration?
Regards,
Tobias
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel