#include <vdpau/vdpau.h>
#include "avcodec.h"
+#include "internal.h"
#include "h264.h"
#include "mpegutils.h"
#include "vdpau.h"
static void vdpau_h264_set_rf(VdpReferenceFrameH264 *rf, H264Picture *pic,
int pic_structure)
{
- VdpVideoSurface surface = ff_vdpau_get_surface_id(pic);
+ VdpVideoSurface surface = ff_vdpau_get_surface_id(&pic->f);
if (pic_structure == 0)
pic_structure = pic->reference;
if (!pic || !pic->reference)
continue;
pic_frame_idx = pic->long_ref ? pic->pic_id : pic->frame_num;
- surface_ref = ff_vdpau_get_surface_id(pic);
+ surface_ref = ff_vdpau_get_surface_id(&pic->f);
rf2 = &info->referenceFrames[0];
while (rf2 != rf) {
vdpau_h264_set_reference_frames(avctx);
- return ff_vdpau_common_start_frame(pic, buffer, size);
+ return ff_vdpau_common_start_frame(pic_ctx, buffer, size);
}
static const uint8_t start_code_prefix[3] = { 0x00, 0x00, 0x01 };
struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private;
int val;
- val = ff_vdpau_add_buffer(pic, start_code_prefix, 3);
+ val = ff_vdpau_add_buffer(pic_ctx, start_code_prefix, 3);
if (val)
return val;
- val = ff_vdpau_add_buffer(pic, buffer, size);
+ val = ff_vdpau_add_buffer(pic_ctx, buffer, size);
if (val)
return val;
static int vdpau_h264_end_frame(AVCodecContext *avctx)
{
- AVVDPAUContext *hwctx = avctx->hwaccel_context;
H264Context *h = avctx->priv_data;
H264Picture *pic = h->cur_pic_ptr;
struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private;
- VdpVideoSurface surf = ff_vdpau_get_surface_id(pic);
+ int val;
- hwctx->render(hwctx->decoder, surf, (void *)&pic_ctx->info,
- pic_ctx->bitstream_buffers_used, pic_ctx->bitstream_buffers);
+ val = ff_vdpau_common_end_frame(avctx, &pic->f, pic_ctx);
+ if (val < 0)
+ return val;
ff_h264_draw_horiz_band(h, 0, h->avctx->height);
- av_freep(&pic_ctx->bitstream_buffers);
-
return 0;
}
+static int vdpau_h264_init(AVCodecContext *avctx)
+{
+ VdpDecoderProfile profile;
+ uint32_t level = avctx->level;
+
+ switch (avctx->profile & ~FF_PROFILE_H264_INTRA) {
+ case FF_PROFILE_H264_BASELINE:
+ profile = VDP_DECODER_PROFILE_H264_BASELINE;
+ break;
+ case FF_PROFILE_H264_CONSTRAINED_BASELINE:
+ case FF_PROFILE_H264_MAIN:
+ profile = VDP_DECODER_PROFILE_H264_MAIN;
+ break;
+ case FF_PROFILE_H264_HIGH:
+ profile = VDP_DECODER_PROFILE_H264_HIGH;
+ break;
+ default:
+ return AVERROR(ENOTSUP);
+ }
+
+ if ((avctx->profile & FF_PROFILE_H264_INTRA) && avctx->level == 11)
+ level = VDP_DECODER_LEVEL_H264_1b;
+
+ return ff_vdpau_common_init(avctx, profile, level);
+}
+
AVHWAccel ff_h264_vdpau_hwaccel = {
.name = "h264_vdpau",
.type = AVMEDIA_TYPE_VIDEO,
.start_frame = vdpau_h264_start_frame,
.end_frame = vdpau_h264_end_frame,
.decode_slice = vdpau_h264_decode_slice,
- .priv_data_size = sizeof(struct vdpau_picture_context),
+ .frame_priv_data_size = sizeof(struct vdpau_picture_context),
+ .init = vdpau_h264_init,
+ .uninit = ff_vdpau_common_uninit,
+ .priv_data_size = sizeof(VDPAUContext),
};