[vlc-devel] [PATCH 07/42] avcodec: remove old VDPAU hardware decoder
Rémi Denis-Courmont
remi at remlab.net
Fri Jun 28 20:29:55 CEST 2013
---
modules/codec/Modules.am | 10 -
modules/codec/avcodec/vdpau.c | 492 ------------------------------------------
2 files changed, 502 deletions(-)
delete mode 100644 modules/codec/avcodec/vdpau.c
diff --git a/modules/codec/Modules.am b/modules/codec/Modules.am
index a93dac7..088a15f 100644
--- a/modules/codec/Modules.am
+++ b/modules/codec/Modules.am
@@ -156,16 +156,6 @@ if HAVE_AVCODEC_VDA
libvlc_LTLIBRARIES += libvda_plugin.la
endif
-libvdpau_plugin_la_SOURCES = avcodec/vdpau.c
-libvdpau_plugin_la_CFLAGS = $(AM_CFLAGS) $(VDPAU_CFLAGS) \
- $(X_CFLAGS) $(CFLAGS_avcodec)
-libvdpau_plugin_la_LIBADD = $(AM_LIBADD) $(VDPAU_LIBS) \
- $(X_LIBS) $(X_PRE_LIBS) -lX11 $(LIBS_avcodec)
-libvdpau_plugin_la_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_avcodec)
-if HAVE_AVCODEC_VDPAU
-libvlc_LTLIBRARIES += libvdpau_plugin.la
-endif
-
### XWD ###
libxwd_plugin_la_SOURCES = xwd.c
libxwd_plugin_la_CFLAGS = $(AM_CFLAGS) $(XPROTO_CFLAGS)
diff --git a/modules/codec/avcodec/vdpau.c b/modules/codec/avcodec/vdpau.c
deleted file mode 100644
index cf0f538..0000000
--- a/modules/codec/avcodec/vdpau.c
+++ /dev/null
@@ -1,492 +0,0 @@
-/*****************************************************************************
- * vdpau.c: VDPAU decoder for libav
- *****************************************************************************
- * Copyright (C) 2012-2013 Rémi Denis-Courmont
- *
- * This program 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.
- *
- * This program 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 this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <assert.h>
-
-#include <vdpau/vdpau.h>
-#include <libavutil/mem.h>
-#include <libavcodec/avcodec.h>
-#include <libavcodec/vdpau.h>
-#include <vlc_common.h>
-#include <vlc_plugin.h>
-#include <vlc_fourcc.h>
-#include <vlc_picture.h>
-
-#include <X11/Xlib.h>
-#include <vdpau/vdpau_x11.h>
-#include <vlc_xlib.h>
-
-#include "avcodec.h"
-#include "va.h"
-
-static int Open (vlc_va_t *, int, const es_format_t *);
-static void Close (vlc_va_t *);
-
-vlc_module_begin ()
- set_description (N_("Video Decode and Presentation API for Unix (VDPAU)"))
- set_capability ("hw decoder", 100)
- set_category (CAT_INPUT)
- set_subcategory (SUBCAT_INPUT_VCODEC)
- set_callbacks (Open, Close)
-vlc_module_end ()
-
-#define MAX_SURFACES (16+1)
-
-struct vlc_va_sys_t
-{
- VdpDevice device;
- VdpDecoderProfile profile;
- VdpYCbCrFormat format;
- AVVDPAUContext context;
- VdpVideoSurface surfaces[MAX_SURFACES];
- uint32_t available;
- vlc_fourcc_t chroma;
- uint16_t width;
- uint16_t height;
- void *display;
-
- VdpGetErrorString *GetErrorString;
- VdpGetInformationString *GetInformationString;
- VdpDeviceDestroy *DeviceDestroy;
- VdpVideoSurfaceQueryCapabilities *VideoSurfaceQueryCapabilities;
- VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities
- *VideoSurfaceQueryGetPutBitsYCbCrCapabilities;
- VdpVideoSurfaceCreate *VideoSurfaceCreate;
- VdpVideoSurfaceDestroy *VideoSurfaceDestroy;
- VdpVideoSurfaceGetBitsYCbCr *VideoSurfaceGetBitsYCbCr;
- VdpDecoderQueryCapabilities *DecoderQueryCapabilities;
- VdpDecoderCreate *DecoderCreate;
- VdpDecoderDestroy *DecoderDestroy;
- VdpDecoderRender *DecoderRender;
-};
-
-static int Lock (vlc_va_t *va, AVFrame *ff)
-{
- vlc_va_sys_t *sys = va->sys;
-
- for (unsigned i = 0; i < AV_NUM_DATA_POINTERS; i++)
- {
- ff->data[i] = NULL;
- ff->linesize[i] = 0;
- }
-
- if (!sys->available)
- {
- msg_Err (va, "no free surfaces");
- return VLC_EGENERIC;
- }
-
- unsigned idx = ctz (sys->available);
- sys->available &= ~(1 << idx);
-
- VdpVideoSurface *surface = sys->surfaces + idx;
- assert (*surface != VDP_INVALID_HANDLE);
- ff->data[0] = (void *)surface; /* must be non-NULL */
- ff->data[3] = (void *)(uintptr_t)*surface;
- ff->opaque = surface;
- return VLC_SUCCESS;
-}
-
-static void Unlock (vlc_va_t *va, AVFrame *ff)
-{
- vlc_va_sys_t *sys = va->sys;
- VdpVideoSurface *surface = ff->opaque;
- unsigned idx = surface - sys->surfaces;
-
- assert (idx < MAX_SURFACES);
- sys->available |= (1 << idx);
-
- ff->data[0] = ff->data[3] = NULL;
- ff->opaque = NULL;
-}
-
-static int Copy (vlc_va_t *va, picture_t *pic, AVFrame *ff)
-{
- vlc_va_sys_t *sys = va->sys;
- VdpVideoSurface *surface = ff->opaque;
- void *planes[3];
- uint32_t pitches[3];
- VdpStatus err;
-
- for (unsigned i = 0; i < 3; i++)
- {
- planes[i] = pic->p[i].p_pixels;
- pitches[i] = pic->p[i].i_pitch;
- }
-
- err = sys->VideoSurfaceGetBitsYCbCr (*surface, sys->format,
- planes, pitches);
- if (err != VDP_STATUS_OK)
- {
- msg_Err (va, "surface copy failure: %s", sys->GetErrorString (err));
- return VLC_EGENERIC;
- }
- return VLC_SUCCESS;
-}
-
-static int Init (vlc_va_t *va, void **ctxp, vlc_fourcc_t *chromap,
- int width, int height)
-{
- vlc_va_sys_t *sys = va->sys;
- VdpStatus err;
-
- width = (width + 1) & ~1;
- height = (height + 3) & ~3;
-
- unsigned surfaces = 2;
- switch (sys->profile)
- {
- case VDP_DECODER_PROFILE_H264_BASELINE:
- case VDP_DECODER_PROFILE_H264_MAIN:
- case VDP_DECODER_PROFILE_H264_HIGH:
- surfaces = 16;
- break;
- }
-
- err = sys->DecoderCreate (sys->device, sys->profile, width, height,
- surfaces, &sys->context.decoder);
- if (err != VDP_STATUS_OK)
- {
- msg_Err (va, "decoder creation failure: %s",
- sys->GetErrorString (err));
- sys->context.decoder = VDP_INVALID_HANDLE;
- return VLC_EGENERIC;
- }
-
- assert (width > 0 && height > 0);
- surfaces++;
- assert (surfaces <= MAX_SURFACES);
- sys->available = 0;
-
- /* TODO: select better chromas when appropriate */
- for (unsigned i = 0; i < surfaces; i++)
- {
- err = sys->VideoSurfaceCreate (sys->device, VDP_CHROMA_TYPE_420, width,
- height, sys->surfaces + i);
- if (err != VDP_STATUS_OK)
- {
- msg_Err (va, "surface creation failure: %s",
- sys->GetErrorString (err));
- sys->surfaces[i] = VDP_INVALID_HANDLE;
- break;
- }
- sys->available |= (1 << i);
- }
-
- *ctxp = &sys->context;
- *chromap = sys->chroma;
- return VLC_SUCCESS;
-}
-
-static void Deinit (vlc_va_t *va)
-{
- vlc_va_sys_t *sys = va->sys;
-
- for (unsigned i = 0; i < MAX_SURFACES; i++)
- {
- VdpVideoSurface *surface = sys->surfaces + i;
-
- if (*surface != VDP_INVALID_HANDLE)
- {
- sys->VideoSurfaceDestroy (*surface);
- *surface = VDP_INVALID_HANDLE;
- }
- }
-
- assert (sys->context.decoder != VDP_INVALID_HANDLE);
- sys->DecoderDestroy (sys->context.decoder);
- av_freep (&sys->context.bitstream_buffers);
-}
-
-static int Setup (vlc_va_t *va, void **ctxp, vlc_fourcc_t *chromap,
- int width, int height)
-{
- vlc_va_sys_t *sys = va->sys;
-
- if (sys->context.decoder != VDP_INVALID_HANDLE)
- {
- if (sys->width == width && sys->height == height)
- return VLC_SUCCESS;
- Deinit (va);
- sys->context.decoder = VDP_INVALID_HANDLE;
- }
-
- sys->width = width;
- sys->height = height;
- return Init (va, ctxp, chromap, width, height);
-}
-
-static int vdp_device_Create (vlc_object_t *obj, void **sysp, VdpDevice *devp,
- VdpGetProcAddress **gpap)
-{
- VdpStatus err;
-
- if (!vlc_xlib_init (obj))
- {
- msg_Err (obj, "Xlib is required for VDPAU");
- return VLC_EGENERIC;
- }
-
- Display *x11 = XOpenDisplay (NULL);
- if (x11 == NULL)
- {
- msg_Err (obj, "windowing system failure failure");
- return VLC_EGENERIC;
- }
-
- err = vdp_device_create_x11 (x11, XDefaultScreen (x11), devp, gpap);
- if (err)
- {
- msg_Err (obj, "device creation failure: error %d", (int)err);
- XCloseDisplay (x11);
- return VLC_EGENERIC;
- }
- *sysp = x11;
- return VLC_SUCCESS;
-}
-
-static int Open (vlc_va_t *va, int codec, const es_format_t *fmt)
-{
- VdpStatus err;
- VdpDecoderProfile profile;
- int level;
-
- switch (codec)
- {
- case AV_CODEC_ID_MPEG1VIDEO:
- profile = VDP_DECODER_PROFILE_MPEG1;
- level = VDP_DECODER_LEVEL_MPEG1_NA;
- break;
-
- case AV_CODEC_ID_MPEG2VIDEO:
- switch (fmt->i_profile)
- {
- case FF_PROFILE_MPEG2_MAIN:
- profile = VDP_DECODER_PROFILE_MPEG2_MAIN;
- break;
- case FF_PROFILE_MPEG2_SIMPLE:
- profile = VDP_DECODER_PROFILE_MPEG2_SIMPLE;
- break;
- default:
- msg_Err (va, "unsupported %s profile %d", "MPEG2", fmt->i_profile);
- return VLC_EGENERIC;
- }
- level = VDP_DECODER_LEVEL_MPEG2_HL;
- break;
-
- case AV_CODEC_ID_H263:
- profile = VDP_DECODER_PROFILE_MPEG4_PART2_ASP;
- level = VDP_DECODER_LEVEL_MPEG4_PART2_ASP_L5;
- break;
- case AV_CODEC_ID_MPEG4:
- switch (fmt->i_profile)
- {
- case FF_PROFILE_MPEG4_SIMPLE:
- profile = VDP_DECODER_PROFILE_MPEG4_PART2_SP;
- break;
- case FF_PROFILE_MPEG4_SIMPLE_STUDIO:
- msg_Err (va, "unsupported %s profile %d", "MPEG4", fmt->i_profile);
- return VLC_EGENERIC;
- default:
- profile = VDP_DECODER_PROFILE_MPEG4_PART2_ASP;
- break;
- }
- level = fmt->i_level;
- break;
-
- case AV_CODEC_ID_H264:
- switch (fmt->i_profile
- & ~(FF_PROFILE_H264_CONSTRAINED|FF_PROFILE_H264_INTRA))
- {
- case FF_PROFILE_H264_BASELINE:
- profile = VDP_DECODER_PROFILE_H264_BASELINE;
- break;
- case FF_PROFILE_H264_MAIN:
- profile = VDP_DECODER_PROFILE_H264_MAIN;
- break;
- case FF_PROFILE_H264_HIGH:
- profile = VDP_DECODER_PROFILE_H264_HIGH;
- break;
- case FF_PROFILE_H264_EXTENDED:
- default:
- msg_Err (va, "unsupported %s profile %d", "H.264", fmt->i_profile);
- return VLC_EGENERIC;
- }
- level = fmt->i_level;
- if ((fmt->i_profile & FF_PROFILE_H264_INTRA) && (fmt->i_level == 11))
- level = VDP_DECODER_LEVEL_H264_1b;
- break;
-
- case AV_CODEC_ID_WMV3:
- case AV_CODEC_ID_VC1:
- switch (fmt->i_profile)
- {
- case FF_PROFILE_VC1_SIMPLE:
- profile = VDP_DECODER_PROFILE_VC1_SIMPLE;
- break;
- case FF_PROFILE_VC1_MAIN:
- profile = VDP_DECODER_PROFILE_VC1_MAIN;
- break;
- case FF_PROFILE_VC1_ADVANCED:
- profile = VDP_DECODER_PROFILE_VC1_ADVANCED;
- break;
- default:
- msg_Err (va, "unsupported %s profile %d", "VC-1", fmt->i_profile);
- return VLC_EGENERIC;
- }
- level = fmt->i_level;
- break;
-
- default:
- msg_Err (va, "unknown codec %d", codec);
- return VLC_EGENERIC;
- }
-
- vlc_va_sys_t *sys = malloc (sizeof (*sys));
- if (unlikely(sys == NULL))
- return VLC_ENOMEM;
-
- VdpDevice device;
- VdpGetProcAddress *GetProcAddress;
- if (vdp_device_Create (VLC_OBJECT(va), &sys->display, &device,
- &GetProcAddress))
- {
- free (sys);
- return VLC_EGENERIC;
- }
-
- sys->device = device;
- sys->profile = profile;
- memset (&sys->context, 0, sizeof (sys->context));
- sys->context.decoder = VDP_INVALID_HANDLE;
- for (unsigned i = 0; i < MAX_SURFACES; i++)
- sys->surfaces[i] = VDP_INVALID_HANDLE;
-
-#define PROC(id,name) \
- do { \
- void *ptr; \
- err = GetProcAddress (device, VDP_FUNC_ID_##id, &ptr); \
- if (unlikely(err)) \
- abort (); \
- sys->name = ptr; \
- } while (0)
-
- /* We are really screwed if any function fails. We cannot even delete the
- * already allocated device. */
- PROC(GET_ERROR_STRING, GetErrorString);
- PROC(GET_INFORMATION_STRING, GetInformationString);
- PROC(DEVICE_DESTROY, DeviceDestroy);
- /* NOTE: We do not really need to retain QueryCap pointers in *sys */
- PROC(VIDEO_SURFACE_QUERY_CAPABILITIES, VideoSurfaceQueryCapabilities);
- PROC(VIDEO_SURFACE_QUERY_GET_PUT_BITS_Y_CB_CR_CAPABILITIES,
- VideoSurfaceQueryGetPutBitsYCbCrCapabilities);
- PROC(VIDEO_SURFACE_CREATE, VideoSurfaceCreate);
- PROC(VIDEO_SURFACE_DESTROY, VideoSurfaceDestroy);
- PROC(VIDEO_SURFACE_GET_BITS_Y_CB_CR, VideoSurfaceGetBitsYCbCr);
- PROC(DECODER_QUERY_CAPABILITIES, DecoderQueryCapabilities);
- PROC(DECODER_CREATE, DecoderCreate);
- PROC(DECODER_DESTROY, DecoderDestroy);
- PROC(DECODER_RENDER, DecoderRender);
- sys->context.render = sys->DecoderRender;
-
- /* Check capabilities */
- VdpBool support;
- uint32_t lvl, mb, width, height;
-
- if (sys->VideoSurfaceQueryCapabilities (device, VDP_CHROMA_TYPE_420,
- &support, &width, &height) != VDP_STATUS_OK)
- support = VDP_FALSE;
- if (!support || width < fmt->video.i_width || height < fmt->video.i_height)
- {
- msg_Err (va, "video surface not supported: %s %ux%u",
- "YUV 4:2:0", fmt->video.i_width, fmt->video.i_height);
- goto error;
- }
- msg_Dbg (va, "video surface supported maximum: %s %"PRIu32"x%"PRIu32,
- "YUV 4:2:0", width, height);
-
- if (sys->VideoSurfaceQueryGetPutBitsYCbCrCapabilities (device,
- VDP_CHROMA_TYPE_420, VDP_YCBCR_FORMAT_YV12, &support)
- == VDP_STATUS_OK && support == VDP_TRUE)
- {
- sys->format = VDP_YCBCR_FORMAT_YV12;
- sys->chroma = VLC_CODEC_YV12;
- }
- else
- if (sys->VideoSurfaceQueryGetPutBitsYCbCrCapabilities (device,
- VDP_CHROMA_TYPE_420, VDP_YCBCR_FORMAT_NV12, &support)
- == VDP_STATUS_OK && support == VDP_TRUE)
- {
- sys->format = VDP_YCBCR_FORMAT_NV12;
- sys->chroma = VLC_CODEC_NV12;
- }
- else
- {
- msg_Err (va, "video surface reading not supported: %s", "YUV 4:2:0");
- goto error;
- }
-
- if (sys->DecoderQueryCapabilities (device, profile, &support, &lvl,
- &mb, &width, &height) != VDP_STATUS_OK)
- support = VDP_FALSE;
- if (!support || (int)lvl < level
- || width < fmt->video.i_width || height < fmt->video.i_height)
- {
- msg_Err (va, "decoding profile not supported: %"PRIu32".%d %ux%u",
- profile, lvl, fmt->video.i_width, fmt->video.i_height);
- goto error;
- }
- msg_Dbg (va, "decoding profile supported maximum: %"PRIu32".%"PRIu32" mb %"
- PRIu32", %"PRIu32"x%"PRIu32, profile, lvl, mb, width, height);
-
- const char *infos;
- if (sys->GetInformationString (&infos) != VDP_STATUS_OK)
- infos = "VDPAU";
-
- va->sys = sys;
- va->description = (char *)infos;
- va->pix_fmt = AV_PIX_FMT_VDPAU;
- va->setup = Setup;
- va->get = Lock;
- va->release = Unlock;
- va->extract = Copy;
- return VLC_SUCCESS;
-
-error:
- sys->DeviceDestroy (device);
- XCloseDisplay (sys->display);
- free (sys);
- return VLC_EGENERIC;
-}
-
-static void Close (vlc_va_t *va)
-{
- vlc_va_sys_t *sys = va->sys;
-
- if (sys->context.decoder != VDP_INVALID_HANDLE)
- Deinit (va);
- sys->DeviceDestroy (sys->device);
- XCloseDisplay (sys->display);
- free (sys);
-}
--
1.8.3.1
More information about the vlc-devel
mailing list