aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2023-07-22 21:12:57 -0700
committerHarish Mahendrakar <harish.mahendrakar@ittiam.com>2023-07-23 22:40:57 -0700
commit72558e3be0acb59d4358a62a1ad4bcc61cc38352 (patch)
tree7af6d24e569258db355df715667823f6d195645f
parent4cd4edc0f6829f9a2054d810d367e741755ce22f (diff)
downloadlibhevc-72558e3be0acb59d4358a62a1ad4bcc61cc38352.tar.gz
decoder: join threads in reset()
Test: hevc_dec_fuzzer
-rw-r--r--decoder/ihevcd_api.c52
1 files changed, 35 insertions, 17 deletions
diff --git a/decoder/ihevcd_api.c b/decoder/ihevcd_api.c
index a53cade..e37d44b 100644
--- a/decoder/ihevcd_api.c
+++ b/decoder/ihevcd_api.c
@@ -1461,6 +1461,37 @@ WORD32 ihevcd_allocate_static_bufs(iv_obj_t **pps_codec_obj,
return (status);
}
+WORD32 ihevcd_join_threads(codec_t *ps_codec)
+{
+ if(ps_codec->i4_threads_active)
+ {
+ int i;
+ /* Wait for threads */
+ ps_codec->i4_break_threads = 1;
+
+ for(i = 0; i < MAX_PROCESS_THREADS; i++)
+ {
+ WORD32 ret;
+ if(ps_codec->ai4_process_thread_created[i])
+ {
+ ret = ithread_mutex_lock(ps_codec->apv_proc_start_mutex[i]);
+ RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
+
+ ps_codec->ai4_process_start[i] = 1;
+ ret = ithread_cond_signal(ps_codec->apv_proc_start_condition[i]);
+ RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
+
+ ret = ithread_mutex_unlock(ps_codec->apv_proc_start_mutex[i]);
+ RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
+
+ ithread_join(ps_codec->apv_process_thread_handle[i], NULL);
+
+ ps_codec->ai4_process_thread_created[i] = 0;
+ }
+ }
+ }
+ return IV_SUCCESS;
+}
/**
*******************************************************************************
*
@@ -1494,26 +1525,11 @@ WORD32 ihevcd_free_static_bufs(iv_obj_t *ps_codec_obj)
if(ps_codec->i4_threads_active)
{
/* Wait for threads */
- ps_codec->i4_break_threads = 1;
+ ihevcd_join_threads(ps_codec);
+
for(int i = 0; i < MAX_PROCESS_THREADS; i++)
{
WORD32 ret;
- if(ps_codec->ai4_process_thread_created[i])
- {
- ret = ithread_mutex_lock(ps_codec->apv_proc_start_mutex[i]);
- RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
-
- ps_codec->ai4_process_start[i] = 1;
- ret = ithread_cond_signal(ps_codec->apv_proc_start_condition[i]);
- RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
-
- ret = ithread_mutex_unlock(ps_codec->apv_proc_start_mutex[i]);
- RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
-
- ithread_join(ps_codec->apv_process_thread_handle[i], NULL);
-
- ps_codec->ai4_process_thread_created[i] = 0;
- }
ret = ithread_cond_destroy(ps_codec->apv_proc_start_condition[i]);
RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
@@ -2941,6 +2957,8 @@ WORD32 ihevcd_reset(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op)
if(ps_codec != NULL)
{
DEBUG("\nReset called \n");
+ ihevcd_join_threads(ps_codec);
+
ihevcd_init(ps_codec);
}
else