diff options
author | Víctor Manuel Jáquez Leal <victorx.jaquez@intel.com> | 2016-07-21 17:38:40 +0200 |
---|---|---|
committer | Sreerenj Balachandran <sreerenj.balachandran@intel.com> | 2016-08-16 14:58:03 +0300 |
commit | ae098c375e18c8f361a0a2a32fdc0cb21045206b (patch) | |
tree | fc234ef829daf9bedc9739ddb6020c691a03c700 | |
parent | b6d05d1b78b14079269c809168e0eb9d21eff7be (diff) | |
download | gstreamer-vaapi-ae098c375e18c8f361a0a2a32fdc0cb21045206b.tar.gz |
encoder: h264,h265,mpeg2,vp8: use gst_util_uint64_scale() for bitrate
Use gst_util_uint64_scale() to calculate bitrate instead of normal arithmetic
to avoid overflows, underflows and loss of precision.
https://bugzilla.gnome.org/show_bug.cgi?id=768458
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapiencoder_h264.c | 6 | ||||
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapiencoder_h265.c | 6 | ||||
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c | 9 | ||||
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapiencoder_vp8.c | 9 |
4 files changed, 16 insertions, 14 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h264.c b/gst-libs/gst/vaapi/gstvaapiencoder_h264.c index 26d2c0f8..03a4d682 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_h264.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_h264.c @@ -2370,10 +2370,10 @@ ensure_bitrate (GstVaapiEncoderH264 * encoder) if (!encoder->use_dct8x8) bits_per_mb += (bits_per_mb * 10) / 100; + guint64 factor = encoder->mb_width * encoder->mb_height * bits_per_mb; base_encoder->bitrate = - encoder->mb_width * encoder->mb_height * bits_per_mb * - GST_VAAPI_ENCODER_FPS_N (encoder) / - GST_VAAPI_ENCODER_FPS_D (encoder) / 1000; + gst_util_uint64_scale (factor, GST_VAAPI_ENCODER_FPS_N (encoder), + GST_VAAPI_ENCODER_FPS_D (encoder)) / 1000; GST_INFO ("target bitrate computed to %u kbps", base_encoder->bitrate); } break; diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h265.c b/gst-libs/gst/vaapi/gstvaapiencoder_h265.c index 396aa938..26569fc3 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_h265.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_h265.c @@ -1823,10 +1823,10 @@ ensure_bitrate (GstVaapiEncoderH265 * encoder) /* Fixme: Provide better estimation */ /* Using a 1/6 compression ratio */ /* 12 bits per pixel fro yuv420 */ + guint64 factor = encoder->luma_width * encoder->luma_height * 12 / 6; base_encoder->bitrate = - (encoder->luma_width * encoder->luma_height * 12 / 6) * - GST_VAAPI_ENCODER_FPS_N (encoder) / - GST_VAAPI_ENCODER_FPS_D (encoder) / 1000; + gst_util_uint64_scale (factor, GST_VAAPI_ENCODER_FPS_N (encoder), + GST_VAAPI_ENCODER_FPS_D (encoder)) / 1000; GST_INFO ("target bitrate computed to %u kbps", base_encoder->bitrate); } break; diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c b/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c index 0620d9f9..93333078 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c @@ -186,10 +186,11 @@ ensure_bitrate (GstVaapiEncoderMpeg2 * encoder) switch (GST_VAAPI_ENCODER_RATE_CONTROL (encoder)) { case GST_VAAPI_RATECONTROL_CBR: if (!base_encoder->bitrate) - base_encoder->bitrate = GST_VAAPI_ENCODER_WIDTH (encoder) * - GST_VAAPI_ENCODER_HEIGHT (encoder) * - GST_VAAPI_ENCODER_FPS_N (encoder) / - GST_VAAPI_ENCODER_FPS_D (encoder) / 4 / 1000; + base_encoder->bitrate = + gst_util_uint64_scale (GST_VAAPI_ENCODER_WIDTH (encoder) * + GST_VAAPI_ENCODER_HEIGHT (encoder), + GST_VAAPI_ENCODER_FPS_N (encoder), + GST_VAAPI_ENCODER_FPS_D (encoder)) / 4 / 1000; break; default: base_encoder->bitrate = 0; diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_vp8.c b/gst-libs/gst/vaapi/gstvaapiencoder_vp8.c index 65b449ed..c23bd257 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_vp8.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_vp8.c @@ -125,10 +125,11 @@ ensure_bitrate (GstVaapiEncoderVP8 * encoder) switch (GST_VAAPI_ENCODER_RATE_CONTROL (encoder)) { case GST_VAAPI_RATECONTROL_CBR: if (!base_encoder->bitrate) { - base_encoder->bitrate = GST_VAAPI_ENCODER_WIDTH (encoder) * - GST_VAAPI_ENCODER_HEIGHT (encoder) * - GST_VAAPI_ENCODER_FPS_N (encoder) / - GST_VAAPI_ENCODER_FPS_D (encoder) / 4 * 1000; + base_encoder->bitrate = + gst_util_uint64_scale (GST_VAAPI_ENCODER_WIDTH (encoder) * + GST_VAAPI_ENCODER_HEIGHT (encoder), + GST_VAAPI_ENCODER_FPS_N (encoder), + GST_VAAPI_ENCODER_FPS_D (encoder)) / 4 * 1000; } default: base_encoder->bitrate = 0; |