diff --git a/girs/Gst-1.0.gir b/girs/Gst-1.0.gir index 3de8bddb78..9cacb6c899 100644 --- a/girs/Gst-1.0.gir +++ b/girs/Gst-1.0.gir @@ -54222,6 +54222,20 @@ element or %NULL if nothing was found + + Return a max num of log2. + + + a computed #guint val. + + + + + a #guint32 value. + + + + Transforms a #gdouble to a fraction and simplifies the result. diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth264parser.c b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth264parser.c index aa2efa9403..d27cc89d3a 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth264parser.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth264parser.c @@ -2432,7 +2432,8 @@ gst_h264_parser_parse_slice_hdr (GstH264NalParser * nalparser, guint32 PicHeightInMapUnits = sps->pic_height_in_map_units_minus1 + 1; guint32 PicSizeInMapUnits = PicWidthInMbs * PicHeightInMapUnits; guint32 SliceGroupChangeRate = pps->slice_group_change_rate_minus1 + 1; - const guint n = ceil_log2 (PicSizeInMapUnits / SliceGroupChangeRate + 1); + const guint n = + gst_util_ceil_log2 (PicSizeInMapUnits / SliceGroupChangeRate + 1); READ_UINT16 (&nr, slice->slice_group_change_cycle, n); } diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265bitwriter.c b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265bitwriter.c index 52efe4ab50..a175a9c2b2 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265bitwriter.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265bitwriter.c @@ -1411,7 +1411,7 @@ _h265_slice_bit_writer_ref_pic_list_modification (const GstH265SliceHdr * guint i; const GstH265RefPicListModification *rpl_mod = &slice->ref_pic_list_modification; - const guint n = ceil_log2 (NumPocTotalCurr); + const guint n = gst_util_ceil_log2 (NumPocTotalCurr); WRITE_BITS (bw, rpl_mod->ref_pic_list_modification_flag_l0, 1); @@ -1551,7 +1551,7 @@ _h265_bit_writer_slice_header (const GstH265SliceHdr * slice, ceil ((gdouble) sps->pic_width_in_luma_samples / (gdouble) CtbSizeY); PicSizeInCtbsY = PicWidthInCtbsY * PicHeightInCtbsY; - n = ceil_log2 (PicSizeInCtbsY); + n = gst_util_ceil_log2 (PicSizeInCtbsY); if (slice->pps->dependent_slice_segments_enabled_flag) WRITE_BITS (bw, slice->dependent_slice_segment_flag, 1); @@ -1584,7 +1584,7 @@ _h265_bit_writer_slice_header (const GstH265SliceHdr * slice, slice->pps->sps, bw, &have_space)) goto error; } else if (sps->num_short_term_ref_pic_sets > 1) { - const guint n = ceil_log2 (sps->num_short_term_ref_pic_sets); + const guint n = gst_util_ceil_log2 (sps->num_short_term_ref_pic_sets); if (slice->short_term_ref_pic_set_idx > sps->num_short_term_ref_pic_sets - 1) @@ -1605,7 +1605,8 @@ _h265_bit_writer_slice_header (const GstH265SliceHdr * slice, for (i = 0; i < limit; i++) { if (i < slice->num_long_term_sps) { if (sps->num_long_term_ref_pics_sps > 1) { - const guint n = ceil_log2 (sps->num_long_term_ref_pics_sps); + const guint n = + gst_util_ceil_log2 (sps->num_long_term_ref_pics_sps); WRITE_BITS (bw, slice->lt_idx_sps[i], n); } } else { diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265parser.c b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265parser.c index f433f64978..cf4e7e9e31 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265parser.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth265parser.c @@ -920,7 +920,7 @@ gst_h265_slice_parse_ref_pic_list_modification (GstH265SliceHdr * slice, { guint i; GstH265RefPicListModification *rpl_mod = &slice->ref_pic_list_modification; - const guint n = ceil_log2 (NumPocTotalCurr); + const guint n = gst_util_ceil_log2 (NumPocTotalCurr); READ_UINT8 (nr, rpl_mod->ref_pic_list_modification_flag_l0, 1); @@ -2797,7 +2797,7 @@ gst_h265_parser_parse_slice_hdr (GstH265Parser * parser, pps->loop_filter_across_slices_enabled_flag; if (!slice->first_slice_segment_in_pic_flag) { - const guint n = ceil_log2 (PicSizeInCtbsY); + const guint n = gst_util_ceil_log2 (PicSizeInCtbsY); if (pps->dependent_slice_segments_enabled_flag) READ_UINT8 (&nr, slice->dependent_slice_segment_flag, 1); @@ -2835,7 +2835,7 @@ gst_h265_parser_parse_slice_hdr (GstH265Parser * parser, (nal_reader_get_pos (&nr) - pos) - (8 * (nal_reader_get_epb_count (&nr) - epb_pos)); } else if (sps->num_short_term_ref_pic_sets > 1) { - const guint n = ceil_log2 (sps->num_short_term_ref_pic_sets); + const guint n = gst_util_ceil_log2 (sps->num_short_term_ref_pic_sets); READ_UINT8 (&nr, slice->short_term_ref_pic_set_idx, n); CHECK_ALLOWED_MAX (slice->short_term_ref_pic_set_idx, sps->num_short_term_ref_pic_sets - 1); @@ -2855,7 +2855,8 @@ gst_h265_parser_parse_slice_hdr (GstH265Parser * parser, for (i = 0; i < limit; i++) { if (i < slice->num_long_term_sps) { if (sps->num_long_term_ref_pics_sps > 1) { - const guint n = ceil_log2 (sps->num_long_term_ref_pics_sps); + const guint n = + gst_util_ceil_log2 (sps->num_long_term_ref_pics_sps); READ_UINT8 (&nr, slice->lt_idx_sps[i], n); } } else { diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/nalutils.c b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/nalutils.c index af802d7d8d..f8a91de11f 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/nalutils.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/nalutils.c @@ -38,29 +38,6 @@ #include "nalutils.h" #include -/* Compute Ceil(Log2(v)) */ -/* Derived from branchless code for integer log2(v) from: - */ -guint -ceil_log2 (guint32 v) -{ - guint r, shift; - - v--; - r = (v > 0xFFFF) << 4; - v >>= r; - shift = (v > 0xFF) << 3; - v >>= shift; - r |= shift; - shift = (v > 0xF) << 2; - v >>= shift; - r |= shift; - shift = (v > 0x3) << 1; - v >>= shift; - r |= shift; - r |= (v >> 1); - return r + 1; -} /****** Nal parser ******/ diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/nalutils.h b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/nalutils.h index d8c0fbb7b0..8e293ed934 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/nalutils.h +++ b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/nalutils.h @@ -40,8 +40,6 @@ #include #include -guint ceil_log2 (guint32 v); - typedef struct { const guint8 *data; diff --git a/subprojects/gstreamer/gst/gstutils.c b/subprojects/gstreamer/gst/gstutils.c index 12eeee9c02..7770cf03c8 100644 --- a/subprojects/gstreamer/gst/gstutils.c +++ b/subprojects/gstreamer/gst/gstutils.c @@ -4473,6 +4473,40 @@ gst_log2 (GstClockTime in) return count; } +/** + * gst_util_ceil_log2: + * @v: a #guint32 value. + * + * Return a max num of log2. + * + * Returns: a computed #guint val. + * + * Since: 1.24 + */ +guint +gst_util_ceil_log2 (guint32 v) +{ + /* Compute Ceil(Log2(v)) */ + /* Derived from branchless code for integer log2(v) from: + */ + guint r, shift; + + v--; + r = (v > 0xFFFF) << 4; + v >>= r; + shift = (v > 0xFF) << 3; + v >>= shift; + r |= shift; + shift = (v > 0xF) << 2; + v >>= shift; + r |= shift; + shift = (v > 0x3) << 1; + v >>= shift; + r |= shift; + r |= (v >> 1); + return r + 1; +} + /** * gst_calculate_linear_regression: (skip) * @xy: Pairs of (x,y) values diff --git a/subprojects/gstreamer/gst/gstutils.h b/subprojects/gstreamer/gst/gstutils.h index 78e520e204..7b4ec2e3b4 100644 --- a/subprojects/gstreamer/gst/gstutils.h +++ b/subprojects/gstreamer/gst/gstutils.h @@ -1240,6 +1240,9 @@ void gst_type_mark_as_plugin_api (GType type, GstPluginAPIFlags f GST_API gboolean gst_type_is_plugin_api (GType type, GstPluginAPIFlags *flags); +GST_API +guint gst_util_ceil_log2 (guint32 v); + G_END_DECLS #endif /* __GST_UTILS_H__ */