summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>2016-07-21 17:38:40 +0200
committerSreerenj Balachandran <sreerenj.balachandran@intel.com>2016-08-16 14:58:03 +0300
commitae098c375e18c8f361a0a2a32fdc0cb21045206b (patch)
treefc234ef829daf9bedc9739ddb6020c691a03c700
parentb6d05d1b78b14079269c809168e0eb9d21eff7be (diff)
downloadgstreamer-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.c6
-rw-r--r--gst-libs/gst/vaapi/gstvaapiencoder_h265.c6
-rw-r--r--gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c9
-rw-r--r--gst-libs/gst/vaapi/gstvaapiencoder_vp8.c9
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;