]> git.sesse.net Git - vlc/commitdiff
avcodec: pass AVCodecContext to VA destroy callback
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 13 Sep 2014 10:40:40 +0000 (13:40 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Sat, 13 Sep 2014 10:41:48 +0000 (13:41 +0300)
modules/codec/avcodec/dxva2.c
modules/codec/avcodec/va.c
modules/codec/avcodec/va.h
modules/codec/avcodec/vaapi.c
modules/codec/avcodec/vda.c
modules/codec/avcodec/video.c
modules/hw/vdpau/avcodec.c

index 8b6dc5f7a8909f7150e715d6409d422d6667fc4d..1c9824f71066a4ebfed9d1b2c5217b08e1cd865e 100644 (file)
@@ -52,7 +52,7 @@
 #include "../../video_chroma/copy.h"
 
 static int Open(vlc_va_t *, AVCodecContext *, const es_format_t *);
-static void Close(vlc_va_t *);
+static void Close(vlc_va_t *, AVCodecContext *);
 
 vlc_module_begin()
     set_description(N_("DirectX Video Acceleration (DXVA) 2.0"))
@@ -463,10 +463,11 @@ static void Release(void *opaque, uint8_t *data)
     (void) data;
 }
 
-static void Close(vlc_va_t *va)
+static void Close(vlc_va_t *va, AVCodecContext *ctx)
 {
     vlc_va_sys_t *sys = va->sys;
 
+    (void) ctx;
     DxDestroyVideoConversion(sys);
     DxDestroyVideoDecoder(sys);
     DxDestroyVideoService(sys);
@@ -540,7 +541,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, const es_format_t *fmt)
     return VLC_SUCCESS;
 
 error:
-    Close(va);
+    Close(va, ctx);
     return VLC_EGENERIC;
 }
 /* */
index f2b22fbe1dc340c216167ca52afd37e7d24bec54..23179c2323577aa95022d115c6f43c32632cc66b 100644 (file)
@@ -41,9 +41,10 @@ static int vlc_va_Start(void *func, va_list ap)
 static void vlc_va_Stop(void *func, va_list ap)
 {
     vlc_va_t *va = va_arg(ap, vlc_va_t *);
-    void (*close)(vlc_va_t *) = func;
+    AVCodecContext *ctx = va_arg(ap, AVCodecContext *);
+    void (*close)(vlc_va_t *, AVCodecContext *) = func;
 
-    close(va);
+    close(va, ctx);
 }
 
 vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *avctx,
@@ -63,8 +64,8 @@ vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *avctx,
     return va;
 }
 
-void vlc_va_Delete(vlc_va_t *va)
+void vlc_va_Delete(vlc_va_t *va, AVCodecContext *avctx)
 {
-    vlc_module_unload(va->module, vlc_va_Stop, va);
+    vlc_module_unload(va->module, vlc_va_Stop, va, avctx);
     vlc_object_release(va);
 }
index 4a376cbecac247dd3780e7558bb9f8e99289b07e..e0c6520e332ea6c43814989eae8d6c0769530ef6 100644 (file)
@@ -124,6 +124,6 @@ static inline int vlc_va_Extract(vlc_va_t *va, picture_t *dst, void *opaque,
  * Destroys a libavcodec hardware acceleration back-end.
  * All allocated surfaces shall have been released beforehand.
  */
-void vlc_va_Delete(vlc_va_t *);
+void vlc_va_Delete(vlc_va_t *, AVCodecContext *);
 
 #endif
index 22b679ac1d46e6d550003f5d8bfe9dcda5707872..f38690ef38459e9e898e97c21e12bb07d0bf8e56 100644 (file)
@@ -416,10 +416,11 @@ static int Setup( vlc_va_t *va, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
     return VLC_EGENERIC;
 }
 
-static void Delete( vlc_va_t *va )
+static void Delete( vlc_va_t *va, AVCodecContext *avctx )
 {
     vlc_va_sys_t *sys = va->sys;
 
+    (void) avctx;
     if( sys->i_surface_width || sys->i_surface_height )
         DestroySurfaces( sys );
 
index 9da05275206051271c780520566a80f950d3fbf8..80ab14d3bb47e10f08e92e03e73be88a87cc32fa 100644 (file)
@@ -154,7 +154,7 @@ static int Open( vlc_va_t *external, AVCodecContext *ctx,
     return VLC_SUCCESS;
 }
 
-static void Close( vlc_va_t *external )
+static void Close( vlc_va_t *external, AVCodecContext *ctx )
 {
     vlc_va_vda_t *p_va = vlc_va_vda_Get( external );
 
@@ -166,6 +166,7 @@ static void Close( vlc_va_t *external )
         CopyCleanCache( &p_va->image_cache );
 
     free( p_va );
+    (void) ctx;
 }
 
 static int Setup( vlc_va_t *external, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
@@ -367,11 +368,10 @@ static int Open( vlc_va_t *external, AVCodecContext *avctx,
     return VLC_SUCCESS;
 }
 
-static void Close( vlc_va_t *external )
+static void Close( vlc_va_t *external, AVCodecContext *avctx )
 {
-    vlc_va_vda_t *p_va = vlc_va_vda_Get( external );
-
-    av_vda_default_free(p_va->avctx);
+    av_vda_default_free(avctx);
+    (void) external;
 }
 
 static int Setup( vlc_va_t *external, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
index 2e05979bf513ed8cf0f8c7e61a42b9f8ae4ef85a..ecfaa193bfd260b46c736c27efb072da300d6cb2 100644 (file)
@@ -823,7 +823,7 @@ void EndVideoDec( decoder_t *p_dec )
         avcodec_free_frame( &p_sys->p_ff_pic );
 
     if( p_sys->p_va )
-        vlc_va_Delete( p_sys->p_va );
+        vlc_va_Delete( p_sys->p_va, p_sys->p_context );
 
     vlc_sem_destroy( &p_sys->sem_mt );
 }
@@ -1323,7 +1323,7 @@ static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *p_context,
     vlc_va_t *p_va = p_sys->p_va;
 
     if( p_va != NULL )
-        vlc_va_Delete( p_va );
+        vlc_va_Delete( p_va, p_context );
 
     /* Enumerate available formats */
     bool can_hwaccel = false;
@@ -1383,7 +1383,7 @@ static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *p_context,
         return pi_fmt[i];
     }
 
-    vlc_va_Delete( p_va );
+    vlc_va_Delete( p_va, p_context );
 
 end:
     /* Fallback to default behaviour */
index 7a76d380bb66cf59aa2c97094ab0253f422e018e..55b50d0ef0c4bce8d150ea783b3c8de05a21ab59 100644 (file)
@@ -39,7 +39,7 @@
 #include "../../codec/avcodec/va.h"
 
 static int Open(vlc_va_t *, AVCodecContext *, const es_format_t *);
-static void Close(vlc_va_t *);
+static void Close(vlc_va_t *, AVCodecContext *);
 
 vlc_module_begin()
     set_description(N_("VDPAU video decoder"))
@@ -293,7 +293,7 @@ error:
     return VLC_EGENERIC;
 }
 
-static void Close(vlc_va_t *va)
+static void Close(vlc_va_t *va, AVCodecContext *avctx)
 {
     vlc_va_sys_t *sys = va->sys;