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

Michael Niedermayer michaelni at gmx.at
Sat Oct 26 13:50:36 CEST 2013


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

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Complexity theory is the science of finding the exact solution to an
approximation. Benchmarking OTOH is finding an approximation of the exact
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20131026/841b0e36/attachment.asc>


More information about the ffmpeg-devel mailing list