static void ffmovie_cleanup(FFMovie *movie) { if(!movie) return; if(movie->audio_st) { packet_queue_abort(&movie->audioq); SDL_CloseAudio(); packet_queue_end(&movie->audioq); avcodec_close(&movie->audio_st->codec); movie->audio_st = NULL; } if(movie->video_st) { avcodec_close(&movie->video_st->codec); movie->video_st = NULL; } if (movie->context) { av_close_input_file(movie->context); movie->context = NULL; } if(movie->dest_mutex) { SDL_DestroyMutex(movie->dest_mutex); movie->dest_mutex = NULL; } if (movie->dest_overlay) { SDL_FreeYUVOverlay(movie->dest_overlay); movie->dest_overlay = NULL; } Global_num_active--; }
void ff_decoder_free(struct ff_decoder *decoder) { void *decoder_thread_result; int i; assert(decoder != NULL); decoder->abort = true; ff_circular_queue_abort(&decoder->frame_queue); packet_queue_abort(&decoder->packet_queue); ff_timer_free(&decoder->refresh_timer); pthread_join(decoder->decoder_thread, &decoder_thread_result); for (i = 0; i < decoder->frame_queue.capacity; i++) { void *item = decoder->frame_queue.slots[i]; struct ff_frame *frame = (struct ff_frame *)item; ff_callbacks_frame_free(frame, decoder->callbacks); if (frame != NULL) { if (frame->frame != NULL) av_frame_unref(frame->frame); if (frame->clock != NULL) ff_clock_release(&frame->clock); av_free(frame); } } packet_queue_free(&decoder->packet_queue); ff_circular_queue_free(&decoder->frame_queue); avcodec_close(decoder->codec); av_free(decoder); }