void ffemu_free(ffemu_t *handle) { if (handle) { deinit_thread(handle); deinit_thread_buf(handle); if (handle->audio.codec) { avcodec_close(handle->audio.codec); av_free(handle->audio.codec); } if (handle->audio.buffer) av_free(handle->audio.buffer); if (handle->video.codec) { avcodec_close(handle->video.codec); av_free(handle->video.codec); } if (handle->video.conv_frame) av_free(handle->video.conv_frame); if (handle->video.conv_frame_buf) av_free(handle->video.conv_frame_buf); if (handle->video.sws_ctx) sws_freeContext(handle->video.sws_ctx); free(handle); } }
void ffemu_free(ffemu_t *handle) { if (handle) { deinit_thread(handle); deinit_thread_buf(handle); if (handle->audio.codec) { avcodec_close(handle->audio.codec); av_free(handle->audio.codec); } if (handle->audio.buffer) av_free(handle->audio.buffer); if (handle->video.codec) { avcodec_close(handle->video.codec); av_free(handle->video.codec); } if (handle->video.conv_frame) av_free(handle->video.conv_frame); if (handle->video.conv_frame_buf) av_free(handle->video.conv_frame_buf); scaler_ctx_gen_reset(&handle->video.scaler); free(handle); } }
bool ffemu_finalize(ffemu_t *handle) { deinit_thread(handle); // Flush out data still in buffers (internal, and FFmpeg internal). ffemu_flush_buffers(handle); deinit_thread_buf(handle); // Write final data. av_write_trailer(handle->muxer.ctx); return true; }
static void ffmpeg_free(void *data) { ffmpeg_t *handle = (ffmpeg_t*)data; if (!handle) return; deinit_thread(handle); deinit_thread_buf(handle); if (handle->audio.codec) { avcodec_close(handle->audio.codec); av_free(handle->audio.codec); } av_free(handle->audio.buffer); if (handle->video.codec) { avcodec_close(handle->video.codec); av_free(handle->video.codec); } av_frame_free(&handle->video.conv_frame); av_free(handle->video.conv_frame_buf); scaler_ctx_gen_reset(&handle->video.scaler); if (handle->video.sws) sws_freeContext(handle->video.sws); if (handle->config.conf) config_file_free(handle->config.conf); if (handle->config.video_opts) av_dict_free(&handle->config.video_opts); if (handle->config.audio_opts) av_dict_free(&handle->config.audio_opts); if (handle->audio.resampler && handle->audio.resampler_data) handle->audio.resampler->free(handle->audio.resampler_data); handle->audio.resampler = NULL; handle->audio.resampler_data = NULL; av_free(handle->audio.float_conv); av_free(handle->audio.resample_out); av_free(handle->audio.fixed_conv); av_free(handle->audio.planar_buf); free(handle); }
void ffemu_free(ffemu_t *handle) { if (!handle) return; deinit_thread(handle); deinit_thread_buf(handle); if (handle->audio.codec) { avcodec_close(handle->audio.codec); av_free(handle->audio.codec); } av_free(handle->audio.buffer); if (handle->video.codec) { avcodec_close(handle->video.codec); av_free(handle->video.codec); } av_frame_free(&handle->video.conv_frame); av_free(handle->video.conv_frame_buf); scaler_ctx_gen_reset(&handle->video.scaler); if (handle->video.sws) sws_freeContext(handle->video.sws); if (handle->config.conf) config_file_free(handle->config.conf); if (handle->config.video_opts) av_dict_free(&handle->config.video_opts); if (handle->config.audio_opts) av_dict_free(&handle->config.audio_opts); rarch_resampler_freep(&handle->audio.resampler, &handle->audio.resampler_data); av_free(handle->audio.float_conv); av_free(handle->audio.resample_out); av_free(handle->audio.fixed_conv); av_free(handle->audio.planar_buf); free(handle); }
static bool ffmpeg_finalize(void *data) { ffmpeg_t *handle = (ffmpeg_t*)data; if (!handle) return false; deinit_thread(handle); // Flush out data still in buffers (internal, and FFmpeg internal). ffmpeg_flush_buffers(handle); deinit_thread_buf(handle); // Write final data. av_write_trailer(handle->muxer.ctx); return true; }