From aa6b2e081c504cb99f5e2e0ceb45295ef24bdac2 Mon Sep 17 00:00:00 2001 From: Mark Thompson Date: Sat, 4 Mar 2017 23:57:34 +0000 Subject: [PATCH] avconv: Enable generic hwaccel support for VDPAU --- avtools/Makefile | 1 - avtools/avconv.h | 1 - avtools/avconv_opt.c | 4 +- avtools/avconv_vdpau.c | 159 ----------------------------------------- 4 files changed, 2 insertions(+), 163 deletions(-) delete mode 100644 avtools/avconv_vdpau.c diff --git a/avtools/Makefile b/avtools/Makefile index 09233dea7e..c23a605a55 100644 --- a/avtools/Makefile +++ b/avtools/Makefile @@ -13,7 +13,6 @@ OBJS-avconv += avtools/avconv_opt.o avtools/avconv_filter.o \ OBJS-avconv-$(CONFIG_LIBMFX) += avtools/avconv_qsv.o OBJS-avconv-$(CONFIG_VDA) += avtools/avconv_vda.o OBJS-avconv-$(HAVE_DXVA2_LIB) += avtools/avconv_dxva2.o -OBJS-avconv-$(HAVE_VDPAU_X11) += avtools/avconv_vdpau.o define DOAVTOOL OBJS-$(1) += avtools/cmdutils.o avtools/$(1).o $(OBJS-$(1)-yes) diff --git a/avtools/avconv.h b/avtools/avconv.h index 4cd846134f..9415b208be 100644 --- a/avtools/avconv.h +++ b/avtools/avconv.h @@ -510,7 +510,6 @@ int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame); int avconv_parse_options(int argc, char **argv); -int vdpau_init(AVCodecContext *s); int dxva2_init(AVCodecContext *s); int vda_init(AVCodecContext *s); int qsv_init(AVCodecContext *s); diff --git a/avtools/avconv_opt.c b/avtools/avconv_opt.c index 09edc1f161..e970c8e46c 100644 --- a/avtools/avconv_opt.c +++ b/avtools/avconv_opt.c @@ -57,8 +57,8 @@ const HWAccel hwaccels[] = { #if HAVE_VDPAU_X11 - { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU, - AV_HWDEVICE_TYPE_NONE }, + { "vdpau", hwaccel_decode_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU, + AV_HWDEVICE_TYPE_VDPAU }, #endif #if HAVE_DXVA2_LIB { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD, diff --git a/avtools/avconv_vdpau.c b/avtools/avconv_vdpau.c deleted file mode 100644 index 5fedceef95..0000000000 --- a/avtools/avconv_vdpau.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - * This file is part of Libav. - * - * Libav is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * Libav is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include "avconv.h" - -#include "libavcodec/vdpau.h" - -#include "libavutil/buffer.h" -#include "libavutil/frame.h" -#include "libavutil/hwcontext.h" -#include "libavutil/hwcontext_vdpau.h" -#include "libavutil/pixfmt.h" - -typedef struct VDPAUContext { - AVBufferRef *hw_frames_ctx; - AVFrame *tmp_frame; -} VDPAUContext; - -static void vdpau_uninit(AVCodecContext *s) -{ - InputStream *ist = s->opaque; - VDPAUContext *ctx = ist->hwaccel_ctx; - - ist->hwaccel_uninit = NULL; - ist->hwaccel_get_buffer = NULL; - ist->hwaccel_retrieve_data = NULL; - - av_buffer_unref(&ctx->hw_frames_ctx); - av_frame_free(&ctx->tmp_frame); - - av_freep(&ist->hwaccel_ctx); - av_freep(&s->hwaccel_context); -} - -static int vdpau_get_buffer(AVCodecContext *s, AVFrame *frame, int flags) -{ - InputStream *ist = s->opaque; - VDPAUContext *ctx = ist->hwaccel_ctx; - - return av_hwframe_get_buffer(ctx->hw_frames_ctx, frame, 0); -} - -static int vdpau_retrieve_data(AVCodecContext *s, AVFrame *frame) -{ - InputStream *ist = s->opaque; - VDPAUContext *ctx = ist->hwaccel_ctx; - int ret; - - ret = av_hwframe_transfer_data(ctx->tmp_frame, frame, 0); - if (ret < 0) - return ret; - - ret = av_frame_copy_props(ctx->tmp_frame, frame); - if (ret < 0) { - av_frame_unref(ctx->tmp_frame); - return ret; - } - - av_frame_unref(frame); - av_frame_move_ref(frame, ctx->tmp_frame); - - return 0; -} - -static int vdpau_alloc(AVCodecContext *s) -{ - InputStream *ist = s->opaque; - int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR; - VDPAUContext *ctx; - int ret; - - AVBufferRef *device_ref = NULL; - AVHWDeviceContext *device_ctx; - AVVDPAUDeviceContext *device_hwctx; - AVHWFramesContext *frames_ctx; - - ctx = av_mallocz(sizeof(*ctx)); - if (!ctx) - return AVERROR(ENOMEM); - - ist->hwaccel_ctx = ctx; - ist->hwaccel_uninit = vdpau_uninit; - ist->hwaccel_get_buffer = vdpau_get_buffer; - ist->hwaccel_retrieve_data = vdpau_retrieve_data; - - ctx->tmp_frame = av_frame_alloc(); - if (!ctx->tmp_frame) - goto fail; - - ret = av_hwdevice_ctx_create(&device_ref, AV_HWDEVICE_TYPE_VDPAU, - ist->hwaccel_device, NULL, 0); - if (ret < 0) - goto fail; - device_ctx = (AVHWDeviceContext*)device_ref->data; - device_hwctx = device_ctx->hwctx; - - ctx->hw_frames_ctx = av_hwframe_ctx_alloc(device_ref); - if (!ctx->hw_frames_ctx) - goto fail; - av_buffer_unref(&device_ref); - - frames_ctx = (AVHWFramesContext*)ctx->hw_frames_ctx->data; - frames_ctx->format = AV_PIX_FMT_VDPAU; - frames_ctx->sw_format = s->sw_pix_fmt; - frames_ctx->width = s->coded_width; - frames_ctx->height = s->coded_height; - - ret = av_hwframe_ctx_init(ctx->hw_frames_ctx); - if (ret < 0) - goto fail; - - if (av_vdpau_bind_context(s, device_hwctx->device, device_hwctx->get_proc_address, 0)) - goto fail; - - av_log(NULL, AV_LOG_VERBOSE, "Using VDPAU to decode input stream #%d:%d.\n", - ist->file_index, ist->st->index); - - return 0; - -fail: - av_log(NULL, loglevel, "VDPAU init failed for stream #%d:%d.\n", - ist->file_index, ist->st->index); - av_buffer_unref(&device_ref); - vdpau_uninit(s); - return AVERROR(EINVAL); -} - -int vdpau_init(AVCodecContext *s) -{ - InputStream *ist = s->opaque; - - if (!ist->hwaccel_ctx) { - int ret = vdpau_alloc(s); - if (ret < 0) - return ret; - } - - ist->hwaccel_get_buffer = vdpau_get_buffer; - ist->hwaccel_retrieve_data = vdpau_retrieve_data; - - return 0; -}