summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/out/ao_lavc.c5
-rw-r--r--common/encode.h1
-rw-r--r--common/encode_lavc.c8
-rw-r--r--common/encode_lavc.h3
-rw-r--r--player/audio.c4
5 files changed, 20 insertions, 1 deletions
diff --git a/audio/out/ao_lavc.c b/audio/out/ao_lavc.c
index 359fbae0fa..9a2df7be22 100644
--- a/audio/out/ao_lavc.c
+++ b/audio/out/ao_lavc.c
@@ -320,7 +320,6 @@ static int play(struct ao *ao, void **data, int samples, int flags)
struct encode_lavc_context *ectx = ao->encode_lavc_ctx;
int bufpos = 0;
double nextpts;
- double pts = ao->pts;
double outpts;
if (!encode_lavc_start(ectx)) {
@@ -328,6 +327,10 @@ static int play(struct ao *ao, void **data, int samples, int flags)
return 0;
}
+ double pts = ectx->last_audio_in_pts;
+ pts += ectx->samples_since_last_pts / ao->samplerate;
+ ectx->samples_since_last_pts += samples;
+
size_t num_planes = af_fmt_is_planar(ao->format) ? ao->channels.num : 1;
if (flags & AOPLAY_FINAL_CHUNK) {
diff --git a/common/encode.h b/common/encode.h
index a4c7d821d9..7d6cacd86a 100644
--- a/common/encode.h
+++ b/common/encode.h
@@ -18,6 +18,7 @@ bool encode_lavc_showhelp(struct mp_log *log, struct encode_output_conf *options
int encode_lavc_getstatus(struct encode_lavc_context *ctx, char *buf, int bufsize, float relative_position);
void encode_lavc_expect_stream(struct encode_lavc_context *ctx, int mt);
void encode_lavc_set_video_fps(struct encode_lavc_context *ctx, float fps);
+void encode_lavc_set_audio_pts(struct encode_lavc_context *ctx, double pts);
bool encode_lavc_didfail(struct encode_lavc_context *ctx); // check if encoding failed
#endif
diff --git a/common/encode_lavc.c b/common/encode_lavc.c
index 39787430bf..5f9e2a0390 100644
--- a/common/encode_lavc.c
+++ b/common/encode_lavc.c
@@ -386,6 +386,14 @@ void encode_lavc_set_video_fps(struct encode_lavc_context *ctx, float fps)
ctx->vo_fps = fps;
}
+void encode_lavc_set_audio_pts(struct encode_lavc_context *ctx, double pts)
+{
+ if (ctx) {
+ ctx->last_audio_in_pts = pts;
+ ctx->samples_since_last_pts = 0;
+ }
+}
+
static void encode_2pass_prepare(struct encode_lavc_context *ctx,
AVDictionary **dictp,
AVStream *stream, struct stream **bytebuf,
diff --git a/common/encode_lavc.h b/common/encode_lavc.h
index 96fc17f1bb..deaf42b684 100644
--- a/common/encode_lavc.h
+++ b/common/encode_lavc.h
@@ -55,6 +55,9 @@ struct encode_lavc_context {
double audio_pts_offset;
double last_video_in_pts;
+ double last_audio_in_pts;
+ int64_t samples_since_last_pts;
+
// anti discontinuity mode
double next_in_pts;
double discontinuity_pts_offset;
diff --git a/player/audio.c b/player/audio.c
index ed4d0f5f2a..984243b639 100644
--- a/player/audio.c
+++ b/player/audio.c
@@ -26,6 +26,7 @@
#include "talloc.h"
#include "common/msg.h"
+#include "common/encode.h"
#include "options/options.h"
#include "common/common.h"
@@ -252,6 +253,9 @@ static int write_to_ao(struct MPContext *mpctx, struct mp_audio *data, int flags
return 0;
struct ao *ao = mpctx->ao;
ao->pts = pts;
+#if HAVE_ENCODING
+ encode_lavc_set_audio_pts(mpctx->encode_lavc_ctx, ao->pts);
+#endif
double real_samplerate = ao->samplerate / mpctx->opts->playback_speed;
int played = ao_play(mpctx->ao, data->planes, data->samples, flags);
assert(played <= data->samples);