ffmpeg: add vdpau_old to allow continued testing of the older (but not oldest) API
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
573d333010
commit
403133ab5e
1
ffmpeg.h
1
ffmpeg.h
@ -490,6 +490,7 @@ extern int stdin_interaction;
|
|||||||
extern int frame_bits_per_raw_sample;
|
extern int frame_bits_per_raw_sample;
|
||||||
extern AVIOContext *progress_avio;
|
extern AVIOContext *progress_avio;
|
||||||
extern float max_error_rate;
|
extern float max_error_rate;
|
||||||
|
extern int vdpau_api_ver;
|
||||||
|
|
||||||
extern const AVIOInterruptCB int_cb;
|
extern const AVIOInterruptCB int_cb;
|
||||||
|
|
||||||
|
@ -2984,6 +2984,9 @@ const OptionDef options[] = {
|
|||||||
{ "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
|
{ "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
|
||||||
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
|
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
|
||||||
"select a device for HW acceleration" "devicename" },
|
"select a device for HW acceleration" "devicename" },
|
||||||
|
#if HAVE_VDPAU_X11
|
||||||
|
{ "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
|
||||||
|
#endif
|
||||||
|
|
||||||
/* audio options */
|
/* audio options */
|
||||||
{ "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
|
{ "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
|
||||||
|
@ -57,6 +57,8 @@ typedef struct VDPAUContext {
|
|||||||
VdpYCbCrFormat vdpau_format;
|
VdpYCbCrFormat vdpau_format;
|
||||||
} VDPAUContext;
|
} VDPAUContext;
|
||||||
|
|
||||||
|
int vdpau_api_ver = 2;
|
||||||
|
|
||||||
static void vdpau_uninit(AVCodecContext *s)
|
static void vdpau_uninit(AVCodecContext *s)
|
||||||
{
|
{
|
||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
@ -291,7 +293,7 @@ fail:
|
|||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int vdpau_init(AVCodecContext *s)
|
static int vdpau_old_init(AVCodecContext *s)
|
||||||
{
|
{
|
||||||
InputStream *ist = s->opaque;
|
InputStream *ist = s->opaque;
|
||||||
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
||||||
@ -333,3 +335,49 @@ int vdpau_init(AVCodecContext *s)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int vdpau_init(AVCodecContext *s)
|
||||||
|
{
|
||||||
|
InputStream *ist = s->opaque;
|
||||||
|
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
||||||
|
AVVDPAUContext *vdpau_ctx;
|
||||||
|
VDPAUContext *ctx;
|
||||||
|
VdpStatus err;
|
||||||
|
int profile, ret;
|
||||||
|
|
||||||
|
if (vdpau_api_ver == 1)
|
||||||
|
return vdpau_old_init(s);
|
||||||
|
|
||||||
|
if (!ist->hwaccel_ctx) {
|
||||||
|
ret = vdpau_alloc(s);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
ctx = ist->hwaccel_ctx;
|
||||||
|
vdpau_ctx = s->hwaccel_context;
|
||||||
|
|
||||||
|
ret = av_vdpau_get_profile(s, &profile);
|
||||||
|
if (ret < 0) {
|
||||||
|
av_log(NULL, loglevel, "No known VDPAU decoder profile for this stream.\n");
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx->decoder)
|
||||||
|
ctx->decoder_destroy(ctx->decoder);
|
||||||
|
|
||||||
|
err = ctx->decoder_create(ctx->device, profile,
|
||||||
|
s->coded_width, s->coded_height,
|
||||||
|
16, &ctx->decoder);
|
||||||
|
if (err != VDP_STATUS_OK) {
|
||||||
|
av_log(NULL, loglevel, "Error creating the VDPAU decoder: %s\n",
|
||||||
|
ctx->get_error_string(err));
|
||||||
|
return AVERROR_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
vdpau_ctx->decoder = ctx->decoder;
|
||||||
|
|
||||||
|
ist->hwaccel_get_buffer = vdpau_get_buffer;
|
||||||
|
ist->hwaccel_retrieve_data = vdpau_retrieve_data;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user