FFmpeg
vdpau_vc1.c
Go to the documentation of this file.
1 /*
2  * VC-1 decode acceleration through VDPAU
3  *
4  * Copyright (c) 2008 NVIDIA
5  * Copyright (c) 2013 Rémi Denis-Courmont
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include <vdpau/vdpau.h>
25 
26 #include "avcodec.h"
27 #include "hwaccel.h"
28 #include "vc1.h"
29 #include "vdpau.h"
30 #include "vdpau_internal.h"
31 
33  const uint8_t *buffer, uint32_t size)
34 {
35  VC1Context * const v = avctx->priv_data;
36  MpegEncContext * const s = &v->s;
37  Picture *pic = s->current_picture_ptr;
38  struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private;
39  VdpPictureInfoVC1 *info = &pic_ctx->info.vc1;
40  VdpVideoSurface ref;
41 
42  /* fill LvPictureInfoVC1 struct */
43  info->forward_reference = VDP_INVALID_HANDLE;
44  info->backward_reference = VDP_INVALID_HANDLE;
45 
46  switch (s->pict_type) {
47  case AV_PICTURE_TYPE_B:
48  if (s->next_picture_ptr) {
49  ref = ff_vdpau_get_surface_id(s->next_picture.f);
50  assert(ref != VDP_INVALID_HANDLE);
51  info->backward_reference = ref;
52  }
53  /* fall-through */
54  case AV_PICTURE_TYPE_P:
55  if (s->last_picture_ptr) {
56  ref = ff_vdpau_get_surface_id(s->last_picture.f);
57  assert(ref != VDP_INVALID_HANDLE);
58  info->forward_reference = ref;
59  }
60  }
61 
62  info->slice_count = 0;
63  if (v->bi_type)
64  info->picture_type = 4;
65  else
66  info->picture_type = s->pict_type - 1 + s->pict_type / 3;
67 
68  info->frame_coding_mode = v->fcm ? (v->fcm + 1) : 0;
69  info->postprocflag = v->postprocflag;
70  info->pulldown = v->broadcast;
71  info->interlace = v->interlace;
72  info->tfcntrflag = v->tfcntrflag;
73  info->finterpflag = v->finterpflag;
74  info->psf = v->psf;
75  info->dquant = v->dquant;
76  info->panscan_flag = v->panscanflag;
77  info->refdist_flag = v->refdist_flag;
78  info->quantizer = v->quantizer_mode;
79  info->extended_mv = v->extended_mv;
80  info->extended_dmv = v->extended_dmv;
81  info->overlap = v->overlap;
82  info->vstransform = v->vstransform;
83  info->loopfilter = v->s.loop_filter;
84  info->fastuvmc = v->fastuvmc;
85  info->range_mapy_flag = v->range_mapy_flag;
86  info->range_mapy = v->range_mapy;
87  info->range_mapuv_flag = v->range_mapuv_flag;
88  info->range_mapuv = v->range_mapuv;
89  /* Specific to simple/main profile only */
90  info->multires = v->multires;
91  info->syncmarker = v->resync_marker;
92  info->rangered = v->rangered | (v->rangeredfrm << 1);
93  info->maxbframes = v->s.max_b_frames;
94  info->deblockEnable = v->postprocflag & 1;
95  info->pquant = v->pq;
96 
97  return ff_vdpau_common_start_frame(pic_ctx, buffer, size);
98 }
99 
101  const uint8_t *buffer, uint32_t size)
102 {
103  VC1Context * const v = avctx->priv_data;
104  MpegEncContext * const s = &v->s;
105  Picture *pic = s->current_picture_ptr;
106  struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private;
107  int val;
108 
109  val = ff_vdpau_add_buffer(pic_ctx, buffer, size);
110  if (val < 0)
111  return val;
112 
113  pic_ctx->info.vc1.slice_count++;
114  return 0;
115 }
116 
117 static int vdpau_vc1_init(AVCodecContext *avctx)
118 {
119  VdpDecoderProfile profile;
120 
121  switch (avctx->profile) {
123  profile = VDP_DECODER_PROFILE_VC1_SIMPLE;
124  break;
125  case FF_PROFILE_VC1_MAIN:
126  profile = VDP_DECODER_PROFILE_VC1_MAIN;
127  break;
129  profile = VDP_DECODER_PROFILE_VC1_ADVANCED;
130  break;
131  default:
132  return AVERROR(ENOTSUP);
133  }
134 
135  return ff_vdpau_common_init(avctx, profile, avctx->level);
136 }
137 
138 #if CONFIG_WMV3_VDPAU_HWACCEL
140  .name = "wm3_vdpau",
141  .type = AVMEDIA_TYPE_VIDEO,
142  .id = AV_CODEC_ID_WMV3,
143  .pix_fmt = AV_PIX_FMT_VDPAU,
144  .start_frame = vdpau_vc1_start_frame,
145  .end_frame = ff_vdpau_mpeg_end_frame,
146  .decode_slice = vdpau_vc1_decode_slice,
147  .frame_priv_data_size = sizeof(struct vdpau_picture_context),
148  .init = vdpau_vc1_init,
149  .uninit = ff_vdpau_common_uninit,
150  .frame_params = ff_vdpau_common_frame_params,
151  .priv_data_size = sizeof(VDPAUContext),
152  .caps_internal = HWACCEL_CAP_ASYNC_SAFE,
153 };
154 #endif
155 
157  .name = "vc1_vdpau",
158  .type = AVMEDIA_TYPE_VIDEO,
159  .id = AV_CODEC_ID_VC1,
160  .pix_fmt = AV_PIX_FMT_VDPAU,
161  .start_frame = vdpau_vc1_start_frame,
162  .end_frame = ff_vdpau_mpeg_end_frame,
163  .decode_slice = vdpau_vc1_decode_slice,
164  .frame_priv_data_size = sizeof(struct vdpau_picture_context),
165  .init = vdpau_vc1_init,
166  .uninit = ff_vdpau_common_uninit,
167  .frame_params = ff_vdpau_common_frame_params,
168  .priv_data_size = sizeof(VDPAUContext),
169  .caps_internal = HWACCEL_CAP_ASYNC_SAFE,
170 };
HWACCEL_CAP_ASYNC_SAFE
#define HWACCEL_CAP_ASYNC_SAFE
Definition: hwaccel.h:26
ff_vdpau_common_frame_params
int ff_vdpau_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Definition: vdpau.c:114
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
VC1Context
The VC1 Context.
Definition: vc1.h:173
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
VC1Context::overlap
int overlap
overlapped transforms in use
Definition: vc1.h:226
VC1Context::interlace
int interlace
Progressive/interlaced (RPTFTM syntax element)
Definition: vc1.h:201
vc1.h
MpegEncContext::max_b_frames
int max_b_frames
max number of B-frames for encoding
Definition: mpegvideo.h:115
profile
mfxU16 profile
Definition: qsvenc.c:44
VC1Context::fastuvmc
int fastuvmc
Rounding of qpel vector to hpel ? (not in Simple)
Definition: vc1.h:222
Picture
Picture.
Definition: mpegpicture.h:45
vdpau_internal.h
AVHWAccel
Definition: avcodec.h:3649
vdpau_picture_context
Definition: vdpau_internal.h:92
VC1Context::multires
int multires
frame-level RESPIC syntax element present
Definition: vc1.h:186
ff_vdpau_add_buffer
int ff_vdpau_add_buffer(struct vdpau_picture_context *pic_ctx, const uint8_t *buf, uint32_t size)
Definition: vdpau.c:377
VC1Context::dquant
int dquant
How qscale varies with MBs, 2 bits (not in Simple)
Definition: vc1.h:224
vdpau_vc1_decode_slice
static int vdpau_vc1_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: vdpau_vc1.c:100
ff_vdpau_common_init
int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile, int level)
Definition: vdpau.c:133
vdpau.h
hwaccel.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
VC1Context::range_mapuv_flag
uint8_t range_mapuv_flag
Definition: vc1.h:330
VC1Context::postprocflag
int postprocflag
Per-frame processing suggestion flag present.
Definition: vc1.h:199
info
MIPS optimizations info
Definition: mips.txt:2
VC1Context::rangered
int rangered
RANGEREDFRM (range reduction) syntax element present at frame level.
Definition: vc1.h:189
MpegEncContext::loop_filter
int loop_filter
Definition: mpegvideo.h:380
ff_vdpau_common_start_frame
int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic_ctx, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: vdpau.c:322
ff_vdpau_get_surface_id
static uintptr_t ff_vdpau_get_surface_id(AVFrame *pic)
Extract VdpVideoSurface from an AVFrame.
Definition: vdpau_internal.h:38
Picture::hwaccel_picture_private
void * hwaccel_picture_private
Hardware accelerator private data.
Definition: mpegpicture.h:77
FF_PROFILE_VC1_SIMPLE
#define FF_PROFILE_VC1_SIMPLE
Definition: avcodec.h:2953
VC1Context::pq
uint8_t pq
Definition: vc1.h:238
AV_CODEC_ID_WMV3
@ AV_CODEC_ID_WMV3
Definition: avcodec.h:289
VC1Context::range_mapy_flag
uint8_t range_mapy_flag
Definition: vc1.h:329
VC1Context::panscanflag
int panscanflag
NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present.
Definition: vc1.h:203
ff_wmv3_vdpau_hwaccel
const AVHWAccel ff_wmv3_vdpau_hwaccel
FF_PROFILE_VC1_MAIN
#define FF_PROFILE_VC1_MAIN
Definition: avcodec.h:2954
VC1Context::range_mapuv
uint8_t range_mapuv
Definition: vc1.h:332
VC1Context::resync_marker
int resync_marker
could this stream contain resync markers
Definition: vc1.h:402
AVCodecContext::level
int level
level
Definition: avcodec.h:3018
VC1Context::refdist_flag
int refdist_flag
REFDIST syntax element present in II, IP, PI or PP field picture headers.
Definition: vc1.h:204
ff_vc1_vdpau_hwaccel
const AVHWAccel ff_vc1_vdpau_hwaccel
Definition: vdpau_vc1.c:156
ff_vdpau_common_uninit
int ff_vdpau_common_uninit(AVCodecContext *avctx)
Definition: vdpau.c:284
VDPAUContext
Definition: vdpau_internal.h:67
size
int size
Definition: twinvq_data.h:11134
VDPAUPictureInfo::vc1
VdpPictureInfoVC1 vc1
Definition: vdpau_internal.h:46
VC1Context::rangeredfrm
uint8_t rangeredfrm
Frame decoding info for S/M profiles only.
Definition: vc1.h:303
val
const char const char void * val
Definition: avisynth_c.h:863
ff_vdpau_mpeg_end_frame
int ff_vdpau_mpeg_end_frame(AVCodecContext *avctx)
VC1Context::tfcntrflag
int tfcntrflag
TFCNTR present.
Definition: vc1.h:202
AV_PIX_FMT_VDPAU
@ AV_PIX_FMT_VDPAU
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
Definition: pixfmt.h:197
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:3655
VC1Context::s
MpegEncContext s
Definition: vc1.h:174
VC1Context::extended_mv
int extended_mv
Ext MV in P/B (not in Simple)
Definition: vc1.h:223
uint8_t
uint8_t
Definition: audio_convert.c:194
AV_CODEC_ID_VC1
@ AV_CODEC_ID_VC1
Definition: avcodec.h:288
vdpau_vc1_init
static int vdpau_vc1_init(AVCodecContext *avctx)
Definition: vdpau_vc1.c:117
avcodec.h
AVCodecContext
main external API structure.
Definition: avcodec.h:1565
vdpau_picture_context::info
union VDPAUPictureInfo info
VDPAU picture information.
Definition: vdpau_internal.h:96
FF_PROFILE_VC1_ADVANCED
#define FF_PROFILE_VC1_ADVANCED
Definition: avcodec.h:2956
AV_PICTURE_TYPE_B
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition: avutil.h:276
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:2898
VC1Context::vstransform
int vstransform
variable-size [48]x[48] transform type + info
Definition: vc1.h:225
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
VC1Context::bi_type
int bi_type
Definition: vc1.h:387
VC1Context::fcm
enum FrameCodingMode fcm
Frame decoding info for Advanced profile.
Definition: vc1.h:309
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:275
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
VC1Context::psf
int psf
Progressive Segmented Frame.
Definition: vc1.h:211
VC1Context::broadcast
int broadcast
TFF/RFF present.
Definition: vc1.h:200
vdpau_vc1_start_frame
static int vdpau_vc1_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: vdpau_vc1.c:32
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:1592
VC1Context::finterpflag
int finterpflag
INTERPFRM present.
Definition: vc1.h:228
VC1Context::quantizer_mode
int quantizer_mode
2 bits, quantizer mode used for sequence, see QUANT_*
Definition: vc1.h:227
VC1Context::range_mapy
uint8_t range_mapy
Definition: vc1.h:331
MpegEncContext
MpegEncContext.
Definition: mpegvideo.h:81
VC1Context::extended_dmv
int extended_dmv
Additional extended dmv range at P/B-frame-level.
Definition: vc1.h:205