[FFmpeg-devel] [PATCH][RFC] Interpretation of duration field in AVI super index chunk

Tobias Rapp t.rapp at noa-audio.com
Thu Feb 26 14:14:33 CET 2015


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.rapp at 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



More information about the ffmpeg-devel mailing list