static void hb_qsv_filter_pre_close( hb_filter_object_t * filter ){ int i = 0; mfxStatus sts = MFX_ERR_NONE; hb_filter_private_t * pv = filter->private_data; if ( !pv ) { return; } sws_freeContext(pv->sws_context_to_nv12); sws_freeContext(pv->sws_context_from_nv12); av_qsv_context* qsv = pv->job->qsv; if(qsv && qsv->vpp_space && av_qsv_list_count(qsv->vpp_space) > 0 ){ if(pv->qsv_user && qsv->mfx_session){ sts=MFXVideoUSER_Unregister(qsv->mfx_session,0); AV_QSV_CHECK_RESULT(sts, MFX_ERR_NONE, sts); for(i=hb_list_count(pv->qsv_user);i>0;i--){ qsv_filter_t *plugin = hb_list_item(pv->qsv_user,i-1); hb_list_rem(pv->qsv_user,plugin); plugin_close(plugin); } hb_list_close(&pv->qsv_user); } // closing local stuff qsv_filter_close(qsv,AV_QSV_VPP_USER); // closing the commong stuff av_qsv_context_clean(qsv); } hb_cond_close(&pv->pre.frame_completed); hb_lock_close(&pv->pre.frame_completed_lock); hb_cond_close(&pv->post.frame_completed); hb_lock_close(&pv->post.frame_completed_lock); hb_cond_close(&pv->pre_busy.frame_completed); hb_lock_close(&pv->pre_busy.frame_completed_lock); hb_cond_close(&pv->post_busy.frame_completed); hb_lock_close(&pv->post_busy.frame_completed_lock); hb_list_close( &pv->list ); free( pv ); filter->private_data = NULL; }
/*********************************************************************** * Close Audio *********************************************************************** * **********************************************************************/ void syncAudioClose( hb_work_object_t * w ) { hb_work_private_t * pv = w->private_data; hb_sync_audio_t * sync = &pv->type.audio; if( sync->silence_buf ) { free( sync->silence_buf ); } if ( sync->state ) { src_delete( sync->state ); } hb_lock( pv->common->mutex ); if ( --pv->common->ref == 0 ) { hb_unlock( pv->common->mutex ); hb_cond_close( &pv->common->next_frame ); hb_lock_close( &pv->common->mutex ); free( pv->common->first_pts ); free( pv->common ); } else { hb_unlock( pv->common->mutex ); } free( pv ); w->private_data = NULL; }
void hb_fifo_close( hb_fifo_t ** _f ) { hb_fifo_t * f = *_f; hb_buffer_t * b; hb_deep_log( 2, "fifo_close: trashing %d buffer(s)", hb_fifo_size( f ) ); while( ( b = hb_fifo_get( f ) ) ) { hb_buffer_close( &b ); } hb_lock_close( &f->lock ); hb_cond_close( &f->cond_empty ); hb_cond_close( &f->cond_full ); free( f ); *_f = NULL; }
/*********************************************************************** * Close Video *********************************************************************** * **********************************************************************/ void syncVideoClose( hb_work_object_t * w ) { hb_work_private_t * pv = w->private_data; hb_job_t * job = pv->job; hb_sync_video_t * sync = &pv->type.video; // Wake up audio sync if it's still waiting on condition. pv->common->pts_offset = 0; pv->common->start_found = 1; hb_cond_broadcast( pv->common->next_frame ); if( sync->cur ) { hb_buffer_close( &sync->cur ); } hb_log( "sync: got %d frames, %d expected", pv->common->count_frames, sync->count_frames_max ); /* save data for second pass */ if( job->pass == 1 ) { /* Preserve frame count for better accuracy in pass 2 */ hb_interjob_t * interjob = hb_interjob_get( job->h ); interjob->frame_count = pv->common->count_frames; interjob->last_job = job->sequence_id; } if (sync->drops || sync->dups ) { hb_log( "sync: %d frames dropped, %d duplicated", sync->drops, sync->dups ); } hb_lock( pv->common->mutex ); if ( --pv->common->ref == 0 ) { hb_unlock( pv->common->mutex ); hb_cond_close( &pv->common->next_frame ); hb_lock_close( &pv->common->mutex ); free( pv->common->first_pts ); free( pv->common ); } else { hb_unlock( pv->common->mutex ); } free( pv ); w->private_data = NULL; }
void taskset_fini( taskset_t *ts ) { int i; hb_lock( ts->task_cond_lock ); /* * Tell each thread to stop, and then cleanup. */ bit_nset( ts->task_stop_bitmap, 0, ts->thread_count - 1 ); bit_nset( ts->task_begin_bitmap, 0, ts->thread_count - 1 ); hb_cond_broadcast( ts->task_begin ); /* * Wait for all threads to exit. */ hb_cond_wait( ts->task_complete, ts->task_cond_lock ); hb_unlock( ts->task_cond_lock ); /* * Clean up taskset memory. */ for( i = 0; i < ts->thread_count; i++) { hb_thread_close( &ts->task_threads[i] ); } hb_lock_close( &ts->task_cond_lock ); hb_cond_close( &ts->task_begin ); hb_cond_close( &ts->task_complete ); free( ts->task_threads ); if( ts->task_threads_args != NULL ) free( ts->task_threads_args ); free( ts->task_begin_bitmap ); free( ts->task_complete_bitmap ); free( ts->task_stop_bitmap ); }
int taskset_init( taskset_t *ts, int thread_count, size_t arg_size ) { int init_step; init_step = 0; memset( ts, 0, sizeof( *ts ) ); ts->thread_count = thread_count; ts->arg_size = arg_size; ts->bitmap_elements = ( ts->thread_count + 31 ) / 32; ts->task_threads = malloc( sizeof( hb_thread_t* ) * ts->thread_count ); if( ts->task_threads == NULL ) goto fail; init_step++; if( arg_size != 0 ) { ts->task_threads_args = malloc( arg_size * ts->thread_count ); if( ts->task_threads == NULL ) goto fail; } init_step++; ts->task_begin_bitmap = malloc( sizeof( uint32_t ) * ts->bitmap_elements ); if( ts->task_begin_bitmap == NULL ) goto fail; init_step++; ts->task_complete_bitmap = malloc( sizeof( uint32_t ) * ts->bitmap_elements ); if( ts->task_complete_bitmap == NULL ) goto fail; init_step++; ts->task_stop_bitmap = malloc( sizeof( uint32_t ) * ts->bitmap_elements ); if( ts->task_stop_bitmap == NULL ) goto fail; init_step++; ts->task_cond_lock = hb_lock_init(); if( ts->task_cond_lock == NULL) goto fail; init_step++; ts->task_begin = hb_cond_init(); if( ts->task_begin == NULL) goto fail; init_step++; ts->task_complete = hb_cond_init(); if( ts->task_complete == NULL) goto fail; init_step++; /* * Initialize all arg data to 0. */ memset(ts->task_threads_args, 0, ts->arg_size * ts->thread_count ); /* * Inialize bitmaps to all bits set. This means that any unused bits * in the bitmap are already in the "condition satisfied" state allowing * us to test the bitmap 32bits at a time without having to mask off * the end. */ memset(ts->task_begin_bitmap, 0xFF, sizeof( uint32_t ) * ts->bitmap_elements ); memset(ts->task_complete_bitmap, 0xFF, sizeof( uint32_t ) * ts->bitmap_elements ); memset(ts->task_stop_bitmap, 0, sizeof( uint32_t ) * ts->bitmap_elements ); /* * Important to start off with the threads locked waiting * on input, no work completed, and not asked to stop. */ bit_nclear( ts->task_begin_bitmap, 0, ts->thread_count - 1 ); bit_nclear( ts->task_complete_bitmap, 0, ts->thread_count - 1 ); bit_nclear( ts->task_stop_bitmap, 0, ts->thread_count - 1 ); return (1); fail: switch (init_step) { default: hb_cond_close( &ts->task_complete ); /* FALL THROUGH */ case 7: hb_cond_close( &ts->task_begin ); /* FALL THROUGH */ case 6: hb_lock_close( &ts->task_cond_lock ); /* FALL THROUGH */ case 5: free( ts->task_stop_bitmap ); /* FALL THROUGH */ case 4: free( ts->task_complete_bitmap ); /* FALL THROUGH */ case 3: free( ts->task_begin_bitmap ); /* FALL THROUGH */ case 2: if( ts->task_threads_args == NULL ) free( ts->task_threads_args ); /* FALL THROUGH */ case 1: free( ts->task_threads ); /* FALL THROUGH */ case 0: break; } return (0); }