[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