diff options
author | Anton Khirnov <anton@khirnov.net> | 2016-07-17 22:24:35 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2016-10-02 19:35:12 +0200 |
commit | 8385ba53f115401a67a4748c0d107769ebfb2941 (patch) | |
tree | 651b7bec5b89f9d8e9675800c900bc4e789aba54 | |
parent | 3a165c187da7d74f46f6c1778294e8c5a3a7151f (diff) | |
download | ffmpeg-8385ba53f115401a67a4748c0d107769ebfb2941.tar.gz |
mmaldec: convert to stdatomic
-rw-r--r-- | libavcodec/mmaldec.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c index 69258a2eb6..924bfb2e26 100644 --- a/libavcodec/mmaldec.c +++ b/libavcodec/mmaldec.c @@ -31,10 +31,10 @@ #include <interface/mmal/util/mmal_util_params.h> #include <interface/mmal/util/mmal_default_components.h> #include <interface/mmal/vc/mmal_vc_api.h> +#include <stdatomic.h> #include "avcodec.h" #include "internal.h" -#include "libavutil/atomic.h" #include "libavutil/avassert.h" #include "libavutil/buffer.h" #include "libavutil/common.h" @@ -55,7 +55,7 @@ typedef struct FFBufferEntry { // refcounting for AVFrames, we can free the MMAL_POOL_T only after all AVFrames // have been unreferenced. typedef struct FFPoolRef { - volatile int refcount; + atomic_int refcount; MMAL_POOL_T *pool; } FFPoolRef; @@ -83,7 +83,7 @@ typedef struct MMALDecodeContext { FFBufferEntry *waiting_buffers, *waiting_buffers_tail; int64_t packets_sent; - volatile int packets_buffered; + atomic_int packets_buffered; int64_t frames_output; int eos_received; int eos_sent; @@ -96,7 +96,8 @@ typedef struct MMALDecodeContext { static void ffmmal_poolref_unref(FFPoolRef *ref) { - if (ref && avpriv_atomic_int_add_and_fetch(&ref->refcount, -1) == 0) { + if (ref && + atomic_fetch_add_explicit(&ref->refcount, -1, memory_order_acq_rel) == 1) { mmal_pool_destroy(ref->pool); av_free(ref); } @@ -132,7 +133,7 @@ static int ffmmal_set_ref(AVFrame *frame, FFPoolRef *pool, return AVERROR(ENOMEM); } - avpriv_atomic_int_add_and_fetch(&ref->pool->refcount, 1); + atomic_fetch_add_explicit(&ref->pool->refcount, 1, memory_order_relaxed); mmal_buffer_header_acquire(buffer); frame->format = AV_PIX_FMT_MMAL; @@ -163,14 +164,14 @@ static void ffmmal_stop_decoder(AVCodecContext *avctx) ctx->waiting_buffers = buffer->next; if (buffer->flags & MMAL_BUFFER_HEADER_FLAG_FRAME_END) - avpriv_atomic_int_add_and_fetch(&ctx->packets_buffered, -1); + atomic_fetch_add(&ctx->packets_buffered, -1); av_buffer_unref(&buffer->ref); av_free(buffer); } ctx->waiting_buffers_tail = NULL; - av_assert0(avpriv_atomic_int_get(&ctx->packets_buffered) == 0); + av_assert0(atomic_load(&ctx->packets_buffered) == 0); ctx->frames_output = ctx->eos_received = ctx->eos_sent = ctx->packets_sent = ctx->extradata_sent = 0; } @@ -202,7 +203,7 @@ static void input_callback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) FFBufferEntry *entry = buffer->user_data; av_buffer_unref(&entry->ref); if (entry->flags & MMAL_BUFFER_HEADER_FLAG_FRAME_END) - avpriv_atomic_int_add_and_fetch(&ctx->packets_buffered, -1); + atomic_fetch_add(&ctx->packets_buffered, -1); av_free(entry); } mmal_buffer_header_release(buffer); @@ -280,7 +281,7 @@ static int ffmal_update_format(AVCodecContext *avctx) ret = AVERROR(ENOMEM); goto fail; } - ctx->pool_out->refcount = 1; + atomic_store(&ctx->pool_out->refcount, 1); if (!format_out) goto fail; @@ -522,7 +523,7 @@ static int ffmmal_add_packet(AVCodecContext *avctx, AVPacket *avpkt, if (!size) { buffer->flags |= MMAL_BUFFER_HEADER_FLAG_FRAME_END; - avpriv_atomic_int_add_and_fetch(&ctx->packets_buffered, 1); + atomic_fetch_add(&ctx->packets_buffered, 1); } if (!buffer->length) { @@ -587,7 +588,7 @@ static int ffmmal_fill_input_port(AVCodecContext *avctx) mmal_buffer_header_release(mbuffer); av_buffer_unref(&buffer->ref); if (buffer->flags & MMAL_BUFFER_HEADER_FLAG_FRAME_END) - avpriv_atomic_int_add_and_fetch(&ctx->packets_buffered, -1); + atomic_fetch_add(&ctx->packets_buffered, -1); av_free(buffer); } @@ -666,7 +667,7 @@ static int ffmmal_read_frame(AVCodecContext *avctx, AVFrame *frame, int *got_fra // excessive buffering. // We also wait if we sent eos, but didn't receive it yet (think of decoding // stream with a very low number of frames). - if (avpriv_atomic_int_get(&ctx->packets_buffered) > MAX_DELAYED_FRAMES || + if (atomic_load(&ctx->packets_buffered) > MAX_DELAYED_FRAMES || (ctx->packets_sent && ctx->eos_sent)) { // MMAL will ignore broken input packets, which means the frame we // expect here may never arrive. Dealing with this correctly is |