From 5b3190593c229d282b7342a6d7572ecbbf4ceb64 Mon Sep 17 00:00:00 2001 From: John Bradley Date: Thu, 12 Mar 2015 15:24:15 -0500 Subject: [PATCH] deps-libff: Add reference counting to clock Add referencing counting to determine when to release a clock Due to no fixed ownership of clocks (packets, frames, decoders and refresh thread all may own a clock at some point). --- deps/libff/libff/ff-clock.c | 52 +++++++++++++++++++++++++++++++++++++ deps/libff/libff/ff-clock.h | 12 +++++++++ 2 files changed, 64 insertions(+) diff --git a/deps/libff/libff/ff-clock.c b/deps/libff/libff/ff-clock.c index 6939d47b7..b22a03ce4 100644 --- a/deps/libff/libff/ff-clock.c +++ b/deps/libff/libff/ff-clock.c @@ -15,8 +15,60 @@ */ #include "ff-clock.h" +#include "ff-threading.h" + +#include double ff_get_sync_clock(struct ff_clock *clock) { return clock->sync_clock(clock->opaque); } + +struct ff_clock *ff_clock_init(struct ff_clock *clock) +{ + clock = av_mallocz(sizeof(struct ff_clock)); + + if (clock == NULL) + return NULL; + + if (pthread_mutex_init(&clock->mutex, NULL) != 0) + goto fail; + + if (pthread_cond_init(&clock->cond, NULL) != 0) + goto fail1; + + return clock; + +fail1: + pthread_mutex_destroy(&clock->mutex); +fail: + av_free(clock); + + return NULL; +} + +struct ff_clock *ff_clock_retain(struct ff_clock *clock) +{ + ff_atomic_inc_long(&clock->retain); + + return clock; +} + +struct ff_clock *ff_clock_move(struct ff_clock **clock) +{ + struct ff_clock *retained_clock = ff_clock_retain(*clock); + ff_clock_release(clock); + + return retained_clock; +} + +void ff_clock_release(struct ff_clock **clock) +{ + if (ff_atomic_dec_long(&(*clock)->retain) == 0) { + pthread_cond_destroy(&(*clock)->cond); + pthread_mutex_destroy(&(*clock)->mutex); + av_free(*clock); + } + + *clock = NULL; +} diff --git a/deps/libff/libff/ff-clock.h b/deps/libff/libff/ff-clock.h index 5f8d4f49d..608eb6971 100644 --- a/deps/libff/libff/ff-clock.h +++ b/deps/libff/libff/ff-clock.h @@ -19,6 +19,9 @@ #define AV_SYNC_THRESHOLD 0.01 #define AV_NOSYNC_THRESHOLD 10.0 +#include +#include + enum ff_av_sync_type { AV_SYNC_AUDIO_MASTER, AV_SYNC_VIDEO_MASTER, @@ -30,9 +33,18 @@ typedef double (*ff_sync_clock)(void *opaque); struct ff_clock { ff_sync_clock sync_clock; enum ff_av_sync_type sync_type; + + pthread_mutex_t mutex; + pthread_cond_t cond; + volatile long retain; + void *opaque; }; typedef struct ff_clock ff_clock_t; +struct ff_clock * ff_clock_init(); double ff_get_sync_clock(struct ff_clock *clock); +struct ff_clock *ff_clock_retain(struct ff_clock *clock); +struct ff_clock *ff_clock_move(struct ff_clock **clock); +void ff_clock_release(struct ff_clock **clock);