[FFmpeg-devel] [PATCH] lavd/pulse_audio_enc: fix timestamp calculation

Lukasz M lukasz.m.luki at gmail.com
Sat Oct 26 15:47:13 CEST 2013


On 26 October 2013 13:50, Michael Niedermayer <michaelni at gmx.at> wrote:

> On Sat, Oct 26, 2013 at 12:53:53AM +0200, Lukasz Marek wrote:
> > Current implementation didn't include duration of
> > last processed packet.
> > Device may return negative timestamps without
> > this correction.
> >
> > Signed-off-by: Lukasz Marek <lukasz.m.luki at gmail.com>
> > ---
> >  libavdevice/pulse_audio_enc.c |   11 ++++++++++-
> >  1 file changed, 10 insertions(+), 1 deletion(-)
> >
> > diff --git a/libavdevice/pulse_audio_enc.c
> b/libavdevice/pulse_audio_enc.c
> > index 86ef648..a27ae3c 100644
> > --- a/libavdevice/pulse_audio_enc.c
> > +++ b/libavdevice/pulse_audio_enc.c
> > @@ -35,6 +35,7 @@ typedef struct PulseData {
> >      const char *device;
> >      pa_simple *pa;
> >      unsigned int stream_index;
> > +    int64_t timestamp_diff;
> >  } PulseData;
> >
> >  static av_cold int pulse_write_header(AVFormatContext *h)
> > @@ -115,6 +116,14 @@ static int pulse_write_packet(AVFormatContext *h,
> AVPacket *pkt)
> >      if (s->stream_index != pkt->stream_index)
> >          return 0;
> >
> > +    if (!(s->timestamp_diff = pkt->duration)) {
> > +        AVStream *st = h->streams[s->stream_index];
> > +        AVCodecContext *codec_ctx = st->codec;
> > +        AVRational r = { 1, codec_ctx->sample_rate };
> > +        int64_t samples = pkt->size /
> (av_get_bytes_per_sample(codec_ctx->sample_fmt) * codec_ctx->channels);
> > +        s->timestamp_diff = av_rescale_q(samples, r, st->time_base);
> > +    }
> > +
> >      if (pa_simple_write(s->pa, pkt->data, pkt->size, &error) < 0) {
> >          av_log(s, AV_LOG_ERROR, "pa_simple_write failed: %s\n",
> pa_strerror(error));
> >          return AVERROR(EIO);
>
> > @@ -128,7 +137,7 @@ static void
> pulse_get_output_timestamp(AVFormatContext *h, int stream, int64_t *
> >      PulseData *s = h->priv_data;
> >      pa_usec_t latency = pa_simple_get_latency(s->pa, NULL);
> >      *wall = av_gettime();
> > -    *dts = h->streams[s->stream_index]->cur_dts - latency;
> > +    *dts = h->streams[s->stream_index]->cur_dts + s->timestamp_diff -
> latency;
>
> its independant of this patch (which should be ok) but
> access to cur_dts from (de)muxer or in/outputs is not a very good idea
> cur_dts is maintained by the core code and may or may not be what
> a (de)muxer expects
>

I attached a patch that removes that cur_dts issue.
I have just question if there is any other way to get current pts than
pkt->pts in write_packet method?
pkt->pts may have AV_NOPTS_VALUE value, which is a problem when seek is
done and packets have no pts.
Output device will still add duration of packets to previous timestamp.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-lavd-pulse_audio_enc-fix-timestamp-calculation.patch
Type: text/x-patch
Size: 2317 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20131026/b2475338/attachment.bin>


More information about the ffmpeg-devel mailing list