From 933a155b1acb341fa8aaefd5caf9405cc1c45ba6 Mon Sep 17 00:00:00 2001 From: He Junyan Date: Thu, 6 Apr 2023 19:33:02 +0800 Subject: [PATCH] va: encoder: Use GstVaEncFrame as the base object for all Enc Frame Part-of: --- .../gst-plugins-bad/sys/va/gstvaav1enc.c | 48 ++++++++------- .../gst-plugins-bad/sys/va/gstvabaseenc.h | 22 +++++++ .../gst-plugins-bad/sys/va/gstvah264enc.c | 61 ++++++++++--------- .../gst-plugins-bad/sys/va/gstvah265enc.c | 60 +++++++++--------- .../gst-plugins-bad/sys/va/gstvavp9enc.c | 42 +++++++------ 5 files changed, 130 insertions(+), 103 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/va/gstvaav1enc.c b/subprojects/gst-plugins-bad/sys/va/gstvaav1enc.c index 8b04b089bf..30fe495f51 100644 --- a/subprojects/gst-plugins-bad/sys/va/gstvaav1enc.c +++ b/subprojects/gst-plugins-bad/sys/va/gstvaav1enc.c @@ -161,7 +161,7 @@ struct _GstVaAV1Ref struct _GstVaAV1EncFrame { - GstVaEncodePicture *picture; + GstVaEncFrame base; GstAV1FrameType type; guint8 temporal_id; guint8 spatial_id; @@ -507,7 +507,7 @@ gst_va_av1_enc_frame_new (void) frame->type = FRAME_TYPE_INVALID; frame->temporal_id = 0; frame->spatial_id = 0; - frame->picture = NULL; + frame->base.picture = NULL; frame->pyramid_level = 0; frame->flags = 0; frame->bidir_ref = FALSE; @@ -524,7 +524,7 @@ gst_va_av1_enc_frame_free (gpointer 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); } @@ -534,7 +534,7 @@ gst_va_av1_enc_new_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame) GstVaAV1EncFrame *frame_in; 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); return TRUE; @@ -3052,7 +3052,7 @@ _av1_add_sequence_header (GstVaAV1Enc * self, GstVaAV1EncFrame * frame, *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)) { GST_ERROR_OBJECT (self, "Failed to add packed sequence header."); return FALSE; @@ -3234,8 +3234,8 @@ _av1_fill_frame_param (GstVaAV1Enc * self, GstVaAV1EncFrame * va_frame, .frame_width_minus_1 = base->width - 1, .frame_height_minus_1 = base->height - 1, .reconstructed_frame = - gst_va_encode_picture_get_reconstruct_surface (va_frame->picture), - .coded_buf = va_frame->picture->coded_buffer, + gst_va_encode_picture_get_reconstruct_surface (va_frame->base.picture), + .coded_buf = va_frame->base.picture->coded_buffer, .primary_ref_frame = primary_ref_frame, .order_hint = va_frame->order_hint, .refresh_frame_flags = refresh_frame_flags, @@ -3357,7 +3357,7 @@ _av1_fill_frame_param (GstVaAV1Enc * self, GstVaAV1EncFrame * va_frame, pic_param->reference_frames[i] = 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++) { @@ -3663,7 +3663,7 @@ _av1_add_tile_group_param (GstVaAV1Enc * self, GstVaAV1EncFrame * va_frame, 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, sizeof (VAEncTileGroupBufferAV1))) { 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))) { GST_ERROR_OBJECT (self, "Failed to create the frame parameter"); return FALSE; } 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, FALSE)) { 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"); return FALSE; } @@ -3840,8 +3840,8 @@ gst_va_av1_enc_encode_frame (GstVaBaseEnc * base, } else { guint size_offset = 0; - g_assert (va_frame->picture == NULL); - va_frame->picture = gst_va_encode_picture_new (base->encoder, + g_assert (va_frame->base.picture == NULL); + va_frame->base.picture = gst_va_encode_picture_new (base->encoder, gst_frame->input_buffer); _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. */ 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.target_percentage, self->rc.base_qindex, self->rc.min_qindex, self->rc.max_qindex, self->rc.mbbrc)) return FALSE; - if (!gst_va_base_enc_add_quality_level_parameter (base, va_frame->picture, - self->rc.target_usage)) + if (!gst_va_base_enc_add_quality_level_parameter (base, + va_frame->base.picture, self->rc.target_usage)) 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; - 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)) return FALSE; _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; _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_enc->picture, data + offset, total_sz - offset); + frame_enc->base.picture, data + offset, total_sz - offset); if (frame_size <= 0) { GST_ERROR_OBJECT (self, "Fails to copy the output data of " "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_enc->picture, data + offset, total_sz - offset); + frame_enc->base.picture, data + offset, total_sz - offset); if (frame_size <= 0) { GST_ERROR_OBJECT (self, "Fails to copy the output data of " "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) { buf = _av1_create_tu_output_buffer (self, frame); } 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 : NULL), frame_enc->cached_frame_header_size); diff --git a/subprojects/gst-plugins-bad/sys/va/gstvabaseenc.h b/subprojects/gst-plugins-bad/sys/va/gstvabaseenc.h index e79a181929..fde2479836 100644 --- a/subprojects/gst-plugins-bad/sys/va/gstvabaseenc.h +++ b/subprojects/gst-plugins-bad/sys/va/gstvabaseenc.h @@ -35,10 +35,16 @@ G_BEGIN_DECLS #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 _GstVaBaseEncClass GstVaBaseEncClass; typedef struct _GstVaBaseEncPrivate GstVaBaseEncPrivate; +struct _GstVaEncFrame +{ + GstVaEncodePicture *picture; +}; + struct _GstVaBaseEnc { GstVideoEncoder parent_instance; @@ -156,6 +162,22 @@ void gst_va_base_enc_update_property_bool (GstVaBaseEnc * base, gboolean new_val, 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_END_DECLS diff --git a/subprojects/gst-plugins-bad/sys/va/gstvah264enc.c b/subprojects/gst-plugins-bad/sys/va/gstvah264enc.c index 6f6737970c..2fc16c3c40 100644 --- a/subprojects/gst-plugins-bad/sys/va/gstvah264enc.c +++ b/subprojects/gst-plugins-bad/sys/va/gstvah264enc.c @@ -262,7 +262,7 @@ struct _GstVaH264Enc struct _GstVaH264EncFrame { - GstVaEncodePicture *picture; + GstVaEncFrame base; GstH264SliceType type; gboolean is_ref; guint pyramid_level; @@ -378,7 +378,7 @@ gst_va_enc_frame_new (void) frame = g_new (GstVaH264EncFrame, 1); frame->frame_num = 0; frame->unused_for_reference_pic_num = -1; - frame->picture = NULL; + frame->base.picture = NULL; frame->last_frame = FALSE; return frame; @@ -388,16 +388,14 @@ static void gst_va_enc_frame_free (gpointer 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); } static inline GstVaH264EncFrame * _enc_frame (GstVideoCodecFrame * frame) { - GstVaH264EncFrame *enc_frame = gst_video_codec_frame_get_user_data (frame); - g_assert (enc_frame); - return enc_frame; + return gst_va_get_enc_frame (frame); } /* Normalizes bitrate (and CPB size) for HRD conformance */ @@ -2177,7 +2175,7 @@ _add_sequence_header (GstVaH264Enc * self, GstVaH264EncFrame * frame) 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)) { GST_ERROR_OBJECT (self, "Failed to add the packed sequence header"); return FALSE; @@ -2304,10 +2302,10 @@ _fill_picture_parameter (GstVaH264Enc * self, GstVaH264EncFrame * frame, *pic_param = (VAEncPictureParameterBufferH264) { .CurrPic = { .picture_id = - gst_va_encode_picture_get_reconstruct_surface (frame->picture), + gst_va_encode_picture_get_reconstruct_surface (frame->base.picture), .TopFieldOrderCnt = frame->poc, }, - .coded_buf = frame->picture->coded_buffer, + .coded_buf = frame->base.picture->coded_buffer, /* Only support one sps and pps now. */ .pic_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)); 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].flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE; @@ -2375,7 +2373,7 @@ _add_picture_parameter (GstVaH264Enc * self, GstVaH264EncFrame * frame, { 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, sizeof (VAEncPictureParameterBufferH264))) { GST_ERROR_OBJECT (self, "Failed to create the picture parameter"); @@ -2439,7 +2437,7 @@ _add_picture_header (GstVaH264Enc * self, GstVaH264EncFrame * frame, 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)) { GST_ERROR_OBJECT (self, "Failed to add the packed picture header"); return FALSE; @@ -2517,7 +2515,8 @@ _add_one_slice (GstVaH264Enc * self, GstVaH264EncFrame * frame, if (frame->type != GST_H264_I_SLICE) { for (; i < list0_num; i++) { 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].flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE; 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) { for (; i < list1_num; i++) { 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].flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE; 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; } - if (!gst_va_encoder_add_param (base->encoder, frame->picture, + if (!gst_va_encoder_add_param (base->encoder, frame->base.picture, VAEncSliceParameterBufferType, slice, sizeof (VAEncSliceParameterBufferH264))) { GST_ERROR_OBJECT (self, "Failed to create the slice parameter"); @@ -2774,7 +2774,7 @@ _add_slice_header (GstVaH264Enc * self, GstVaH264EncFrame * frame, 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, FALSE)) { GST_ERROR_OBJECT (self, "Failed to add the packed slice header"); @@ -2814,7 +2814,7 @@ _add_aud (GstVaH264Enc * self, GstVaH264EncFrame * frame) 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)) { GST_ERROR_OBJECT (self, "Failed to add the AUD"); return FALSE; @@ -2929,7 +2929,7 @@ _add_sei_cc (GstVaH264Enc * self, GstVideoCodecFrame * gst_frame) 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)) { GST_WARNING_OBJECT (self, "Failed to add SEI CC data"); goto out; @@ -2966,24 +2966,24 @@ _encode_one_frame (GstVaH264Enc * self, GstVideoCodecFrame * gst_frame) if (frame->poc == 0) { 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.target_percentage, self->rc.qp_i, self->rc.min_qp, self->rc.max_qp, self->rc.mbbrc)) 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)) 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; - 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)) 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)) return FALSE; @@ -2991,7 +2991,7 @@ _encode_one_frame (GstVaH264Enc * self, GstVideoCodecFrame * gst_frame) if (!_fill_sps (self, &sequence)) return FALSE; - if (!_add_sequence_parameter (self, frame->picture, &sequence)) + if (!_add_sequence_parameter (self, frame->base.picture, &sequence)) return FALSE; 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; } - 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"); return FALSE; } @@ -3129,7 +3129,7 @@ gst_va_h264_enc_prepare_output (GstVaBaseEnc * base, } buf = gst_va_base_enc_create_output_buffer (base, - frame_enc->picture, NULL, 0); + frame_enc->base.picture, NULL, 0); if (!buf) { GST_ERROR_OBJECT (base, "Failed to create output buffer"); return FALSE; @@ -3236,11 +3236,11 @@ gst_va_h264_enc_encode_frame (GstVaBaseEnc * base, frame = _enc_frame (gst_frame); frame->last_frame = is_last; - g_assert (frame->picture == NULL); - frame->picture = gst_va_encode_picture_new (base->encoder, + g_assert (frame->base.picture == NULL); + frame->base.picture = gst_va_encode_picture_new (base->encoder, gst_frame->input_buffer); - if (!frame->picture) { + if (!frame->base.picture) { GST_ERROR_OBJECT (self, "Failed to create the encode picture"); return GST_FLOW_ERROR; } @@ -3280,7 +3280,8 @@ gst_va_h264_enc_new_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame) GstVaH264EncFrame *frame_in; 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); diff --git a/subprojects/gst-plugins-bad/sys/va/gstvah265enc.c b/subprojects/gst-plugins-bad/sys/va/gstvah265enc.c index a9b6898205..03f3bb0334 100644 --- a/subprojects/gst-plugins-bad/sys/va/gstvah265enc.c +++ b/subprojects/gst-plugins-bad/sys/va/gstvah265enc.c @@ -341,7 +341,7 @@ struct _GstVaH265Enc struct _GstVaH265EncFrame { - GstVaEncodePicture *picture; + GstVaEncFrame base; GstH265SliceType type; gboolean is_ref; guint pyramid_level; @@ -451,7 +451,7 @@ gst_va_h265_enc_frame_new (void) frame = g_new (GstVaH265EncFrame, 1); frame->last_frame = FALSE; - frame->picture = NULL; + frame->base.picture = NULL; return frame; } @@ -460,16 +460,14 @@ static void gst_va_h265_enc_frame_free (gpointer 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); } static inline GstVaH265EncFrame * _enc_frame (GstVideoCodecFrame * frame) { - GstVaH265EncFrame *enc_frame = gst_video_codec_frame_get_user_data (frame); - g_assert (enc_frame); - return enc_frame; + return gst_va_get_enc_frame (frame); } 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 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)) { GST_ERROR_OBJECT (self, "Failed to add packed VPS header."); return FALSE; @@ -1182,7 +1180,7 @@ _h265_add_sps_header (GstVaH265Enc * self, GstVaH265EncFrame * frame) 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)) { GST_ERROR_OBJECT (self, "Failed to add packed SPS header."); return FALSE; @@ -1208,7 +1206,7 @@ _h265_add_pps_header (GstVaH265Enc * self, GstVaH265EncFrame * frame, 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)) { GST_ERROR_OBJECT (self, "Failed to add the packed picture header"); return FALSE; @@ -1235,7 +1233,7 @@ _h265_add_slice_header (GstVaH265Enc * self, GstVaH265EncFrame * frame, 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)) { GST_ERROR_OBJECT (self, "Failed to add the packed slice header"); return FALSE; @@ -1274,7 +1272,7 @@ _h265_add_aud (GstVaH265Enc * self, GstVaH265EncFrame * frame) 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)) { GST_ERROR_OBJECT (self, "Failed to add the AUD"); return FALSE; @@ -1485,11 +1483,11 @@ _h265_fill_picture_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame, *pic_param = (VAEncPictureParameterBufferHEVC) { .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.flags = 0, - .coded_buf = frame->picture->coded_buffer, + .coded_buf = frame->base.picture->coded_buffer, .last_picture = frame->last_frame, .pic_init_qp = self->rc.qp_i, .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)); 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].flags = 0; } @@ -1727,7 +1725,8 @@ _h265_fill_slice_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame, if (frame_type != GST_H265_I_SLICE) { for (; i < list0_num; i++) { 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; } } @@ -1740,7 +1739,8 @@ _h265_fill_slice_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame, if (frame_type == GST_H265_B_SLICE) { for (; i < list1_num; i++) { 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; } } @@ -1758,7 +1758,7 @@ _h265_add_sequence_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame, { 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))) { GST_ERROR_OBJECT (self, "Failed to create the sequence parameter"); return FALSE; @@ -1773,7 +1773,7 @@ _h265_add_picture_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame, { 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, sizeof (VAEncPictureParameterBufferHEVC))) { 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); - if (!gst_va_encoder_add_param (base->encoder, frame->picture, + if (!gst_va_encoder_add_param (base->encoder, frame->base.picture, VAEncSliceParameterBufferType, slice, sizeof (VAEncSliceParameterBufferHEVC))) { 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) { 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.target_percentage, self->rc.qp_i, self->rc.min_qp, self->rc.max_qp, self->rc.mbbrc)) 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)) 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; - 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)) 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)) 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)) 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"); return FALSE; } @@ -2431,11 +2431,11 @@ gst_va_h265_enc_encode_frame (GstVaBaseEnc * base, frame = _enc_frame (gst_frame); frame->last_frame = is_last; - g_assert (frame->picture == NULL); - frame->picture = gst_va_encode_picture_new (base->encoder, + g_assert (frame->base.picture == NULL); + frame->base.picture = gst_va_encode_picture_new (base->encoder, gst_frame->input_buffer); - if (!frame->picture) { + if (!frame->base.picture) { GST_ERROR_OBJECT (base, "Failed to create the encode picture"); return GST_FLOW_ERROR; } @@ -4717,7 +4717,7 @@ gst_va_h265_enc_new_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame) GstVaH265EncFrame *frame_in; 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_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, - frame_enc->picture, NULL, 0); + frame_enc->base.picture, NULL, 0); if (!buf) { GST_ERROR_OBJECT (base, "Failed to create output buffer"); return FALSE; diff --git a/subprojects/gst-plugins-bad/sys/va/gstvavp9enc.c b/subprojects/gst-plugins-bad/sys/va/gstvavp9enc.c index c338ad6271..2a0bdd3f52 100644 --- a/subprojects/gst-plugins-bad/sys/va/gstvavp9enc.c +++ b/subprojects/gst-plugins-bad/sys/va/gstvavp9enc.c @@ -153,7 +153,7 @@ struct _GstVaVp9GFGroup struct _GstVaVp9EncFrame { - GstVaEncodePicture *picture; + GstVaEncFrame base; GstVp9FrameType type; /* VP9 does not define a frame number. 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->frame_num = -1; frame->type = FRAME_TYPE_INVALID; - frame->picture = NULL; + frame->base.picture = NULL; frame->pyramid_level = 0; frame->flags = 0; frame->bidir_ref = FALSE; @@ -281,7 +281,7 @@ gst_va_vp9_enc_frame_free (gpointer 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); } @@ -291,7 +291,7 @@ gst_va_vp9_enc_new_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame) GstVaVp9EncFrame *frame_in; 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); return TRUE; @@ -2322,10 +2322,10 @@ _vp9_fill_frame_param (GstVaVp9Enc * self, GstVaVp9EncFrame * va_frame, .frame_width_dst = base->width, .frame_height_dst = base->height, .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. */ .reference_frames = { 0, }, - .coded_buf = va_frame->picture->coded_buffer, + .coded_buf = va_frame->base.picture->coded_buffer, .ref_flags.bits = { .force_kf = 0, /* 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] = 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; } - 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))) { GST_ERROR_OBJECT (self, "Failed to create the frame parameter"); 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"); return FALSE; } @@ -2504,33 +2504,35 @@ gst_va_vp9_enc_encode_frame (GstVaBaseEnc * base, g_assert (va_frame->flags & FRAME_FLAG_ALREADY_ENCODED); _vp9_add_repeat_frame_header (self, va_frame); } else { - g_assert (va_frame->picture == NULL); - va_frame->picture = gst_va_encode_picture_new (base->encoder, + g_assert (va_frame->base.picture == NULL); + va_frame->base.picture = gst_va_encode_picture_new (base->encoder, gst_frame->input_buffer); _vp9_find_ref_to_update (base, gst_frame); /* Repeat the sequence for each key. */ 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.target_percentage, self->rc.base_qindex, self->rc.min_qindex, self->rc.max_qindex, self->rc.mbbrc)) return FALSE; - if (!gst_va_base_enc_add_quality_level_parameter (base, va_frame->picture, - self->rc.target_usage)) + if (!gst_va_base_enc_add_quality_level_parameter (base, + va_frame->base.picture, self->rc.target_usage)) 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; - 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)) return FALSE; _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; } @@ -2576,7 +2578,7 @@ _vp9_create_super_frame_output_buffer (GstVaVp9Enc * self, frame_enc = _enc_frame (self->frames_in_super[num]); 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) { GST_ERROR_OBJECT (self, "Fails to copy the output data of " "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_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) { GST_ERROR_OBJECT (self, "Fails to copy the output data of " "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); } else { buf = gst_va_base_enc_create_output_buffer (base, - frame_enc->picture, NULL, 0); + frame_enc->base.picture, NULL, 0); } if (!buf) { GST_ERROR_OBJECT (base, "Failed to create output buffer%s",