You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
lavc/vaapi_encode_h265: add h265 tile encoding support
Default to enable uniform_spacing_flag. Guess level by the tile rows/cols. Supported for ICL+ platforms. Also add documentations. To encode with 4 rows 2 columns: ffmpeg ... -c:v hevc_vaapi -tiles 4x2 ... ffmpeg ... -c:v hevc_vaapi -tile_rows 4 -tile_cols 2 ... Suggested-by: Jun Zhao <mypopydev@gmail.com> Signed-off-by: Linjie Fu <linjie.justin.fu@gmail.com>
This commit is contained in:
@@ -3145,6 +3145,19 @@ Include HDR metadata if the input frames have it
|
|||||||
messages).
|
messages).
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@item tiles
|
||||||
|
Set the number of tiles to encode the input video with, as rows x columns.
|
||||||
|
Larger numbers allow greater parallelism in both encoding and decoding, but
|
||||||
|
may decrease coding efficiency.
|
||||||
|
|
||||||
|
@item tile_rows
|
||||||
|
Selects how many rows of tiles to encode with. For example, 4 tile rows would
|
||||||
|
be requested by setting the tile_rows option to 4.
|
||||||
|
|
||||||
|
@item tile_cols
|
||||||
|
Selects how many columns of tiles to encode with. For example, 5 tile columns
|
||||||
|
would be requested by setting the tile_cols option to 5.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item mjpeg_vaapi
|
@item mjpeg_vaapi
|
||||||
|
@@ -63,6 +63,9 @@ typedef struct VAAPIEncodeH265Context {
|
|||||||
int level;
|
int level;
|
||||||
int sei;
|
int sei;
|
||||||
|
|
||||||
|
int trows;
|
||||||
|
int tcols;
|
||||||
|
|
||||||
// Derived settings.
|
// Derived settings.
|
||||||
int fixed_qp_idr;
|
int fixed_qp_idr;
|
||||||
int fixed_qp_p;
|
int fixed_qp_p;
|
||||||
@@ -344,7 +347,7 @@ static int vaapi_encode_h265_init_sequence_params(AVCodecContext *avctx)
|
|||||||
|
|
||||||
level = ff_h265_guess_level(ptl, avctx->bit_rate,
|
level = ff_h265_guess_level(ptl, avctx->bit_rate,
|
||||||
ctx->surface_width, ctx->surface_height,
|
ctx->surface_width, ctx->surface_height,
|
||||||
ctx->nb_slices, 1, 1,
|
ctx->nb_slices, ctx->tile_rows, ctx->tile_cols,
|
||||||
(ctx->b_per_p > 0) + 1);
|
(ctx->b_per_p > 0) + 1);
|
||||||
if (level) {
|
if (level) {
|
||||||
av_log(avctx, AV_LOG_VERBOSE, "Using level %s.\n", level->name);
|
av_log(avctx, AV_LOG_VERBOSE, "Using level %s.\n", level->name);
|
||||||
@@ -557,6 +560,20 @@ static int vaapi_encode_h265_init_sequence_params(AVCodecContext *avctx)
|
|||||||
|
|
||||||
pps->pps_loop_filter_across_slices_enabled_flag = 1;
|
pps->pps_loop_filter_across_slices_enabled_flag = 1;
|
||||||
|
|
||||||
|
if (ctx->tile_rows && ctx->tile_cols) {
|
||||||
|
pps->tiles_enabled_flag = 1;
|
||||||
|
pps->uniform_spacing_flag = 1;
|
||||||
|
|
||||||
|
pps->num_tile_rows_minus1 = ctx->tile_rows - 1;
|
||||||
|
pps->num_tile_columns_minus1 = ctx->tile_cols - 1;
|
||||||
|
|
||||||
|
pps->loop_filter_across_tiles_enabled_flag = 1;
|
||||||
|
|
||||||
|
for (i = 0; i <= pps->num_tile_rows_minus1; i++)
|
||||||
|
pps->row_height_minus1[i] = ctx->row_height[i] - 1;
|
||||||
|
for (i = 0; i <= pps->num_tile_columns_minus1; i++)
|
||||||
|
pps->column_width_minus1[i] = ctx->col_width[i] - 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Fill VAAPI parameter buffers.
|
// Fill VAAPI parameter buffers.
|
||||||
|
|
||||||
@@ -665,6 +682,13 @@ static int vaapi_encode_h265_init_sequence_params(AVCodecContext *avctx)
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (pps->tiles_enabled_flag) {
|
||||||
|
for (i = 0; i <= vpic->num_tile_rows_minus1; i++)
|
||||||
|
vpic->row_height_minus1[i] = pps->row_height_minus1[i];
|
||||||
|
for (i = 0; i <= vpic->num_tile_columns_minus1; i++)
|
||||||
|
vpic->column_width_minus1[i] = pps->column_width_minus1[i];
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1180,6 +1204,11 @@ static av_cold int vaapi_encode_h265_init(AVCodecContext *avctx)
|
|||||||
if (priv->qp > 0)
|
if (priv->qp > 0)
|
||||||
ctx->explicit_qp = priv->qp;
|
ctx->explicit_qp = priv->qp;
|
||||||
|
|
||||||
|
if (priv->trows && priv->tcols) {
|
||||||
|
ctx->tile_rows = priv->trows;
|
||||||
|
ctx->tile_cols = priv->tcols;
|
||||||
|
}
|
||||||
|
|
||||||
return ff_vaapi_encode_init(avctx);
|
return ff_vaapi_encode_init(avctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1256,6 +1285,13 @@ static const AVOption vaapi_encode_h265_options[] = {
|
|||||||
{ .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVEL },
|
{ .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVEL },
|
||||||
INT_MIN, INT_MAX, FLAGS, "sei" },
|
INT_MIN, INT_MAX, FLAGS, "sei" },
|
||||||
|
|
||||||
|
{ "tiles", "Tile rows x cols",
|
||||||
|
OFFSET(trows), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, FLAGS },
|
||||||
|
{ "tile_rows", "Number of rows for tile encoding",
|
||||||
|
OFFSET(trows), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
|
||||||
|
{ "tile_cols", "Number of cols for tile encoding",
|
||||||
|
OFFSET(tcols), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
|
||||||
|
|
||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user