mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/rpzaenc: replace float-point calculations with integer ones
This commit is contained in:
parent
b97ac6b3df
commit
03ed48aeca
|
@ -30,6 +30,7 @@
|
||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "codec_internal.h"
|
#include "codec_internal.h"
|
||||||
#include "encode.h"
|
#include "encode.h"
|
||||||
|
#include "mathops.h"
|
||||||
#include "put_bits.h"
|
#include "put_bits.h"
|
||||||
|
|
||||||
typedef struct RpzaContext {
|
typedef struct RpzaContext {
|
||||||
|
@ -65,7 +66,7 @@ typedef struct rgb {
|
||||||
#define SQR(x) ((x) * (x))
|
#define SQR(x) ((x) * (x))
|
||||||
|
|
||||||
/* 15 bit components */
|
/* 15 bit components */
|
||||||
#define GET_CHAN(color, chan) (((color) >> ((chan) * 5) & 0x1F) * 8)
|
#define GET_CHAN(color, chan) (((color) >> ((chan) * 5) & 0x1F))
|
||||||
#define R(color) GET_CHAN(color, RED)
|
#define R(color) GET_CHAN(color, RED)
|
||||||
#define G(color) GET_CHAN(color, GREEN)
|
#define G(color) GET_CHAN(color, GREEN)
|
||||||
#define B(color) GET_CHAN(color, BLUE)
|
#define B(color) GET_CHAN(color, BLUE)
|
||||||
|
@ -141,9 +142,9 @@ static uint16_t rgb24_to_rgb555(const uint8_t *rgb24)
|
||||||
uint16_t rgb555 = 0;
|
uint16_t rgb555 = 0;
|
||||||
uint32_t r, g, b;
|
uint32_t r, g, b;
|
||||||
|
|
||||||
r = rgb24[0] >> 3;
|
r = rgb24[0];
|
||||||
g = rgb24[1] >> 3;
|
g = rgb24[1];
|
||||||
b = rgb24[2] >> 3;
|
b = rgb24[2];
|
||||||
|
|
||||||
rgb555 |= (r << 10);
|
rgb555 |= (r << 10);
|
||||||
rgb555 |= (g << 5);
|
rgb555 |= (g << 5);
|
||||||
|
@ -185,7 +186,7 @@ static int max_component_diff(const uint16_t *colorA, const uint16_t *colorB)
|
||||||
if (diff > max) {
|
if (diff > max) {
|
||||||
max = diff;
|
max = diff;
|
||||||
}
|
}
|
||||||
return max * 8;
|
return max;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -266,9 +267,9 @@ static int compare_blocks(const uint16_t *block1, const uint16_t *block2,
|
||||||
*/
|
*/
|
||||||
static int leastsquares(const uint16_t *block_ptr, const BlockInfo *bi,
|
static int leastsquares(const uint16_t *block_ptr, const BlockInfo *bi,
|
||||||
channel_offset xchannel, channel_offset ychannel,
|
channel_offset xchannel, channel_offset ychannel,
|
||||||
double *slope, double *y_intercept, double *correlation_coef)
|
int *slope, int *y_intercept, int *correlation_coef)
|
||||||
{
|
{
|
||||||
double sumx = 0, sumy = 0, sumx2 = 0, sumy2 = 0, sumxy = 0,
|
int sumx = 0, sumy = 0, sumx2 = 0, sumy2 = 0, sumxy = 0,
|
||||||
sumx_sq = 0, sumy_sq = 0, tmp, tmp2;
|
sumx_sq = 0, sumy_sq = 0, tmp, tmp2;
|
||||||
int i, j, count;
|
int i, j, count;
|
||||||
uint8_t x, y;
|
uint8_t x, y;
|
||||||
|
@ -305,10 +306,10 @@ static int leastsquares(const uint16_t *block_ptr, const BlockInfo *bi,
|
||||||
|
|
||||||
tmp2 = count * sumy2 - sumy_sq;
|
tmp2 = count * sumy2 - sumy_sq;
|
||||||
if (tmp2 == 0) {
|
if (tmp2 == 0) {
|
||||||
*correlation_coef = 0.0;
|
*correlation_coef = 0;
|
||||||
} else {
|
} else {
|
||||||
*correlation_coef = (count * sumxy - sumx * sumy) /
|
*correlation_coef = (count * sumxy - sumx * sumy) /
|
||||||
sqrt(tmp * tmp2);
|
ff_sqrt((unsigned)tmp * tmp2);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0; // success
|
return 0; // success
|
||||||
|
@ -332,18 +333,18 @@ static int calc_lsq_max_fit_error(const uint16_t *block_ptr, const BlockInfo *bi
|
||||||
y = GET_CHAN(block_ptr[j], ychannel);
|
y = GET_CHAN(block_ptr[j], ychannel);
|
||||||
|
|
||||||
/* calculate x_inc as the 4-color index (0..3) */
|
/* calculate x_inc as the 4-color index (0..3) */
|
||||||
x_inc = floor( (x - min) * 3.0 / (max - min) + 0.5);
|
x_inc = (x - min) * 3 / (max - min) + 1;
|
||||||
x_inc = FFMAX(FFMIN(3, x_inc), 0);
|
x_inc = FFMAX(FFMIN(3, x_inc), 0);
|
||||||
|
|
||||||
/* calculate lin_y corresponding to x_inc */
|
/* calculate lin_y corresponding to x_inc */
|
||||||
lin_y = (int)(tmp_min + (tmp_max - tmp_min) * x_inc / 3.0 + 0.5);
|
lin_y = tmp_min + (tmp_max - tmp_min) * x_inc / 3 + 1;
|
||||||
|
|
||||||
err = FFABS(lin_y - y);
|
err = FFABS(lin_y - y);
|
||||||
if (err > max_err)
|
if (err > max_err)
|
||||||
max_err = err;
|
max_err = err;
|
||||||
|
|
||||||
/* calculate lin_x corresponding to x_inc */
|
/* calculate lin_x corresponding to x_inc */
|
||||||
lin_x = (int)(min + (max - min) * x_inc / 3.0 + 0.5);
|
lin_x = min + (max - min) * x_inc / 3 + 1;
|
||||||
|
|
||||||
err = FFABS(lin_x - x);
|
err = FFABS(lin_x - x);
|
||||||
if (err > max_err)
|
if (err > max_err)
|
||||||
|
@ -577,7 +578,7 @@ static void rpza_encode_stream(RpzaContext *s, const AVFrame *pict)
|
||||||
uint8_t avg_color[3];
|
uint8_t avg_color[3];
|
||||||
int pixel_count;
|
int pixel_count;
|
||||||
uint8_t min_color[3], max_color[3];
|
uint8_t min_color[3], max_color[3];
|
||||||
double slope, y_intercept, correlation_coef;
|
int slope, y_intercept, correlation_coef;
|
||||||
const uint16_t *src_pixels = (const uint16_t *)pict->data[0];
|
const uint16_t *src_pixels = (const uint16_t *)pict->data[0];
|
||||||
uint16_t *prev_pixels = (uint16_t *)s->prev_frame->data[0];
|
uint16_t *prev_pixels = (uint16_t *)s->prev_frame->data[0];
|
||||||
|
|
||||||
|
@ -730,8 +731,8 @@ post_skip :
|
||||||
min_color[i] = GET_CHAN(src_pixels[block_offset], i);
|
min_color[i] = GET_CHAN(src_pixels[block_offset], i);
|
||||||
max_color[i] = GET_CHAN(src_pixels[block_offset], i);
|
max_color[i] = GET_CHAN(src_pixels[block_offset], i);
|
||||||
} else {
|
} else {
|
||||||
tmp_min = (int)(0.5 + min * slope + y_intercept);
|
tmp_min = 1 + min * slope + y_intercept;
|
||||||
tmp_max = (int)(0.5 + max * slope + y_intercept);
|
tmp_max = 1 + max * slope + y_intercept;
|
||||||
|
|
||||||
av_assert0(tmp_min <= tmp_max);
|
av_assert0(tmp_min <= tmp_max);
|
||||||
// clamp min and max color values
|
// clamp min and max color values
|
||||||
|
|
Loading…
Reference in New Issue