mirror of https://git.ffmpeg.org/ffmpeg.git
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>
This commit is contained in:
commit
cd2a27e1e5
|
@ -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;
|
||||
}
|
||||
|
||||
/* @} */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue