vaapi_encode: Pass framerate parameters to driver

Only do this when building for a recent VAAPI version - initial
driver implementations were confused about the interpretation of the
framerate field, but hopefully this will be consistent everywhere
once 0.40.0 is released.

(cherry picked from commit ff35aa8ca4)
This commit is contained in:
Mark Thompson 2016-11-29 22:12:46 +00:00
parent 2201c02e6d
commit be6546a4ff
2 changed files with 22 additions and 0 deletions

View File

@ -1116,6 +1116,7 @@ static av_cold int vaapi_encode_init_rate_control(AVCodecContext *avctx)
int rc_window_size;
int hrd_buffer_size;
int hrd_initial_buffer_fullness;
int fr_num, fr_den;
if (avctx->bit_rate > INT32_MAX) {
av_log(avctx, AV_LOG_ERROR, "Target bitrate of 2^31 bps or "
@ -1172,6 +1173,23 @@ static av_cold int vaapi_encode_init_rate_control(AVCodecContext *avctx)
ctx->global_params_size[ctx->nb_global_params++] =
sizeof(ctx->hrd_params);
if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
av_reduce(&fr_num, &fr_den,
avctx->framerate.num, avctx->framerate.den, 65535);
else
av_reduce(&fr_num, &fr_den,
avctx->time_base.den, avctx->time_base.num, 65535);
ctx->fr_params.misc.type = VAEncMiscParameterTypeFrameRate;
ctx->fr_params.fr.framerate = (unsigned int)fr_den << 16 | fr_num;
#if VA_CHECK_VERSION(0, 40, 0)
ctx->global_params[ctx->nb_global_params] =
&ctx->fr_params.misc;
ctx->global_params_size[ctx->nb_global_params++] =
sizeof(ctx->fr_params);
#endif
return 0;
}

View File

@ -155,6 +155,10 @@ typedef struct VAAPIEncodeContext {
VAEncMiscParameterBuffer misc;
VAEncMiscParameterHRD hrd;
} hrd_params;
struct {
VAEncMiscParameterBuffer misc;
VAEncMiscParameterFrameRate fr;
} fr_params;
// Per-sequence parameter structure (VAEncSequenceParameterBuffer*).
void *codec_sequence_params;