diff options
Diffstat (limited to 'src/buffer')
| -rw-r--r-- | src/buffer/audio.c | 6 | ||||
| -rw-r--r-- | src/buffer/video.c | 19 |
2 files changed, 14 insertions, 11 deletions
diff --git a/src/buffer/audio.c b/src/buffer/audio.c index 141c589..f3e0b74 100644 --- a/src/buffer/audio.c +++ b/src/buffer/audio.c @@ -14,7 +14,7 @@ #define BUFFER_MARK_BUFFERED (1.5 * 1000000L) #ifdef CAMU_AUDIO_BUFFER_FADE -#define FADE_STEP(fmt) (1.f / (fmt)->sample_rate) +#define FADE_STEP(fmt) (1.1f / (fmt)->sample_rate) #endif enum { @@ -280,7 +280,7 @@ size_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, size_t re if (pts > 0.0) { // Skip. ret = camu_audio_format_sec_to_bytes(&buf->fmt.req, pts); ret = AL_MIN(ret, have); - al_log_debug("audio_buffer", "Skipping %fs of audio (%zu bytes).", pts, ret); + al_log_info("audio_buffer", "Skipping %fs of audio (%zu bytes).", pts, ret); ret = al_ring_buffer_discard(&buf->rb, ret); have -= ret; buf->pts += camu_audio_format_bytes_to_sec(&buf->fmt.req, ret); @@ -289,7 +289,7 @@ size_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, size_t re pts = -pts; ret = camu_audio_format_sec_to_bytes(&buf->fmt.req, pts); ret = AL_MIN(ret, req); - al_log_debug("audio_buffer", "Delaying audio by %fs (%zu bytes).", pts, ret); + al_log_info("audio_buffer", "Delaying audio by %fs (%zu bytes).", pts, ret); al_memset(data, 0, ret); data += ret; req -= ret; diff --git a/src/buffer/video.c b/src/buffer/video.c index 00902f3..04a9dbf 100644 --- a/src/buffer/video.c +++ b/src/buffer/video.c @@ -4,10 +4,10 @@ #include "common.h" #include "common_internal.h" -#define BUFFER_WATERMARK_LOW 8 // frames. -#define BUFFER_WATERMARK_BUFFERED 5 -#define BUFFER_WATERMARK_HIGH 12 -#define BUFFER_WATERMARK_RESET BUFFER_WATERMARK_HIGH + 10. +#define BUFFER_WATERMARK_LOW 6 // frames. +#define BUFFER_WATERMARK_BUFFERED 4 +#define BUFFER_WATERMARK_HIGH 10 +#define BUFFER_WATERMARK_RESET BUFFER_WATERMARK_HIGH + 10 bool camu_video_buffer_init(struct camu_video_buffer *buf, struct camu_clock *clock, struct camu_renderer *renderer) { @@ -99,7 +99,7 @@ static void after_push_internal(struct camu_video_buffer *buf) } #ifdef CAMU_HAVE_FFMPEG -static void push_av_frame_internal(struct camu_video_buffer *buf, AVFrame *frame) +static bool push_av_frame_internal(struct camu_video_buffer *buf, AVFrame *frame) { f64 pts = 0.0; if (!buf->single_frame) { @@ -107,7 +107,7 @@ static void push_av_frame_internal(struct camu_video_buffer *buf, AVFrame *frame pts = frame->best_effort_timestamp * av_q2d(stream->time_base); if (pts + buf->avg_frame_duration < camu_clock_get_base_pts(buf->clock)) { av_frame_free(&frame); - return; + return false; } } if (buf->pts == -1.0) buf->pts = pts; @@ -122,6 +122,7 @@ static void push_av_frame_internal(struct camu_video_buffer *buf, AVFrame *frame #endif if (frame) frame->opaque = buf; buf->queue->push_av_frame(buf->queue, frame, pts); + return true; } #endif @@ -137,10 +138,12 @@ void camu_video_buffer_push(struct camu_video_buffer *buf, struct camu_codec_fra buf->queue->push(buf->queue, frame, 0.0); break; #ifdef CAMU_HAVE_FFMPEG - case CAMU_FFMPEG_COMPAT: - push_av_frame_internal(buf, frame->av.frame); + case CAMU_FFMPEG_COMPAT: { + bool pushed = push_av_frame_internal(buf, frame->av.frame); al_free(frame); + if (!pushed) return; break; + } #endif } after_push_internal(buf); |