[vlc-devel] [PATCH] avcodec: use VDA in synchronous mode.
Sebastien Zwickert
dilaroga at gmail.com
Tue Aug 14 21:52:27 CEST 2012
---
modules/codec/avcodec/vda.c | 29 +++++++++--------------------
1 files changed, 9 insertions(+), 20 deletions(-)
diff --git a/modules/codec/avcodec/vda.c b/modules/codec/avcodec/vda.c
index fc68f31..7104657 100644
--- a/modules/codec/avcodec/vda.c
+++ b/modules/codec/avcodec/vda.c
@@ -51,8 +51,6 @@ typedef struct
copy_cache_t image_cache;
- vda_frame *top_frame;
-
vlc_object_t *p_log;
} vlc_va_vda_t;
@@ -143,6 +141,7 @@ static int Setup( vlc_va_t *p_external, void **pp_hw_ctx, vlc_fourcc_t *pi_chrom
p_va->hw_ctx.width = i_width;
p_va->hw_ctx.height = i_height;
p_va->hw_ctx.format = 'avc1';
+ p_va->hw_ctx.use_sync_decoding = 1;
int i_pix_fmt = var_CreateGetInteger( p_va->p_log, "avcodec-vda-pix-fmt" );
@@ -179,12 +178,7 @@ ok:
static int Get( vlc_va_t *p_external, AVFrame *p_ff )
{
- vlc_va_vda_t *p_va = vlc_va_vda_Get( p_external );
-
- if( p_va->top_frame )
- ff_vda_release_vda_frame( p_va->top_frame );
-
- p_va->top_frame = ff_vda_queue_pop( &p_va->hw_ctx );
+ VLC_UNUSED( p_external );
/* */
for( int i = 0; i < 4; i++ )
@@ -201,17 +195,15 @@ static int Get( vlc_va_t *p_external, AVFrame *p_ff )
static int Extract( vlc_va_t *p_external, picture_t *p_picture, AVFrame *p_ff )
{
- VLC_UNUSED( p_ff );
vlc_va_vda_t *p_va = vlc_va_vda_Get( p_external );
+ CVPixelBufferRef cv_buffer = ( CVPixelBufferRef )p_ff->data[3];
- if( !p_va->top_frame )
+ if( !cv_buffer )
{
- msg_Dbg( p_va->p_log, "Decoder is buffering...");
+ msg_Dbg( p_va->p_log, "Frame buffer is empty.");
return VLC_EGENERIC;
}
- CVPixelBufferRef cv_buffer = p_va->top_frame->cv_buffer;
-
if( p_va->hw_ctx.cv_pix_fmt_type == kCVPixelFormatType_420YpCbCr8Planar )
{
if( !p_va->image_cache.buffer )
@@ -226,15 +218,16 @@ static int Extract( vlc_va_t *p_external, picture_t *p_picture, AVFrame *p_ff )
else
vda_Copy422YpCbCr8( p_picture, cv_buffer );
- p_picture->date = p_va->top_frame->pts;
-
return VLC_SUCCESS;
}
static void Release( vlc_va_t *p_external, AVFrame *p_ff )
{
- VLC_UNUSED( p_ff );
VLC_UNUSED( p_external );
+ CVPixelBufferRef cv_buffer = ( CVPixelBufferRef )p_ff->data[3];
+
+ if ( cv_buffer )
+ CFRelease( cv_buffer );
}
static void Close( vlc_va_t *p_external )
@@ -243,9 +236,6 @@ static void Close( vlc_va_t *p_external )
ff_vda_destroy_decoder( &p_va->hw_ctx ) ;
- if( p_va->top_frame )
- ff_vda_release_vda_frame( p_va->top_frame );
-
if( p_va->hw_ctx.cv_pix_fmt_type == kCVPixelFormatType_420YpCbCr8Planar )
CopyCleanCache( &p_va->image_cache );
@@ -270,7 +260,6 @@ vlc_va_t *vlc_va_NewVDA( vlc_object_t *p_log, int i_codec_id, void *p_extra, int
p_va->p_log = p_log;
p_va->p_extradata = p_extra;
p_va->i_extradata = i_extra;
- p_va->top_frame = NULL;
p_va->va.setup = Setup;
p_va->va.get = Get;
--
1.7.5.4
More information about the vlc-devel
mailing list