diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-10-06 16:23:56 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-10-06 16:31:51 +0200 |
commit | 4d8356b6788016d578941d1b43d141d5db2fdf14 (patch) | |
tree | 701ca9cdc20fb75dec240ab89872393372afa48c /ffmpeg_vdpau.c | |
parent | 0e57c051181c06d9a3468d5e072ded827ed09a53 (diff) | |
parent | 8de1d67967a9f9e22c66cb0c1e518ae4f30d07dd (diff) | |
download | ffmpeg-4d8356b6788016d578941d1b43d141d5db2fdf14.tar.gz |
Merge commit '8de1d67967a9f9e22c66cb0c1e518ae4f30d07dd'
* commit '8de1d67967a9f9e22c66cb0c1e518ae4f30d07dd':
avconv_vdpau: update to new VDPAU interface
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'ffmpeg_vdpau.c')
-rw-r--r-- | ffmpeg_vdpau.c | 53 |
1 files changed, 17 insertions, 36 deletions
diff --git a/ffmpeg_vdpau.c b/ffmpeg_vdpau.c index ef35d22ae8..14a3773e88 100644 --- a/ffmpeg_vdpau.c +++ b/ffmpeg_vdpau.c @@ -42,9 +42,11 @@ typedef struct VDPAUContext { VdpGetErrorString *get_error_string; VdpGetInformationString *get_information_string; VdpDeviceDestroy *device_destroy; +#if 1 // for ffmpegs older vdpau API, not the oldest though VdpDecoderCreate *decoder_create; VdpDecoderDestroy *decoder_destroy; VdpDecoderRender *decoder_render; +#endif VdpVideoSurfaceCreate *video_surface_create; VdpVideoSurfaceDestroy *video_surface_destroy; VdpVideoSurfaceGetBitsYCbCr *video_surface_get_bits; @@ -241,9 +243,11 @@ do { GET_CALLBACK(VDP_FUNC_ID_GET_ERROR_STRING, get_error_string); GET_CALLBACK(VDP_FUNC_ID_GET_INFORMATION_STRING, get_information_string); GET_CALLBACK(VDP_FUNC_ID_DEVICE_DESTROY, device_destroy); - GET_CALLBACK(VDP_FUNC_ID_DECODER_CREATE, decoder_create); - GET_CALLBACK(VDP_FUNC_ID_DECODER_DESTROY, decoder_destroy); - GET_CALLBACK(VDP_FUNC_ID_DECODER_RENDER, decoder_render); + if (vdpau_api_ver == 1) { + GET_CALLBACK(VDP_FUNC_ID_DECODER_CREATE, decoder_create); + GET_CALLBACK(VDP_FUNC_ID_DECODER_DESTROY, decoder_destroy); + GET_CALLBACK(VDP_FUNC_ID_DECODER_RENDER, decoder_render); + } GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_CREATE, video_surface_create); GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_DESTROY, video_surface_destroy); GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR, video_surface_get_bits); @@ -272,12 +276,16 @@ do { ctx->vdpau_format = vdpau_formats[i][0]; ctx->pix_fmt = vdpau_formats[i][1]; - vdpau_ctx = av_vdpau_alloc_context(); - if (!vdpau_ctx) - goto fail; - vdpau_ctx->render = ctx->decoder_render; + if (vdpau_api_ver == 1) { + vdpau_ctx = av_vdpau_alloc_context(); + if (!vdpau_ctx) + goto fail; + vdpau_ctx->render = ctx->decoder_render; - s->hwaccel_context = vdpau_ctx; + s->hwaccel_context = vdpau_ctx; + } else + if (av_vdpau_bind_context(s, ctx->device, ctx->get_proc_address, 0)) + goto fail; ctx->get_information_string(&vendor); av_log(NULL, AV_LOG_VERBOSE, "Using VDPAU -- %s -- on X11 display %s, " @@ -339,42 +347,15 @@ static int vdpau_old_init(AVCodecContext *s) int vdpau_init(AVCodecContext *s) { InputStream *ist = s->opaque; - int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR; - AVVDPAUContext *vdpau_ctx; - VDPAUContext *ctx; - VdpStatus err; - int profile, ret; if (vdpau_api_ver == 1) return vdpau_old_init(s); if (!ist->hwaccel_ctx) { - ret = vdpau_alloc(s); + int ret = vdpau_alloc(s); if (ret < 0) return ret; } - ctx = ist->hwaccel_ctx; - vdpau_ctx = s->hwaccel_context; - - ret = av_vdpau_get_profile(s, &profile); - if (ret < 0) { - av_log(NULL, loglevel, "No known VDPAU decoder profile for this stream.\n"); - return AVERROR(EINVAL); - } - - if (ctx->decoder) - ctx->decoder_destroy(ctx->decoder); - - err = ctx->decoder_create(ctx->device, profile, - s->coded_width, s->coded_height, - 16, &ctx->decoder); - if (err != VDP_STATUS_OK) { - av_log(NULL, loglevel, "Error creating the VDPAU decoder: %s\n", - ctx->get_error_string(err)); - return AVERROR_UNKNOWN; - } - - vdpau_ctx->decoder = ctx->decoder; ist->hwaccel_get_buffer = vdpau_get_buffer; ist->hwaccel_retrieve_data = vdpau_retrieve_data; |