mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
lavc/vaapi_encode: Change the slice/parameter buffers to dynamic alloc.
Change the slice/parameter buffers to be allocated dynamically. Signed-off-by: Wang, Yi A <yi.a.wang@intel.com> Signed-off-by: Jun Zhao <jun.zhao@intel.com> Signed-off-by: Mark Thompson <sw@jkqxz.net>
This commit is contained in:
parent
385cafb07a
commit
e4a6eb70f4
@ -36,13 +36,17 @@ static int vaapi_encode_make_packed_header(AVCodecContext *avctx,
|
||||
VAAPIEncodeContext *ctx = avctx->priv_data;
|
||||
VAStatus vas;
|
||||
VABufferID param_buffer, data_buffer;
|
||||
VABufferID *tmp;
|
||||
VAEncPackedHeaderParameterBuffer params = {
|
||||
.type = type,
|
||||
.bit_length = bit_len,
|
||||
.has_emulation_bytes = 1,
|
||||
};
|
||||
|
||||
av_assert0(pic->nb_param_buffers + 2 <= MAX_PARAM_BUFFERS);
|
||||
tmp = av_realloc_array(pic->param_buffers, sizeof(*tmp), pic->nb_param_buffers + 2);
|
||||
if (!tmp)
|
||||
return AVERROR(ENOMEM);
|
||||
pic->param_buffers = tmp;
|
||||
|
||||
vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context,
|
||||
VAEncPackedHeaderParameterBufferType,
|
||||
@ -77,9 +81,13 @@ static int vaapi_encode_make_param_buffer(AVCodecContext *avctx,
|
||||
{
|
||||
VAAPIEncodeContext *ctx = avctx->priv_data;
|
||||
VAStatus vas;
|
||||
VABufferID *tmp;
|
||||
VABufferID buffer;
|
||||
|
||||
av_assert0(pic->nb_param_buffers + 1 <= MAX_PARAM_BUFFERS);
|
||||
tmp = av_realloc_array(pic->param_buffers, sizeof(*tmp), pic->nb_param_buffers + 1);
|
||||
if (!tmp)
|
||||
return AVERROR(ENOMEM);
|
||||
pic->param_buffers = tmp;
|
||||
|
||||
vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context,
|
||||
type, len, 1, data, &buffer);
|
||||
@ -313,15 +321,14 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
|
||||
}
|
||||
}
|
||||
|
||||
av_assert0(pic->nb_slices <= MAX_PICTURE_SLICES);
|
||||
pic->slices = av_mallocz_array(pic->nb_slices, sizeof(*pic->slices));
|
||||
if (!pic->slices) {
|
||||
err = AVERROR(ENOMEM);
|
||||
goto fail;
|
||||
}
|
||||
for (i = 0; i < pic->nb_slices; i++) {
|
||||
slice = av_mallocz(sizeof(*slice));
|
||||
if (!slice) {
|
||||
err = AVERROR(ENOMEM);
|
||||
goto fail;
|
||||
}
|
||||
slice = &pic->slices[i];
|
||||
slice->index = i;
|
||||
pic->slices[i] = slice;
|
||||
|
||||
if (ctx->codec->slice_params_size > 0) {
|
||||
slice->codec_slice_params = av_mallocz(ctx->codec->slice_params_size);
|
||||
@ -425,8 +432,16 @@ fail_with_picture:
|
||||
fail:
|
||||
for(i = 0; i < pic->nb_param_buffers; i++)
|
||||
vaDestroyBuffer(ctx->hwctx->display, pic->param_buffers[i]);
|
||||
for (i = 0; i < pic->nb_slices; i++) {
|
||||
if (pic->slices) {
|
||||
av_freep(&pic->slices[i].priv_data);
|
||||
av_freep(&pic->slices[i].codec_slice_params);
|
||||
}
|
||||
}
|
||||
fail_at_end:
|
||||
av_freep(&pic->codec_picture_params);
|
||||
av_freep(&pic->param_buffers);
|
||||
av_freep(&pic->slices);
|
||||
av_frame_free(&pic->recon_image);
|
||||
av_buffer_unref(&pic->output_buffer_ref);
|
||||
pic->output_buffer = VA_INVALID_ID;
|
||||
@ -535,15 +550,18 @@ static int vaapi_encode_free(AVCodecContext *avctx,
|
||||
vaapi_encode_discard(avctx, pic);
|
||||
|
||||
for (i = 0; i < pic->nb_slices; i++) {
|
||||
av_freep(&pic->slices[i]->priv_data);
|
||||
av_freep(&pic->slices[i]->codec_slice_params);
|
||||
av_freep(&pic->slices[i]);
|
||||
if (pic->slices) {
|
||||
av_freep(&pic->slices[i].priv_data);
|
||||
av_freep(&pic->slices[i].codec_slice_params);
|
||||
}
|
||||
}
|
||||
av_freep(&pic->codec_picture_params);
|
||||
|
||||
av_frame_free(&pic->input_image);
|
||||
av_frame_free(&pic->recon_image);
|
||||
|
||||
av_freep(&pic->param_buffers);
|
||||
av_freep(&pic->slices);
|
||||
// Output buffer should already be destroyed.
|
||||
av_assert0(pic->output_buffer == VA_INVALID_ID);
|
||||
|
||||
|
@ -35,8 +35,6 @@ enum {
|
||||
MAX_CONFIG_ATTRIBUTES = 4,
|
||||
MAX_GLOBAL_PARAMS = 4,
|
||||
MAX_PICTURE_REFERENCES = 2,
|
||||
MAX_PICTURE_SLICES = 112,
|
||||
MAX_PARAM_BUFFERS = 128,
|
||||
MAX_REORDER_DELAY = 16,
|
||||
MAX_PARAM_BUFFER_SIZE = 1024,
|
||||
};
|
||||
@ -73,7 +71,7 @@ typedef struct VAAPIEncodePicture {
|
||||
VASurfaceID recon_surface;
|
||||
|
||||
int nb_param_buffers;
|
||||
VABufferID param_buffers[MAX_PARAM_BUFFERS];
|
||||
VABufferID *param_buffers;
|
||||
|
||||
AVBufferRef *output_buffer_ref;
|
||||
VABufferID output_buffer;
|
||||
@ -85,7 +83,7 @@ typedef struct VAAPIEncodePicture {
|
||||
struct VAAPIEncodePicture *refs[MAX_PICTURE_REFERENCES];
|
||||
|
||||
int nb_slices;
|
||||
VAAPIEncodeSlice *slices[MAX_PICTURE_SLICES];
|
||||
VAAPIEncodeSlice *slices;
|
||||
} VAAPIEncodePicture;
|
||||
|
||||
typedef struct VAAPIEncodeContext {
|
||||
|
Loading…
Reference in New Issue
Block a user