diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-01-08 20:26:49 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-01-08 20:26:55 +0100 |
commit | cd2a27e1e586be5dc68454ecbbfe8c2c3d041c2a (patch) | |
tree | b5240cb375b73f1162c7ae7bb3adb079b75973b3 /libavcodec | |
parent | 52ef95474ba1615fe261b001c07b107449866368 (diff) | |
parent | 186980bf0f5e890295b6dc6b939084e3ebcf0dde (diff) | |
download | ffmpeg-cd2a27e1e586be5dc68454ecbbfe8c2c3d041c2a.tar.gz |
Merge remote-tracking branch 'dilaroga/master'
* dilaroga/master:
vda: cosmetic.
vda: removes useless doxygen command.
vda: uses pthreads directly.
vda: convert 3 byte NAL sizes to 4 byte.
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/vda.c | 54 | ||||
-rw-r--r-- | libavcodec/vda.h | 12 | ||||
-rw-r--r-- | libavcodec/vda_internal.h | 2 |
3 files changed, 20 insertions, 48 deletions
diff --git a/libavcodec/vda.c b/libavcodec/vda.c index aaf5ba047a..a2814d7024 100644 --- a/libavcodec/vda.c +++ b/libavcodec/vda.c @@ -26,36 +26,9 @@ #include <CoreFoundation/CFData.h> #include <CoreFoundation/CFString.h> -#include "avcodec.h" +#include "libavutil/avutil.h" #include "vda_internal.h" -/** - * \addtogroup VDA_Decoding - * - * @{ - */ - -/* 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 +66,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 +74,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 +103,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 +127,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 +147,12 @@ 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; + pthread_mutex_init(&vda_ctx->queue_mutex, NULL); - vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_CREATE); + if (extradata[4]==0xFE) { + // convert 3 byte NAL sizes to 4 byte + extradata[4] = 0xFF; + } config_info = CFDictionaryCreateMutable(kCFAllocatorDefault, 4, @@ -242,8 +217,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); @@ -261,10 +235,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; } @@ -299,5 +273,3 @@ int ff_vda_decoder_decode(struct vda_context *vda_ctx, return 0; } - -/* @} */ diff --git a/libavcodec/vda.h b/libavcodec/vda.h index 5ff8070fd3..6e9de9cd0a 100644 --- a/libavcodec/vda.h +++ b/libavcodec/vda.h @@ -23,6 +23,7 @@ #ifndef AVCODEC_VDA_H #define AVCODEC_VDA_H +#include <pthread.h> #include <stdint.h> // emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes @@ -60,7 +61,6 @@ typedef struct { * - decoding: Set/Unset by libavcodec. */ struct vda_frame *next_frame; - } vda_frame; /** @@ -92,7 +92,7 @@ struct vda_context { * - encoding: unused * - decoding: Set/Unset by libavcodec. */ - void *queue_mutex; + pthread_mutex_t queue_mutex; /** * The frame width. @@ -151,18 +151,18 @@ struct vda_context { int ref_size; }; -/** Creates the video decoder. */ +/** Create the video decoder. */ int ff_vda_create_decoder(struct vda_context *vda_ctx, uint8_t *extradata, int extradata_size); -/** Destroys the video decoder. */ +/** Destroy the video decoder. */ int ff_vda_destroy_decoder(struct vda_context *vda_ctx); -/** Returns the top frame of the queue. */ +/** Return the top frame of the queue. */ vda_frame *ff_vda_queue_pop(struct vda_context *vda_ctx); -/** Releases the given frame. */ +/** Release the given frame. */ void ff_vda_release_vda_frame(vda_frame *frame); #endif /* AVCODEC_VDA_H */ diff --git a/libavcodec/vda_internal.h b/libavcodec/vda_internal.h index 02c13df721..df7305bfe6 100644 --- a/libavcodec/vda_internal.h +++ b/libavcodec/vda_internal.h @@ -31,7 +31,7 @@ * @{ */ -/** Send a frame data to the hardware decoder. */ +/** Send frame data to the hardware decoder. */ int ff_vda_decoder_decode(struct vda_context *vda_ctx, uint8_t *bitstream, int bitstream_size, |