license/copyright change - fixed memory leaks
authorFabrice Bellard <fabrice@bellard.org>
Sat, 25 May 2002 22:25:13 +0000 (22:25 +0000)
committerFabrice Bellard <fabrice@bellard.org>
Sat, 25 May 2002 22:25:13 +0000 (22:25 +0000)
Originally committed as revision 587 to svn://svn.ffmpeg.org/ffmpeg/trunk

ffmpeg.c

index d68aed9..103dc0d 100644 (file)
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -1,20 +1,20 @@
 /*
  * FFmpeg main 
- * Copyright (c) 2000, 2001, 2002 Gerard Lantau
+ * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
  *
- * This program is distributed in the hope that it will be useful,
+ * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #define HAVE_AV_CONFIG_H
 #include "avformat.h"
 #include <sys/ioctl.h>
 #include <sys/time.h>
 #include <termios.h>
-#include <time.h>
 #include <sys/resource.h>
-#include <ctype.h>
 #endif
+#include <time.h>
+#include <ctype.h>
 
 
 #define MAXINT64 INT64_C(0x7fffffffffffffff)
@@ -114,6 +114,13 @@ static int do_psnr = 0;
 static int do_vstats = 0;
 static int mpeg_vcd = 0;
 
+#ifndef CONFIG_AUDIO_OSS
+const char *audio_device = "none";
+#endif
+#ifndef CONFIG_VIDEO4LINUX
+const char *v4l_device = "none";
+#endif
+
 typedef struct AVOutputStream {
     int file_index;          /* file index */
     int index;               /* stream index in the output file */
