[vlc-devel] [PATCH 1/2] avcodec: pass whole AVCodecContext instead of hwaccel_context only
Rémi Denis-Courmont
remi at remlab.net
Tue Jan 8 21:36:45 CET 2013
In current versions of libavcodec, VDPAU does not use hwaccel_context,
but it does use draw_horiz_band. Now vlc_va_Setup() can access and
modify the entire AVCodecContext.
TBD: This patch makes the width and height parameters redundant.
They should probably be removed too.
TBD: If libavcodec VDPAU support were normalized, this patch might
become useless.
---
modules/codec/avcodec/dxva2.c | 6 +++---
modules/codec/avcodec/va.h | 8 ++++----
modules/codec/avcodec/vaapi.c | 11 ++++++-----
modules/codec/avcodec/vda.c | 8 ++++----
modules/codec/avcodec/video.c | 7 +++----
5 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
index ddd1b58..c28c7fa 100644
--- a/modules/codec/avcodec/dxva2.c
+++ b/modules/codec/avcodec/dxva2.c
@@ -317,7 +317,7 @@ static void DxCreateVideoConversion(vlc_va_dxva2_t *);
static void DxDestroyVideoConversion(vlc_va_dxva2_t *);
/* */
-static int Setup(vlc_va_t *external, void **hw, vlc_fourcc_t *chroma,
+static int Setup(vlc_va_t *external, AVCodecContext *ctx, vlc_fourcc_t *chroma,
int width, int height)
{
vlc_va_dxva2_t *va = vlc_va_dxva2_Get(external);
@@ -329,7 +329,7 @@ static int Setup(vlc_va_t *external, void **hw, vlc_fourcc_t *chroma,
DxDestroyVideoConversion(va);
DxDestroyVideoDecoder(va);
- *hw = NULL;
+ ctx->hwaccel_context = NULL;
*chroma = 0;
if (width <= 0 || height <= 0)
return VLC_EGENERIC;
@@ -355,7 +355,7 @@ static int Setup(vlc_va_t *external, void **hw, vlc_fourcc_t *chroma,
/* */
ok:
- *hw = &va->hw;
+ ctx->hwaccel_context = &va->hw;
const d3d_format_t *output = D3dFindFormat(va->output);
*chroma = output->codec;
diff --git a/modules/codec/avcodec/va.h b/modules/codec/avcodec/va.h
index eabe1b5..07ca552 100644
--- a/modules/codec/avcodec/va.h
+++ b/modules/codec/avcodec/va.h
@@ -35,17 +35,17 @@ struct vlc_va_t {
char *description;
int pix_fmt;
- int (*setup)(vlc_va_t *, void **hw, vlc_fourcc_t *output,
+ int (*setup)(vlc_va_t *, AVCodecContext *, vlc_fourcc_t *output,
int width, int height);
int (*get)(vlc_va_t *, AVFrame *frame);
void (*release)(vlc_va_t *, AVFrame *frame);
int (*extract)(vlc_va_t *, picture_t *dst, AVFrame *src);
};
-static inline int vlc_va_Setup(vlc_va_t *va, void **hw, vlc_fourcc_t *output,
- int width, int height)
+static inline int vlc_va_Setup(vlc_va_t *va, AVCodecContext *ctx,
+ vlc_fourcc_t *chroma, int width, int height)
{
- return va->setup(va, hw, output, width, height);
+ return va->setup(va, ctx, chroma, width, height);
}
static inline int vlc_va_Get(vlc_va_t *va, AVFrame *frame)
{
diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c
index bcfaeec..3544953 100644
--- a/modules/codec/avcodec/vaapi.c
+++ b/modules/codec/avcodec/vaapi.c
@@ -364,26 +364,27 @@ error:
return VLC_EGENERIC;
}
-static int Setup( vlc_va_t *p_external, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
- int i_width, int i_height )
+static int Setup( vlc_va_t *p_external, AVCodecContext *p_ctx,
+ vlc_fourcc_t *pi_chroma, int i_width, int i_height )
{
vlc_va_sys_t *p_va = p_external->sys;
if( p_va->i_surface_width == i_width &&
p_va->i_surface_height == i_height )
{
- *pp_hw_ctx = &p_va->hw_ctx;
+ p_ctx->hwaccel_context = &p_va->hw_ctx;
*pi_chroma = p_va->i_surface_chroma;
return VLC_SUCCESS;
}
- *pp_hw_ctx = NULL;
+ p_ctx->hwaccel_context = NULL;
*pi_chroma = 0;
if( p_va->i_surface_width || p_va->i_surface_height )
DestroySurfaces( p_va );
if( i_width > 0 && i_height > 0 )
- return CreateSurfaces( p_va, pp_hw_ctx, pi_chroma, i_width, i_height );
+ return CreateSurfaces( p_va, &p_ctx->hwaccel_context, pi_chroma,
+ i_width, i_height );
return VLC_EGENERIC;
}
diff --git a/modules/codec/avcodec/vda.c b/modules/codec/avcodec/vda.c
index d82778c..64355d0 100644
--- a/modules/codec/avcodec/vda.c
+++ b/modules/codec/avcodec/vda.c
@@ -136,8 +136,8 @@ static void vda_Copy422YpCbCr8( picture_t *p_pic,
CVPixelBufferUnlockBaseAddress( buffer, 0 );
}
-static int Setup( vlc_va_t *p_external, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
- int i_width, int i_height )
+static int Setup( vlc_va_t *p_external, AVCodecContext *p_ctx,
+ vlc_fourcc_t *pi_chroma, int i_width, int i_height )
{
vlc_va_vda_t *p_va = vlc_va_vda_Get( p_external );
@@ -146,7 +146,7 @@ static int Setup( vlc_va_t *p_external, void **pp_hw_ctx, vlc_fourcc_t *pi_chrom
&& p_va->hw_ctx.height == i_height
&& p_va->hw_ctx.decoder )
{
- *pp_hw_ctx = &p_va->hw_ctx;
+ p_ctx->hwaccel_context = &p_va->hw_ctx;
*pi_chroma = p_va->i_chroma;
return VLC_SUCCESS;
}
@@ -180,7 +180,7 @@ static int Setup( vlc_va_t *p_external, void **pp_hw_ctx, vlc_fourcc_t *pi_chrom
ok:
/* Setup the libavcodec hardware context */
- *pp_hw_ctx = &p_va->hw_ctx;
+ p_ctx->hwaccel_context = &p_va->hw_ctx;
*pi_chroma = p_va->i_chroma;
/* create the decoder */
diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index 8782e42..81b14c1 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -953,9 +953,8 @@ static int ffmpeg_GetFrameBuf( struct AVCodecContext *p_context,
if( p_sys->p_va )
{
- /* hwaccel_context is not present in old ffmpeg version */
- if( vlc_va_Setup( p_sys->p_va,
- &p_context->hwaccel_context, &p_dec->fmt_out.video.i_chroma,
+ if( vlc_va_Setup( p_sys->p_va, p_context,
+ &p_dec->fmt_out.video.i_chroma,
p_context->width, p_context->height ) )
{
msg_Err( p_dec, "vlc_va_Setup failed" );
@@ -1177,7 +1176,7 @@ static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *p_context,
/* We try to call vlc_va_Setup when possible to detect errors when
* possible (later is too late) */
if( p_context->width > 0 && p_context->height > 0
- && vlc_va_Setup( p_va, &p_context->hwaccel_context,
+ && vlc_va_Setup( p_va, p_context,
&p_dec->fmt_out.video.i_chroma,
p_context->width, p_context->height ) )
{
--
1.7.10.4
More information about the vlc-devel
mailing list