va: encoder: Use GstVaEncFrame as the base object for all Enc Frame

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4359>
This commit is contained in:
He Junyan 2023-04-06 19:33:02 +08:00 committed by Víctor Manuel Jáquez Leal
parent 210487b50a
commit 933a155b1a
5 changed files with 130 additions and 103 deletions

View File

@ -161,7 +161,7 @@ struct _GstVaAV1Ref
struct _GstVaAV1EncFrame struct _GstVaAV1EncFrame
{ {
GstVaEncodePicture *picture; GstVaEncFrame base;
GstAV1FrameType type; GstAV1FrameType type;
guint8 temporal_id; guint8 temporal_id;
guint8 spatial_id; guint8 spatial_id;
@ -507,7 +507,7 @@ gst_va_av1_enc_frame_new (void)
frame->type = FRAME_TYPE_INVALID; frame->type = FRAME_TYPE_INVALID;
frame->temporal_id = 0; frame->temporal_id = 0;
frame->spatial_id = 0; frame->spatial_id = 0;
frame->picture = NULL; frame->base.picture = NULL;
frame->pyramid_level = 0; frame->pyramid_level = 0;
frame->flags = 0; frame->flags = 0;
frame->bidir_ref = FALSE; frame->bidir_ref = FALSE;
@ -524,7 +524,7 @@ gst_va_av1_enc_frame_free (gpointer pframe)
{ {
GstVaAV1EncFrame *frame = pframe; GstVaAV1EncFrame *frame = pframe;
g_clear_pointer (&frame->picture, gst_va_encode_picture_free); g_clear_pointer (&frame->base.picture, gst_va_encode_picture_free);
g_free (frame); g_free (frame);
} }
@ -534,7 +534,7 @@ gst_va_av1_enc_new_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame)
GstVaAV1EncFrame *frame_in; GstVaAV1EncFrame *frame_in;
frame_in = gst_va_av1_enc_frame_new (); frame_in = gst_va_av1_enc_frame_new ();
gst_video_codec_frame_set_user_data (frame, frame_in, gst_va_set_enc_frame (frame, (GstVaEncFrame *) frame_in,
gst_va_av1_enc_frame_free); gst_va_av1_enc_frame_free);
return TRUE; return TRUE;
@ -3052,7 +3052,7 @@ _av1_add_sequence_header (GstVaAV1Enc * self, GstVaAV1EncFrame * frame,
*size_offset += size; *size_offset += size;
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderAV1_SPS, packed_sps, size * 8, FALSE)) { VAEncPackedHeaderAV1_SPS, packed_sps, size * 8, FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add packed sequence header."); GST_ERROR_OBJECT (self, "Failed to add packed sequence header.");
return FALSE; return FALSE;
@ -3234,8 +3234,8 @@ _av1_fill_frame_param (GstVaAV1Enc * self, GstVaAV1EncFrame * va_frame,
.frame_width_minus_1 = base->width - 1, .frame_width_minus_1 = base->width - 1,
.frame_height_minus_1 = base->height - 1, .frame_height_minus_1 = base->height - 1,
.reconstructed_frame = .reconstructed_frame =
gst_va_encode_picture_get_reconstruct_surface (va_frame->picture), gst_va_encode_picture_get_reconstruct_surface (va_frame->base.picture),
.coded_buf = va_frame->picture->coded_buffer, .coded_buf = va_frame->base.picture->coded_buffer,
.primary_ref_frame = primary_ref_frame, .primary_ref_frame = primary_ref_frame,
.order_hint = va_frame->order_hint, .order_hint = va_frame->order_hint,
.refresh_frame_flags = refresh_frame_flags, .refresh_frame_flags = refresh_frame_flags,
@ -3357,7 +3357,7 @@ _av1_fill_frame_param (GstVaAV1Enc * self, GstVaAV1EncFrame * va_frame,
pic_param->reference_frames[i] = pic_param->reference_frames[i] =
gst_va_encode_picture_get_reconstruct_surface gst_va_encode_picture_get_reconstruct_surface
(_enc_frame (self->gop.ref_list[i])->picture); (_enc_frame (self->gop.ref_list[i])->base.picture);
} }
for (i = 0; i < 7; i++) { for (i = 0; i < 7; i++) {
@ -3663,7 +3663,7 @@ _av1_add_tile_group_param (GstVaAV1Enc * self, GstVaAV1EncFrame * va_frame,
tile_group_param.tg_end = (index + 1) * div - 1; tile_group_param.tg_end = (index + 1) * div - 1;
} }
if (!gst_va_encoder_add_param (base->encoder, va_frame->picture, if (!gst_va_encoder_add_param (base->encoder, va_frame->base.picture,
VAEncSliceParameterBufferType, &tile_group_param, VAEncSliceParameterBufferType, &tile_group_param,
sizeof (VAEncTileGroupBufferAV1))) { sizeof (VAEncTileGroupBufferAV1))) {
GST_ERROR_OBJECT (self, "Failed to add one tile group parameter"); GST_ERROR_OBJECT (self, "Failed to add one tile group parameter");
@ -3738,14 +3738,14 @@ _av1_encode_one_frame (GstVaAV1Enc * self, GstVaAV1EncFrame * va_frame,
} }
} }
if (!gst_va_encoder_add_param (base->encoder, va_frame->picture, if (!gst_va_encoder_add_param (base->encoder, va_frame->base.picture,
VAEncPictureParameterBufferType, &pic_param, sizeof (pic_param))) { VAEncPictureParameterBufferType, &pic_param, sizeof (pic_param))) {
GST_ERROR_OBJECT (self, "Failed to create the frame parameter"); GST_ERROR_OBJECT (self, "Failed to create the frame parameter");
return FALSE; return FALSE;
} }
if ((self->packed_headers & VA_ENC_PACKED_HEADER_PICTURE) && if ((self->packed_headers & VA_ENC_PACKED_HEADER_PICTURE) &&
!gst_va_encoder_add_packed_header (base->encoder, va_frame->picture, !gst_va_encoder_add_packed_header (base->encoder, va_frame->base.picture,
VAEncPackedHeaderAV1_PPS, packed_frame_hdr, frame_hdr_size * 8, VAEncPackedHeaderAV1_PPS, packed_frame_hdr, frame_hdr_size * 8,
FALSE)) { FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add the packed frame header"); GST_ERROR_OBJECT (self, "Failed to add the packed frame header");
@ -3759,7 +3759,7 @@ _av1_encode_one_frame (GstVaAV1Enc * self, GstVaAV1EncFrame * va_frame,
} }
} }
if (!gst_va_encoder_encode (base->encoder, va_frame->picture)) { if (!gst_va_encoder_encode (base->encoder, va_frame->base.picture)) {
GST_ERROR_OBJECT (self, "Encode frame error"); GST_ERROR_OBJECT (self, "Encode frame error");
return FALSE; return FALSE;
} }
@ -3840,8 +3840,8 @@ gst_va_av1_enc_encode_frame (GstVaBaseEnc * base,
} else { } else {
guint size_offset = 0; guint size_offset = 0;
g_assert (va_frame->picture == NULL); g_assert (va_frame->base.picture == NULL);
va_frame->picture = gst_va_encode_picture_new (base->encoder, va_frame->base.picture = gst_va_encode_picture_new (base->encoder,
gst_frame->input_buffer); gst_frame->input_buffer);
_av1_find_ref_to_update (base, gst_frame); _av1_find_ref_to_update (base, gst_frame);
@ -3860,25 +3860,27 @@ gst_va_av1_enc_encode_frame (GstVaBaseEnc * base,
/* Repeat the sequence for each key. */ /* Repeat the sequence for each key. */
if (va_frame->frame_num == 0) { if (va_frame->frame_num == 0) {
if (!gst_va_base_enc_add_rate_control_parameter (base, va_frame->picture, if (!gst_va_base_enc_add_rate_control_parameter (base,
va_frame->base.picture,
self->rc.rc_ctrl_mode, self->rc.max_bitrate_bits, self->rc.rc_ctrl_mode, self->rc.max_bitrate_bits,
self->rc.target_percentage, self->rc.base_qindex, self->rc.target_percentage, self->rc.base_qindex,
self->rc.min_qindex, self->rc.max_qindex, self->rc.mbbrc)) self->rc.min_qindex, self->rc.max_qindex, self->rc.mbbrc))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_quality_level_parameter (base, va_frame->picture, if (!gst_va_base_enc_add_quality_level_parameter (base,
self->rc.target_usage)) va_frame->base.picture, self->rc.target_usage))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_frame_rate_parameter (base, va_frame->picture)) if (!gst_va_base_enc_add_frame_rate_parameter (base,
va_frame->base.picture))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_hrd_parameter (base, va_frame->picture, if (!gst_va_base_enc_add_hrd_parameter (base, va_frame->base.picture,
self->rc.rc_ctrl_mode, self->rc.cpb_length_bits)) self->rc.rc_ctrl_mode, self->rc.cpb_length_bits))
return FALSE; return FALSE;
_av1_fill_sequence_param (self, &seq_param); _av1_fill_sequence_param (self, &seq_param);
if (!_av1_add_sequence_param (self, va_frame->picture, &seq_param)) if (!_av1_add_sequence_param (self, va_frame->base.picture, &seq_param))
return FALSE; return FALSE;
_av1_fill_sequence_header (self, &seq_param); _av1_fill_sequence_header (self, &seq_param);
@ -3936,7 +3938,7 @@ _av1_create_tu_output_buffer (GstVaAV1Enc * self,
} }
frame_size = gst_va_base_enc_copy_output_data (base, frame_size = gst_va_base_enc_copy_output_data (base,
frame_enc->picture, data + offset, total_sz - offset); frame_enc->base.picture, data + offset, total_sz - offset);
if (frame_size <= 0) { if (frame_size <= 0) {
GST_ERROR_OBJECT (self, "Fails to copy the output data of " GST_ERROR_OBJECT (self, "Fails to copy the output data of "
"system_frame_number %d, frame_num: %d", "system_frame_number %d, frame_num: %d",
@ -3956,7 +3958,7 @@ _av1_create_tu_output_buffer (GstVaAV1Enc * self,
} }
frame_size = gst_va_base_enc_copy_output_data (base, frame_size = gst_va_base_enc_copy_output_data (base,
frame_enc->picture, data + offset, total_sz - offset); frame_enc->base.picture, data + offset, total_sz - offset);
if (frame_size <= 0) { if (frame_size <= 0) {
GST_ERROR_OBJECT (self, "Fails to copy the output data of " GST_ERROR_OBJECT (self, "Fails to copy the output data of "
"system_frame_number %d, frame_num: %d", "system_frame_number %d, frame_num: %d",
@ -4050,7 +4052,7 @@ gst_va_av1_enc_prepare_output (GstVaBaseEnc * base,
if (self->frames_in_tu_num > 0) { if (self->frames_in_tu_num > 0) {
buf = _av1_create_tu_output_buffer (self, frame); buf = _av1_create_tu_output_buffer (self, frame);
} else { } else {
buf = gst_va_base_enc_create_output_buffer (base, frame_enc->picture, buf = gst_va_base_enc_create_output_buffer (base, frame_enc->base.picture,
(frame_enc->cached_frame_header_size > 0 ? (frame_enc->cached_frame_header_size > 0 ?
frame_enc->cached_frame_header : NULL), frame_enc->cached_frame_header : NULL),
frame_enc->cached_frame_header_size); frame_enc->cached_frame_header_size);

View File

@ -35,10 +35,16 @@ G_BEGIN_DECLS
#define GST_VA_BASE_ENC_ENTRYPOINT(obj) (GST_VA_BASE_ENC_GET_CLASS(obj)->entrypoint) #define GST_VA_BASE_ENC_ENTRYPOINT(obj) (GST_VA_BASE_ENC_GET_CLASS(obj)->entrypoint)
typedef struct _GstVaEncFrame GstVaEncFrame;
typedef struct _GstVaBaseEnc GstVaBaseEnc; typedef struct _GstVaBaseEnc GstVaBaseEnc;
typedef struct _GstVaBaseEncClass GstVaBaseEncClass; typedef struct _GstVaBaseEncClass GstVaBaseEncClass;
typedef struct _GstVaBaseEncPrivate GstVaBaseEncPrivate; typedef struct _GstVaBaseEncPrivate GstVaBaseEncPrivate;
struct _GstVaEncFrame
{
GstVaEncodePicture *picture;
};
struct _GstVaBaseEnc struct _GstVaBaseEnc
{ {
GstVideoEncoder parent_instance; GstVideoEncoder parent_instance;
@ -156,6 +162,22 @@ void gst_va_base_enc_update_property_bool (GstVaBaseEnc * base,
gboolean new_val, gboolean new_val,
GParamSpec * pspec); GParamSpec * pspec);
static inline gpointer
gst_va_get_enc_frame (GstVideoCodecFrame * frame)
{
GstVaEncFrame *enc_frame = gst_video_codec_frame_get_user_data (frame);
g_assert (enc_frame);
return enc_frame;
}
static inline void
gst_va_set_enc_frame (GstVideoCodecFrame * frame,
GstVaEncFrame * frame_in, GDestroyNotify notify)
{
gst_video_codec_frame_set_user_data (frame, frame_in, notify);
}
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVaBaseEnc, gst_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVaBaseEnc, gst_object_unref)
G_END_DECLS G_END_DECLS

View File

@ -262,7 +262,7 @@ struct _GstVaH264Enc
struct _GstVaH264EncFrame struct _GstVaH264EncFrame
{ {
GstVaEncodePicture *picture; GstVaEncFrame base;
GstH264SliceType type; GstH264SliceType type;
gboolean is_ref; gboolean is_ref;
guint pyramid_level; guint pyramid_level;
@ -378,7 +378,7 @@ gst_va_enc_frame_new (void)
frame = g_new (GstVaH264EncFrame, 1); frame = g_new (GstVaH264EncFrame, 1);
frame->frame_num = 0; frame->frame_num = 0;
frame->unused_for_reference_pic_num = -1; frame->unused_for_reference_pic_num = -1;
frame->picture = NULL; frame->base.picture = NULL;
frame->last_frame = FALSE; frame->last_frame = FALSE;
return frame; return frame;
@ -388,16 +388,14 @@ static void
gst_va_enc_frame_free (gpointer pframe) gst_va_enc_frame_free (gpointer pframe)
{ {
GstVaH264EncFrame *frame = pframe; GstVaH264EncFrame *frame = pframe;
g_clear_pointer (&frame->picture, gst_va_encode_picture_free); g_clear_pointer (&frame->base.picture, gst_va_encode_picture_free);
g_free (frame); g_free (frame);
} }
static inline GstVaH264EncFrame * static inline GstVaH264EncFrame *
_enc_frame (GstVideoCodecFrame * frame) _enc_frame (GstVideoCodecFrame * frame)
{ {
GstVaH264EncFrame *enc_frame = gst_video_codec_frame_get_user_data (frame); return gst_va_get_enc_frame (frame);
g_assert (enc_frame);
return enc_frame;
} }
/* Normalizes bitrate (and CPB size) for HRD conformance */ /* Normalizes bitrate (and CPB size) for HRD conformance */
@ -2177,7 +2175,7 @@ _add_sequence_header (GstVaH264Enc * self, GstVaH264EncFrame * frame)
return FALSE; return FALSE;
} }
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderSequence, packed_sps, size * 8, FALSE)) { VAEncPackedHeaderSequence, packed_sps, size * 8, FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add the packed sequence header"); GST_ERROR_OBJECT (self, "Failed to add the packed sequence header");
return FALSE; return FALSE;
@ -2304,10 +2302,10 @@ _fill_picture_parameter (GstVaH264Enc * self, GstVaH264EncFrame * frame,
*pic_param = (VAEncPictureParameterBufferH264) { *pic_param = (VAEncPictureParameterBufferH264) {
.CurrPic = { .CurrPic = {
.picture_id = .picture_id =
gst_va_encode_picture_get_reconstruct_surface (frame->picture), gst_va_encode_picture_get_reconstruct_surface (frame->base.picture),
.TopFieldOrderCnt = frame->poc, .TopFieldOrderCnt = frame->poc,
}, },
.coded_buf = frame->picture->coded_buffer, .coded_buf = frame->base.picture->coded_buffer,
/* Only support one sps and pps now. */ /* Only support one sps and pps now. */
.pic_parameter_set_id = 0, .pic_parameter_set_id = 0,
.seq_parameter_set_id = 0, .seq_parameter_set_id = 0,
@ -2356,7 +2354,7 @@ _fill_picture_parameter (GstVaH264Enc * self, GstVaH264EncFrame * frame,
f = _enc_frame (g_queue_peek_nth (&base->ref_list, i)); f = _enc_frame (g_queue_peek_nth (&base->ref_list, i));
pic_param->ReferenceFrames[i].picture_id = pic_param->ReferenceFrames[i].picture_id =
gst_va_encode_picture_get_reconstruct_surface (f->picture); gst_va_encode_picture_get_reconstruct_surface (f->base.picture);
pic_param->ReferenceFrames[i].TopFieldOrderCnt = f->poc; pic_param->ReferenceFrames[i].TopFieldOrderCnt = f->poc;
pic_param->ReferenceFrames[i].flags = pic_param->ReferenceFrames[i].flags =
VA_PICTURE_H264_SHORT_TERM_REFERENCE; VA_PICTURE_H264_SHORT_TERM_REFERENCE;
@ -2375,7 +2373,7 @@ _add_picture_parameter (GstVaH264Enc * self, GstVaH264EncFrame * frame,
{ {
GstVaBaseEnc *base = GST_VA_BASE_ENC (self); GstVaBaseEnc *base = GST_VA_BASE_ENC (self);
if (!gst_va_encoder_add_param (base->encoder, frame->picture, if (!gst_va_encoder_add_param (base->encoder, frame->base.picture,
VAEncPictureParameterBufferType, pic_param, VAEncPictureParameterBufferType, pic_param,
sizeof (VAEncPictureParameterBufferH264))) { sizeof (VAEncPictureParameterBufferH264))) {
GST_ERROR_OBJECT (self, "Failed to create the picture parameter"); GST_ERROR_OBJECT (self, "Failed to create the picture parameter");
@ -2439,7 +2437,7 @@ _add_picture_header (GstVaH264Enc * self, GstVaH264EncFrame * frame,
return FALSE; return FALSE;
} }
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderPicture, packed_pps, size * 8, FALSE)) { VAEncPackedHeaderPicture, packed_pps, size * 8, FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add the packed picture header"); GST_ERROR_OBJECT (self, "Failed to add the packed picture header");
return FALSE; return FALSE;
@ -2517,7 +2515,8 @@ _add_one_slice (GstVaH264Enc * self, GstVaH264EncFrame * frame,
if (frame->type != GST_H264_I_SLICE) { if (frame->type != GST_H264_I_SLICE) {
for (; i < list0_num; i++) { for (; i < list0_num; i++) {
slice->RefPicList0[i].picture_id = slice->RefPicList0[i].picture_id =
gst_va_encode_picture_get_reconstruct_surface (list0[i]->picture); gst_va_encode_picture_get_reconstruct_surface
(list0[i]->base.picture);
slice->RefPicList0[i].TopFieldOrderCnt = list0[i]->poc; slice->RefPicList0[i].TopFieldOrderCnt = list0[i]->poc;
slice->RefPicList0[i].flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE; slice->RefPicList0[i].flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE;
slice->RefPicList0[i].frame_idx = list0[i]->frame_num; slice->RefPicList0[i].frame_idx = list0[i]->frame_num;
@ -2532,7 +2531,8 @@ _add_one_slice (GstVaH264Enc * self, GstVaH264EncFrame * frame,
if (frame->type == GST_H264_B_SLICE) { if (frame->type == GST_H264_B_SLICE) {
for (; i < list1_num; i++) { for (; i < list1_num; i++) {
slice->RefPicList1[i].picture_id = slice->RefPicList1[i].picture_id =
gst_va_encode_picture_get_reconstruct_surface (list1[i]->picture); gst_va_encode_picture_get_reconstruct_surface
(list1[i]->base.picture);
slice->RefPicList1[i].TopFieldOrderCnt = list1[i]->poc; slice->RefPicList1[i].TopFieldOrderCnt = list1[i]->poc;
slice->RefPicList1[i].flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE; slice->RefPicList1[i].flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE;
slice->RefPicList1[i].frame_idx = list1[i]->frame_num; slice->RefPicList1[i].frame_idx = list1[i]->frame_num;
@ -2543,7 +2543,7 @@ _add_one_slice (GstVaH264Enc * self, GstVaH264EncFrame * frame,
slice->RefPicList1[i].flags = VA_PICTURE_H264_INVALID; slice->RefPicList1[i].flags = VA_PICTURE_H264_INVALID;
} }
if (!gst_va_encoder_add_param (base->encoder, frame->picture, if (!gst_va_encoder_add_param (base->encoder, frame->base.picture,
VAEncSliceParameterBufferType, slice, VAEncSliceParameterBufferType, slice,
sizeof (VAEncSliceParameterBufferH264))) { sizeof (VAEncSliceParameterBufferH264))) {
GST_ERROR_OBJECT (self, "Failed to create the slice parameter"); GST_ERROR_OBJECT (self, "Failed to create the slice parameter");
@ -2774,7 +2774,7 @@ _add_slice_header (GstVaH264Enc * self, GstVaH264EncFrame * frame,
return FALSE; return FALSE;
} }
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderSlice, packed_slice_hdr, size * 8 + trail_bits, VAEncPackedHeaderSlice, packed_slice_hdr, size * 8 + trail_bits,
FALSE)) { FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add the packed slice header"); GST_ERROR_OBJECT (self, "Failed to add the packed slice header");
@ -2814,7 +2814,7 @@ _add_aud (GstVaH264Enc * self, GstVaH264EncFrame * frame)
return FALSE; return FALSE;
} }
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderRawData, aud_data, size * 8, FALSE)) { VAEncPackedHeaderRawData, aud_data, size * 8, FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add the AUD"); GST_ERROR_OBJECT (self, "Failed to add the AUD");
return FALSE; return FALSE;
@ -2929,7 +2929,7 @@ _add_sei_cc (GstVaH264Enc * self, GstVideoCodecFrame * gst_frame)
goto out; goto out;
} }
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderRawData, packed_sei, sei_size * 8, FALSE)) { VAEncPackedHeaderRawData, packed_sei, sei_size * 8, FALSE)) {
GST_WARNING_OBJECT (self, "Failed to add SEI CC data"); GST_WARNING_OBJECT (self, "Failed to add SEI CC data");
goto out; goto out;
@ -2966,24 +2966,24 @@ _encode_one_frame (GstVaH264Enc * self, GstVideoCodecFrame * gst_frame)
if (frame->poc == 0) { if (frame->poc == 0) {
VAEncSequenceParameterBufferH264 sequence; VAEncSequenceParameterBufferH264 sequence;
if (!gst_va_base_enc_add_rate_control_parameter (base, frame->picture, if (!gst_va_base_enc_add_rate_control_parameter (base, frame->base.picture,
self->rc.rc_ctrl_mode, self->rc.max_bitrate_bits, self->rc.rc_ctrl_mode, self->rc.max_bitrate_bits,
self->rc.target_percentage, self->rc.qp_i, self->rc.min_qp, self->rc.target_percentage, self->rc.qp_i, self->rc.min_qp,
self->rc.max_qp, self->rc.mbbrc)) self->rc.max_qp, self->rc.mbbrc))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_quality_level_parameter (base, frame->picture, if (!gst_va_base_enc_add_quality_level_parameter (base, frame->base.picture,
self->rc.target_usage)) self->rc.target_usage))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_frame_rate_parameter (base, frame->picture)) if (!gst_va_base_enc_add_frame_rate_parameter (base, frame->base.picture))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_hrd_parameter (base, frame->picture, if (!gst_va_base_enc_add_hrd_parameter (base, frame->base.picture,
self->rc.rc_ctrl_mode, self->rc.cpb_length_bits)) self->rc.rc_ctrl_mode, self->rc.cpb_length_bits))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_trellis_parameter (base, frame->picture, if (!gst_va_base_enc_add_trellis_parameter (base, frame->base.picture,
self->use_trellis)) self->use_trellis))
return FALSE; return FALSE;
@ -2991,7 +2991,7 @@ _encode_one_frame (GstVaH264Enc * self, GstVideoCodecFrame * gst_frame)
if (!_fill_sps (self, &sequence)) if (!_fill_sps (self, &sequence))
return FALSE; return FALSE;
if (!_add_sequence_parameter (self, frame->picture, &sequence)) if (!_add_sequence_parameter (self, frame->base.picture, &sequence))
return FALSE; return FALSE;
if ((self->packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE) if ((self->packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE)
@ -3088,7 +3088,7 @@ _encode_one_frame (GstVaH264Enc * self, GstVideoCodecFrame * gst_frame)
slice_start_mb += slice_mbs; slice_start_mb += slice_mbs;
} }
if (!gst_va_encoder_encode (base->encoder, frame->picture)) { if (!gst_va_encoder_encode (base->encoder, frame->base.picture)) {
GST_ERROR_OBJECT (self, "Encode frame error"); GST_ERROR_OBJECT (self, "Encode frame error");
return FALSE; return FALSE;
} }
@ -3129,7 +3129,7 @@ gst_va_h264_enc_prepare_output (GstVaBaseEnc * base,
} }
buf = gst_va_base_enc_create_output_buffer (base, buf = gst_va_base_enc_create_output_buffer (base,
frame_enc->picture, NULL, 0); frame_enc->base.picture, NULL, 0);
if (!buf) { if (!buf) {
GST_ERROR_OBJECT (base, "Failed to create output buffer"); GST_ERROR_OBJECT (base, "Failed to create output buffer");
return FALSE; return FALSE;
@ -3236,11 +3236,11 @@ gst_va_h264_enc_encode_frame (GstVaBaseEnc * base,
frame = _enc_frame (gst_frame); frame = _enc_frame (gst_frame);
frame->last_frame = is_last; frame->last_frame = is_last;
g_assert (frame->picture == NULL); g_assert (frame->base.picture == NULL);
frame->picture = gst_va_encode_picture_new (base->encoder, frame->base.picture = gst_va_encode_picture_new (base->encoder,
gst_frame->input_buffer); gst_frame->input_buffer);
if (!frame->picture) { if (!frame->base.picture) {
GST_ERROR_OBJECT (self, "Failed to create the encode picture"); GST_ERROR_OBJECT (self, "Failed to create the encode picture");
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
@ -3280,7 +3280,8 @@ gst_va_h264_enc_new_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame)
GstVaH264EncFrame *frame_in; GstVaH264EncFrame *frame_in;
frame_in = gst_va_enc_frame_new (); frame_in = gst_va_enc_frame_new ();
gst_video_codec_frame_set_user_data (frame, frame_in, gst_va_enc_frame_free); gst_va_set_enc_frame (frame, (GstVaEncFrame *) frame_in,
gst_va_enc_frame_free);
gst_va_base_enc_push_dts (base, frame, self->gop.num_reorder_frames); gst_va_base_enc_push_dts (base, frame, self->gop.num_reorder_frames);

View File

@ -341,7 +341,7 @@ struct _GstVaH265Enc
struct _GstVaH265EncFrame struct _GstVaH265EncFrame
{ {
GstVaEncodePicture *picture; GstVaEncFrame base;
GstH265SliceType type; GstH265SliceType type;
gboolean is_ref; gboolean is_ref;
guint pyramid_level; guint pyramid_level;
@ -451,7 +451,7 @@ gst_va_h265_enc_frame_new (void)
frame = g_new (GstVaH265EncFrame, 1); frame = g_new (GstVaH265EncFrame, 1);
frame->last_frame = FALSE; frame->last_frame = FALSE;
frame->picture = NULL; frame->base.picture = NULL;
return frame; return frame;
} }
@ -460,16 +460,14 @@ static void
gst_va_h265_enc_frame_free (gpointer pframe) gst_va_h265_enc_frame_free (gpointer pframe)
{ {
GstVaH265EncFrame *frame = pframe; GstVaH265EncFrame *frame = pframe;
g_clear_pointer (&frame->picture, gst_va_encode_picture_free); g_clear_pointer (&frame->base.picture, gst_va_encode_picture_free);
g_free (frame); g_free (frame);
} }
static inline GstVaH265EncFrame * static inline GstVaH265EncFrame *
_enc_frame (GstVideoCodecFrame * frame) _enc_frame (GstVideoCodecFrame * frame)
{ {
GstVaH265EncFrame *enc_frame = gst_video_codec_frame_get_user_data (frame); return gst_va_get_enc_frame (frame);
g_assert (enc_frame);
return enc_frame;
} }
static inline gboolean static inline gboolean
@ -1155,7 +1153,7 @@ _h265_add_vps_header (GstVaH265Enc * self, GstVaH265EncFrame * frame)
/* VPS does not have its own packed header define, just reuse /* VPS does not have its own packed header define, just reuse
VAEncPackedHeaderSequence */ VAEncPackedHeaderSequence */
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderSequence, packed_vps, size * 8, FALSE)) { VAEncPackedHeaderSequence, packed_vps, size * 8, FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add packed VPS header."); GST_ERROR_OBJECT (self, "Failed to add packed VPS header.");
return FALSE; return FALSE;
@ -1182,7 +1180,7 @@ _h265_add_sps_header (GstVaH265Enc * self, GstVaH265EncFrame * frame)
return FALSE; return FALSE;
} }
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderSequence, packed_sps, size * 8, FALSE)) { VAEncPackedHeaderSequence, packed_sps, size * 8, FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add packed SPS header."); GST_ERROR_OBJECT (self, "Failed to add packed SPS header.");
return FALSE; return FALSE;
@ -1208,7 +1206,7 @@ _h265_add_pps_header (GstVaH265Enc * self, GstVaH265EncFrame * frame,
return FALSE; return FALSE;
} }
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderPicture, packed_pps, size * 8, FALSE)) { VAEncPackedHeaderPicture, packed_pps, size * 8, FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add the packed picture header"); GST_ERROR_OBJECT (self, "Failed to add the packed picture header");
return FALSE; return FALSE;
@ -1235,7 +1233,7 @@ _h265_add_slice_header (GstVaH265Enc * self, GstVaH265EncFrame * frame,
return FALSE; return FALSE;
} }
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderSlice, packed_slice_hdr, size * 8, FALSE)) { VAEncPackedHeaderSlice, packed_slice_hdr, size * 8, FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add the packed slice header"); GST_ERROR_OBJECT (self, "Failed to add the packed slice header");
return FALSE; return FALSE;
@ -1274,7 +1272,7 @@ _h265_add_aud (GstVaH265Enc * self, GstVaH265EncFrame * frame)
return FALSE; return FALSE;
} }
if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, if (!gst_va_encoder_add_packed_header (base->encoder, frame->base.picture,
VAEncPackedHeaderRawData, aud_data, size * 8, FALSE)) { VAEncPackedHeaderRawData, aud_data, size * 8, FALSE)) {
GST_ERROR_OBJECT (self, "Failed to add the AUD"); GST_ERROR_OBJECT (self, "Failed to add the AUD");
return FALSE; return FALSE;
@ -1485,11 +1483,11 @@ _h265_fill_picture_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame,
*pic_param = (VAEncPictureParameterBufferHEVC) { *pic_param = (VAEncPictureParameterBufferHEVC) {
.decoded_curr_pic.picture_id = .decoded_curr_pic.picture_id =
gst_va_encode_picture_get_reconstruct_surface (frame->picture), gst_va_encode_picture_get_reconstruct_surface (frame->base.picture),
.decoded_curr_pic.pic_order_cnt = frame->poc, .decoded_curr_pic.pic_order_cnt = frame->poc,
.decoded_curr_pic.flags = 0, .decoded_curr_pic.flags = 0,
.coded_buf = frame->picture->coded_buffer, .coded_buf = frame->base.picture->coded_buffer,
.last_picture = frame->last_frame, .last_picture = frame->last_frame,
.pic_init_qp = self->rc.qp_i, .pic_init_qp = self->rc.qp_i,
.diff_cu_qp_delta_depth = self->features.diff_cu_qp_delta_depth, .diff_cu_qp_delta_depth = self->features.diff_cu_qp_delta_depth,
@ -1559,7 +1557,7 @@ _h265_fill_picture_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame,
f = _enc_frame (g_queue_peek_nth (&base->ref_list, i)); f = _enc_frame (g_queue_peek_nth (&base->ref_list, i));
pic_param->reference_frames[i].picture_id = pic_param->reference_frames[i].picture_id =
gst_va_encode_picture_get_reconstruct_surface (f->picture); gst_va_encode_picture_get_reconstruct_surface (f->base.picture);
pic_param->reference_frames[i].pic_order_cnt = f->poc; pic_param->reference_frames[i].pic_order_cnt = f->poc;
pic_param->reference_frames[i].flags = 0; pic_param->reference_frames[i].flags = 0;
} }
@ -1727,7 +1725,8 @@ _h265_fill_slice_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame,
if (frame_type != GST_H265_I_SLICE) { if (frame_type != GST_H265_I_SLICE) {
for (; i < list0_num; i++) { for (; i < list0_num; i++) {
slice->ref_pic_list0[i].picture_id = slice->ref_pic_list0[i].picture_id =
gst_va_encode_picture_get_reconstruct_surface (list0[i]->picture); gst_va_encode_picture_get_reconstruct_surface
(list0[i]->base.picture);
slice->ref_pic_list0[i].pic_order_cnt = list0[i]->poc; slice->ref_pic_list0[i].pic_order_cnt = list0[i]->poc;
} }
} }
@ -1740,7 +1739,8 @@ _h265_fill_slice_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame,
if (frame_type == GST_H265_B_SLICE) { if (frame_type == GST_H265_B_SLICE) {
for (; i < list1_num; i++) { for (; i < list1_num; i++) {
slice->ref_pic_list1[i].picture_id = slice->ref_pic_list1[i].picture_id =
gst_va_encode_picture_get_reconstruct_surface (list1[i]->picture); gst_va_encode_picture_get_reconstruct_surface
(list1[i]->base.picture);
slice->ref_pic_list1[i].pic_order_cnt = list1[i]->poc; slice->ref_pic_list1[i].pic_order_cnt = list1[i]->poc;
} }
} }
@ -1758,7 +1758,7 @@ _h265_add_sequence_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame,
{ {
GstVaBaseEnc *base = GST_VA_BASE_ENC (self); GstVaBaseEnc *base = GST_VA_BASE_ENC (self);
if (!gst_va_encoder_add_param (base->encoder, frame->picture, if (!gst_va_encoder_add_param (base->encoder, frame->base.picture,
VAEncSequenceParameterBufferType, sequence, sizeof (*sequence))) { VAEncSequenceParameterBufferType, sequence, sizeof (*sequence))) {
GST_ERROR_OBJECT (self, "Failed to create the sequence parameter"); GST_ERROR_OBJECT (self, "Failed to create the sequence parameter");
return FALSE; return FALSE;
@ -1773,7 +1773,7 @@ _h265_add_picture_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame,
{ {
GstVaBaseEnc *base = GST_VA_BASE_ENC (self); GstVaBaseEnc *base = GST_VA_BASE_ENC (self);
if (!gst_va_encoder_add_param (base->encoder, frame->picture, if (!gst_va_encoder_add_param (base->encoder, frame->base.picture,
VAEncPictureParameterBufferType, pic_param, VAEncPictureParameterBufferType, pic_param,
sizeof (VAEncPictureParameterBufferHEVC))) { sizeof (VAEncPictureParameterBufferHEVC))) {
GST_ERROR_OBJECT (self, "Failed to create the picture parameter"); GST_ERROR_OBJECT (self, "Failed to create the picture parameter");
@ -1789,7 +1789,7 @@ _h265_add_slice_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame,
{ {
GstVaBaseEnc *base = GST_VA_BASE_ENC (self); GstVaBaseEnc *base = GST_VA_BASE_ENC (self);
if (!gst_va_encoder_add_param (base->encoder, frame->picture, if (!gst_va_encoder_add_param (base->encoder, frame->base.picture,
VAEncSliceParameterBufferType, slice, VAEncSliceParameterBufferType, slice,
sizeof (VAEncSliceParameterBufferHEVC))) { sizeof (VAEncSliceParameterBufferHEVC))) {
GST_ERROR_OBJECT (self, "Failed to add the slice parameter"); GST_ERROR_OBJECT (self, "Failed to add the slice parameter");
@ -1877,24 +1877,24 @@ _h265_encode_one_frame (GstVaH265Enc * self, GstVideoCodecFrame * gst_frame)
if (frame->poc == 0) { if (frame->poc == 0) {
VAEncSequenceParameterBufferHEVC sequence; VAEncSequenceParameterBufferHEVC sequence;
if (!gst_va_base_enc_add_rate_control_parameter (base, frame->picture, if (!gst_va_base_enc_add_rate_control_parameter (base, frame->base.picture,
self->rc.rc_ctrl_mode, self->rc.max_bitrate_bits, self->rc.rc_ctrl_mode, self->rc.max_bitrate_bits,
self->rc.target_percentage, self->rc.qp_i, self->rc.min_qp, self->rc.target_percentage, self->rc.qp_i, self->rc.min_qp,
self->rc.max_qp, self->rc.mbbrc)) self->rc.max_qp, self->rc.mbbrc))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_quality_level_parameter (base, frame->picture, if (!gst_va_base_enc_add_quality_level_parameter (base, frame->base.picture,
self->rc.target_usage)) self->rc.target_usage))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_frame_rate_parameter (base, frame->picture)) if (!gst_va_base_enc_add_frame_rate_parameter (base, frame->base.picture))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_hrd_parameter (base, frame->picture, if (!gst_va_base_enc_add_hrd_parameter (base, frame->base.picture,
self->rc.rc_ctrl_mode, self->rc.cpb_length_bits)) self->rc.rc_ctrl_mode, self->rc.cpb_length_bits))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_trellis_parameter (base, frame->picture, if (!gst_va_base_enc_add_trellis_parameter (base, frame->base.picture,
self->features.use_trellis)) self->features.use_trellis))
return FALSE; return FALSE;
@ -2013,7 +2013,7 @@ _h265_encode_one_frame (GstVaH265Enc * self, GstVideoCodecFrame * gst_frame)
negative_pocs, num_negative_pics, positive_pocs, num_positive_pics)) negative_pocs, num_negative_pics, positive_pocs, num_positive_pics))
return FALSE; return FALSE;
if (!gst_va_encoder_encode (base->encoder, frame->picture)) { if (!gst_va_encoder_encode (base->encoder, frame->base.picture)) {
GST_ERROR_OBJECT (self, "Encode frame error"); GST_ERROR_OBJECT (self, "Encode frame error");
return FALSE; return FALSE;
} }
@ -2431,11 +2431,11 @@ gst_va_h265_enc_encode_frame (GstVaBaseEnc * base,
frame = _enc_frame (gst_frame); frame = _enc_frame (gst_frame);
frame->last_frame = is_last; frame->last_frame = is_last;
g_assert (frame->picture == NULL); g_assert (frame->base.picture == NULL);
frame->picture = gst_va_encode_picture_new (base->encoder, frame->base.picture = gst_va_encode_picture_new (base->encoder,
gst_frame->input_buffer); gst_frame->input_buffer);
if (!frame->picture) { if (!frame->base.picture) {
GST_ERROR_OBJECT (base, "Failed to create the encode picture"); GST_ERROR_OBJECT (base, "Failed to create the encode picture");
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
@ -4717,7 +4717,7 @@ gst_va_h265_enc_new_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame)
GstVaH265EncFrame *frame_in; GstVaH265EncFrame *frame_in;
frame_in = gst_va_h265_enc_frame_new (); frame_in = gst_va_h265_enc_frame_new ();
gst_video_codec_frame_set_user_data (frame, frame_in, gst_va_set_enc_frame (frame, (GstVaEncFrame *) frame_in,
gst_va_h265_enc_frame_free); gst_va_h265_enc_frame_free);
gst_va_base_enc_push_dts (base, frame, self->gop.num_reorder_frames); gst_va_base_enc_push_dts (base, frame, self->gop.num_reorder_frames);
@ -4745,7 +4745,7 @@ gst_va_h265_enc_prepare_output (GstVaBaseEnc * base,
} }
buf = gst_va_base_enc_create_output_buffer (base, buf = gst_va_base_enc_create_output_buffer (base,
frame_enc->picture, NULL, 0); frame_enc->base.picture, NULL, 0);
if (!buf) { if (!buf) {
GST_ERROR_OBJECT (base, "Failed to create output buffer"); GST_ERROR_OBJECT (base, "Failed to create output buffer");
return FALSE; return FALSE;

View File

@ -153,7 +153,7 @@ struct _GstVaVp9GFGroup
struct _GstVaVp9EncFrame struct _GstVaVp9EncFrame
{ {
GstVaEncodePicture *picture; GstVaEncFrame base;
GstVp9FrameType type; GstVp9FrameType type;
/* VP9 does not define a frame number. /* VP9 does not define a frame number.
This is a virtual number after the key frame. */ This is a virtual number after the key frame. */
@ -264,7 +264,7 @@ gst_va_vp9_enc_frame_new (void)
frame = g_new (GstVaVp9EncFrame, 1); frame = g_new (GstVaVp9EncFrame, 1);
frame->frame_num = -1; frame->frame_num = -1;
frame->type = FRAME_TYPE_INVALID; frame->type = FRAME_TYPE_INVALID;
frame->picture = NULL; frame->base.picture = NULL;
frame->pyramid_level = 0; frame->pyramid_level = 0;
frame->flags = 0; frame->flags = 0;
frame->bidir_ref = FALSE; frame->bidir_ref = FALSE;
@ -281,7 +281,7 @@ gst_va_vp9_enc_frame_free (gpointer pframe)
{ {
GstVaVp9EncFrame *frame = pframe; GstVaVp9EncFrame *frame = pframe;
g_clear_pointer (&frame->picture, gst_va_encode_picture_free); g_clear_pointer (&frame->base.picture, gst_va_encode_picture_free);
g_free (frame); g_free (frame);
} }
@ -291,7 +291,7 @@ gst_va_vp9_enc_new_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame)
GstVaVp9EncFrame *frame_in; GstVaVp9EncFrame *frame_in;
frame_in = gst_va_vp9_enc_frame_new (); frame_in = gst_va_vp9_enc_frame_new ();
gst_video_codec_frame_set_user_data (frame, frame_in, gst_va_set_enc_frame (frame, (GstVaEncFrame *) frame_in,
gst_va_vp9_enc_frame_free); gst_va_vp9_enc_frame_free);
return TRUE; return TRUE;
@ -2322,10 +2322,10 @@ _vp9_fill_frame_param (GstVaVp9Enc * self, GstVaVp9EncFrame * va_frame,
.frame_width_dst = base->width, .frame_width_dst = base->width,
.frame_height_dst = base->height, .frame_height_dst = base->height,
.reconstructed_frame = .reconstructed_frame =
gst_va_encode_picture_get_reconstruct_surface (va_frame->picture), gst_va_encode_picture_get_reconstruct_surface (va_frame->base.picture),
/* Set it later. */ /* Set it later. */
.reference_frames = { 0, }, .reference_frames = { 0, },
.coded_buf = va_frame->picture->coded_buffer, .coded_buf = va_frame->base.picture->coded_buffer,
.ref_flags.bits = { .ref_flags.bits = {
.force_kf = 0, .force_kf = 0,
/* Set all the refs later if inter frame. */ /* Set all the refs later if inter frame. */
@ -2392,7 +2392,7 @@ _vp9_fill_frame_param (GstVaVp9Enc * self, GstVaVp9EncFrame * va_frame,
pic_param->reference_frames[i] = pic_param->reference_frames[i] =
gst_va_encode_picture_get_reconstruct_surface gst_va_encode_picture_get_reconstruct_surface
(_enc_frame (self->gop.ref_list[i])->picture); (_enc_frame (self->gop.ref_list[i])->base.picture);
} }
@ -2428,13 +2428,13 @@ _vp9_encode_one_frame (GstVaVp9Enc * self, GstVaVp9EncFrame * va_frame)
return FALSE; return FALSE;
} }
if (!gst_va_encoder_add_param (base->encoder, va_frame->picture, if (!gst_va_encoder_add_param (base->encoder, va_frame->base.picture,
VAEncPictureParameterBufferType, &pic_param, sizeof (pic_param))) { VAEncPictureParameterBufferType, &pic_param, sizeof (pic_param))) {
GST_ERROR_OBJECT (self, "Failed to create the frame parameter"); GST_ERROR_OBJECT (self, "Failed to create the frame parameter");
return FALSE; return FALSE;
} }
if (!gst_va_encoder_encode (base->encoder, va_frame->picture)) { if (!gst_va_encoder_encode (base->encoder, va_frame->base.picture)) {
GST_ERROR_OBJECT (self, "Encode frame error"); GST_ERROR_OBJECT (self, "Encode frame error");
return FALSE; return FALSE;
} }
@ -2504,33 +2504,35 @@ gst_va_vp9_enc_encode_frame (GstVaBaseEnc * base,
g_assert (va_frame->flags & FRAME_FLAG_ALREADY_ENCODED); g_assert (va_frame->flags & FRAME_FLAG_ALREADY_ENCODED);
_vp9_add_repeat_frame_header (self, va_frame); _vp9_add_repeat_frame_header (self, va_frame);
} else { } else {
g_assert (va_frame->picture == NULL); g_assert (va_frame->base.picture == NULL);
va_frame->picture = gst_va_encode_picture_new (base->encoder, va_frame->base.picture = gst_va_encode_picture_new (base->encoder,
gst_frame->input_buffer); gst_frame->input_buffer);
_vp9_find_ref_to_update (base, gst_frame); _vp9_find_ref_to_update (base, gst_frame);
/* Repeat the sequence for each key. */ /* Repeat the sequence for each key. */
if (va_frame->frame_num == 0) { if (va_frame->frame_num == 0) {
if (!gst_va_base_enc_add_rate_control_parameter (base, va_frame->picture, if (!gst_va_base_enc_add_rate_control_parameter (base,
va_frame->base.picture,
self->rc.rc_ctrl_mode, self->rc.max_bitrate_bits, self->rc.rc_ctrl_mode, self->rc.max_bitrate_bits,
self->rc.target_percentage, self->rc.base_qindex, self->rc.target_percentage, self->rc.base_qindex,
self->rc.min_qindex, self->rc.max_qindex, self->rc.mbbrc)) self->rc.min_qindex, self->rc.max_qindex, self->rc.mbbrc))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_quality_level_parameter (base, va_frame->picture, if (!gst_va_base_enc_add_quality_level_parameter (base,
self->rc.target_usage)) va_frame->base.picture, self->rc.target_usage))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_frame_rate_parameter (base, va_frame->picture)) if (!gst_va_base_enc_add_frame_rate_parameter (base,
va_frame->base.picture))
return FALSE; return FALSE;
if (!gst_va_base_enc_add_hrd_parameter (base, va_frame->picture, if (!gst_va_base_enc_add_hrd_parameter (base, va_frame->base.picture,
self->rc.rc_ctrl_mode, self->rc.cpb_length_bits)) self->rc.rc_ctrl_mode, self->rc.cpb_length_bits))
return FALSE; return FALSE;
_vp9_fill_sequence_param (self, &seq_param); _vp9_fill_sequence_param (self, &seq_param);
if (!_vp9_add_sequence_param (self, va_frame->picture, &seq_param)) if (!_vp9_add_sequence_param (self, va_frame->base.picture, &seq_param))
return FALSE; return FALSE;
} }
@ -2576,7 +2578,7 @@ _vp9_create_super_frame_output_buffer (GstVaVp9Enc * self,
frame_enc = _enc_frame (self->frames_in_super[num]); frame_enc = _enc_frame (self->frames_in_super[num]);
frame_size[num] = gst_va_base_enc_copy_output_data (base, frame_size[num] = gst_va_base_enc_copy_output_data (base,
frame_enc->picture, data + offset, total_sz - offset); frame_enc->base.picture, data + offset, total_sz - offset);
if (frame_size[num] <= 0) { if (frame_size[num] <= 0) {
GST_ERROR_OBJECT (self, "Fails to copy the output data of " GST_ERROR_OBJECT (self, "Fails to copy the output data of "
"system_frame_number %d, frame_num: %d", "system_frame_number %d, frame_num: %d",
@ -2590,7 +2592,7 @@ _vp9_create_super_frame_output_buffer (GstVaVp9Enc * self,
frame_enc = _enc_frame (last_frame); frame_enc = _enc_frame (last_frame);
frame_size[num] = gst_va_base_enc_copy_output_data (base, frame_size[num] = gst_va_base_enc_copy_output_data (base,
frame_enc->picture, data + offset, total_sz - offset); frame_enc->base.picture, data + offset, total_sz - offset);
if (frame_size[num] <= 0) { if (frame_size[num] <= 0) {
GST_ERROR_OBJECT (self, "Fails to copy the output data of " GST_ERROR_OBJECT (self, "Fails to copy the output data of "
"system_frame_number %d, frame_num: %d", "system_frame_number %d, frame_num: %d",
@ -2699,7 +2701,7 @@ gst_va_vp9_enc_prepare_output (GstVaBaseEnc * base,
buf = _vp9_create_super_frame_output_buffer (self, frame); buf = _vp9_create_super_frame_output_buffer (self, frame);
} else { } else {
buf = gst_va_base_enc_create_output_buffer (base, buf = gst_va_base_enc_create_output_buffer (base,
frame_enc->picture, NULL, 0); frame_enc->base.picture, NULL, 0);
} }
if (!buf) { if (!buf) {
GST_ERROR_OBJECT (base, "Failed to create output buffer%s", GST_ERROR_OBJECT (base, "Failed to create output buffer%s",