From 75be547f77af196b14c0635bfad89445f04bdaed Mon Sep 17 00:00:00 2001 From: Sebastien Zwickert Date: Sun, 8 Jan 2012 20:22:12 +0100 Subject: [PATCH] vda: uses pthreads directly. --- libavcodec/vda.c | 43 +++++++++---------------------------------- libavcodec/vda.h | 3 ++- 2 files changed, 11 insertions(+), 35 deletions(-) diff --git a/libavcodec/vda.c b/libavcodec/vda.c index 20207eab70..eff5933e71 100644 --- a/libavcodec/vda.c +++ b/libavcodec/vda.c @@ -26,7 +26,7 @@ #include #include -#include "avcodec.h" +#include "libavutil/avutil.h" #include "vda_internal.h" /** @@ -35,27 +35,6 @@ * @{ */ -/* Mutex manager callback. */ -static int vda_lock_operation(void **mtx, enum AVLockOp op) -{ - switch (op) { - case AV_LOCK_CREATE: - *mtx = av_malloc(sizeof(pthread_mutex_t)); - if (!*mtx) - return 1; - return !!pthread_mutex_init(*mtx, NULL); - case AV_LOCK_OBTAIN: - return !!pthread_mutex_lock(*mtx); - case AV_LOCK_RELEASE: - return !!pthread_mutex_unlock(*mtx); - case AV_LOCK_DESTROY: - pthread_mutex_destroy(*mtx); - av_freep(mtx); - return 0; - } - return 1; -} - /* Helper to create a dictionary according to the given pts. */ static CFDictionaryRef vda_dictionary_with_pts(int64_t i_pts) { @@ -93,7 +72,7 @@ static void vda_clear_queue(struct vda_context *vda_ctx) { vda_frame *top_frame; - vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_OBTAIN); + pthread_mutex_lock(&vda_ctx->queue_mutex); while (vda_ctx->queue) { top_frame = vda_ctx->queue; @@ -101,7 +80,7 @@ static void vda_clear_queue(struct vda_context *vda_ctx) ff_vda_release_vda_frame(top_frame); } - vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_RELEASE); + pthread_mutex_unlock(&vda_ctx->queue_mutex); } @@ -130,7 +109,7 @@ static void vda_decoder_callback (void *vda_hw_ctx, new_frame->cv_buffer = CVPixelBufferRetain(image_buffer); new_frame->pts = vda_pts_from_dictionary(user_info); - vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_OBTAIN); + pthread_mutex_lock(&vda_ctx->queue_mutex); queue_walker = vda_ctx->queue; @@ -154,7 +133,7 @@ static void vda_decoder_callback (void *vda_hw_ctx, } } - vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_RELEASE); + pthread_mutex_unlock(&vda_ctx->queue_mutex); } int ff_vda_create_decoder(struct vda_context *vda_ctx, @@ -174,10 +153,7 @@ int ff_vda_create_decoder(struct vda_context *vda_ctx, vda_ctx->bitstream = NULL; vda_ctx->ref_size = 0; - if (av_lockmgr_register(vda_lock_operation)) - return -1; - - vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_CREATE); + pthread_mutex_init(&vda_ctx->queue_mutex, NULL); if (extradata[4]==0xFE) { // convert 3 byte NAL sizes to 4 byte @@ -247,8 +223,7 @@ int ff_vda_destroy_decoder(struct vda_context *vda_ctx) vda_clear_queue(vda_ctx); - if (vda_ctx->queue_mutex) - vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_DESTROY); + pthread_mutex_destroy(&vda_ctx->queue_mutex); if (vda_ctx->bitstream) av_freep(&vda_ctx->bitstream); @@ -266,10 +241,10 @@ vda_frame *ff_vda_queue_pop(struct vda_context *vda_ctx) if (!vda_ctx->queue) return NULL; - vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_OBTAIN); + pthread_mutex_lock(&vda_ctx->queue_mutex); top_frame = vda_ctx->queue; vda_ctx->queue = top_frame->next_frame; - vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_RELEASE); + pthread_mutex_unlock(&vda_ctx->queue_mutex); return top_frame; } diff --git a/libavcodec/vda.h b/libavcodec/vda.h index 5ff8070fd3..7d043c7e30 100644 --- a/libavcodec/vda.h +++ b/libavcodec/vda.h @@ -23,6 +23,7 @@ #ifndef AVCODEC_VDA_H #define AVCODEC_VDA_H +#include #include // emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes @@ -92,7 +93,7 @@ struct vda_context { * - encoding: unused * - decoding: Set/Unset by libavcodec. */ - void *queue_mutex; + pthread_mutex_t queue_mutex; /** * The frame width.