title: Calling ffmpeg.c's main twice causes app crash
body: <p>Using FFmpeg 4.0.2 and call its <code>ffmpeg.c's main</code> function twice causes Android app crash (using FFmpeg shared libs and JNI)</p>
  
  <pre><code>A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 20153
  </code></pre>
  
  <p>Though it works ok for FFmpeg 3.2.5</p>
  
  <p><strong>FFmpeg 4.0.2 main</strong> </p>
  
  <pre><code>int main(int argc, char **argv) {
      int i, ret;
      int64_t ti;
  
      init_dynload();
  
      register_exit(ffmpeg_cleanup);
  
      setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */
  
      av_log_set_flags(AV_LOG_SKIP_REPEATED);
      parse_loglevel(argc, argv, options);
  
      if(argc&gt;1 &amp;&amp; !strcmp(argv[1], "-d")){
          run_as_daemon=1;
          av_log_set_callback(log_callback_null);
          argc--;
          argv++;
      }
  
  #if CONFIG_AVDEVICE
      avdevice_register_all();
  #endif
      avformat_network_init();
  
      show_banner(argc, argv, options);
  
      /* parse options and open all input/output files */
      ret = ffmpeg_parse_options(argc, argv);
      if (ret &lt; 0)
          exit_program(1);
  
      if (nb_output_files &lt;= 0 &amp;&amp; nb_input_files == 0) {
          show_usage();
          av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
          exit_program(1);
      }
  
      /* file converter / grab */
      if (nb_output_files &lt;= 0) {
          av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
          exit_program(1);
      }
  
  //     if (nb_input_files == 0) {
  //         av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
  //         exit_program(1);
  //     }
  
      for (i = 0; i &lt; nb_output_files; i++) {
          if (strcmp(output_files[i]-&gt;ctx-&gt;oformat-&gt;name, "rtp"))
              want_sdp = 0;
      }
  
      current_time = ti = getutime();
      if (transcode() &lt; 0)
          exit_program(1);
      ti = getutime() - ti;
      if (do_benchmark) {
          av_log(NULL, AV_LOG_INFO, "bench: utime=%0.3fs\n", ti / 1000000.0);
      }
      av_log(NULL, AV_LOG_DEBUG, "%"PRIu64" frames successfully decoded, %"PRIu64" decoding errors\n",
             decode_error_stat[0], decode_error_stat[1]);
      if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate &lt; decode_error_stat[1])
          exit_program(69);
  
      ffmpeg_cleanup(received_nb_signals ? 255 : main_return_code);
      return main_return_code;
  }
  </code></pre>
  
  <p><strong>FFmpeg 3.2.5 main</strong> </p>
  
  <pre><code>int main(int argc, char **argv) {
      av_log(NULL, AV_LOG_WARNING, " Command start");
  
      int i, ret;
      int64_t ti;
      init_dynload();
  
      register_exit(ffmpeg_cleanup);
  
      setvbuf(stderr, NULL, _IONBF, 0); /* win32 runtime needs this */
  
      av_log_set_flags(AV_LOG_SKIP_REPEATED);
      parse_loglevel(argc, argv, options);
  
      if (argc &gt; 1 &amp;&amp; !strcmp(argv[1], "-d")) {
          run_as_daemon = 1;
          av_log_set_callback(log_callback_null);
          argc--;
          argv++;
      }
  
      avcodec_register_all();
  #if CONFIG_AVDEVICE
      avdevice_register_all();
  #endif
      avfilter_register_all();
      av_register_all();
      avformat_network_init();
  
      av_log(NULL, AV_LOG_WARNING, " Register to complete the codec");
  
      show_banner(argc, argv, options);
  
      /* parse options and open all input/output files */
      ret = ffmpeg_parse_options(argc, argv);
      if (ret &lt; 0)
          exit_program(1);
  
      if (nb_output_files &lt;= 0 &amp;&amp; nb_input_files == 0) {
          show_usage();
          av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n",
                 program_name);
          exit_program(1);
      }
  
      /* file converter / grab */
      if (nb_output_files &lt;= 0) {
          av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
          exit_program(1);
      }
  
  //     if (nb_input_files == 0) {
  //         av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
  //         exit_program(1);
  //     }
  
      for (i = 0; i &lt; nb_output_files; i++) {
          if (strcmp(output_files[i]-&gt;ctx-&gt;oformat-&gt;name, "rtp"))
              want_sdp = 0;
      }
  
      current_time = ti = getutime();
      if (transcode() &lt; 0)
          exit_program(1);
      ti = getutime() - ti;
      if (do_benchmark) {
          av_log(NULL, AV_LOG_INFO, "bench: utime=%0.3fs\n", ti / 1000000.0);
      }
      av_log(NULL, AV_LOG_DEBUG, "%"PRIu64" frames successfully decoded, %"PRIu64" decoding errors\n",
             decode_error_stat[0], decode_error_stat[1]);
      if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate &lt; decode_error_stat[1])
          exit_program(69);
  
      exit_program(received_nb_signals ? 255 : main_return_code);
  
      nb_filtergraphs = 0;
      nb_input_streams = 0;
      nb_input_files = 0;
      progress_avio = NULL;
  
  
      input_streams = NULL;
      nb_input_streams = 0;
      input_files = NULL;
      nb_input_files = 0;
  
      output_streams = NULL;
      nb_output_streams = 0;
      output_files = NULL;
      nb_output_files = 0;
  
      return main_return_code;
  }
  </code></pre>
  
  <p>So what could be issue? It seems FFmpeg 4.0.2 doesn't release something (resources or its static variables to initial values after the first command)</p>