diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-09-15 22:34:34 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-09-20 04:08:54 +0200 |
commit | d046e76515d8f30e2960e4888478002852bf0209 (patch) | |
tree | e230073dd8055c4113422e23953b1b3793bfec62 /libavcodec/elbg.c | |
parent | 01f106000bec78f5fa6e4de9dfc241b021584442 (diff) | |
download | ffmpeg-d046e76515d8f30e2960e4888478002852bf0209.tar.gz |
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>
Diffstat (limited to 'libavcodec/elbg.c')
-rw-r--r-- | libavcodec/elbg.c | 71 |
1 files changed, 35 insertions, 36 deletions
diff --git a/libavcodec/elbg.c b/libavcodec/elbg.c index 795fc83f16..3ca67b400c 100644 --- a/libavcodec/elbg.c +++ b/libavcodec/elbg.c @@ -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; +} |