[FFmpeg-devel] [PATCH] avformat/dv: always set audio packet duration

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Mon Sep 6 21:28:54 EEST 2021


Paul B Mahol:
> If audio packet is present in DV stream it have duration of 1 in DV timebase units.
> 
> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> ---
>  libavformat/dv.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/libavformat/dv.c b/libavformat/dv.c
> index d7909683c3..b2b74162df 100644
> --- a/libavformat/dv.c
> +++ b/libavformat/dv.c
> @@ -48,6 +48,7 @@ struct DVPacket {
>      int      stream_index;
>      int      flags;
>      int64_t  pos;
> +    int64_t  duration;
>  };
>  
>  struct DVDemuxContext {
> @@ -276,6 +277,7 @@ static int dv_extract_audio_info(DVDemuxContext *c, const uint8_t *frame)
>              c->audio_pkt[i].stream_index = c->ast[i]->index;
>              c->audio_pkt[i].flags       |= AV_PKT_FLAG_KEY;
>              c->audio_pkt[i].pts          = AV_NOPTS_VALUE;
> +            c->audio_pkt[i].duration     = 0;
>              c->audio_pkt[i].pos          = -1;
>          }
>          c->ast[i]->codecpar->sample_rate    = dv_audio_frequency[freq];
> @@ -374,6 +376,7 @@ int avpriv_dv_get_packet(DVDemuxContext *c, AVPacket *pkt)
>              pkt->stream_index = c->audio_pkt[i].stream_index;
>              pkt->flags        = c->audio_pkt[i].flags;
>              pkt->pts          = c->audio_pkt[i].pts;
> +            pkt->duration     = c->audio_pkt[i].duration;
>              pkt->pos          = c->audio_pkt[i].pos;
>  
>              c->audio_pkt[i].size = 0;
> @@ -404,6 +407,7 @@ int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
>          c->audio_pkt[i].pos  = pos;
>          c->audio_pkt[i].size = size;
>          c->audio_pkt[i].pts  = (c->sys->height == 720) ? (c->frames & ~1) : c->frames;
> +        c->audio_pkt[i].duration = 1;
>          ppcm[i] = c->audio_buf[i];
>      }
>      if (c->ach)
> 
Sure about that? According to the code, the packets contain slightly
different amounts of samples; see dv_extract_audio_info(), in particular
lines 242 and 289.
(It seems to me that one audio packet is supposed to contain the audio
for one video frame, yet the standard sample rates and standard video
framerates (in particular NTSC) are incompatible, so a slight variation
in the number of samples per frame is used.)
IMO one should set the audio timebase to be the inverse of the
samplerate and set the duration based upon the number of samples. But I
have zero experience with dv.

- Andreas


More information about the ffmpeg-devel mailing list