363 lines
14 KiB
Diff
363 lines
14 KiB
Diff
From e3f07a8e64dcd406b6665a7bce125efdf603efb9 Mon Sep 17 00:00:00 2001
|
|
From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
|
|
Date: Wed, 15 Nov 2023 11:31:14 -0500
|
|
Subject: [PATCH 56/68] v4l2codecs: h264enc: Fix indentation
|
|
|
|
Upstream-Status: Pending
|
|
---
|
|
sys/v4l2codecs/gstv4l2codech264enc.c | 157 ++++++++++++---------------
|
|
1 file changed, 69 insertions(+), 88 deletions(-)
|
|
|
|
diff --git a/sys/v4l2codecs/gstv4l2codech264enc.c b/sys/v4l2codecs/gstv4l2codech264enc.c
|
|
index e7a6e07..6bf249a 100644
|
|
--- a/sys/v4l2codecs/gstv4l2codech264enc.c
|
|
+++ b/sys/v4l2codecs/gstv4l2codech264enc.c
|
|
@@ -45,12 +45,11 @@ enum
|
|
#define GST_PAD_SINK_FORMATS "{NV12, YUY2, I420}"
|
|
|
|
static GstStaticPadTemplate sink_template =
|
|
- GST_STATIC_PAD_TEMPLATE(GST_VIDEO_ENCODER_SINK_NAME,
|
|
- GST_PAD_SINK, GST_PAD_ALWAYS,
|
|
- GST_STATIC_CAPS(GST_VIDEO_CAPS_MAKE(GST_PAD_SINK_FORMATS)
|
|
- ", colorimetry= {bt601,bt709,bt601-full-range,bt709-full-range}"
|
|
- )
|
|
- );
|
|
+GST_STATIC_PAD_TEMPLATE (GST_VIDEO_ENCODER_SINK_NAME,
|
|
+ GST_PAD_SINK, GST_PAD_ALWAYS,
|
|
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_PAD_SINK_FORMATS)
|
|
+ ", colorimetry= {bt601,bt709,bt601-full-range,bt709-full-range}")
|
|
+ );
|
|
|
|
static GstStaticPadTemplate src_template =
|
|
GST_STATIC_PAD_TEMPLATE (GST_VIDEO_ENCODER_SRC_NAME,
|
|
@@ -157,13 +156,7 @@ gst_v4l2_codec_h264_enc_api_check (GstV4l2Encoder * encoder)
|
|
}, {
|
|
SET_ID (V4L2_CID_STATELESS_H264_ENCODE_RC),
|
|
.size = sizeof(struct v4l2_ctrl_h264_encode_rc),
|
|
- // }, {
|
|
- // SET_ID (V4L2_CID_STATELESS_H264_SPS),
|
|
- // .size = sizeof(struct v4l2_ctrl_h264_sps),
|
|
- // }, {
|
|
- // SET_ID (V4L2_CID_STATELESS_H264_PPS),
|
|
- // .size = sizeof(struct v4l2_ctrl_h264_pps),
|
|
- },
|
|
+ }
|
|
};
|
|
#undef SET_ID
|
|
/* *INDENT-ON* */
|
|
@@ -324,7 +317,7 @@ gst_v4l2_codec_h264_enc_buffers_allocation (GstVideoEncoder * encoder)
|
|
|
|
static gboolean
|
|
gst_v4l2_codec_h264_enc_set_codec_data (GstVideoEncoder * encoder,
|
|
- GstBuffer *codec_data, guint *data_size)
|
|
+ GstBuffer * codec_data, guint * data_size)
|
|
{
|
|
GstV4l2CodecH264Enc *self = GST_V4L2_CODEC_H264_ENC (encoder);
|
|
|
|
@@ -362,7 +355,7 @@ gst_v4l2_codec_h264_enc_set_codec_data (GstVideoEncoder * encoder,
|
|
}
|
|
|
|
static guint8
|
|
-get_sps_aspect_ratio_idc(guint par_n, guint par_d)
|
|
+get_sps_aspect_ratio_idc (guint par_n, guint par_d)
|
|
{
|
|
if (par_n == 1 && par_d == 1)
|
|
return 1;
|
|
@@ -397,7 +390,7 @@ get_sps_aspect_ratio_idc(guint par_n, guint par_d)
|
|
else if (par_n == 2 && par_d == 1)
|
|
return 16;
|
|
else
|
|
- return 0; // Extended_SAR for custom ratios
|
|
+ return 0; // Extended_SAR for custom ratios
|
|
}
|
|
|
|
/* Begin of code taken from VA plugin */
|
|
@@ -412,9 +405,9 @@ typedef struct
|
|
int MaxCPB;
|
|
int MinCr;
|
|
} GstVaH264LevelLimits;
|
|
-/* *INDENT-OFF* */
|
|
|
|
static const GstVaH264LevelLimits _va_h264_level_limits[] = {
|
|
+ /* *INDENT-OFF* */
|
|
/* level idc MaxMBPS MaxFS MaxDpbMbs MaxBR MaxCPB MinCr */
|
|
{"1", GST_H264_LEVEL_L1, 1485, 99, 396, 64, 175, 2},
|
|
{"1b", GST_H264_LEVEL_L1B, 1485, 99, 396, 128, 350, 2},
|
|
@@ -436,32 +429,33 @@ static const GstVaH264LevelLimits _va_h264_level_limits[] = {
|
|
{"6", GST_H264_LEVEL_L6, 4177920, 139264, 696320, 240000, 240000, 2},
|
|
{"6.1", GST_H264_LEVEL_L6_1, 8355840, 139264, 696320, 480000, 480000, 2},
|
|
{"6.2", GST_H264_LEVEL_L6_2, 16711680, 139264, 696320, 800000, 800000, 2},
|
|
+ /* *INDENT-ON* */
|
|
};
|
|
-/* *INDENT-ON* */
|
|
+
|
|
/* Enf of code taken from VA Plugin */
|
|
|
|
// Recursive function to find the greatest common divisor
|
|
static gint
|
|
-gcd(int a, int b)
|
|
+gcd (int a, int b)
|
|
{
|
|
if (b == 0)
|
|
return a;
|
|
- return gcd(b, a % b);
|
|
+ return gcd (b, a % b);
|
|
}
|
|
|
|
static gint
|
|
-find_time_scale_multiplier(int fps_d)
|
|
+find_time_scale_multiplier (int fps_d)
|
|
{
|
|
guint base_value = 1000;
|
|
- return (fps_d * base_value) / gcd(fps_d, base_value);
|
|
+ return (fps_d * base_value) / gcd (fps_d, base_value);
|
|
}
|
|
|
|
static void
|
|
-gst_v4l2_codec_h264_enc_init_sps_pps(GstV4l2CodecH264Enc *self,
|
|
+gst_v4l2_codec_h264_enc_init_sps_pps (GstV4l2CodecH264Enc * self,
|
|
GstVideoCodecState * state)
|
|
{
|
|
- memset(&self->sps, 0, sizeof(self->sps));
|
|
- memset(&self->sps, 0, sizeof(self->pps));
|
|
+ memset (&self->sps, 0, sizeof (self->sps));
|
|
+ memset (&self->sps, 0, sizeof (self->pps));
|
|
|
|
/* SPS */
|
|
self->sps.profile_idc = 66;
|
|
@@ -470,7 +464,7 @@ gst_v4l2_codec_h264_enc_init_sps_pps(GstV4l2CodecH264Enc *self,
|
|
|
|
|
|
// sps.seq_parameter_set_id = 0; // TODO: Set it properly
|
|
- self->sps.chroma_format_idc = 1; /* YUV 4:2:0 */
|
|
+ self->sps.chroma_format_idc = 1; /* YUV 4:2:0 */
|
|
|
|
self->sps.pic_width_in_mbs_minus1 = self->width_mbs - 1;
|
|
self->sps.pic_height_in_map_units_minus1 = self->height_mbs - 1;
|
|
@@ -492,114 +486,100 @@ gst_v4l2_codec_h264_enc_init_sps_pps(GstV4l2CodecH264Enc *self,
|
|
// Calculate lowest acceptable level
|
|
GstStructure *structure;
|
|
gint fps_n, fps_d;
|
|
- structure = gst_caps_get_structure(state->caps, 0);
|
|
- gst_structure_get_fraction(structure, "framerate", &fps_n, &fps_d);
|
|
- gint n_levels = sizeof(_va_h264_level_limits) / sizeof(_va_h264_level_limits[0]);
|
|
+ structure = gst_caps_get_structure (state->caps, 0);
|
|
+ gst_structure_get_fraction (structure, "framerate", &fps_n, &fps_d);
|
|
+ gint n_levels =
|
|
+ sizeof (_va_h264_level_limits) / sizeof (_va_h264_level_limits[0]);
|
|
GValue bitrate = G_VALUE_INIT;
|
|
- g_object_get_property(G_OBJECT(&self->parent), "bitrate", &bitrate);
|
|
- self->targeted_bitrate = g_value_get_uint64(&bitrate);
|
|
+ g_object_get_property (G_OBJECT (&self->parent), "bitrate", &bitrate);
|
|
+ self->targeted_bitrate = g_value_get_uint64 (&bitrate);
|
|
int MaxBR = self->targeted_bitrate;
|
|
int FS = self->width * self->height / 256;
|
|
- int MBPS = FS * fps_n / fps_d; // Assuming each macroblock is 16x16
|
|
+ int MBPS = FS * fps_n / fps_d; // Assuming each macroblock is 16x16
|
|
int DpbMbs = FS;
|
|
int CPB = MaxBR;
|
|
int CR = fps_n / fps_d;
|
|
gint lowest_level = 0;
|
|
- for (; lowest_level < n_levels; ++lowest_level)
|
|
- {
|
|
+ for (; lowest_level < n_levels; ++lowest_level) {
|
|
const GstVaH264LevelLimits *level = &_va_h264_level_limits[lowest_level];
|
|
- if (MBPS <= level->MaxMBPS && FS <= level->MaxFS && DpbMbs <= level->MaxDpbMbs &&
|
|
- MaxBR <= level->MaxBR && CPB <= level->MaxCPB && CR >= level->MinCr)
|
|
- {
|
|
+ if (MBPS <= level->MaxMBPS && FS <= level->MaxFS
|
|
+ && DpbMbs <= level->MaxDpbMbs && MaxBR <= level->MaxBR
|
|
+ && CPB <= level->MaxCPB && CR >= level->MinCr) {
|
|
break;
|
|
}
|
|
}
|
|
self->sps.level_idc = _va_h264_level_limits[lowest_level].idc;
|
|
- if (self->sps.level_idc == GST_H264_LEVEL_L1B)
|
|
- {
|
|
+ if (self->sps.level_idc == GST_H264_LEVEL_L1B) {
|
|
self->sps.constraint_set3_flag = 1;
|
|
}
|
|
- GST_DEBUG_OBJECT(self, "width:%d height:%d targeted_bitrate:%ld",
|
|
- self->height, self->height, self->targeted_bitrate);
|
|
- GST_DEBUG_OBJECT(self, "MBPS=%d,FS=%d,DpbMbs=%d,MaxBR=%d,CPB=%d,CR=%d",
|
|
- MBPS, FS, DpbMbs, MaxBR, CPB, CR);
|
|
- GST_DEBUG_OBJECT(self, "level_idc: %d", self->sps.level_idc);
|
|
+ GST_DEBUG_OBJECT (self, "width:%d height:%d targeted_bitrate:%ld",
|
|
+ self->height, self->height, self->targeted_bitrate);
|
|
+ GST_DEBUG_OBJECT (self, "MBPS=%d,FS=%d,DpbMbs=%d,MaxBR=%d,CPB=%d,CR=%d",
|
|
+ MBPS, FS, DpbMbs, MaxBR, CPB, CR);
|
|
+ GST_DEBUG_OBJECT (self, "level_idc: %d", self->sps.level_idc);
|
|
|
|
/* Crop unaligned videos */
|
|
- if (self->width & 15 || self->height & 15)
|
|
- {
|
|
- static const guint SubWidthC[] = {1, 2, 2, 1};
|
|
- static const guint SubHeightC[] = {1, 2, 1, 1};
|
|
+ if (self->width & 15 || self->height & 15) {
|
|
+ static const guint SubWidthC[] = { 1, 2, 2, 1 };
|
|
+ static const guint SubHeightC[] = { 1, 2, 1, 1 };
|
|
const guint CropUnitX = SubWidthC[self->sps.chroma_format_idc];
|
|
const guint CropUnitY = SubHeightC[self->sps.chroma_format_idc] *
|
|
- (2 - self->sps.frame_mbs_only_flag);
|
|
+ (2 - self->sps.frame_mbs_only_flag);
|
|
|
|
self->sps.frame_cropping_flag = 1;
|
|
self->sps.frame_crop_left_offset = 0;
|
|
self->sps.frame_crop_right_offset = (16 * self->width_mbs -
|
|
- self->width) /
|
|
- CropUnitX;
|
|
+ self->width) / CropUnitX;
|
|
self->sps.frame_crop_top_offset = 0;
|
|
self->sps.frame_crop_bottom_offset = (16 * self->height_mbs -
|
|
- self->height) /
|
|
- CropUnitY;
|
|
+ self->height) / CropUnitY;
|
|
}
|
|
-
|
|
-
|
|
// set colorimetry
|
|
const gchar *colorimetry;
|
|
- colorimetry = gst_structure_get_string(structure, "colorimetry");
|
|
+ colorimetry = gst_structure_get_string (structure, "colorimetry");
|
|
|
|
- if (colorimetry)
|
|
- {
|
|
+ if (colorimetry) {
|
|
self->sps.vui_parameters_present_flag = 1;
|
|
self->sps.vui_parameters.colour_description_present_flag = 1;
|
|
- if ((strcmp(colorimetry, "bt709") == 0) ||
|
|
- (strcmp(colorimetry, "bt709-full-range") == 0))
|
|
- {
|
|
+ if ((strcmp (colorimetry, "bt709") == 0) ||
|
|
+ (strcmp (colorimetry, "bt709-full-range") == 0)) {
|
|
self->sps.vui_parameters.colour_primaries = 1;
|
|
self->sps.vui_parameters.transfer_characteristics = 1;
|
|
self->sps.vui_parameters.matrix_coefficients = 1;
|
|
- if (strcmp(colorimetry, "bt709-full-range") == 0)
|
|
- {
|
|
+ if (strcmp (colorimetry, "bt709-full-range") == 0) {
|
|
self->sps.vui_parameters.video_full_range_flag = 1;
|
|
}
|
|
- }
|
|
- else if ((strcmp(colorimetry, "bt601") == 0) ||
|
|
- (strcmp(colorimetry, "bt601-full-range") == 0))
|
|
- {
|
|
+ } else if ((strcmp (colorimetry, "bt601") == 0) ||
|
|
+ (strcmp (colorimetry, "bt601-full-range") == 0)) {
|
|
self->sps.vui_parameters.colour_primaries = 6;
|
|
self->sps.vui_parameters.transfer_characteristics = 6;
|
|
self->sps.vui_parameters.matrix_coefficients = 6;
|
|
- if (strcmp(colorimetry, "bt601-full-range") == 0)
|
|
- {
|
|
+ if (strcmp (colorimetry, "bt601-full-range") == 0) {
|
|
self->sps.vui_parameters.video_full_range_flag = 1;
|
|
}
|
|
}
|
|
}
|
|
-
|
|
// set aspect ratio
|
|
gint par_n, par_d;
|
|
- if (gst_structure_get_fraction(structure, "pixel-aspect-ratio", &par_n, &par_d))
|
|
- {
|
|
+ if (gst_structure_get_fraction (structure, "pixel-aspect-ratio", &par_n,
|
|
+ &par_d)) {
|
|
self->sps.vui_parameters.aspect_ratio_info_present_flag = 1;
|
|
- self->sps.vui_parameters.aspect_ratio_idc = get_sps_aspect_ratio_idc(par_n, par_d);
|
|
- if (self->sps.vui_parameters.aspect_ratio_idc == 255)
|
|
- {
|
|
+ self->sps.vui_parameters.aspect_ratio_idc =
|
|
+ get_sps_aspect_ratio_idc (par_n, par_d);
|
|
+ if (self->sps.vui_parameters.aspect_ratio_idc == 255) {
|
|
self->sps.vui_parameters.sar_width = par_n;
|
|
self->sps.vui_parameters.sar_height = par_d;
|
|
}
|
|
}
|
|
-
|
|
// set Frame rate
|
|
- if (gst_structure_get_fraction(structure, "framerate", &fps_n, &fps_d))
|
|
- {
|
|
+ if (gst_structure_get_fraction (structure, "framerate", &fps_n, &fps_d)) {
|
|
self->sps.vui_parameters.timing_info_present_flag = 1;
|
|
self->sps.vui_parameters.fixed_frame_rate_flag = 1; // Only supports fixed frame rate for now
|
|
- gint multiplier = find_time_scale_multiplier(fps_d);
|
|
+ gint multiplier = find_time_scale_multiplier (fps_d);
|
|
gint time_scale = fps_n * multiplier;
|
|
self->sps.vui_parameters.time_scale = time_scale;
|
|
- self->sps.vui_parameters.num_units_in_tick = time_scale / (2 * fps_n / fps_d );
|
|
+ self->sps.vui_parameters.num_units_in_tick =
|
|
+ time_scale / (2 * fps_n / fps_d);
|
|
}
|
|
|
|
/* PPS */
|
|
@@ -665,8 +645,8 @@ gst_v4l2_codec_h264_enc_set_format (GstVideoEncoder * encoder,
|
|
gst_video_codec_state_unref (self->output_state);
|
|
|
|
caps = gst_caps_new_simple ("video/x-h264",
|
|
- "stream-format", G_TYPE_STRING, "byte-stream",
|
|
- "alignment", G_TYPE_STRING, "nal", NULL);
|
|
+ "stream-format", G_TYPE_STRING, "byte-stream",
|
|
+ "alignment", G_TYPE_STRING, "nal", NULL);
|
|
|
|
self->output_state =
|
|
gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (self),
|
|
@@ -690,7 +670,7 @@ gst_v4l2_codec_h264_enc_set_format (GstVideoEncoder * encoder,
|
|
gst_v4l2_codec_h264_enc_get_qp_range (self->encoder, &self->qp_min,
|
|
&self->qp_max);
|
|
|
|
- gst_v4l2_codec_h264_enc_init_sps_pps(self, state);
|
|
+ gst_v4l2_codec_h264_enc_init_sps_pps (self, state);
|
|
|
|
return TRUE;
|
|
}
|
|
@@ -882,7 +862,8 @@ gst_v4l2_codec_h264_enc_fill_encode_params (GstH264Encoder * encoder,
|
|
self->encode_params.nalu_type = V4L2_H264_NAL_CODED_SLICE_NON_IDR_PIC;
|
|
self->encode_params.reference_ts = self->reference_timestamp;
|
|
self->encode_params.frame_num++;
|
|
- self->encode_params.frame_num %= (1 << (self->sps.log2_max_frame_num_minus4 + 4));
|
|
+ self->encode_params.frame_num %=
|
|
+ (1 << (self->sps.log2_max_frame_num_minus4 + 4));
|
|
self->encode_params.nalu_type = 1;
|
|
self->encode_params.nal_reference_idc = 2;
|
|
break;
|
|
@@ -906,7 +887,7 @@ gst_v4l2_codec_h264_enc_fill_encode_rc (GstH264Encoder * encoder,
|
|
|
|
//h264_rate_control_step(encoder);
|
|
|
|
- self->encode_rc.qp = self->pps.pic_init_qp_minus26 + 26;//encoder->rc.qp;
|
|
+ self->encode_rc.qp = self->pps.pic_init_qp_minus26 + 26; //encoder->rc.qp;
|
|
self->encode_rc.qp_min = self->qp_min;
|
|
self->encode_rc.qp_max = self->qp_max;
|
|
}
|
|
@@ -949,8 +930,8 @@ gst_v4l2_codec_h264_enc_encode_frame (GstH264Encoder * encoder,
|
|
gst_buffer_resize (codec_data, 0, data_size);
|
|
}
|
|
|
|
- /* *INDENT-OFF* */
|
|
struct v4l2_ext_control control[] = {
|
|
+ /* *INDENT-OFF* */
|
|
{
|
|
.id = V4L2_CID_STATELESS_H264_ENCODE_PARAMS,
|
|
.ptr = &self->encode_params,
|
|
@@ -960,8 +941,8 @@ gst_v4l2_codec_h264_enc_encode_frame (GstH264Encoder * encoder,
|
|
.ptr = &self->encode_rc,
|
|
.size = sizeof (self->encode_rc),
|
|
},
|
|
+ /* *INDENT-ON* */
|
|
};
|
|
- /* *INDENT-ON* */
|
|
|
|
GST_DEBUG_OBJECT (self, "encode h264 frame with quality = %d",
|
|
h264_frame->quality);
|
|
@@ -1008,7 +989,7 @@ gst_v4l2_codec_h264_enc_encode_frame (GstH264Encoder * encoder,
|
|
}
|
|
}
|
|
|
|
- if (!gst_v4l2_encoder_request_set_done(request, &bytesused, &flags)) {
|
|
+ if (!gst_v4l2_encoder_request_set_done (request, &bytesused, &flags)) {
|
|
GST_ELEMENT_ERROR (self, RESOURCE, WRITE,
|
|
("Driver did not ack the request."), (NULL));
|
|
goto done;
|
|
--
|
|
2.25.1
|
|
|