Skip to content

Commit 7bc4b8b

Browse files
marconeandi34
authored andcommitted
vp8:fix threading issues
1 - stops de allocating before threads are closed. 2 - limits threads to mb_rows when mb_rows < partitions BUG=webm:851 Bug: 30436808 Change-Id: Ie017818ed28103ca9d26d57087f31361b642e09b (cherry picked from commit 70cca74)
1 parent 659e9d3 commit 7bc4b8b

File tree

3 files changed

+89
-107
lines changed

3 files changed

+89
-107
lines changed

libvpx/vp8/decoder/decodeframe.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -903,9 +903,13 @@ static void setup_token_decoder(VP8D_COMP *pbi,
903903
}
904904

905905
#if CONFIG_MULTITHREAD
906-
/* Clamp number of decoder threads */
907-
if (pbi->decoding_thread_count > num_token_partitions - 1)
908-
pbi->decoding_thread_count = num_token_partitions - 1;
906+
/* Clamp number of decoder threads */
907+
if (pbi->decoding_thread_count > num_token_partitions - 1) {
908+
pbi->decoding_thread_count = num_token_partitions - 1;
909+
}
910+
if (pbi->decoding_thread_count > pbi->common.mb_rows - 1) {
911+
pbi->decoding_thread_count = pbi->common.mb_rows - 1;
912+
}
909913
#endif
910914
}
911915

libvpx/vp8/decoder/onyxd_if.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,6 @@ int vp8dx_receive_compressed_data(VP8D_COMP *pbi, size_t size,
331331

332332
if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0)
333333
cm->fb_idx_ref_cnt[cm->new_fb_idx]--;
334-
335334
goto decode_exit;
336335
}
337336

@@ -487,8 +486,6 @@ int vp8_remove_decoder_instances(struct frame_buffers *fb)
487486
if (!pbi)
488487
return VPX_CODEC_ERROR;
489488
#if CONFIG_MULTITHREAD
490-
if (pbi->b_multithreaded_rd)
491-
vp8mt_de_alloc_temp_buffers(pbi, pbi->common.mb_rows);
492489
vp8_decoder_remove_threads(pbi);
493490
#endif
494491

libvpx/vp8/decoder/threading.c

Lines changed: 82 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -694,83 +694,67 @@ void vp8_decoder_create_threads(VP8D_COMP *pbi)
694694
}
695695

696696

