blob: 30d01af65d801d1edc0c41eddcc84118057c92a4
1 | /* |
2 | * Video Decode and Presentation API for UNIX (VDPAU) is used for |
3 | * HW decode acceleration for MPEG-1/2, H.264 and VC-1. |
4 | * |
5 | * Copyright (C) 2008 NVIDIA |
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 |
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
22 | */ |
23 | |
24 | #ifndef AVCODEC_VDPAU_INTERNAL_H |
25 | #define AVCODEC_VDPAU_INTERNAL_H |
26 | |
27 | #include <stdint.h> |
28 | #include <vdpau/vdpau.h> |
29 | |
30 | #include "libavutil/frame.h" |
31 | #include "libavutil/hwcontext.h" |
32 | #include "libavutil/hwcontext_vdpau.h" |
33 | |
34 | #include "avcodec.h" |
35 | #include "vdpau.h" |
36 | |
37 | /** Extract VdpVideoSurface from an AVFrame */ |
38 | static inline uintptr_t ff_vdpau_get_surface_id(AVFrame *pic) |
39 | { |
40 | return (uintptr_t)pic->data[3]; |
41 | } |
42 | |
43 | union VDPAUPictureInfo { |
44 | VdpPictureInfoH264 h264; |
45 | VdpPictureInfoMPEG1Or2 mpeg; |
46 | VdpPictureInfoVC1 vc1; |
47 | VdpPictureInfoMPEG4Part2 mpeg4; |
48 | #ifdef VDP_DECODER_PROFILE_H264_HIGH_444_PREDICTIVE |
49 | VdpPictureInfoH264Predictive h264_predictive; |
50 | #endif |
51 | #ifdef VDP_DECODER_PROFILE_HEVC_MAIN |
52 | VdpPictureInfoHEVC hevc; |
53 | #endif |
54 | }; |
55 | |
56 | typedef struct VDPAUHWContext { |
57 | AVVDPAUContext context; |
58 | VdpDevice device; |
59 | VdpGetProcAddress *get_proc_address; |
60 | char reset; |
61 | unsigned char flags; |
62 | } VDPAUHWContext; |
63 | |
64 | typedef struct VDPAUContext { |
65 | /** |
66 | * VDPAU device handle |
67 | */ |
68 | VdpDevice device; |
69 | |
70 | /** |
71 | * VDPAU decoder handle |
72 | */ |
73 | VdpDecoder decoder; |
74 | |
75 | /** |
76 | * VDPAU device driver |
77 | */ |
78 | VdpGetProcAddress *get_proc_address; |
79 | |
80 | /** |
81 | * VDPAU decoder render callback |
82 | */ |
83 | VdpDecoderRender *render; |
84 | |
85 | uint32_t width; |
86 | uint32_t height; |
87 | } VDPAUContext; |
88 | |
89 | struct vdpau_picture_context { |
90 | /** |
91 | * VDPAU picture information. |
92 | */ |
93 | union VDPAUPictureInfo info; |
94 | |
95 | /** |
96 | * Allocated size of the bitstream_buffers table. |
97 | */ |
98 | int bitstream_buffers_allocated; |
99 | |
100 | /** |
101 | * Useful bitstream buffers in the bitstream buffers table. |
102 | */ |
103 | int bitstream_buffers_used; |
104 | |
105 | /** |
106 | * Table of bitstream buffers. |
107 | */ |
108 | VdpBitstreamBuffer *bitstream_buffers; |
109 | }; |
110 | |
111 | int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile, |
112 | int level); |
113 | int ff_vdpau_common_uninit(AVCodecContext *avctx); |
114 | |
115 | int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic, |
116 | const uint8_t *buffer, uint32_t size); |
117 | int ff_vdpau_common_end_frame(AVCodecContext *avctx, AVFrame *frame, |
118 | struct vdpau_picture_context *pic); |
119 | int ff_vdpau_mpeg_end_frame(AVCodecContext *avctx); |
120 | int ff_vdpau_add_buffer(struct vdpau_picture_context *pic, const uint8_t *buf, |
121 | uint32_t buf_size); |
122 | |
123 | #endif /* AVCODEC_VDPAU_INTERNAL_H */ |
124 |