Showing the changes to libavcodec/vaapi_encode.c (1 of 2 files). Show all
Unified · Split
| @@ -1387,6 +1387,51 @@ static av_cold int vaapi_encode_init_rate_control(AVCodecContext *avctx) · 1386 unmodified lines | |||
| 1387 | return 0; | 1387 | return 0; |
| 1388 | } | 1388 | } |
| 1389 | 1389 | ||
| 1390 | static av_cold int vaapi_encode_init_quality(AVCodecContext *avctx) | ||
| 1391 | { | ||
| 1392 | #if VA_CHECK_VERSION(0, 36, 0) | ||
| 1393 | VAAPIEncodeContext *ctx = avctx->priv_data; | ||
| 1394 | VAStatus vas; | ||
| 1395 | VAConfigAttrib attr = { VAConfigAttribEncQualityRange }; | ||
| 1396 | int quality = avctx->compression_level; | ||
| 1397 | |||
| 1398 | vas = vaGetConfigAttributes(ctx->hwctx->display, | ||
| 1399 | ctx->va_profile, | ||
| 1400 | ctx->va_entrypoint, | ||
| 1401 | &attr, 1); | ||
| 1402 | if (vas != VA_STATUS_SUCCESS) { | ||
| 1403 | av_log(avctx, AV_LOG_ERROR, "Failed to query quality " | ||
| 1404 | "config attribute: %d (%s).\n", vas, vaErrorStr(vas)); | ||
| 1405 | return AVERROR_EXTERNAL; | ||
| 1406 | } | ||
| 1407 | |||
| 1408 | if (attr.value == VA_ATTRIB_NOT_SUPPORTED) { | ||
| 1409 | if (quality != 0) { | ||
| 1410 | av_log(avctx, AV_LOG_WARNING, "Quality attribute is not " | ||
| 1411 | "supported: will use default quality level.\n"); | ||
| 1412 | } | ||
| 1413 | } else { | ||
| 1414 | if (quality > attr.value) { | ||
| 1415 | av_log(avctx, AV_LOG_WARNING, "Invalid quality level: " | ||
| 1416 | "valid range is 0-%d, using %d.\n", | ||
| 1417 | attr.value, attr.value); | ||
| 1418 | quality = attr.value; | ||
| 1419 | } | ||
| 1420 | |||
| 1421 | ctx->quality_params.misc.type = VAEncMiscParameterTypeQualityLevel; | ||
| 1422 | ctx->quality_params.quality.quality_level = quality; | ||
| 1423 | |||
| 1424 | vaapi_encode_add_global_param(avctx, &ctx->quality_params.misc, | ||
| 1425 | sizeof(ctx->quality_params)); | ||
| 1426 | } | ||
| 1427 | #else | ||
| 1428 | av_log(avctx, AV_LOG_WARNING, "The encode quality option is " | ||
| 1429 | "not supported with this VAAPI version.\n"); | ||
| 1430 | #endif | ||
| 1431 | |||
| 1432 | return 0; | ||
| 1433 | } | ||
| 1434 | |||
| 1390 | static void vaapi_encode_free_output_buffer(void *opaque, | 1435 | static void vaapi_encode_free_output_buffer(void *opaque, |
| 1391 | uint8_t *data) | 1436 | uint8_t *data) |
| 1392 | { | 1437 | { |
| @@ -1568,6 +1613,12 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx) · 175 unmodified lines | |||
| 1568 | if (err < 0) | 1613 | if (err < 0) |
| 1569 | goto fail; | 1614 | goto fail; |
| 1570 | 1615 | ||
| 1616 | if (avctx->compression_level >= 0) { | ||
| 1617 | err = vaapi_encode_init_quality(avctx); | ||
| 1618 | if (err < 0) | ||
| 1619 | goto fail; | ||
| 1620 | } | ||
| 1621 | |||
| 1571 | vas = vaCreateConfig(ctx->hwctx->display, | 1622 | vas = vaCreateConfig(ctx->hwctx->display, |
| 1572 | ctx->va_profile, ctx->va_entrypoint, | 1623 | ctx->va_profile, ctx->va_entrypoint, |
| 1573 | ctx->config_attributes, ctx->nb_config_attributes, | 1624 | ctx->config_attributes, ctx->nb_config_attributes, |
| @@ -1617,39 +1668,6 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx) · 43 unmodified lines | |||
| 1617 | goto fail; | 1668 | goto fail; |
| 1618 | } | 1669 | } |
| 1619 | 1670 | ||
| 1620 | if (avctx->compression_level >= 0) { | ||
| 1621 | #if VA_CHECK_VERSION(0, 36, 0) | ||
| 1622 | VAConfigAttrib attr = { VAConfigAttribEncQualityRange }; | ||
| 1623 | |||
| 1624 | vas = vaGetConfigAttributes(ctx->hwctx->display, | ||
| 1625 | ctx->va_profile, | ||
| 1626 | ctx->va_entrypoint, | ||
| 1627 | &attr, 1); | ||
| 1628 | if (vas != VA_STATUS_SUCCESS) { | ||
| 1629 | av_log(avctx, AV_LOG_WARNING, "Failed to query quality " | ||
| 1630 | "attribute: will use default compression level.\n"); | ||
| 1631 | } else { | ||
| 1632 | if (avctx->compression_level > attr.value) { | ||
| 1633 | av_log(avctx, AV_LOG_WARNING, "Invalid compression " | ||
| 1634 | "level: valid range is 0-%d, using %d.\n", | ||
| 1635 | attr.value, attr.value); | ||
| 1636 | avctx->compression_level = attr.value; | ||
| 1637 | } | ||
| 1638 | |||
| 1639 | ctx->quality_params.misc.type = | ||
| 1640 | VAEncMiscParameterTypeQualityLevel; | ||
| 1641 | ctx->quality_params.quality.quality_level = | ||
| 1642 | avctx->compression_level; | ||
| 1643 | |||
| 1644 | vaapi_encode_add_global_param(avctx, &ctx->quality_params.misc, | ||
| 1645 | sizeof(ctx->quality_params)); | ||
| 1646 | } | ||
| 1647 | #else | ||
| 1648 | av_log(avctx, AV_LOG_WARNING, "The encode compression level " | ||
| 1649 | "option is not supported with this VAAPI version.\n"); | ||
| 1650 | #endif | ||
| 1651 | } | ||
| 1652 | |||
| 1653 | ctx->input_order = 0; | 1671 | ctx->input_order = 0; |
| 1654 | ctx->output_delay = avctx->max_b_frames; | 1672 | ctx->output_delay = avctx->max_b_frames; |
| 1655 | ctx->decode_delay = 1; | 1673 | ctx->decode_delay = 1; |