697-
void vp8mt_de_alloc_temp_buffers(VP8D_COMP *pbi, int mb_rows)
698-
{
699-
int i;
700-
701-
if (pbi->b_multithreaded_rd)
702-
{
703-
vpx_free(pbi->mt_current_mb_col);
704-
pbi->mt_current_mb_col = NULL ;
705-
706-
/* Free above_row buffers. */
707-
if (pbi->mt_yabove_row)
708-
{
709-
for (i=0; i< mb_rows; i++)
710-
{
711-
vpx_free(pbi->mt_yabove_row[i]);
712-
pbi->mt_yabove_row[i] = NULL ;
713-
}
714-
vpx_free(pbi->mt_yabove_row);
715-
pbi->mt_yabove_row = NULL ;
716-
}
717-
718-
if (pbi->mt_uabove_row)
719-
{
720-
for (i=0; i< mb_rows; i++)
721-
{
722-
vpx_free(pbi->mt_uabove_row[i]);
723-
pbi->mt_uabove_row[i] = NULL ;
724-
}
725-
vpx_free(pbi->mt_uabove_row);
726-
pbi->mt_uabove_row = NULL ;
727-
}
728-
729-
if (pbi->mt_vabove_row)
730-
{
731-
for (i=0; i< mb_rows; i++)
732-
{
733-
vpx_free(pbi->mt_vabove_row[i]);
734-
pbi->mt_vabove_row[i] = NULL ;
735-
}
736-
vpx_free(pbi->mt_vabove_row);
737-
pbi->mt_vabove_row = NULL ;
738-
}
739-
740-
/* Free left_col buffers. */
741-
if (pbi->mt_yleft_col)
742-
{
743-
for (i=0; i< mb_rows; i++)
744-
{
745-
vpx_free(pbi->mt_yleft_col[i]);
746-
pbi->mt_yleft_col[i] = NULL ;
747-
}
748-
vpx_free(pbi->mt_yleft_col);
749-
pbi->mt_yleft_col = NULL ;
750-
}
697+
void vp8mt_de_alloc_temp_buffers(VP8D_COMP *pbi, int mb_rows) {
698+
int i;
751699

752-
if (pbi->mt_uleft_col)
753-
{
754-
for (i=0; i< mb_rows; i++)
755-
{
756-
vpx_free(pbi->mt_uleft_col[i]);
757-
pbi->mt_uleft_col[i] = NULL ;
758-
}
759-
vpx_free(pbi->mt_uleft_col);
760-
pbi->mt_uleft_col = NULL ;
761-
}
700+
vpx_free(pbi->mt_current_mb_col);
701+
pbi->mt_current_mb_col = NULL;
762702

763-
if (pbi->mt_vleft_col)
764-
{
765-
for (i=0; i< mb_rows; i++)
766-
{
767-
vpx_free(pbi->mt_vleft_col[i]);
768-
pbi->mt_vleft_col[i] = NULL ;
769-
}
770-
vpx_free(pbi->mt_vleft_col);
771-
pbi->mt_vleft_col = NULL ;
772-
}
703+
/* Free above_row buffers. */
704+
if (pbi->mt_yabove_row) {
705+
for (i = 0; i < mb_rows; ++i) {
706+
vpx_free(pbi->mt_yabove_row[i]);
707+
pbi->mt_yabove_row[i] = NULL;
708+
}
709+
vpx_free(pbi->mt_yabove_row);
710+
pbi->mt_yabove_row = NULL;
711+
}
712+
713+
if (pbi->mt_uabove_row) {
714+
for (i = 0; i < mb_rows; ++i) {
715+
vpx_free(pbi->mt_uabove_row[i]);
716+
pbi->mt_uabove_row[i] = NULL;
717+
}
718+
vpx_free(pbi->mt_uabove_row);
719+
pbi->mt_uabove_row = NULL;
720+
}
721+
722+
if (pbi->mt_vabove_row) {
723+
for (i = 0; i < mb_rows; ++i) {
724+
vpx_free(pbi->mt_vabove_row[i]);
725+
pbi->mt_vabove_row[i] = NULL;
726+
}
727+
vpx_free(pbi->mt_vabove_row);
728+
pbi->mt_vabove_row = NULL;
729+
}
730+
731+
/* Free left_col buffers. */
732+
if (pbi->mt_yleft_col) {
733+
for (i = 0; i < mb_rows; ++i) {
734+
vpx_free(pbi->mt_yleft_col[i]);
735+
pbi->mt_yleft_col[i] = NULL;
736+
}
737+
vpx_free(pbi->mt_yleft_col);
738+
pbi->mt_yleft_col = NULL;
739+
}
740+
741+
if (pbi->mt_uleft_col) {
742+
for (i = 0; i < mb_rows; ++i) {
743+
vpx_free(pbi->mt_uleft_col[i]);
744+
pbi->mt_uleft_col[i] = NULL;
745+
}
746+
vpx_free(pbi->mt_uleft_col);
747+
pbi->mt_uleft_col = NULL;
748+
}
749+
750+
if (pbi->mt_vleft_col) {
751+
for (i = 0; i < mb_rows; ++i) {
752+
vpx_free(pbi->mt_vleft_col[i]);
753+
pbi->mt_vleft_col[i] = NULL;
773754
}
755+
vpx_free(pbi->mt_vleft_col);
756+
pbi->mt_vleft_col = NULL;
757+
}
774758
}
775759

776760

@@ -827,41 +811,38 @@ void vp8mt_alloc_temp_buffers(VP8D_COMP *pbi, int width, int prev_mb_rows)
827811
}
828812

829813

830-
void vp8_decoder_remove_threads(VP8D_COMP *pbi)
831-
{
832-
/* shutdown MB Decoding thread; */
833-
if (pbi->b_multithreaded_rd)
834-
{
835-
int i;
814+
void vp8_decoder_remove_threads(VP8D_COMP *pbi) {
815+
/* shutdown MB Decoding thread; */
816+
if (pbi->b_multithreaded_rd) {
817+
int i;
818+
pbi->b_multithreaded_rd = 0;
836819

837-
pbi->b_multithreaded_rd = 0;
820+
/* allow all threads to exit */
821+
for (i = 0; i < pbi->allocated_decoding_thread_count; ++i) {
822+
sem_post(&pbi->h_event_start_decoding[i]);
823+
pthread_join(pbi->h_decoding_thread[i], NULL);
824+
}
838825

839-
/* allow all threads to exit */
840-
for (i = 0; i < pbi->allocated_decoding_thread_count; i++)
841-
{
842-
sem_post(&pbi->h_event_start_decoding[i]);
843-
pthread_join(pbi->h_decoding_thread[i], NULL);
844-
}
826+
for (i = 0; i < pbi->allocated_decoding_thread_count; ++i) {
827+
sem_destroy(&pbi->h_event_start_decoding[i]);
828+
}
845829

846-
for (i = 0; i < pbi->allocated_decoding_thread_count; i++)
847-
{
848-
sem_destroy(&pbi->h_event_start_decoding[i]);
849-
}
830+
sem_destroy(&pbi->h_event_end_decoding);
850831

851-
sem_destroy(&pbi->h_event_end_decoding);
832+
vpx_free(pbi->h_decoding_thread);
833+
pbi->h_decoding_thread = NULL;
852834

853-
vpx_free(pbi->h_decoding_thread);
854-
pbi->h_decoding_thread = NULL;
835+
vpx_free(pbi->h_event_start_decoding);
836+
pbi->h_event_start_decoding = NULL;
855837

856-
vpx_free(pbi->h_event_start_decoding);
857-
pbi->h_event_start_decoding = NULL;
838+
vpx_free(pbi->mb_row_di);
839+
pbi->mb_row_di = NULL;
858840

859-
vpx_free(pbi->mb_row_di);
860-
pbi->mb_row_di = NULL ;
841+
vpx_free(pbi->de_thread_data);
842+
pbi->de_thread_data = NULL;
861843

862-
vpx_free(pbi->de_thread_data);
863-
pbi->de_thread_data = NULL;
864-
}
844+
vp8mt_de_alloc_temp_buffers(pbi, pbi->common.mb_rows);
845+
}
865846
}
866847

867848
void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd)

0 commit comments

Comments
 (0)