Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
ae2d41ec
Commit
ae2d41ec
authored
Dec 16, 2014
by
Vittorio Giovara
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
elbg: check memory allocations and propagate errors
parent
5d839778
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
33 additions
and
16 deletions
+33
-16
elbg.c
libavcodec/elbg.c
+25
-10
elbg.h
libavcodec/elbg.h
+8
-6
No files found.
libavcodec/elbg.c
View file @
ae2d41ec
...
...
@@ -323,41 +323,48 @@ static void do_shiftings(elbg_data *elbg)
#define BIG_PRIME 433494437LL
void
ff_init_elbg
(
int
*
points
,
int
dim
,
int
numpoints
,
int
*
codebook
,
int
numCB
,
int
max_steps
,
int
*
closest_cb
,
AVLFG
*
rand_state
)
int
ff_init_elbg
(
int
*
points
,
int
dim
,
int
numpoints
,
int
*
codebook
,
int
numCB
,
int
max_steps
,
int
*
closest_cb
,
AVLFG
*
rand_state
)
{
int
i
,
k
;
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
(
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
));
}
ff_init_elbg
(
temp_points
,
dim
,
numpoints
/
8
,
codebook
,
numCB
,
2
*
max_steps
,
closest_cb
,
rand_state
);
ff_do_elbg
(
temp_points
,
dim
,
numpoints
/
8
,
codebook
,
numCB
,
2
*
max_steps
,
closest_cb
,
rand_state
);
ret
=
ff_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
=
ff_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
;
}
void
ff_do_elbg
(
int
*
points
,
int
dim
,
int
numpoints
,
int
*
codebook
,
int
ff_do_elbg
(
int
*
points
,
int
dim
,
int
numpoints
,
int
*
codebook
,
int
numCB
,
int
max_steps
,
int
*
closest_cb
,
AVLFG
*
rand_state
)
{
int
dist
;
elbg_data
elbg_d
;
elbg_data
*
elbg
=
&
elbg_d
;
int
i
,
j
,
k
,
last_error
,
steps
=
0
;
int
i
,
j
,
k
,
last_error
,
steps
=
0
,
ret
=
0
;
int
*
dist_cb
=
av_malloc
(
numpoints
*
sizeof
(
int
));
int
*
size_part
=
av_malloc
(
numCB
*
sizeof
(
int
));
cell
*
list_buffer
=
av_malloc
(
numpoints
*
sizeof
(
cell
));
...
...
@@ -375,6 +382,12 @@ void ff_do_elbg(int *points, int dim, int numpoints, int *codebook,
elbg
->
utility_inc
=
av_malloc
(
numCB
*
sizeof
(
int
));
elbg
->
scratchbuf
=
av_malloc
(
5
*
dim
*
sizeof
(
int
));
if
(
!
dist_cb
||
!
size_part
||
!
list_buffer
||
!
elbg
->
cells
||
!
elbg
->
utility
||
!
elbg
->
utility_inc
||
!
elbg
->
scratchbuf
)
{
ret
=
AVERROR
(
ENOMEM
);
goto
out
;
}
elbg
->
rand_state
=
rand_state
;
do
{
...
...
@@ -427,6 +440,7 @@ void ff_do_elbg(int *points, int dim, int numpoints, int *codebook,
}
while
(((
last_error
-
elbg
->
error
)
>
DELTA_ERR_MAX
*
elbg
->
error
)
&&
(
steps
<
max_steps
));
out:
av_free
(
dist_cb
);
av_free
(
size_part
);
av_free
(
elbg
->
utility
);
...
...
@@ -434,4 +448,5 @@ void ff_do_elbg(int *points, int dim, int numpoints, int *codebook,
av_free
(
elbg
->
cells
);
av_free
(
elbg
->
utility_inc
);
av_free
(
elbg
->
scratchbuf
);
return
ret
;
}
libavcodec/elbg.h
View file @
ae2d41ec
...
...
@@ -36,10 +36,11 @@
* @param num_steps The maximum number of steps. One step is already a good compromise between time and quality.
* @param closest_cb Return the closest codebook to each point. Must be allocated.
* @param rand_state A random number generator state. Should be already initialized by av_lfg_init().
* @return < 0 in case of error, 0 otherwise
*/
void
ff_do_elbg
(
int
*
points
,
int
dim
,
int
numpoints
,
int
*
codebook
,
int
numCB
,
int
num_steps
,
int
*
closest_cb
,
AVLFG
*
rand_state
);
int
ff_do_elbg
(
int
*
points
,
int
dim
,
int
numpoints
,
int
*
codebook
,
int
numCB
,
int
num_steps
,
int
*
closest_cb
,
AVLFG
*
rand_state
);
/**
* Initialize the **codebook vector for the elbg algorithm. If you have already
...
...
@@ -47,9 +48,10 @@ void ff_do_elbg(int *points, int dim, int numpoints, int *codebook,
* If numpoints < 8*numCB this function fills **codebook with random numbers.
* If not, it calls ff_do_elbg for a (smaller) random sample of the points in
* **points. Get the same parameters as ff_do_elbg.
* @return < 0 in case of error, 0 otherwise
*/
void
ff_init_elbg
(
int
*
points
,
int
dim
,
int
numpoints
,
int
*
codebook
,
int
numCB
,
int
num_steps
,
int
*
closest_cb
,
AVLFG
*
rand_state
);
int
ff_init_elbg
(
int
*
points
,
int
dim
,
int
numpoints
,
int
*
codebook
,
int
numCB
,
int
num_steps
,
int
*
closest_cb
,
AVLFG
*
rand_state
);
#endif
/* AVCODEC_ELBG_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment