1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-21 10:55:51 +02:00

avcodec/elbg: Move avpriv_init_elbg() down

It will avoid a forward declaration later.

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2021-09-15 22:34:34 +02:00
parent 01f106000b
commit d046e76515

View File

@ -332,42 +332,6 @@ static void do_shiftings(elbg_data *elbg)
}
}
#define BIG_PRIME 433494437LL
int avpriv_init_elbg(int *points, int dim, int numpoints, int *codebook,
int numCB, int max_steps, int *closest_cb,
AVLFG *rand_state)
{
int i, k, ret = 0;
if (numpoints > 24*numCB) {
/* ELBG is very costly for a big number of points. So if we have a lot
of them, get a good initial codebook to save on iterations */
int *temp_points = av_malloc_array(dim, (numpoints/8)*sizeof(int));
if (!temp_points)
return AVERROR(ENOMEM);
for (i=0; i<numpoints/8; i++) {
k = (i*BIG_PRIME) % numpoints;
memcpy(temp_points + i*dim, points + k*dim, dim*sizeof(int));
}
ret = avpriv_init_elbg(temp_points, dim, numpoints / 8, codebook,
numCB, 2 * max_steps, closest_cb, rand_state);
if (ret < 0) {
av_freep(&temp_points);
return ret;
}
ret = avpriv_do_elbg(temp_points, dim, numpoints / 8, codebook,
numCB, 2 * max_steps, closest_cb, rand_state);
av_free(temp_points);
} else // If not, initialize the codebook with random positions
for (i=0; i < numCB; i++)
memcpy(codebook + i*dim, points + ((i*BIG_PRIME)%numpoints)*dim,
dim*sizeof(int));
return ret;
}
int avpriv_do_elbg(int *points, int dim, int numpoints, int *codebook,
int numCB, int max_steps, int *closest_cb,
AVLFG *rand_state)
@ -459,3 +423,38 @@ out:
av_free(elbg->scratchbuf);
return ret;
}
#define BIG_PRIME 433494437LL
int avpriv_init_elbg(int *points, int dim, int numpoints, int *codebook,
int num_cb, int max_steps, int *closest_cb,
AVLFG *rand_state)
{
int ret = 0;
if (numpoints > 24LL * num_cb) {
/* ELBG is very costly for a big number of points. So if we have a lot
of them, get a good initial codebook to save on iterations */
int *temp_points = av_malloc_array(dim, (numpoints/8)*sizeof(*temp_points));
if (!temp_points)
return AVERROR(ENOMEM);
for (int i = 0; i < numpoints / 8; i++) {
int k = (i*BIG_PRIME) % numpoints;
memcpy(temp_points + i*dim, points + k*dim, dim * sizeof(*temp_points));
}
ret = avpriv_init_elbg(temp_points, dim, numpoints / 8, codebook,
num_cb, 2 * max_steps, closest_cb, rand_state);
if (ret < 0) {
av_freep(&temp_points);
return ret;
}
ret = avpriv_do_elbg(temp_points, dim, numpoints / 8, codebook,
num_cb, 2 * max_steps, closest_cb, rand_state);
av_free(temp_points);
} else // If not, initialize the codebook with random positions
for (int i = 0; i < num_cb; i++)
memcpy(codebook + i * dim, points + ((i*BIG_PRIME)%numpoints)*dim,
dim * sizeof(*codebook));
return ret;
}