vdpau_h264.c
Go to the documentation of this file.
1 /*
2  * MPEG-4 Part 10 / AVC / H.264 HW 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 "h264.h"
28 #include "vdpau.h"
29 #include "vdpau_internal.h"
30 
31 static int32_t h264_foc(int foc)
32 {
33  if (foc == INT_MAX)
34  foc = 0;
35  return foc;
36 }
37 
38 static void vdpau_h264_clear_rf(VdpReferenceFrameH264 *rf)
39 {
40  rf->surface = VDP_INVALID_HANDLE;
41  rf->is_long_term = VDP_FALSE;
42  rf->top_is_reference = VDP_FALSE;
43  rf->bottom_is_reference = VDP_FALSE;
44  rf->field_order_cnt[0] = 0;
45  rf->field_order_cnt[1] = 0;
46  rf->frame_idx = 0;
47 }
48 
49 static void vdpau_h264_set_rf(VdpReferenceFrameH264 *rf, Picture *pic,
50  int pic_structure)
51 {
52  VdpVideoSurface surface = ff_vdpau_get_surface_id(pic);
53 
54  if (pic_structure == 0)
55  pic_structure = pic->reference;
56 
57  rf->surface = surface;
58  rf->is_long_term = pic->reference && pic->long_ref;
59  rf->top_is_reference = (pic_structure & PICT_TOP_FIELD) != 0;
60  rf->bottom_is_reference = (pic_structure & PICT_BOTTOM_FIELD) != 0;
61  rf->field_order_cnt[0] = h264_foc(pic->field_poc[0]);
62  rf->field_order_cnt[1] = h264_foc(pic->field_poc[1]);
63  rf->frame_idx = pic->long_ref ? pic->pic_id : pic->frame_num;
64 }
65 
67 {
68  H264Context * const h = avctx->priv_data;
69  AVVDPAUContext *hwctx = avctx->hwaccel_context;
70  VdpPictureInfoH264 *info = &hwctx->info.h264;
71  int list;
72 
73  VdpReferenceFrameH264 *rf = &info->referenceFrames[0];
74 #define H264_RF_COUNT FF_ARRAY_ELEMS(info->referenceFrames)
75 
76  for (list = 0; list < 2; ++list) {
77  Picture **lp = list ? h->long_ref : h->short_ref;
78  int i, ls = list ? 16 : h->short_ref_count;
79 
80  for (i = 0; i < ls; ++i) {
81  Picture *pic = lp[i];
82  VdpReferenceFrameH264 *rf2;
83  VdpVideoSurface surface_ref;
84  int pic_frame_idx;
85 
86  if (!pic || !pic->reference)
87  continue;
88  pic_frame_idx = pic->long_ref ? pic->pic_id : pic->frame_num;
89  surface_ref = ff_vdpau_get_surface_id(pic);
90 
91  rf2 = &info->referenceFrames[0];
92  while (rf2 != rf) {
93  if ((rf2->surface == surface_ref) &&
94  (rf2->is_long_term == pic->long_ref) &&
95  (rf2->frame_idx == pic_frame_idx))
96  break;
97  ++rf2;
98  }
99  if (rf2 != rf) {
100  rf2->top_is_reference |= (pic->reference & PICT_TOP_FIELD) ? VDP_TRUE : VDP_FALSE;
101  rf2->bottom_is_reference |= (pic->reference & PICT_BOTTOM_FIELD) ? VDP_TRUE : VDP_FALSE;
102  continue;
103  }
104 
105  if (rf >= &info->referenceFrames[H264_RF_COUNT])
106  continue;
107 
108  vdpau_h264_set_rf(rf, pic, pic->reference);
109  ++rf;
110  }
111  }
112 
113  for (; rf < &info->referenceFrames[H264_RF_COUNT]; ++rf)
115 }
116 
118  const uint8_t *buffer, uint32_t size)
119 {
120  H264Context * const h = avctx->priv_data;
121  AVVDPAUContext *hwctx = avctx->hwaccel_context;
122  VdpPictureInfoH264 *info = &hwctx->info.h264;
123  Picture *pic = h->cur_pic_ptr;
124 
125  /* init VdpPictureInfoH264 */
126  info->slice_count = 0;
127  info->field_order_cnt[0] = h264_foc(pic->field_poc[0]);
128  info->field_order_cnt[1] = h264_foc(pic->field_poc[1]);
129  info->is_reference = h->nal_ref_idc != 0;
130  info->frame_num = h->frame_num;
131  info->field_pic_flag = h->picture_structure != PICT_FRAME;
132  info->bottom_field_flag = h->picture_structure == PICT_BOTTOM_FIELD;
133  info->num_ref_frames = h->sps.ref_frame_count;
134  info->mb_adaptive_frame_field_flag = h->sps.mb_aff && !info->field_pic_flag;
135  info->constrained_intra_pred_flag = h->pps.constrained_intra_pred;
136  info->weighted_pred_flag = h->pps.weighted_pred;
137  info->weighted_bipred_idc = h->pps.weighted_bipred_idc;
138  info->frame_mbs_only_flag = h->sps.frame_mbs_only_flag;
139  info->transform_8x8_mode_flag = h->pps.transform_8x8_mode;
140  info->chroma_qp_index_offset = h->pps.chroma_qp_index_offset[0];
141  info->second_chroma_qp_index_offset = h->pps.chroma_qp_index_offset[1];
142  info->pic_init_qp_minus26 = h->pps.init_qp - 26;
143  info->num_ref_idx_l0_active_minus1 = h->pps.ref_count[0] - 1;
144  info->num_ref_idx_l1_active_minus1 = h->pps.ref_count[1] - 1;
145  info->log2_max_frame_num_minus4 = h->sps.log2_max_frame_num - 4;
146  info->pic_order_cnt_type = h->sps.poc_type;
147  info->log2_max_pic_order_cnt_lsb_minus4 = h->sps.poc_type ? 0 : h->sps.log2_max_poc_lsb - 4;
148  info->delta_pic_order_always_zero_flag = h->sps.delta_pic_order_always_zero_flag;
149  info->direct_8x8_inference_flag = h->sps.direct_8x8_inference_flag;
150  info->entropy_coding_mode_flag = h->pps.cabac;
151  info->pic_order_present_flag = h->pps.pic_order_present;
152  info->deblocking_filter_control_present_flag = h->pps.deblocking_filter_parameters_present;
153  info->redundant_pic_cnt_present_flag = h->pps.redundant_pic_cnt_present;
154 
155  memcpy(info->scaling_lists_4x4, h->pps.scaling_matrix4,
156  sizeof(info->scaling_lists_4x4));
157  memcpy(info->scaling_lists_8x8[0], h->pps.scaling_matrix8[0],
158  sizeof(info->scaling_lists_8x8[0]));
159  memcpy(info->scaling_lists_8x8[1], h->pps.scaling_matrix8[3],
160  sizeof(info->scaling_lists_8x8[1]));
161 
163 
164  return ff_vdpau_common_start_frame(avctx, buffer, size);
165 }
166 
167 static const uint8_t start_code_prefix[3] = { 0x00, 0x00, 0x01 };
168 
170  const uint8_t *buffer, uint32_t size)
171 {
172  AVVDPAUContext *hwctx = avctx->hwaccel_context;
173  int val;
174 
175  val = ff_vdpau_add_buffer(avctx, start_code_prefix, 3);
176  if (val)
177  return val;
178 
179  val = ff_vdpau_add_buffer(avctx, buffer, size);
180  if (val)
181  return val;
182 
183  hwctx->info.h264.slice_count++;
184  return 0;
185 }
186 
188 {
189  AVVDPAUContext *hwctx = avctx->hwaccel_context;
190  H264Context *h = avctx->priv_data;
191  VdpVideoSurface surf = ff_vdpau_get_surface_id(h->cur_pic_ptr);
192 
193  hwctx->render(hwctx->decoder, surf, (void *)&hwctx->info,
195 
197  hwctx->bitstream_buffers_used = 0;
198 
199  return 0;
200 }
201 
203  .name = "h264_vdpau",
204  .type = AVMEDIA_TYPE_VIDEO,
205  .id = AV_CODEC_ID_H264,
206  .pix_fmt = AV_PIX_FMT_VDPAU,
207  .start_frame = vdpau_h264_start_frame,
208  .end_frame = vdpau_h264_end_frame,
209  .decode_slice = vdpau_h264_decode_slice,
210 };
#define PICT_BOTTOM_FIELD
Definition: mpegvideo.h:663
#define PICT_TOP_FIELD
Definition: mpegvideo.h:662
static void vdpau_h264_set_rf(VdpReferenceFrameH264 *rf, Picture *pic, int pic_structure)
Definition: vdpau_h264.c:49
int weighted_bipred_idc
Definition: h264.h:221
int chroma_qp_index_offset[2]
Definition: h264.h:224
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
Definition: h264.h:219
int frame_mbs_only_flag
Definition: h264.h:167
H264Context.
Definition: h264.h:260
Public libavcodec VDPAU header.
static void vdpau_h264_clear_rf(VdpReferenceFrameH264 *rf)
Definition: vdpau_h264.c:38
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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 list
int picture_structure
Definition: h264.h:382
AVHWAccel ff_h264_vdpau_hwaccel
Definition: vdpau_h264.c:202
int long_ref
1->long term reference 0->short term reference
Definition: mpegvideo.h:165
uint8_t scaling_matrix4[6][16]
Definition: h264.h:229
int deblocking_filter_parameters_present
deblocking_filter_parameters_present_flag
Definition: h264.h:225
uint8_t
union FFVdpPictureInfo info
VDPAU picture information.
Definition: vdpau.h:92
void * hwaccel_context
Hardware accelerator context.
#define PICT_FRAME
Definition: mpegvideo.h:664
VdpBitstreamBuffer * bitstream_buffers
Table of bitstream buffers.
Definition: vdpau.h:114
int cabac
entropy_coding_mode_flag
Definition: h264.h:215
static int vdpau_h264_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: vdpau_h264.c:117
VdpDecoder decoder
VDPAU decoder handle.
Definition: vdpau.h:78
int redundant_pic_cnt_present
redundant_pic_cnt_present_flag
Definition: h264.h:227
static uintptr_t ff_vdpau_get_surface_id(Picture *pic)
Extract VdpVideoSurface from a Picture.
H.264 / AVC / MPEG4 part10 codec.
static int32_t h264_foc(int foc)
Definition: vdpau_h264.c:31
int frame_num
Definition: h264.h:507
int mb_aff
mb_adaptive_frame_field_flag
Definition: h264.h:168
This structure is used to share data between the libavcodec library and the client video application...
Definition: vdpau.h:72
int poc_type
pic_order_cnt_type
Definition: h264.h:157
int constrained_intra_pred
constrained_intra_pred_flag
Definition: h264.h:226
int reference
Definition: mpegvideo.h:178
PPS pps
current pps
Definition: h264.h:365
int weighted_pred
weighted_pred_flag
Definition: h264.h:220
external API header
int delta_pic_order_always_zero_flag
Definition: h264.h:159
int size
uint8_t scaling_matrix8[6][64]
Definition: h264.h:230
MIPS optimizations info
Definition: mips.txt:2
int ref_frame_count
num_ref_frames
Definition: h264.h:163
Picture * long_ref[32]
Definition: h264.h:528
const char * name
Name of the hardware accelerated codec.
Picture.
Definition: mpegvideo.h:97
SPS sps
current sps
Definition: h264.h:360
int32_t
static int vdpau_h264_end_frame(AVCodecContext *avctx)
Definition: vdpau_h264.c:187
static void vdpau_h264_set_reference_frames(AVCodecContext *avctx)
Definition: vdpau_h264.c:66
int init_qp
pic_init_qp_minus26 + 26
Definition: h264.h:222
int frame_num
h264 frame_num (raw frame_num from slice header)
Definition: mpegvideo.h:161
int direct_8x8_inference_flag
Definition: h264.h:169
int pic_order_present
pic_order_present_flag
Definition: h264.h:216
AVCodecContext * avctx
Definition: h264.h:261
AVHWAccel.
static const uint8_t start_code_prefix[3]
Definition: vdpau_h264.c:167
main external API structure.
int ff_vdpau_add_buffer(AVCodecContext *avctx, const uint8_t *buf, uint32_t size)
Definition: vdpau.c:70
Picture * short_ref[32]
Definition: h264.h:527
#define H264_RF_COUNT
int bitstream_buffers_used
Useful bitstream buffers in the bitstream buffers table.
Definition: vdpau.h:106
synthesis window for stochastic i
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
Definition: pixfmt.h:203
VdpDecoderRender * render
VDPAU decoder render callback.
Definition: vdpau.h:85
VdpPictureInfoH264 h264
Definition: vdpau.h:57
int log2_max_poc_lsb
log2_max_pic_order_cnt_lsb_minus4
Definition: h264.h:158
void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
Definition: h264.c:147
int ff_vdpau_common_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: vdpau.c:41
int field_poc[2]
h264 top/bottom POC
Definition: mpegvideo.h:159
int transform_8x8_mode
transform_8x8_mode_flag
Definition: h264.h:228
int log2_max_frame_num
log2_max_frame_num_minus4 + 4
Definition: h264.h:156
the buffer and buffer 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 AVFilterBuffer structures They must not be accessed but through references stored in AVFilterBufferRef structures Several references can point to the same buffer
static int vdpau_h264_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: vdpau_h264.c:169
Picture * cur_pic_ptr
Definition: h264.h:273
int pic_id
h264 pic_num (short -> no wrap version of pic_num, pic_num & max_pic_num; long -> long_pic_num) ...
Definition: mpegvideo.h:163
int nal_ref_idc
Definition: h264.h:480
int short_ref_count
number of actual short term references
Definition: h264.h:543