[vlc-commits] vdpau/avcodec: cleanup
Rémi Denis-Courmont
git at videolan.org
Sat Sep 13 13:26:50 CEST 2014
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Sep 13 14:07:37 2014 +0300| [f0a1414381cb352f2a5982b2601265e57d4b301c] | committer: Rémi Denis-Courmont
vdpau/avcodec: cleanup
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f0a1414381cb352f2a5982b2601265e57d4b301c
---
modules/hw/vdpau/avcodec.c | 85 ++++++++++++++++++++------------------------
1 file changed, 39 insertions(+), 46 deletions(-)
diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c
index 85954d7..eefea53 100644
--- a/modules/hw/vdpau/avcodec.c
+++ b/modules/hw/vdpau/avcodec.c
@@ -52,10 +52,8 @@ vlc_module_end()
struct vlc_va_sys_t
{
- AVVDPAUContext *context;
vdp_t *vdp;
VdpDevice device;
- VdpDecoderProfile profile;
uint16_t width;
uint16_t height;
};
@@ -108,16 +106,34 @@ static int Copy(vlc_va_t *va, picture_t *pic, void *opaque, uint8_t *data)
return VLC_SUCCESS;
}
-static int Init(vlc_va_t *va, AVCodecContext *avctx, vlc_fourcc_t *chromap)
+static int Setup(vlc_va_t *va, AVCodecContext *avctx, vlc_fourcc_t *chromap)
{
vlc_va_sys_t *sys = va->sys;
+ AVVDPAUContext *hwctx = avctx->hwaccel_context;
+ VdpDecoderProfile profile;
VdpStatus err;
+ if (hwctx->decoder != VDP_INVALID_HANDLE)
+ {
+ if (sys->width == avctx->coded_width
+ && sys->height == avctx->coded_height)
+ return VLC_SUCCESS;
+
+ vdp_decoder_destroy(sys->vdp, hwctx->decoder);
+ hwctx->decoder = VDP_INVALID_HANDLE;
+ }
+
sys->width = (avctx->coded_width + 1) & ~1;
sys->height = (avctx->coded_height + 3) & ~3;
+ if (av_vdpau_get_profile(avctx, &profile))
+ {
+ msg_Err(va, "no longer supported codec profile");
+ return VLC_EGENERIC;
+ }
+
unsigned surfaces = 2;
- switch (sys->profile)
+ switch (profile)
{
case VDP_DECODER_PROFILE_H264_BASELINE:
case VDP_DECODER_PROFILE_H264_MAIN:
@@ -126,60 +142,35 @@ static int Init(vlc_va_t *va, AVCodecContext *avctx, vlc_fourcc_t *chromap)
break;
}
- err = vdp_decoder_create(sys->vdp, sys->device, sys->profile, sys->width,
- sys->height, surfaces, &sys->context->decoder);
+ err = vdp_decoder_create(sys->vdp, sys->device, profile, sys->width,
+ sys->height, surfaces, &hwctx->decoder);
if (err != VDP_STATUS_OK)
{
msg_Err(va, "%s creation failure: %s", "decoder",
vdp_get_error_string(sys->vdp, err));
- sys->context->decoder = VDP_INVALID_HANDLE;
+ hwctx->decoder = VDP_INVALID_HANDLE;
return VLC_EGENERIC;
}
- avctx->hwaccel_context = sys->context;
/* TODO: select better chromas when appropriate */
*chromap = VLC_CODEC_VDPAU_VIDEO_420;
return VLC_SUCCESS;
}
-static void Deinit(vlc_va_t *va)
-{
- vlc_va_sys_t *sys = va->sys;
-
- assert(sys->context->decoder != VDP_INVALID_HANDLE);
- vdp_decoder_destroy(sys->vdp, sys->context->decoder);
-}
-
-static int Setup(vlc_va_t *va, AVCodecContext *avctx, vlc_fourcc_t *chromap)
-{
- vlc_va_sys_t *sys = va->sys;
-
- if (sys->context->decoder != VDP_INVALID_HANDLE)
- {
- if (sys->width == avctx->coded_width
- && sys->height == avctx->coded_height)
- return VLC_SUCCESS;
- Deinit(va);
- sys->context->decoder = VDP_INVALID_HANDLE;
- }
-
- return Init(va, avctx, chromap);
-}
-
-static int Open(vlc_va_t *va, AVCodecContext *ctx, const es_format_t *fmt)
+static int Open(vlc_va_t *va, AVCodecContext *avctx, const es_format_t *fmt)
{
VdpStatus err;
VdpDecoderProfile profile;
int level = fmt->i_level;
- if (av_vdpau_get_profile(ctx, &profile))
+ if (av_vdpau_get_profile(avctx, &profile))
{
- msg_Err(va, "unsupported codec %d or profile %d", ctx->codec_id,
+ msg_Err(va, "unsupported codec %d or profile %d", avctx->codec_id,
fmt->i_profile);
return VLC_EGENERIC;
}
- switch (ctx->codec_id)
+ switch (avctx->codec_id)
{
case AV_CODEC_ID_MPEG1VIDEO:
level = VDP_DECODER_LEVEL_MPEG1_NA;
@@ -208,8 +199,8 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, const es_format_t *fmt)
if (unlikely(sys == NULL))
return VLC_ENOMEM;
- sys->context = av_vdpau_alloc_context();
- if (unlikely(sys->context == NULL))
+ avctx->hwaccel_context = av_vdpau_alloc_context();
+ if (unlikely(avctx->hwaccel_context == NULL))
{
free(sys);
return VLC_ENOMEM;
@@ -218,7 +209,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, const es_format_t *fmt)
err = vdp_get_x11(NULL, -1, &sys->vdp, &sys->device);
if (err != VDP_STATUS_OK)
{
- av_free(sys->context);
+ av_freep(&avctx->hwaccel_context);
free(sys);
return VLC_EGENERIC;
}
@@ -229,9 +220,10 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, const es_format_t *fmt)
if (err != VDP_STATUS_OK)
goto error;
- sys->context->decoder = VDP_INVALID_HANDLE;
- sys->context->render = func;
- sys->profile = profile;
+ AVVDPAUContext *hwctx = avctx->hwaccel_context;
+
+ hwctx->decoder = VDP_INVALID_HANDLE;
+ hwctx->render = func;
/* Check capabilities */
VdpBool support;
@@ -285,7 +277,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, const es_format_t *fmt)
error:
vdp_release_x11(sys->vdp);
- av_free(sys->context);
+ av_freep(&avctx->hwaccel_context);
free(sys);
return VLC_EGENERIC;
}
@@ -293,10 +285,11 @@ error:
static void Close(vlc_va_t *va, AVCodecContext *avctx)
{
vlc_va_sys_t *sys = va->sys;
+ AVVDPAUContext *hwctx = avctx->hwaccel_context;
- if (sys->context->decoder != VDP_INVALID_HANDLE)
- Deinit(va);
+ if (hwctx->decoder != VDP_INVALID_HANDLE)
+ vdp_decoder_destroy(sys->vdp, hwctx->decoder);
vdp_release_x11(sys->vdp);
- av_free(sys->context);
+ av_freep(&avctx->hwaccel_context);
free(sys);
}
More information about the vlc-commits
mailing list