mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 03:59:43 +00:00
lavc: Remove old vaapi decode infrastructure
Deprecates struct vaapi_context and the installed header vaapi.h,
to be removed at the next version bump.
(cherry picked from commit 851960f6f8
)
This commit is contained in:
parent
542a65d0b3
commit
2a4a8653b6
@ -15,6 +15,10 @@ libavutil: 2015-08-28
|
||||
|
||||
API changes, most recent first:
|
||||
|
||||
2017-01-xx - xxxxxxx - lavc 57.74.100 - vaapi.h
|
||||
Deprecate struct vaapi_context and the vaapi.h installed header.
|
||||
Callers should set AVCodecContext.hw_frames_ctx instead.
|
||||
|
||||
2017-01-12 - xxxxxxx - lavfi 6.69.100- buffersink.h
|
||||
Add av_buffersink_get_*() functions.
|
||||
|
||||
|
@ -771,7 +771,7 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER) += adpcmenc.o adpcm_data.o
|
||||
# hardware accelerators
|
||||
OBJS-$(CONFIG_D3D11VA) += dxva2.o
|
||||
OBJS-$(CONFIG_DXVA2) += dxva2.o
|
||||
OBJS-$(CONFIG_VAAPI) += vaapi.o vaapi_decode.o
|
||||
OBJS-$(CONFIG_VAAPI) += vaapi_decode.o
|
||||
OBJS-$(CONFIG_VDA) += vda.o videotoolbox.o
|
||||
OBJS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.o
|
||||
OBJS-$(CONFIG_VDPAU) += vdpau.o
|
||||
@ -1003,8 +1003,7 @@ SKIPHEADERS-$(CONFIG_QSV) += qsv.h qsv_internal.h
|
||||
SKIPHEADERS-$(CONFIG_QSVDEC) += qsvdec.h
|
||||
SKIPHEADERS-$(CONFIG_QSVENC) += qsvenc.h
|
||||
SKIPHEADERS-$(CONFIG_XVMC) += xvmc.h
|
||||
SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_decode.h vaapi_encode.h \
|
||||
vaapi_internal.h
|
||||
SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_decode.h vaapi_encode.h
|
||||
SKIPHEADERS-$(CONFIG_VDA) += vda.h vda_vt_internal.h
|
||||
SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h vdpau_internal.h
|
||||
SKIPHEADERS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.h vda_vt_internal.h
|
||||
|
@ -1,251 +0,0 @@
|
||||
/*
|
||||
* Video Acceleration API (video decoding)
|
||||
* HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1
|
||||
*
|
||||
* Copyright (C) 2008-2009 Splitted-Desktop Systems
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "libavutil/log.h"
|
||||
#include "mpegvideo.h"
|
||||
#include "vaapi_internal.h"
|
||||
|
||||
/**
|
||||
* @addtogroup VAAPI_Decoding
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
static void destroy_buffers(VADisplay display, VABufferID *buffers, unsigned int n_buffers)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < n_buffers; i++) {
|
||||
if (buffers[i] != VA_INVALID_ID) {
|
||||
vaDestroyBuffer(display, buffers[i]);
|
||||
buffers[i] = VA_INVALID_ID;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int ff_vaapi_context_init(AVCodecContext *avctx)
|
||||
{
|
||||
FFVAContext * const vactx = ff_vaapi_get_context(avctx);
|
||||
const struct vaapi_context * const user_vactx = avctx->hwaccel_context;
|
||||
|
||||
if (!user_vactx) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Hardware acceleration context (hwaccel_context) does not exist.\n");
|
||||
return AVERROR(ENOSYS);
|
||||
}
|
||||
|
||||
vactx->display = user_vactx->display;
|
||||
vactx->config_id = user_vactx->config_id;
|
||||
vactx->context_id = user_vactx->context_id;
|
||||
|
||||
vactx->pic_param_buf_id = VA_INVALID_ID;
|
||||
vactx->iq_matrix_buf_id = VA_INVALID_ID;
|
||||
vactx->bitplane_buf_id = VA_INVALID_ID;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ff_vaapi_context_fini(AVCodecContext *avctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ff_vaapi_render_picture(FFVAContext *vactx, VASurfaceID surface)
|
||||
{
|
||||
VABufferID va_buffers[3];
|
||||
unsigned int n_va_buffers = 0;
|
||||
|
||||
if (vactx->pic_param_buf_id == VA_INVALID_ID)
|
||||
return 0;
|
||||
|
||||
vaUnmapBuffer(vactx->display, vactx->pic_param_buf_id);
|
||||
va_buffers[n_va_buffers++] = vactx->pic_param_buf_id;
|
||||
|
||||
if (vactx->iq_matrix_buf_id != VA_INVALID_ID) {
|
||||
vaUnmapBuffer(vactx->display, vactx->iq_matrix_buf_id);
|
||||
va_buffers[n_va_buffers++] = vactx->iq_matrix_buf_id;
|
||||
}
|
||||
|
||||
if (vactx->bitplane_buf_id != VA_INVALID_ID) {
|
||||
vaUnmapBuffer(vactx->display, vactx->bitplane_buf_id);
|
||||
va_buffers[n_va_buffers++] = vactx->bitplane_buf_id;
|
||||
}
|
||||
|
||||
if (vaBeginPicture(vactx->display, vactx->context_id,
|
||||
surface) != VA_STATUS_SUCCESS)
|
||||
return -1;
|
||||
|
||||
if (vaRenderPicture(vactx->display, vactx->context_id,
|
||||
va_buffers, n_va_buffers) != VA_STATUS_SUCCESS)
|
||||
return -1;
|
||||
|
||||
if (vaRenderPicture(vactx->display, vactx->context_id,
|
||||
vactx->slice_buf_ids,
|
||||
vactx->n_slice_buf_ids) != VA_STATUS_SUCCESS)
|
||||
return -1;
|
||||
|
||||
if (vaEndPicture(vactx->display, vactx->context_id) != VA_STATUS_SUCCESS)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ff_vaapi_commit_slices(FFVAContext *vactx)
|
||||
{
|
||||
VABufferID *slice_buf_ids;
|
||||
VABufferID slice_param_buf_id, slice_data_buf_id;
|
||||
|
||||
if (vactx->slice_count == 0)
|
||||
return 0;
|
||||
|
||||
slice_buf_ids =
|
||||
av_fast_realloc(vactx->slice_buf_ids,
|
||||
&vactx->slice_buf_ids_alloc,
|
||||
(vactx->n_slice_buf_ids + 2) * sizeof(slice_buf_ids[0]));
|
||||
if (!slice_buf_ids)
|
||||
return -1;
|
||||
vactx->slice_buf_ids = slice_buf_ids;
|
||||
|
||||
slice_param_buf_id = VA_INVALID_ID;
|
||||
if (vaCreateBuffer(vactx->display, vactx->context_id,
|
||||
VASliceParameterBufferType,
|
||||
vactx->slice_param_size,
|
||||
vactx->slice_count, vactx->slice_params,
|
||||
&slice_param_buf_id) != VA_STATUS_SUCCESS)
|
||||
return -1;
|
||||
vactx->slice_count = 0;
|
||||
|
||||
slice_data_buf_id = VA_INVALID_ID;
|
||||
if (vaCreateBuffer(vactx->display, vactx->context_id,
|
||||
VASliceDataBufferType,
|
||||
vactx->slice_data_size,
|
||||
1, (void *)vactx->slice_data,
|
||||
&slice_data_buf_id) != VA_STATUS_SUCCESS)
|
||||
return -1;
|
||||
vactx->slice_data = NULL;
|
||||
vactx->slice_data_size = 0;
|
||||
|
||||
slice_buf_ids[vactx->n_slice_buf_ids++] = slice_param_buf_id;
|
||||
slice_buf_ids[vactx->n_slice_buf_ids++] = slice_data_buf_id;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *alloc_buffer(FFVAContext *vactx, int type, unsigned int size, uint32_t *buf_id)
|
||||
{
|
||||
void *data = NULL;
|
||||
|
||||
*buf_id = VA_INVALID_ID;
|
||||
if (vaCreateBuffer(vactx->display, vactx->context_id,
|
||||
type, size, 1, NULL, buf_id) == VA_STATUS_SUCCESS)
|
||||
vaMapBuffer(vactx->display, *buf_id, &data);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void *ff_vaapi_alloc_pic_param(FFVAContext *vactx, unsigned int size)
|
||||
{
|
||||
return alloc_buffer(vactx, VAPictureParameterBufferType, size, &vactx->pic_param_buf_id);
|
||||
}
|
||||
|
||||
void *ff_vaapi_alloc_iq_matrix(FFVAContext *vactx, unsigned int size)
|
||||
{
|
||||
return alloc_buffer(vactx, VAIQMatrixBufferType, size, &vactx->iq_matrix_buf_id);
|
||||
}
|
||||
|
||||
uint8_t *ff_vaapi_alloc_bitplane(FFVAContext *vactx, uint32_t size)
|
||||
{
|
||||
return alloc_buffer(vactx, VABitPlaneBufferType, size, &vactx->bitplane_buf_id);
|
||||
}
|
||||
|
||||
VASliceParameterBufferBase *ff_vaapi_alloc_slice(FFVAContext *vactx, const uint8_t *buffer, uint32_t size)
|
||||
{
|
||||
uint8_t *slice_params;
|
||||
VASliceParameterBufferBase *slice_param;
|
||||
|
||||
if (!vactx->slice_data)
|
||||
vactx->slice_data = buffer;
|
||||
if (vactx->slice_data + vactx->slice_data_size != buffer) {
|
||||
if (ff_vaapi_commit_slices(vactx) < 0)
|
||||
return NULL;
|
||||
vactx->slice_data = buffer;
|
||||
}
|
||||
|
||||
slice_params =
|
||||
av_fast_realloc(vactx->slice_params,
|
||||
&vactx->slice_params_alloc,
|
||||
(vactx->slice_count + 1) * vactx->slice_param_size);
|
||||
if (!slice_params)
|
||||
return NULL;
|
||||
vactx->slice_params = slice_params;
|
||||
|
||||
slice_param = (VASliceParameterBufferBase *)(slice_params + vactx->slice_count * vactx->slice_param_size);
|
||||
slice_param->slice_data_size = size;
|
||||
slice_param->slice_data_offset = vactx->slice_data_size;
|
||||
slice_param->slice_data_flag = VA_SLICE_DATA_FLAG_ALL;
|
||||
|
||||
vactx->slice_count++;
|
||||
vactx->slice_data_size += size;
|
||||
return slice_param;
|
||||
}
|
||||
|
||||
void ff_vaapi_common_end_frame(AVCodecContext *avctx)
|
||||
{
|
||||
FFVAContext * const vactx = ff_vaapi_get_context(avctx);
|
||||
|
||||
destroy_buffers(vactx->display, &vactx->pic_param_buf_id, 1);
|
||||
destroy_buffers(vactx->display, &vactx->iq_matrix_buf_id, 1);
|
||||
destroy_buffers(vactx->display, &vactx->bitplane_buf_id, 1);
|
||||
destroy_buffers(vactx->display, vactx->slice_buf_ids, vactx->n_slice_buf_ids);
|
||||
av_freep(&vactx->slice_buf_ids);
|
||||
av_freep(&vactx->slice_params);
|
||||
vactx->n_slice_buf_ids = 0;
|
||||
vactx->slice_buf_ids_alloc = 0;
|
||||
vactx->slice_count = 0;
|
||||
vactx->slice_params_alloc = 0;
|
||||
}
|
||||
|
||||
#if CONFIG_H263_VAAPI_HWACCEL || CONFIG_MPEG1_VAAPI_HWACCEL || \
|
||||
CONFIG_MPEG2_VAAPI_HWACCEL || CONFIG_MPEG4_VAAPI_HWACCEL || \
|
||||
CONFIG_VC1_VAAPI_HWACCEL || CONFIG_WMV3_VAAPI_HWACCEL
|
||||
int ff_vaapi_mpeg_end_frame(AVCodecContext *avctx)
|
||||
{
|
||||
FFVAContext * const vactx = ff_vaapi_get_context(avctx);
|
||||
MpegEncContext *s = avctx->priv_data;
|
||||
int ret;
|
||||
|
||||
ret = ff_vaapi_commit_slices(vactx);
|
||||
if (ret < 0)
|
||||
goto finish;
|
||||
|
||||
ret = ff_vaapi_render_picture(vactx,
|
||||
ff_vaapi_get_surface_id(s->current_picture_ptr->f));
|
||||
if (ret < 0)
|
||||
goto finish;
|
||||
|
||||
ff_mpeg_draw_horiz_band(s, 0, s->avctx->height);
|
||||
|
||||
finish:
|
||||
ff_vaapi_common_end_frame(avctx);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* @} */
|
@ -34,6 +34,8 @@
|
||||
#include "libavutil/attributes.h"
|
||||
#include "version.h"
|
||||
|
||||
#if FF_API_STRUCT_VAAPI_CONTEXT
|
||||
|
||||
/**
|
||||
* @defgroup lavc_codec_hwaccel_vaapi VA API Decoding
|
||||
* @ingroup lavc_codec_hwaccel
|
||||
@ -48,7 +50,10 @@
|
||||
* during initialization or through each AVCodecContext.get_buffer()
|
||||
* function call. In any case, they must be valid prior to calling
|
||||
* decoding functions.
|
||||
*
|
||||
* Deprecated: use AVCodecContext.hw_frames_ctx instead.
|
||||
*/
|
||||
attribute_deprecated
|
||||
struct vaapi_context {
|
||||
/**
|
||||
* Window system dependent data
|
||||
@ -186,4 +191,6 @@ struct vaapi_context {
|
||||
|
||||
/* @} */
|
||||
|
||||
#endif /* FF_API_STRUCT_VAAPI_CONTEXT */
|
||||
|
||||
#endif /* AVCODEC_VAAPI_H */
|
||||
|
@ -427,6 +427,7 @@ int ff_vaapi_decode_init(AVCodecContext *avctx)
|
||||
ctx->va_config = VA_INVALID_ID;
|
||||
ctx->va_context = VA_INVALID_ID;
|
||||
|
||||
#if FF_API_STRUCT_VAAPI_CONTEXT
|
||||
if (avctx->hwaccel_context) {
|
||||
av_log(avctx, AV_LOG_WARNING, "Using deprecated struct "
|
||||
"vaapi_context in decode.\n");
|
||||
@ -453,7 +454,9 @@ int ff_vaapi_decode_init(AVCodecContext *avctx)
|
||||
ctx->hwctx->driver_quirks =
|
||||
AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS;
|
||||
|
||||
} else if (avctx->hw_frames_ctx) {
|
||||
} else
|
||||
#endif
|
||||
if (avctx->hw_frames_ctx) {
|
||||
// This structure has a shorter lifetime than the enclosing
|
||||
// AVCodecContext, so we inherit the references from there
|
||||
// and do not need to make separate ones.
|
||||
@ -471,6 +474,7 @@ int ff_vaapi_decode_init(AVCodecContext *avctx)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
#if FF_API_STRUCT_VAAPI_CONTEXT
|
||||
if (ctx->have_old_context) {
|
||||
ctx->va_config = ctx->old_context->config_id;
|
||||
ctx->va_context = ctx->old_context->context_id;
|
||||
@ -478,27 +482,31 @@ int ff_vaapi_decode_init(AVCodecContext *avctx)
|
||||
av_log(avctx, AV_LOG_DEBUG, "Using user-supplied decoder "
|
||||
"context: %#x/%#x.\n", ctx->va_config, ctx->va_context);
|
||||
} else {
|
||||
err = vaapi_decode_make_config(avctx);
|
||||
if (err)
|
||||
goto fail;
|
||||
#endif
|
||||
|
||||
vas = vaCreateContext(ctx->hwctx->display, ctx->va_config,
|
||||
avctx->coded_width, avctx->coded_height,
|
||||
VA_PROGRESSIVE,
|
||||
ctx->hwfc->surface_ids,
|
||||
ctx->hwfc->nb_surfaces,
|
||||
&ctx->va_context);
|
||||
if (vas != VA_STATUS_SUCCESS) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Failed to create decode "
|
||||
"context: %d (%s).\n", vas, vaErrorStr(vas));
|
||||
err = AVERROR(EIO);
|
||||
goto fail;
|
||||
}
|
||||
err = vaapi_decode_make_config(avctx);
|
||||
if (err)
|
||||
goto fail;
|
||||
|
||||
av_log(avctx, AV_LOG_DEBUG, "Decode context initialised: "
|
||||
"%#x/%#x.\n", ctx->va_config, ctx->va_context);
|
||||
vas = vaCreateContext(ctx->hwctx->display, ctx->va_config,
|
||||
avctx->coded_width, avctx->coded_height,
|
||||
VA_PROGRESSIVE,
|
||||
ctx->hwfc->surface_ids,
|
||||
ctx->hwfc->nb_surfaces,
|
||||
&ctx->va_context);
|
||||
if (vas != VA_STATUS_SUCCESS) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Failed to create decode "
|
||||
"context: %d (%s).\n", vas, vaErrorStr(vas));
|
||||
err = AVERROR(EIO);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
av_log(avctx, AV_LOG_DEBUG, "Decode context initialised: "
|
||||
"%#x/%#x.\n", ctx->va_config, ctx->va_context);
|
||||
#if FF_API_STRUCT_VAAPI_CONTEXT
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
@ -511,26 +519,32 @@ int ff_vaapi_decode_uninit(AVCodecContext *avctx)
|
||||
VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data;
|
||||
VAStatus vas;
|
||||
|
||||
#if FF_API_STRUCT_VAAPI_CONTEXT
|
||||
if (ctx->have_old_context) {
|
||||
av_buffer_unref(&ctx->device_ref);
|
||||
} else {
|
||||
if (ctx->va_context != VA_INVALID_ID) {
|
||||
vas = vaDestroyContext(ctx->hwctx->display, ctx->va_context);
|
||||
if (vas != VA_STATUS_SUCCESS) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Failed to destroy decode "
|
||||
"context %#x: %d (%s).\n",
|
||||
ctx->va_context, vas, vaErrorStr(vas));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ctx->va_context != VA_INVALID_ID) {
|
||||
vas = vaDestroyContext(ctx->hwctx->display, ctx->va_context);
|
||||
if (vas != VA_STATUS_SUCCESS) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Failed to destroy decode "
|
||||
"context %#x: %d (%s).\n",
|
||||
ctx->va_context, vas, vaErrorStr(vas));
|
||||
}
|
||||
if (ctx->va_config != VA_INVALID_ID) {
|
||||
vas = vaDestroyConfig(ctx->hwctx->display, ctx->va_config);
|
||||
if (vas != VA_STATUS_SUCCESS) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Failed to destroy decode "
|
||||
"configuration %#x: %d (%s).\n",
|
||||
ctx->va_config, vas, vaErrorStr(vas));
|
||||
}
|
||||
}
|
||||
if (ctx->va_config != VA_INVALID_ID) {
|
||||
vas = vaDestroyConfig(ctx->hwctx->display, ctx->va_config);
|
||||
if (vas != VA_STATUS_SUCCESS) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Failed to destroy decode "
|
||||
"configuration %#x: %d (%s).\n",
|
||||
ctx->va_config, vas, vaErrorStr(vas));
|
||||
}
|
||||
}
|
||||
|
||||
#if FF_API_STRUCT_VAAPI_CONTEXT
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -26,7 +26,11 @@
|
||||
#include "libavutil/hwcontext_vaapi.h"
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
#include "version.h"
|
||||
#if FF_API_STRUCT_VAAPI_CONTEXT
|
||||
#include "vaapi.h"
|
||||
#endif
|
||||
|
||||
static inline VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic)
|
||||
{
|
||||
@ -54,9 +58,11 @@ typedef struct VAAPIDecodeContext {
|
||||
VAConfigID va_config;
|
||||
VAContextID va_context;
|
||||
|
||||
#if FF_API_STRUCT_VAAPI_CONTEXT
|
||||
int have_old_context;
|
||||
struct vaapi_context *old_context;
|
||||
AVBufferRef *device_ref;
|
||||
#endif
|
||||
|
||||
AVHWDeviceContext *device;
|
||||
AVVAAPIDeviceContext *hwctx;
|
||||
|
@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Video Acceleration API (video decoding)
|
||||
* HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1
|
||||
*
|
||||
* Copyright (C) 2008-2009 Splitted-Desktop Systems
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_VAAPI_INTERNAL_H
|
||||
#define AVCODEC_VAAPI_INTERNAL_H
|
||||
|
||||
#include <va/va.h>
|
||||
#include "vaapi.h"
|
||||
#include "avcodec.h"
|
||||
#include "internal.h"
|
||||
|
||||
/**
|
||||
* @addtogroup VAAPI_Decoding
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
VADisplay display; ///< Windowing system dependent handle
|
||||
VAConfigID config_id; ///< Configuration ID
|
||||
VAContextID context_id; ///< Context ID (video decode pipeline)
|
||||
VABufferID pic_param_buf_id; ///< Picture parameter buffer
|
||||
VABufferID iq_matrix_buf_id; ///< Inverse quantiser matrix buffer
|
||||
VABufferID bitplane_buf_id; ///< Bitplane buffer (for VC-1 decoding)
|
||||
VABufferID *slice_buf_ids; ///< Slice parameter/data buffers
|
||||
unsigned int n_slice_buf_ids; ///< Number of effective slice buffers
|
||||
unsigned int slice_buf_ids_alloc; ///< Number of allocated slice buffers
|
||||
void *slice_params; ///< Pointer to slice parameter buffers
|
||||
unsigned int slice_param_size; ///< Size of a slice parameter element
|
||||
unsigned int slice_params_alloc; ///< Number of allocated slice parameters
|
||||
unsigned int slice_count; ///< Number of slices currently filled in
|
||||
const uint8_t *slice_data; ///< Pointer to slice data buffer base
|
||||
unsigned int slice_data_size; ///< Current size of slice data
|
||||
} FFVAContext;
|
||||
|
||||
/** Extract vaapi_context from an AVCodecContext */
|
||||
static inline FFVAContext *ff_vaapi_get_context(AVCodecContext *avctx)
|
||||
{
|
||||
return avctx->internal->hwaccel_priv_data;
|
||||
}
|
||||
|
||||
/** Extract VASurfaceID from an AVFrame */
|
||||
static inline VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic)
|
||||
{
|
||||
return (uintptr_t)pic->data[3];
|
||||
}
|
||||
|
||||
/** Common AVHWAccel.init() implementation */
|
||||
int ff_vaapi_context_init(AVCodecContext *avctx);
|
||||
|
||||
/** Common AVHWAccel.uninit() implementation */
|
||||
int ff_vaapi_context_fini(AVCodecContext *avctx);
|
||||
|
||||
/** Common AVHWAccel.end_frame() implementation */
|
||||
void ff_vaapi_common_end_frame(AVCodecContext *avctx);
|
||||
|
||||
/** Allocate a new picture parameter buffer */
|
||||
void *ff_vaapi_alloc_pic_param(FFVAContext *vactx, unsigned int size);
|
||||
|
||||
/** Allocate a new IQ matrix buffer */
|
||||
void *ff_vaapi_alloc_iq_matrix(FFVAContext *vactx, unsigned int size);
|
||||
|
||||
/** Allocate a new bit-plane buffer */
|
||||
uint8_t *ff_vaapi_alloc_bitplane(FFVAContext *vactx, uint32_t size);
|
||||
|
||||
/**
|
||||
* Allocate a new slice descriptor for the input slice.
|
||||
*
|
||||
* @param vactx the VA API context
|
||||
* @param buffer the slice data buffer base
|
||||
* @param size the size of the slice in bytes
|
||||
* @return the newly allocated slice parameter
|
||||
*/
|
||||
VASliceParameterBufferBase *ff_vaapi_alloc_slice(FFVAContext *vactx, const uint8_t *buffer, uint32_t size);
|
||||
|
||||
int ff_vaapi_mpeg_end_frame(AVCodecContext *avctx);
|
||||
int ff_vaapi_commit_slices(FFVAContext *vactx);
|
||||
int ff_vaapi_render_picture(FFVAContext *vactx, VASurfaceID surface);
|
||||
|
||||
/* @} */
|
||||
|
||||
#endif /* AVCODEC_VAAPI_INTERNAL_H */
|
@ -28,7 +28,7 @@
|
||||
#include "libavutil/version.h"
|
||||
|
||||
#define LIBAVCODEC_VERSION_MAJOR 57
|
||||
#define LIBAVCODEC_VERSION_MINOR 73
|
||||
#define LIBAVCODEC_VERSION_MINOR 74
|
||||
#define LIBAVCODEC_VERSION_MICRO 100
|
||||
|
||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||
@ -226,5 +226,8 @@
|
||||
#ifndef FF_API_NVENC_OLD_NAME
|
||||
#define FF_API_NVENC_OLD_NAME (LIBAVCODEC_VERSION_MAJOR < 59)
|
||||
#endif
|
||||
#ifndef FF_API_STRUCT_VAAPI_CONTEXT
|
||||
#define FF_API_STRUCT_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59)
|
||||
#endif
|
||||
|
||||
#endif /* AVCODEC_VERSION_H */
|
||||
|
Loading…
Reference in New Issue
Block a user