2 * VC-1 decode acceleration through VDPAU
4 * Copyright (c) 2008 NVIDIA
5 * Copyright (c) 2013 RĂ©mi Denis-Courmont
7 * This file is part of Libav.
9 * Libav 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.
14 * Libav 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.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with Libav; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include <vdpau/vdpau.h>
29 #include "vdpau_internal.h"
31 static int vdpau_vc1_start_frame(AVCodecContext
*avctx
,
32 const uint8_t *buffer
, uint32_t size
)
34 VC1Context
* const v
= avctx
->priv_data
;
35 AVVDPAUContext
*hwctx
= avctx
->hwaccel_context
;
36 MpegEncContext
* const s
= &v
->s
;
37 VdpPictureInfoVC1
*info
= &hwctx
->info
.vc1
;
40 /* fill LvPictureInfoVC1 struct */
41 info
->forward_reference
= VDP_INVALID_HANDLE
;
42 info
->backward_reference
= VDP_INVALID_HANDLE
;
44 switch (s
->pict_type
) {
45 case AV_PICTURE_TYPE_B
:
46 ref
= ff_vdpau_get_surface_id(&s
->next_picture
);
47 assert(ref
!= VDP_INVALID_HANDLE
);
48 info
->backward_reference
= ref
;
50 case AV_PICTURE_TYPE_P
:
51 ref
= ff_vdpau_get_surface_id(&s
->last_picture
);
52 assert(ref
!= VDP_INVALID_HANDLE
);
53 info
->forward_reference
= ref
;
56 info
->slice_count
= 0;
58 info
->picture_type
= 4;
60 info
->picture_type
= s
->pict_type
- 1 + s
->pict_type
/ 3;
62 info
->frame_coding_mode
= v
->fcm
;
63 info
->postprocflag
= v
->postprocflag
;
64 info
->pulldown
= v
->broadcast
;
65 info
->interlace
= v
->interlace
;
66 info
->tfcntrflag
= v
->tfcntrflag
;
67 info
->finterpflag
= v
->finterpflag
;
69 info
->dquant
= v
->dquant
;
70 info
->panscan_flag
= v
->panscanflag
;
71 info
->refdist_flag
= v
->refdist_flag
;
72 info
->quantizer
= v
->quantizer_mode
;
73 info
->extended_mv
= v
->extended_mv
;
74 info
->extended_dmv
= v
->extended_dmv
;
75 info
->overlap
= v
->overlap
;
76 info
->vstransform
= v
->vstransform
;
77 info
->loopfilter
= v
->s
.loop_filter
;
78 info
->fastuvmc
= v
->fastuvmc
;
79 info
->range_mapy_flag
= v
->range_mapy_flag
;
80 info
->range_mapy
= v
->range_mapy
;
81 info
->range_mapuv_flag
= v
->range_mapuv_flag
;
82 info
->range_mapuv
= v
->range_mapuv
;
83 /* Specific to simple/main profile only */
84 info
->multires
= v
->multires
;
85 info
->syncmarker
= v
->s
.resync_marker
;
86 info
->rangered
= v
->rangered
| (v
->rangeredfrm
<< 1);
87 info
->maxbframes
= v
->s
.max_b_frames
;
88 info
->deblockEnable
= v
->postprocflag
& 1;
91 return ff_vdpau_common_start_frame(avctx
, buffer
, size
);
94 static int vdpau_vc1_decode_slice(AVCodecContext
*avctx
,
95 const uint8_t *buffer
, uint32_t size
)
97 AVVDPAUContext
*hwctx
= avctx
->hwaccel_context
;
100 val
= ff_vdpau_add_buffer(avctx
, buffer
, size
);
104 hwctx
->info
.vc1
.slice_count
++;
108 #if CONFIG_WMV3_VDPAU_HWACCEL
109 AVHWAccel ff_wmv3_vdpau_hwaccel
= {
111 .type
= AVMEDIA_TYPE_VIDEO
,
112 .id
= AV_CODEC_ID_WMV3
,
113 .pix_fmt
= AV_PIX_FMT_VDPAU
,
114 .start_frame
= vdpau_vc1_start_frame
,
115 .end_frame
= ff_vdpau_common_end_frame
,
116 .decode_slice
= vdpau_vc1_decode_slice
,
120 AVHWAccel ff_vc1_vdpau_hwaccel
= {
122 .type
= AVMEDIA_TYPE_VIDEO
,
123 .id
= AV_CODEC_ID_VC1
,
124 .pix_fmt
= AV_PIX_FMT_VDPAU
,
125 .start_frame
= vdpau_vc1_start_frame
,
126 .end_frame
= ff_vdpau_common_end_frame
,
127 .decode_slice
= vdpau_vc1_decode_slice
,