@@ -517,9 +524,9 @@ static void do_video_stats(AVOutputStream *ost,
 {
     static FILE *fvstats=NULL;
     static INT64 total_size = 0;
-    struct tm *today;
-    time_t today2;
     char filename[40];
+    time_t today2;
+    struct tm *today;
     AVCodecContext *enc;
     int frame_number;
     INT64 ti;
@@ -902,11 +909,13 @@ static int av_encode(AVFormatContext **output_files,
         /* if none, if is finished */
         if (file_index < 0) {
             if (stream_no_data) {
+#ifndef CONFIG_WIN32
                 struct timespec ts;
 
                 ts.tv_sec = 0;
                 ts.tv_nsec = 1000 * 1000 * 10;
                 nanosleep(&ts, 0);
+#endif
                 stream_no_data = 0;
                 continue;
             }
@@ -929,12 +938,11 @@ static int av_encode(AVFormatContext **output_files,
         /* the following test is needed in case new streams appear
            dynamically in stream : we ignore them */
         if (pkt.stream_index >= file_table[file_index].nb_streams)
-            continue;
+            goto discard_packet;
         ist_index = file_table[file_index].ist_index + pkt.stream_index;
         ist = ist_table[ist_index];
-        if (ist->discard) {
-            continue;
-        }
+        if (ist->discard)
+            goto discard_packet;
 
         if (pkt.flags & PKT_FLAG_DROPPED_FRAME)
             ist->frame_number++;
@@ -1079,6 +1087,7 @@ static int av_encode(AVFormatContext **output_files,
                 }
             }
         }
+    discard_packet:
         av_free_packet(&pkt);
         
         /* dump report by using the first video and audio streams */
@@ -1219,6 +1228,8 @@ static int av_encode(AVFormatContext **output_files,
         for(i=0;i<nb_ostreams;i++) {
             ost = ost_table[i];
             if (ost) {
+                fifo_free(&ost->fifo); /* works even if fifo is not
+                                          initialized but set to zero */
                 av_free(ost->pict_tmp.data[0]);
                 if (ost->video_resample)
                     img_resample_close(ost->img_resample_ctx);
@@ -1261,20 +1272,20 @@ void show_licence(void)
 {
     printf(
     "ffmpeg version " FFMPEG_VERSION "\n"
-    "Copyright (c) 2000, 2001, 2002 Gerard Lantau\n"
-    "This program is free software; you can redistribute it and/or modify\n"
-    "it under the terms of the GNU General Public License as published by\n"
-    "the Free Software Foundation; either version 2 of the License, or\n"
-    "(at your option) any later version.\n"
+    "Copyright (c) 2000, 2001, 2002 Fabrice Bellard\n"
+    "This library is free software; you can redistribute it and/or\n"
+    "modify it under the terms of the GNU Lesser General Public\n"
+    "License as published by the Free Software Foundation; either\n"
+    "version 2 of the License, or (at your option) any later version.\n"
     "\n"
-    "This program is distributed in the hope that it will be useful,\n"
+    "This library is distributed in the hope that it will be useful,\n"
     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
-    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
-    "GNU General Public License for more details.\n"
+    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n"
+    "Lesser General Public License for more details.\n"
     "\n"
-    "You should have received a copy of the GNU General Public License\n"
-    "along with this program; if not, write to the Free Software\n"
-    "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
+    "You should have received a copy of the GNU Lesser General Public\n"
+    "License along with this library; if not, write to the Free Software\n"
+    "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n"
     );
     exit(1);
 }
@@ -1399,7 +1410,6 @@ void opt_audio_channels(const char *arg)
     audio_channels = atoi(arg);
 }
 
-#ifdef CONFIG_GRAB
 void opt_video_device(const char *arg)
 {
     v4l_device = strdup(arg);
@@ -1409,7 +1419,6 @@ void opt_audio_device(const char *arg)
 {
     audio_device = strdup(arg);
 }
-#endif
 
 void opt_audio_codec(const char *arg)
 {
@@ -1562,6 +1571,8 @@ void opt_input_file(const char *filename)
                     i, (float)enc->frame_rate / FRAME_RATE_BASE,
                     (float)rfps / FRAME_RATE_BASE);
             }
+            /* update the current frame rate to match the stream frame rate */
+            frame_rate = rfps;
             break;
         default:
             abort();
@@ -1823,8 +1834,6 @@ void opt_output_file(const char *filename)
     video_codec_id = CODEC_ID_NONE;
 }
 
-#ifdef CONFIG_GRAB
-
 /* prepare dummy protocols for grab */
 void prepare_grab(void)
 {
@@ -1873,7 +1882,7 @@ void prepare_grab(void)
         AVInputFormat *fmt1;
         fmt1 = av_find_input_format("video_grab_device");
         if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
-            fprintf(stderr, "Could not open video grab device\n");
+            fprintf(stderr, "Could not find video grab device\n");
             exit(1);
         }
         /* by now video grab has one stream */
@@ -1886,7 +1895,7 @@ void prepare_grab(void)
         AVInputFormat *fmt1;
         fmt1 = av_find_input_format("audio_device");
         if (av_open_input_file(&ic, "", fmt1, 0, ap) < 0) {
-            fprintf(stderr, "Could not open audio grab device\n");
+            fprintf(stderr, "Could not find audio grab device\n");
             exit(1);
         }
         input_files[nb_input_files] = ic;
@@ -1895,22 +1904,12 @@ void prepare_grab(void)
     }
 }
 
-#else
-
-void prepare_grab(void)
-{
-    fprintf(stderr, "Must supply at least one input file\n");
-    exit(1);
-}
-
-#endif
-
 /* open the necessary output devices for playing */
 void prepare_play(void)
 {
-    AVOutputFormat *ofmt;
-    ofmt = guess_format("audio_device", NULL, NULL);
-    if (!ofmt) {
+    file_iformat = NULL;
+    file_oformat = guess_format("audio_device", NULL, NULL);
+    if (!file_oformat) {
         fprintf(stderr, "Could not find audio device\n");
         exit(1);
     }
@@ -2008,7 +2007,7 @@ void show_help(void)
     
     prog = do_play ? "ffplay" : "ffmpeg";
 
-    printf("%s version " FFMPEG_VERSION ", Copyright (c) 2000, 2001, 2002 Gerard Lantau\n", 
+    printf("%s version " FFMPEG_VERSION ", Copyright (c) 2000, 2001, 2002 Fabrice Bellard\n",
            prog);
     
     if (!do_play) {
@@ -2069,9 +2068,7 @@ const OptionDef options[] = {
     { "qblur", HAS_ARG | OPT_EXPERT, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
     { "qcomp", HAS_ARG | OPT_EXPERT, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
     { "bt", HAS_ARG, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
-#ifdef CONFIG_GRAB
-    { "vd", HAS_ARG | OPT_EXPERT, {(void*)opt_video_device}, "set video device", "device" },
-#endif
+    { "vd", HAS_ARG | OPT_EXPERT, {(void*)opt_video_device}, "set video grab device", "device" },
     { "vcodec", HAS_ARG | OPT_EXPERT, {(void*)opt_video_codec}, "force video codec", "codec" },
     { "me", HAS_ARG | OPT_EXPERT, {(void*)opt_motion_estimation}, "set motion estimation method", 
       "method" },
@@ -2085,9 +2082,7 @@ const OptionDef options[] = {
     { "ar", HAS_ARG, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
     { "ac", HAS_ARG, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
     { "an", OPT_BOOL, {(void*)&audio_disable}, "disable audio" },
-#ifdef CONFIG_GRAB
     { "ad", HAS_ARG | OPT_EXPERT, {(void*)opt_audio_device}, "set audio device", "device" },
-#endif
     { "acodec", HAS_ARG | OPT_EXPERT, {(void*)opt_audio_codec}, "force audio codec", "codec" },
     { "deinterlace", OPT_BOOL | OPT_EXPERT, {(void*)&do_deinterlace}, 
       "deinterlace pictures" },