avcodec/vaapi_encode_vp9: fix > 4k encode fail issue
This patch will fix following command: ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i input.264 \ -vf 'scale_vaapi=w=7680:h=4096' -c:v vp9_vaapi output.ivf Max width of a vp9 tile is 4096. If the source frame > 4096, we need split to multiple tiles. Reviewed-by: Limin Wang <lance.lmwang@gmail.com> Signed-off-by: Zhang yuankun <yuankunx.zhang@intel.com> Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
This commit is contained in:
committed by
Haihao Xiang
parent
dd7c0bc4f9
commit
db901276c0
@@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#define VP9_MAX_QUANT 255
|
#define VP9_MAX_QUANT 255
|
||||||
|
|
||||||
|
#define VP9_MAX_TILE_WIDTH 4096
|
||||||
|
|
||||||
typedef struct VAAPIEncodeVP9Picture {
|
typedef struct VAAPIEncodeVP9Picture {
|
||||||
int slot;
|
int slot;
|
||||||
@@ -82,10 +83,17 @@ static int vaapi_encode_vp9_init_picture_params(AVCodecContext *avctx,
|
|||||||
VAAPIEncodeVP9Picture *hpic = pic->priv_data;
|
VAAPIEncodeVP9Picture *hpic = pic->priv_data;
|
||||||
VAEncPictureParameterBufferVP9 *vpic = pic->codec_picture_params;
|
VAEncPictureParameterBufferVP9 *vpic = pic->codec_picture_params;
|
||||||
int i;
|
int i;
|
||||||
|
int num_tile_columns;
|
||||||
|
|
||||||
vpic->reconstructed_frame = pic->recon_surface;
|
vpic->reconstructed_frame = pic->recon_surface;
|
||||||
vpic->coded_buf = pic->output_buffer;
|
vpic->coded_buf = pic->output_buffer;
|
||||||
|
|
||||||
|
// Maximum width of a tile in units of superblocks is MAX_TILE_WIDTH_B64(64)
|
||||||
|
// So the number of tile columns is related to the width of the picture.
|
||||||
|
// We set the minimum possible number for num_tile_columns as default value.
|
||||||
|
num_tile_columns = (vpic->frame_width_src + VP9_MAX_TILE_WIDTH - 1) / VP9_MAX_TILE_WIDTH;
|
||||||
|
vpic->log2_tile_columns = num_tile_columns == 1 ? 0 : av_log2(num_tile_columns - 1) + 1;
|
||||||
|
|
||||||
switch (pic->type) {
|
switch (pic->type) {
|
||||||
case PICTURE_TYPE_IDR:
|
case PICTURE_TYPE_IDR:
|
||||||
av_assert0(pic->nb_refs == 0);
|
av_assert0(pic->nb_refs == 0);
|
||||||
|
Reference in New Issue
Block a user