summaryrefslogtreecommitdiffstats
path: root/video/decode/vdpau_old.c
diff options
context:
space:
mode:
Diffstat (limited to 'video/decode/vdpau_old.c')
-rw-r--r--video/decode/vdpau_old.c287
1 files changed, 0 insertions, 287 deletions
diff --git a/video/decode/vdpau_old.c b/video/decode/vdpau_old.c
deleted file mode 100644
index 9e03026221..0000000000
--- a/video/decode/vdpau_old.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * VDPAU video output driver
- *
- * Copyright (C) 2008 NVIDIA
- * Copyright (C) 2009 Uoti Urpala
- *
- * This file is part of MPlayer.
- *
- * MPlayer is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * MPlayer 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with MPlayer; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <stddef.h>
-#include <assert.h>
-
-#include <libavcodec/vdpau.h>
-#include <libavutil/common.h>
-
-#include "lavc.h"
-#include "video/fmt-conversion.h"
-#include "video/vdpau.h"
-#include "video/hwdec.h"
-#include "video/decode/dec_video.h"
-
-struct priv {
- struct mp_log *log;
- struct mp_vdpau_ctx *mpvdp;
- struct vdp_functions *vdp;
- VdpDevice vdp_device;
- uint64_t preemption_counter;
-
- int image_format;
- int vid_width;
- int vid_height;
-
- VdpDecoder decoder;
- int decoder_max_refs;
-};
-
-static void mark_uninitialized(struct lavc_ctx *ctx)
-{
- struct priv *p = ctx->hwdec_priv;
-
- p->vdp_device = VDP_INVALID_HANDLE;
- p->decoder = VDP_INVALID_HANDLE;
-}
-
-static int handle_preemption(struct lavc_ctx *ctx)
-{
- struct priv *p = ctx->hwdec_priv;
-
- if (!mp_vdpau_status_ok(p->mpvdp))
- return -1;
-
- // Mark objects as destroyed if preemption+reinit occured
- if (p->preemption_counter < p->mpvdp->preemption_counter) {
- p->preemption_counter = p->mpvdp->preemption_counter;
- mark_uninitialized(ctx);
- }
-
- p->vdp_device = p->mpvdp->vdp_device;
- p->vdp = p->mpvdp->vdp;
-
- return 0;
-}
-
-static bool create_vdp_decoder(struct lavc_ctx *ctx, int max_refs)
-{
- struct priv *p = ctx->hwdec_priv;
- struct vdp_functions *vdp = p->mpvdp->vdp;
- VdpStatus vdp_st;
- VdpDecoderProfile vdp_decoder_profile;
-
- if (handle_preemption(ctx) < 0)
- return false;
-
- if (p->decoder != VDP_INVALID_HANDLE)
- vdp->decoder_destroy(p->decoder);
-
- switch (p->image_format) {
- case IMGFMT_VDPAU_MPEG1:
- vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG1;
- break;
- case IMGFMT_VDPAU_MPEG2:
- vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG2_MAIN;
- break;
- case IMGFMT_VDPAU_H264:
- vdp_decoder_profile = VDP_DECODER_PROFILE_H264_HIGH;
- MP_VERBOSE(p, "Creating H264 hardware decoder "
- "for %d reference frames.\n", max_refs);
- break;
- case IMGFMT_VDPAU_WMV3:
- vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_MAIN;
- break;
- case IMGFMT_VDPAU_VC1:
- vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_ADVANCED;
- break;
- case IMGFMT_VDPAU_MPEG4:
- vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG4_PART2_ASP;
- break;
- default:
- MP_ERR(p, "Unknown image format!\n");
- goto fail;
- }
- vdp_st = vdp->decoder_create(p->vdp_device, vdp_decoder_profile,
- p->vid_width, p->vid_height, max_refs,
- &p->decoder);
- CHECK_VDP_WARNING(p, "Failed creating VDPAU decoder");
- if (vdp_st != VDP_STATUS_OK)
- goto fail;
- p->decoder_max_refs = max_refs;
- return true;
-
-fail:
- p->decoder = VDP_INVALID_HANDLE;
- p->decoder_max_refs = 0;
- return false;
-}
-
-static void draw_slice_hwdec(struct AVCodecContext *s,
- const AVFrame *src, int offset[4],
- int y, int type, int height)
-{
- struct dec_video *vd = s->opaque;
- struct lavc_ctx *ctx = vd->priv;
- struct priv *p = ctx->hwdec_priv;
- struct vdp_functions *vdp = p->vdp;
- VdpStatus vdp_st;
-
- if (handle_preemption(ctx) < 0)
- return;
-
- struct vdpau_render_state *rndr = (void *)src->data[0];
-
- int max_refs = p->image_format == IMGFMT_VDPAU_H264 ?
- rndr->info.h264.num_ref_frames : 2;
- if ((p->decoder == VDP_INVALID_HANDLE || p->decoder_max_refs < max_refs)
- && !create_vdp_decoder(ctx, max_refs))
- return;
-
- vdp_st = vdp->decoder_render(p->decoder, rndr->surface,
- (void *)&rndr->info,
- rndr->bitstream_buffers_used,
- rndr->bitstream_buffers);
- CHECK_VDP_WARNING(p, "Failed VDPAU decoder rendering");
-}
-
-static void release_surface(void *ptr)
-{
- struct vdpau_render_state *state = ptr;
- // Free bitstream buffers allocated by libavcodec
- av_freep(&state->bitstream_buffers);
- talloc_free(state);
-}
-
-static struct mp_image *allocate_image(struct lavc_ctx *ctx, int imgfmt,
- int w, int h)
-{
- struct priv *p = ctx->hwdec_priv;
-
- if (!IMGFMT_IS_VDPAU(imgfmt))
- return NULL;
-
- if (w != p->vid_width || h != p->vid_height || imgfmt != p->image_format) {
- p->vid_width = w;
- p->vid_height = h;
- p->image_format = imgfmt;
- if (!create_vdp_decoder(ctx, 2))
- return NULL;
- }
-
- VdpChromaType chroma;
- mp_vdpau_get_format(p->image_format, &chroma, NULL);
-
- struct mp_image *img =
- mp_vdpau_get_video_surface(p->mpvdp, imgfmt, chroma, w, h);
-
- if (!img)
- return NULL;
-
- // Create chained reference for vdpau_render_state. This will track the
- // lifetime of the actual reference too.
- // This is quite roundabout, but at least it allows us to share the
- // surface allocator in vo_vdpau.c with the new vdpau code.
-
- struct vdpau_render_state *state = talloc_ptrtype(NULL, state);
- memset(state, 0, sizeof(*state));
- state->surface = (VdpVideoSurface)(intptr_t)img->planes[3];
-
- talloc_steal(state, img);
-
- struct mp_image *new = mp_image_new_custom_ref(img, state, release_surface);
- new->planes[0] = (void *)state;
- return new;
-}
-
-static void uninit(struct lavc_ctx *ctx)
-{
- struct priv *p = ctx->hwdec_priv;
-
- if (!p)
- return;
-
- if (p->decoder != VDP_INVALID_HANDLE)
- p->vdp->decoder_destroy(p->decoder);
-
- talloc_free(p);
- ctx->hwdec_priv = NULL;
-}
-
-static int init(struct lavc_ctx *ctx)
-{
- struct priv *p = talloc_ptrtype(NULL, p);
- *p = (struct priv) {
- .log = mp_log_new(p, ctx->log, "vdpau"),
- .mpvdp = ctx->hwdec_info->vdpau_ctx,
- };
- ctx->hwdec_priv = p;
-
- p->preemption_counter = p->mpvdp->preemption_counter;
- mark_uninitialized(ctx);
-
- if (handle_preemption(ctx) < 0)
- return -1;
-
- AVCodecContext *avctx = ctx->avctx;
-
- avctx->draw_horiz_band = draw_slice_hwdec;
- avctx->slice_flags = SLICE_FLAG_CODED_ORDER | SLICE_FLAG_ALLOW_FIELD;
-
- return 0;
-}
-
-static int probe(struct vd_lavc_hwdec *hwdec, struct mp_hwdec_info *info,
- const char *decoder)
-{
- hwdec_request_api(info, "vdpau");
- if (!info || !info->vdpau_ctx)
- return HWDEC_ERR_NO_CTX;
- return 0;
-}
-
-static struct mp_image *process_image(struct lavc_ctx *ctx, struct mp_image *img)
-{
- // Make it follow the convention of the "new" vdpau decoder
- struct vdpau_render_state *rndr = (void *)img->planes[0];
- img->planes[0] = (void *)"dummy"; // must be non-NULL, otherwise arbitrary
- img->planes[3] = (void *)(intptr_t)rndr->surface;
- mp_image_setfmt(img, IMGFMT_VDPAU);
- return img;
-}
-
-const struct vd_lavc_hwdec mp_vd_lavc_vdpau_old = {
- .type = HWDEC_VDPAU,
- .image_formats = (const int[]) {
- IMGFMT_VDPAU_MPEG1, IMGFMT_VDPAU_MPEG2, IMGFMT_VDPAU_H264,
- IMGFMT_VDPAU_WMV3, IMGFMT_VDPAU_VC1, IMGFMT_VDPAU_MPEG4,
- 0
- },
- .codec_pairs = (const char *[]) {
- "h264", "h264_vdpau",
- "wmv3", "wmv3_vdpau",
- "vc1", "vc1_vdpau",
- "mpegvideo", "mpegvideo_vdpau",
- "mpeg1video", "mpeg1video_vdpau",
- "mpeg2video", "mpegvideo_vdpau",
- "mpeg2", "mpeg2_vdpau",
- "mpeg4", "mpeg4_vdpau",
- NULL
- },
- .probe = probe,
- .init = init,
- .uninit = uninit,
- .allocate_image = allocate_image,
- .process_image = process_image,
-};