[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