annotate ffmpeg/libavcodec/vdpau_vc1.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * VC-1 decode acceleration through VDPAU
yading@10 3 *
yading@10 4 * Copyright (c) 2008 NVIDIA
yading@10 5 * Copyright (c) 2013 Rémi Denis-Courmont
yading@10 6 *
yading@10 7 * This file is part of FFmpeg.
yading@10 8 *
yading@10 9 * FFmpeg is free software; you can redistribute it and/or
yading@10 10 * modify it under the terms of the GNU Lesser General Public
yading@10 11 * License as published by the Free Software Foundation; either
yading@10 12 * version 2.1 of the License, or (at your option) any later version.
yading@10 13 *
yading@10 14 * FFmpeg is distributed in the hope that it will be useful,
yading@10 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 17 * Lesser General Public License for more details.
yading@10 18 *
yading@10 19 * You should have received a copy of the GNU Lesser General Public
yading@10 20 * License along with FFmpeg; if not, write to the Free Software Foundation,
yading@10 21 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 22 */
yading@10 23
yading@10 24 #include <vdpau/vdpau.h>
yading@10 25
yading@10 26 #include "avcodec.h"
yading@10 27 #include "vc1.h"
yading@10 28 #include "vdpau.h"
yading@10 29 #include "vdpau_internal.h"
yading@10 30
yading@10 31 static int vdpau_vc1_start_frame(AVCodecContext *avctx,
yading@10 32 const uint8_t *buffer, uint32_t size)
yading@10 33 {
yading@10 34 VC1Context * const v = avctx->priv_data;
yading@10 35 AVVDPAUContext *hwctx = avctx->hwaccel_context;
yading@10 36 MpegEncContext * const s = &v->s;
yading@10 37 VdpPictureInfoVC1 *info = &hwctx->info.vc1;
yading@10 38 VdpVideoSurface ref;
yading@10 39
yading@10 40 /* fill LvPictureInfoVC1 struct */
yading@10 41 info->forward_reference = VDP_INVALID_HANDLE;
yading@10 42 info->backward_reference = VDP_INVALID_HANDLE;
yading@10 43
yading@10 44 switch (s->pict_type) {
yading@10 45 case AV_PICTURE_TYPE_B:
yading@10 46 ref = ff_vdpau_get_surface_id(&s->next_picture);
yading@10 47 assert(ref != VDP_INVALID_HANDLE);
yading@10 48 info->backward_reference = ref;
yading@10 49 /* fall-through */
yading@10 50 case AV_PICTURE_TYPE_P:
yading@10 51 ref = ff_vdpau_get_surface_id(&s->last_picture);
yading@10 52 assert(ref != VDP_INVALID_HANDLE);
yading@10 53 info->forward_reference = ref;
yading@10 54 }
yading@10 55
yading@10 56 info->slice_count = 0;
yading@10 57 if (v->bi_type)
yading@10 58 info->picture_type = 4;
yading@10 59 else
yading@10 60 info->picture_type = s->pict_type - 1 + s->pict_type / 3;
yading@10 61
yading@10 62 info->frame_coding_mode = v->fcm;
yading@10 63 info->postprocflag = v->postprocflag;
yading@10 64 info->pulldown = v->broadcast;
yading@10 65 info->interlace = v->interlace;
yading@10 66 info->tfcntrflag = v->tfcntrflag;
yading@10 67 info->finterpflag = v->finterpflag;
yading@10 68 info->psf = v->psf;
yading@10 69 info->dquant = v->dquant;
yading@10 70 info->panscan_flag = v->panscanflag;
yading@10 71 info->refdist_flag = v->refdist_flag;
yading@10 72 info->quantizer = v->quantizer_mode;
yading@10 73 info->extended_mv = v->extended_mv;
yading@10 74 info->extended_dmv = v->extended_dmv;
yading@10 75 info->overlap = v->overlap;
yading@10 76 info->vstransform = v->vstransform;
yading@10 77 info->loopfilter = v->s.loop_filter;
yading@10 78 info->fastuvmc = v->fastuvmc;
yading@10 79 info->range_mapy_flag = v->range_mapy_flag;
yading@10 80 info->range_mapy = v->range_mapy;
yading@10 81 info->range_mapuv_flag = v->range_mapuv_flag;
yading@10 82 info->range_mapuv = v->range_mapuv;
yading@10 83 /* Specific to simple/main profile only */
yading@10 84 info->multires = v->multires;
yading@10 85 info->syncmarker = v->s.resync_marker;
yading@10 86 info->rangered = v->rangered | (v->rangeredfrm << 1);
yading@10 87 info->maxbframes = v->s.max_b_frames;
yading@10 88 info->deblockEnable = v->postprocflag & 1;
yading@10 89 info->pquant = v->pq;
yading@10 90
yading@10 91 return ff_vdpau_common_start_frame(avctx, buffer, size);
yading@10 92 }
yading@10 93
yading@10 94 static int vdpau_vc1_decode_slice(AVCodecContext *avctx,
yading@10 95 const uint8_t *buffer, uint32_t size)
yading@10 96 {
yading@10 97 AVVDPAUContext *hwctx = avctx->hwaccel_context;
yading@10 98 int val;
yading@10 99
yading@10 100 val = ff_vdpau_add_buffer(avctx, buffer, size);
yading@10 101 if (val < 0)
yading@10 102 return val;
yading@10 103
yading@10 104 hwctx->info.vc1.slice_count++;
yading@10 105 return 0;
yading@10 106 }
yading@10 107
yading@10 108 #if CONFIG_WMV3_VDPAU_HWACCEL
yading@10 109 AVHWAccel ff_wmv3_vdpau_hwaccel = {
yading@10 110 .name = "wm3_vdpau",
yading@10 111 .type = AVMEDIA_TYPE_VIDEO,
yading@10 112 .id = AV_CODEC_ID_WMV3,
yading@10 113 .pix_fmt = AV_PIX_FMT_VDPAU,
yading@10 114 .start_frame = vdpau_vc1_start_frame,
yading@10 115 .end_frame = ff_vdpau_mpeg_end_frame,
yading@10 116 .decode_slice = vdpau_vc1_decode_slice,
yading@10 117 };
yading@10 118 #endif
yading@10 119
yading@10 120 AVHWAccel ff_vc1_vdpau_hwaccel = {
yading@10 121 .name = "vc1_vdpau",
yading@10 122 .type = AVMEDIA_TYPE_VIDEO,
yading@10 123 .id = AV_CODEC_ID_VC1,
yading@10 124 .pix_fmt = AV_PIX_FMT_VDPAU,
yading@10 125 .start_frame = vdpau_vc1_start_frame,
yading@10 126 .end_frame = ff_vdpau_mpeg_end_frame,
yading@10 127 .decode_slice = vdpau_vc1_decode_slice,
yading@10 128 };