Browse Source

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>
tags/n0.10
Michael Niedermayer 14 years ago
parent
commit
cd2a27e1e5
3 changed files with 20 additions and 48 deletions
  1. +13
    -41
      libavcodec/vda.c
  2. +6
    -6
      libavcodec/vda.h
  3. +1
    -1
      libavcodec/vda_internal.h

+ 13
- 41
libavcodec/vda.c View File

@@ -26,36 +26,9 @@
#include <CoreFoundation/CFData.h> #include <CoreFoundation/CFData.h>
#include <CoreFoundation/CFString.h> #include <CoreFoundation/CFString.h>


#include "avcodec.h"
#include "libavutil/avutil.h"
#include "vda_internal.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. */ /* Helper to create a dictionary according to the given pts. */
static CFDictionaryRef vda_dictionary_with_pts(int64_t i_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_frame *top_frame;


vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_OBTAIN);
pthread_mutex_lock(&vda_ctx->queue_mutex);


while (vda_ctx->queue) { while (vda_ctx->queue) {
top_frame = 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); 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->cv_buffer = CVPixelBufferRetain(image_buffer);
new_frame->pts = vda_pts_from_dictionary(user_info); 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; 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, 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->bitstream = NULL;
vda_ctx->ref_size = 0; 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, config_info = CFDictionaryCreateMutable(kCFAllocatorDefault,
4, 4,
@@ -242,8 +217,7 @@ int ff_vda_destroy_decoder(struct vda_context *vda_ctx)


vda_clear_queue(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) if (vda_ctx->bitstream)
av_freep(&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) if (!vda_ctx->queue)
return NULL; return NULL;


vda_lock_operation(&vda_ctx->queue_mutex, AV_LOCK_OBTAIN);
pthread_mutex_lock(&vda_ctx->queue_mutex);
top_frame = vda_ctx->queue; top_frame = vda_ctx->queue;
vda_ctx->queue = top_frame->next_frame; 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; return top_frame;
} }
@@ -299,5 +273,3 @@ int ff_vda_decoder_decode(struct vda_context *vda_ctx,


return 0; return 0;
} }

/* @} */

+ 6
- 6
libavcodec/vda.h View File

@@ -23,6 +23,7 @@
#ifndef AVCODEC_VDA_H #ifndef AVCODEC_VDA_H
#define AVCODEC_VDA_H #define AVCODEC_VDA_H


#include <pthread.h>
#include <stdint.h> #include <stdint.h>


// emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes // emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes
@@ -60,7 +61,6 @@ typedef struct {
* - decoding: Set/Unset by libavcodec. * - decoding: Set/Unset by libavcodec.
*/ */
struct vda_frame *next_frame; struct vda_frame *next_frame;

} vda_frame; } vda_frame;


/** /**
@@ -92,7 +92,7 @@ struct vda_context {
* - encoding: unused * - encoding: unused
* - decoding: Set/Unset by libavcodec. * - decoding: Set/Unset by libavcodec.
*/ */
void *queue_mutex;
pthread_mutex_t queue_mutex;


/** /**
* The frame width. * The frame width.
@@ -151,18 +151,18 @@ struct vda_context {
int ref_size; int ref_size;
}; };


/** Creates the video decoder. */
/** Create the video decoder. */
int ff_vda_create_decoder(struct vda_context *vda_ctx, int ff_vda_create_decoder(struct vda_context *vda_ctx,
uint8_t *extradata, uint8_t *extradata,
int extradata_size); int extradata_size);


/** Destroys the video decoder. */
/** Destroy the video decoder. */
int ff_vda_destroy_decoder(struct vda_context *vda_ctx); 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); 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); void ff_vda_release_vda_frame(vda_frame *frame);


#endif /* AVCODEC_VDA_H */ #endif /* AVCODEC_VDA_H */

+ 1
- 1
libavcodec/vda_internal.h View File

@@ -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, int ff_vda_decoder_decode(struct vda_context *vda_ctx,
uint8_t *bitstream, uint8_t *bitstream,
int bitstream_size, int bitstream_size,


Loading…
Cancel
Save