[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