[vlc-commits] vaapi: fix unbalanced initialization and simplify
Rémi Denis-Courmont
git at videolan.org
Fri Apr 24 22:47:04 CEST 2015
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri Apr 24 23:36:35 2015 +0300| [ccc530cd5f1fb1ffb7498cd06186b673f707552d] | committer: Rémi Denis-Courmont
vaapi: fix unbalanced initialization and simplify
The mutex was allocated in Open() and destroyed in Setup()...
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ccc530cd5f1fb1ffb7498cd06186b673f707552d
---
modules/codec/avcodec/vaapi.c | 109 +++++++++++++----------------------------
1 file changed, 35 insertions(+), 74 deletions(-)
diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c
index 89b4e9d..8719d92 100644
--- a/modules/codec/avcodec/vaapi.c
+++ b/modules/codec/avcodec/vaapi.c
@@ -67,9 +67,8 @@ struct vlc_va_sys_t
/* */
vlc_mutex_t lock;
- int i_surface_width;
- int i_surface_height;
- vlc_fourcc_t i_surface_chroma;
+ int width;
+ int height;
VAImage image;
copy_cache_t image_cache;
@@ -81,43 +80,18 @@ struct vlc_va_sys_t
VASurfaceID surfaces[32];
};
-static void DestroySurfaces( vlc_va_sys_t *sys )
+static int CreateSurfaces( vlc_va_sys_t *sys, int i_width, int i_height )
{
- if( sys->image.image_id != VA_INVALID_ID )
- {
- CopyCleanCache( &sys->image_cache );
- vaDestroyImage(sys->hw_ctx.display, sys->image.image_id);
- }
- else if(sys->b_supports_derive)
- {
- CopyCleanCache( &sys->image_cache );
- }
-
- /* */
- sys->image.image_id = VA_INVALID_ID;
- sys->i_surface_width = 0;
- sys->i_surface_height = 0;
- vlc_mutex_destroy(&sys->lock);
-}
-
-static int CreateSurfaces( vlc_va_sys_t *sys, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
- int i_width, int i_height )
-{
- assert( i_width > 0 && i_height > 0 );
-
- /* */
- sys->image.image_id = VA_INVALID_ID;
-
/* Find and create a supported image chroma */
int i_fmt_count = vaMaxNumImageFormats(sys->hw_ctx.display);
VAImageFormat *p_fmt = calloc( i_fmt_count, sizeof(*p_fmt) );
if( !p_fmt )
- goto error;
+ return VLC_ENOMEM;
if (vaQueryImageFormats(sys->hw_ctx.display, p_fmt, &i_fmt_count))
{
free( p_fmt );
- goto error;
+ return VLC_EGENERIC;
}
VAImage test_image;
@@ -180,31 +154,14 @@ static int CreateSurfaces( vlc_va_sys_t *sys, void **pp_hw_ctx, vlc_fourcc_t *pi
}
free( p_fmt );
- if( !i_chroma )
- goto error;
- *pi_chroma = i_chroma;
- if(sys->b_supports_derive)
+ if (i_chroma == 0 || sys->b_supports_derive)
{
vaDestroyImage(sys->hw_ctx.display, sys->image.image_id);
sys->image.image_id = VA_INVALID_ID;
}
- if( unlikely(CopyInitCache( &sys->image_cache, i_width )) )
- goto error;
-
- /* Setup the ffmpeg hardware context */
- *pp_hw_ctx = &sys->hw_ctx;
-
- /* */
- sys->i_surface_chroma = i_chroma;
- sys->i_surface_width = i_width;
- sys->i_surface_height = i_height;
- return VLC_SUCCESS;
-
-error:
- DestroySurfaces( sys );
- return VLC_EGENERIC;
+ return i_chroma ? VLC_SUCCESS : VLC_EGENERIC;
}
static int Extract( vlc_va_t *va, picture_t *p_picture, uint8_t *data )
@@ -228,8 +185,7 @@ static int Extract( vlc_va_t *va, picture_t *p_picture, uint8_t *data )
else
{
if (vaGetImage(sys->hw_ctx.display, i_surface_id, 0, 0,
- sys->i_surface_width, sys->i_surface_height,
- sys->image.image_id))
+ sys->width, sys->height, sys->image.image_id))
return VLC_EGENERIC;
}
@@ -251,9 +207,7 @@ static int Extract( vlc_va_t *va, picture_t *p_picture, uint8_t *data )
pp_plane[i] = (uint8_t*)p_base + sys->image.offsets[i_src_plane];
pi_pitch[i] = sys->image.pitches[i_src_plane];
}
- CopyFromYv12( p_picture, pp_plane, pi_pitch,
- sys->i_surface_width,
- sys->i_surface_height,
+ CopyFromYv12( p_picture, pp_plane, pi_pitch, sys->width, sys->height,
&sys->image_cache );
}
else
@@ -267,9 +221,7 @@ static int Extract( vlc_va_t *va, picture_t *p_picture, uint8_t *data )
pp_plane[i] = (uint8_t*)p_base + sys->image.offsets[i];
pi_pitch[i] = sys->image.pitches[i];
}
- CopyFromNv12( p_picture, pp_plane, pi_pitch,
- sys->i_surface_width,
- sys->i_surface_height,
+ CopyFromNv12( p_picture, pp_plane, pi_pitch, sys->width, sys->height,
&sys->image_cache );
}
@@ -329,24 +281,11 @@ static int Setup( vlc_va_t *va, AVCodecContext *avctx, vlc_fourcc_t *pi_chroma )
{
vlc_va_sys_t *sys = va->sys;
- if( sys->i_surface_width == avctx->coded_width &&
- sys->i_surface_height == avctx->coded_height )
- {
- avctx->hwaccel_context = &sys->hw_ctx;
- *pi_chroma = sys->i_surface_chroma;
- return VLC_SUCCESS;
- }
-
- avctx->hwaccel_context = NULL;
- *pi_chroma = 0;
- if( sys->i_surface_width || sys->i_surface_height )
- DestroySurfaces( sys );
-
- if( avctx->coded_width <= 0 && avctx->coded_height <= 0 )
+ if (sys->width != avctx->coded_width || sys->height != avctx->coded_height)
return VLC_EGENERIC;
- return CreateSurfaces( sys, &avctx->hwaccel_context, pi_chroma,
- avctx->coded_width, avctx->coded_height );
+ *pi_chroma = VLC_CODEC_YV12;
+ return VLC_SUCCESS;
}
static void Delete( vlc_va_t *va, AVCodecContext *avctx )
@@ -355,6 +294,12 @@ static void Delete( vlc_va_t *va, AVCodecContext *avctx )
(void) avctx;
+ vlc_mutex_destroy(&sys->lock);
+ CopyCleanCache(&sys->image_cache);
+
+ if (sys->image.image_id != VA_INVALID_ID)
+ vaDestroyImage(sys->hw_ctx.display, sys->image.image_id);
+
vaDestroyContext(sys->hw_ctx.display, sys->hw_ctx.context_id);
vaDestroySurfaces(sys->hw_ctx.display, sys->surfaces, sys->count);
vaDestroyConfig(sys->hw_ctx.display, sys->hw_ctx.config_id);
@@ -428,6 +373,8 @@ static int Create( vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
sys->hw_ctx.display = NULL;
sys->hw_ctx.config_id = VA_INVALID_ID;
sys->hw_ctx.context_id = VA_INVALID_ID;
+ sys->width = ctx->coded_width;
+ sys->height = ctx->coded_height;
sys->image.image_id = VA_INVALID_ID;
sys->b_supports_derive = false;
sys->count = count;
@@ -531,8 +478,15 @@ static int Create( vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
goto error;
}
+ if (CreateSurfaces(sys, ctx->coded_width, ctx->coded_height))
+ goto error;
+
+ if (unlikely(CopyInitCache(&sys->image_cache, ctx->coded_width)))
+ goto error;
+
vlc_mutex_init(&sys->lock);
+ ctx->hwaccel_context = &sys->hw_ctx;
va->sys = sys;
va->description = vaQueryVendorString(sys->hw_ctx.display);
va->setup = Setup;
@@ -542,6 +496,13 @@ static int Create( vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
return VLC_SUCCESS;
error:
+ if (sys->image.image_id != VA_INVALID_ID)
+ vaDestroyImage(sys->hw_ctx.display, sys->image.image_id);
+ if (sys->hw_ctx.context_id != VA_INVALID_ID)
+ {
+ vaDestroyContext(sys->hw_ctx.display, sys->hw_ctx.context_id);
+ vaDestroySurfaces(sys->hw_ctx.display, sys->surfaces, sys->count);
+ }
if (sys->hw_ctx.config_id != VA_INVALID_ID)
vaDestroyConfig(sys->hw_ctx.display, sys->hw_ctx.config_id);
if (sys->hw_ctx.display != NULL)
More information about the vlc-commits
mailing list