]> git.sesse.net Git - ffmpeg/blobdiff - ffmpeg.c
revert my accidental previous commit
[ffmpeg] / ffmpeg.c
index e2e2e6170df2d9ad5c28a00ac2e10ffb28a882b2..ac52d7a2bb037e6221b093b0416fc617cecba52c 100644 (file)
--- a/ffmpeg.c
+++ b/ffmpeg.c
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
-#define HAVE_AV_CONFIG_H
+
+#include "config.h"
+#include <ctype.h>
+#include <string.h>
+#include <math.h>
+#include <stdlib.h>
+#include <errno.h>
 #include <signal.h>
 #include <limits.h>
 #include "avformat.h"
 #include "swscale.h"
 #include "framehook.h"
 #include <signal.h>
 #include <limits.h>
 #include "avformat.h"
 #include "swscale.h"
 #include "framehook.h"
-#include "dsputil.h"
 #include "opt.h"
 #include "fifo.h"
 #include "opt.h"
 #include "fifo.h"
+#include "avstring.h"
 
 
-#ifdef __MINGW32__
-#include <conio.h>
-#else
+#if !defined(HAVE_GETRUSAGE) && defined(HAVE_GETPROCESSTIMES)
+#include <windows.h>
+#endif
+
+#if defined(HAVE_TERMIOS_H)
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/time.h>
 #include <termios.h>
 #include <sys/resource.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/time.h>
 #include <termios.h>
 #include <sys/resource.h>
-#endif
-#ifdef CONFIG_OS2
-#include <sys/types.h>
-#include <sys/select.h>
-#include <stdlib.h>
+#elif defined(HAVE_CONIO_H)
+#include <conio.h>
 #endif
 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
 #include <time.h>
 #endif
 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
 #include <time.h>
@@ -56,6 +61,8 @@
 #define INFINITY HUGE_VAL
 #endif
 
 #define INFINITY HUGE_VAL
 #endif
 
+#undef exit
+
 /* select an input stream for an output stream */
 typedef struct AVStreamMap {
     int file_index;
 /* select an input stream for an output stream */
 typedef struct AVStreamMap {
     int file_index;
@@ -107,8 +114,7 @@ static int frame_bottomBand = 0;
 static int frame_leftBand  = 0;
 static int frame_rightBand = 0;
 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
 static int frame_leftBand  = 0;
 static int frame_rightBand = 0;
 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
-static int frame_rate = 25;
-static int frame_rate_base = 1;
+static AVRational frame_rate = (AVRational) {25,1};
 static float video_qscale = 0;
 static int video_qdiff = 3;
 static uint16_t *intra_matrix = NULL;
 static float video_qscale = 0;
 static int video_qdiff = 3;
 static uint16_t *intra_matrix = NULL;
@@ -120,14 +126,12 @@ static int video_rc_qmod_freq=0;
 #endif
 static char *video_rc_override_string=NULL;
 static char *video_rc_eq="tex^qComp";
 #endif
 static char *video_rc_override_string=NULL;
 static char *video_rc_eq="tex^qComp";
-static int me_method = ME_EPZS;
 static int video_disable = 0;
 static int video_discard = 0;
 static int video_codec_id = CODEC_ID_NONE;
 static int video_codec_tag = 0;
 static int same_quality = 0;
 static int do_deinterlace = 0;
 static int video_disable = 0;
 static int video_discard = 0;
 static int video_codec_id = CODEC_ID_NONE;
 static int video_codec_tag = 0;
 static int same_quality = 0;
 static int do_deinterlace = 0;
-static int packet_size = 0;
 static int strict = 0;
 static int top_field_first = -1;
 static int me_threshold = 0;
 static int strict = 0;
 static int top_field_first = -1;
 static int me_threshold = 0;
@@ -138,7 +142,6 @@ static int qp_hist = 0;
 
 static int intra_only = 0;
 static int audio_sample_rate = 44100;
 
 static int intra_only = 0;
 static int audio_sample_rate = 44100;
-static int audio_bit_rate = 64000;
 #define QSCALE_NONE -99999
 static float audio_qscale = QSCALE_NONE;
 static int audio_disable = 0;
 #define QSCALE_NONE -99999
 static float audio_qscale = QSCALE_NONE;
 static int audio_disable = 0;
@@ -167,7 +170,6 @@ static int do_benchmark = 0;
 static int do_hex_dump = 0;
 static int do_pkt_dump = 0;
 static int do_psnr = 0;
 static int do_hex_dump = 0;
 static int do_pkt_dump = 0;
 static int do_psnr = 0;
-static int do_vstats = 0;
 static int do_pass = 0;
 static char *pass_logfilename = NULL;
 static int audio_stream_copy = 0;
 static int do_pass = 0;
 static char *pass_logfilename = NULL;
 static int audio_stream_copy = 0;
@@ -178,11 +180,13 @@ static int audio_sync_method= 0;
 static int copy_ts= 0;
 static int opt_shortest = 0; //
 static int video_global_header = 0;
 static int copy_ts= 0;
 static int opt_shortest = 0; //
 static int video_global_header = 0;
+static char *vstats_filename;
+static FILE *fvstats;
 
 static int rate_emu = 0;
 
 static int  video_channel = 0;
 
 static int rate_emu = 0;
 
 static int  video_channel = 0;
-static char *video_standard = "ntsc";
+static char *video_standard;
 
 static int audio_volume = 256;
 
 
 static int audio_volume = 256;
 
@@ -197,17 +201,19 @@ static int64_t extra_size = 0;
 static int nb_frames_dup = 0;
 static int nb_frames_drop = 0;
 static int input_sync;
 static int nb_frames_dup = 0;
 static int nb_frames_drop = 0;
 static int input_sync;
-static int limit_filesize = 0; //
+static uint64_t limit_filesize = 0; //
 
 static int pgmyuv_compatibility_hack=0;
 static int dts_delta_threshold = 10;
 
 static int sws_flags = SWS_BICUBIC;
 
 
 static int pgmyuv_compatibility_hack=0;
 static int dts_delta_threshold = 10;
 
 static int sws_flags = SWS_BICUBIC;
 
-const char **opt_names=NULL;
-int opt_name_count=0;
-AVCodecContext *avctx_opts[CODEC_TYPE_NB];
-AVFormatContext *avformat_opts;
+static const char **opt_names;
+static int opt_name_count;
+static AVCodecContext *avctx_opts[CODEC_TYPE_NB];
+static AVFormatContext *avformat_opts;
+static struct SwsContext *sws_opts;
+static int64_t timer_start;
 
 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
 
 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
@@ -272,12 +278,10 @@ typedef struct AVInputFile {
     int eof_reached;      /* true if eof reached */
     int ist_index;        /* index of first stream in ist_table */
     int buffer_size;      /* current total buffer size */
     int eof_reached;      /* true if eof reached */
     int ist_index;        /* index of first stream in ist_table */
     int buffer_size;      /* current total buffer size */
-    int buffer_size_max;  /* buffer size at which we consider we can stop
-                             buffering */
     int nb_streams;       /* nb streams we are aware of */
 } AVInputFile;
 
     int nb_streams;       /* nb streams we are aware of */
 } AVInputFile;
 
-#ifndef __MINGW32__
+#ifdef HAVE_TERMIOS_H
 
 /* init terminal so that we can grab keys */
 static struct termios oldtty;
 
 /* init terminal so that we can grab keys */
 static struct termios oldtty;
@@ -285,7 +289,7 @@ static struct termios oldtty;
 
 static void term_exit(void)
 {
 
 static void term_exit(void)
 {
-#ifndef __MINGW32__
+#ifdef HAVE_TERMIOS_H
     tcsetattr (0, TCSANOW, &oldtty);
 #endif
 }
     tcsetattr (0, TCSANOW, &oldtty);
 #endif
 }
@@ -301,7 +305,7 @@ sigterm_handler(int sig)
 
 static void term_init(void)
 {
 
 static void term_init(void)
 {
-#ifndef __MINGW32__
+#ifdef HAVE_TERMIOS_H
     struct termios tty;
 
     tcgetattr (0, &tty);
     struct termios tty;
 
     tcgetattr (0, &tty);
@@ -334,10 +338,7 @@ static void term_init(void)
 /* read a key without blocking */
 static int read_key(void)
 {
 /* read a key without blocking */
 static int read_key(void)
 {
-#ifdef __MINGW32__
-    if(kbhit())
-        return(getch());
-#else
+#if defined(HAVE_TERMIOS_H)
     int n = 1;
     unsigned char ch;
 #ifndef CONFIG_BEOS_NETSERVER
     int n = 1;
     unsigned char ch;
 #ifndef CONFIG_BEOS_NETSERVER
@@ -357,6 +358,9 @@ static int read_key(void)
 
         return n;
     }
 
         return n;
     }
+#elif defined(HAVE_CONIO_H)
+    if(kbhit())
+        return(getch());
 #endif
     return -1;
 }
 #endif
     return -1;
 }
@@ -597,13 +601,14 @@ static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void
                 picture2 = picture;
             }
         } else {
                 picture2 = picture;
             }
         } else {
-            img_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
+            av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
         }
     } else {
         picture2 = picture;
     }
 
         }
     } else {
         picture2 = picture;
     }
 
-    frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height);
+    frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
+                       1000000 * ist->pts / AV_TIME_BASE);
 
     if (picture != picture2)
         *picture = *picture2;
 
     if (picture != picture2)
         *picture = *picture2;
@@ -677,7 +682,6 @@ static void do_video_out(AVFormatContext *s,
     int nb_frames, i, ret;
     AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
     AVFrame picture_crop_temp, picture_pad_temp;
     int nb_frames, i, ret;
     AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
     AVFrame picture_crop_temp, picture_pad_temp;
-    uint8_t *buf = NULL, *buf1 = NULL;
     AVCodecContext *enc, *dec;
 
     avcodec_get_frame_defaults(&picture_crop_temp);
     AVCodecContext *enc, *dec;
 
     avcodec_get_frame_defaults(&picture_crop_temp);
@@ -717,9 +721,9 @@ static void do_video_out(AVFormatContext *s,
         return;
 
     if (ost->video_crop) {
         return;
 
     if (ost->video_crop) {
-        if (img_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
+        if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
             av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
             av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
-            goto the_end;
+            return;
         }
         formatted_picture = &picture_crop_temp;
     } else {
         }
         formatted_picture = &picture_crop_temp;
     } else {
@@ -732,9 +736,9 @@ static void do_video_out(AVFormatContext *s,
     if (ost->video_pad) {
         final_picture = &ost->pict_tmp;
         if (ost->video_resample) {
     if (ost->video_pad) {
         final_picture = &ost->pict_tmp;
         if (ost->video_resample) {
-            if (img_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
+            if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
                 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
                 av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
-                goto the_end;
+                return;
             }
             resampling_dst = &picture_pad_temp;
         }
             }
             resampling_dst = &picture_pad_temp;
         }
@@ -748,7 +752,7 @@ static void do_video_out(AVFormatContext *s,
     }
 
     if (ost->video_pad) {
     }
 
     if (ost->video_pad) {
-        img_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
+        av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
                 enc->height, enc->width, enc->pix_fmt,
                 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
     }
                 enc->height, enc->width, enc->pix_fmt,
                 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
     }
@@ -833,9 +837,6 @@ static void do_video_out(AVFormatContext *s,
         ost->sync_opts++;
         ost->frame_number++;
     }
         ost->sync_opts++;
         ost->frame_number++;
     }
- the_end:
-    av_free(buf);
-    av_free(buf1);
 }
 
 static double psnr(double d){
 }
 
 static double psnr(double d){
@@ -846,22 +847,14 @@ static double psnr(double d){
 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
                            int frame_size)
 {
 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
                            int frame_size)
 {
-    static FILE *fvstats=NULL;
-    char filename[40];
-    time_t today2;
-    struct tm *today;
     AVCodecContext *enc;
     int frame_number;
     int64_t ti;
     double ti1, bitrate, avg_bitrate;
 
     AVCodecContext *enc;
     int frame_number;
     int64_t ti;
     double ti1, bitrate, avg_bitrate;
 
+    /* this is executed just the first time do_video_stats is called */
     if (!fvstats) {
     if (!fvstats) {
-        today2 = time(NULL);
-        today = localtime(&today2);
-        snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour,
-                                               today->tm_min,
-                                               today->tm_sec);
-        fvstats = fopen(filename,"w");
+        fvstats = fopen(vstats_filename, "w");
         if (!fvstats) {
             perror("fopen");
             exit(1);
         if (!fvstats) {
             perror("fopen");
             exit(1);
@@ -920,7 +913,9 @@ static void print_report(AVFormatContext **output_files,
 
     oc = output_files[0];
 
 
     oc = output_files[0];
 
-    total_size = url_ftell(&oc->pb);
+    total_size = url_fsize(&oc->pb);
+    if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
+        total_size= url_ftell(&oc->pb);
 
     buf[0] = '\0';
     ti1 = 1e10;
 
     buf[0] = '\0';
     ti1 = 1e10;
@@ -934,9 +929,12 @@ static void print_report(AVFormatContext **output_files,
                     enc->coded_frame->quality/(float)FF_QP2LAMBDA);
         }
         if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
                     enc->coded_frame->quality/(float)FF_QP2LAMBDA);
         }
         if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
+            float t = (av_gettime()-timer_start) / 1000000.0;
+
             frame_number = ost->frame_number;
             frame_number = ost->frame_number;
-            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d q=%3.1f ",
-                    frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
+            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
+                     frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
+                     enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
             if(is_last_report)
                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
             if(qp_hist && enc->coded_frame){
             if(is_last_report)
                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
             if(qp_hist && enc->coded_frame){
@@ -1052,7 +1050,7 @@ static int output_packet(AVInputStream *ist, int ist_index,
             switch(ist->st->codec->codec_type) {
             case CODEC_TYPE_AUDIO:{
                 if(pkt)
             switch(ist->st->codec->codec_type) {
             case CODEC_TYPE_AUDIO:{
                 if(pkt)
-                    samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE));
+                    samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE));
                 data_size= samples_size;
                     /* XXX: could avoid copy if PCM 16 bits with same
                        endianness as CPU */
                 data_size= samples_size;
                     /* XXX: could avoid copy if PCM 16 bits with same
                        endianness as CPU */
@@ -1108,165 +1106,165 @@ static int output_packet(AVInputStream *ist, int ist_index,
                 goto fail_decode;
             }
         } else {
                 goto fail_decode;
             }
         } else {
-                switch(ist->st->codec->codec_type) {
-                case CODEC_TYPE_AUDIO:
-                    ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
-                        (ist->st->codec->sample_rate * ist->st->codec->channels);
-                    break;
-                case CODEC_TYPE_VIDEO:
-                    if (ist->st->codec->time_base.num != 0) {
-                        ist->next_pts += ((int64_t)AV_TIME_BASE *
-                                          ist->st->codec->time_base.num) /
-                            ist->st->codec->time_base.den;
-                    }
-                    break;
+            switch(ist->st->codec->codec_type) {
+            case CODEC_TYPE_AUDIO:
+                ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
+                    (ist->st->codec->sample_rate * ist->st->codec->channels);
+                break;
+            case CODEC_TYPE_VIDEO:
+                if (ist->st->codec->time_base.num != 0) {
+                    ist->next_pts += ((int64_t)AV_TIME_BASE *
+                                      ist->st->codec->time_base.num) /
+                        ist->st->codec->time_base.den;
                 }
                 }
-                data_buf = ptr;
-                data_size = len;
-                ret = len;
-                len = 0;
-            }
-
-            buffer_to_free = NULL;
-            if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
-                pre_process_video_frame(ist, (AVPicture *)&picture,
-                                        &buffer_to_free);
+                break;
             }
             }
-
-            // preprocess audio (volume)
-            if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
-                if (audio_volume != 256) {
-                    short *volp;
-                    volp = samples;
-                    for(i=0;i<(data_size / sizeof(short));i++) {
-                        int v = ((*volp) * audio_volume + 128) >> 8;
-                        if (v < -32768) v = -32768;
-                        if (v >  32767) v = 32767;
-                        *volp++ = v;
-                    }
+            data_buf = ptr;
+            data_size = len;
+            ret = len;
+            len = 0;
+        }
+
+        buffer_to_free = NULL;
+        if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
+            pre_process_video_frame(ist, (AVPicture *)&picture,
+                                    &buffer_to_free);
+        }
+
+        // preprocess audio (volume)
+        if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
+            if (audio_volume != 256) {
+                short *volp;
+                volp = samples;
+                for(i=0;i<(data_size / sizeof(short));i++) {
+                    int v = ((*volp) * audio_volume + 128) >> 8;
+                    if (v < -32768) v = -32768;
+                    if (v >  32767) v = 32767;
+                    *volp++ = v;
                 }
             }
                 }
             }
+        }
 
 
-            /* frame rate emulation */
-            if (ist->st->codec->rate_emu) {
-                int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
-                int64_t now = av_gettime() - ist->start;
-                if (pts > now)
-                    usleep(pts - now);
+        /* frame rate emulation */
+        if (ist->st->codec->rate_emu) {
+            int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
+            int64_t now = av_gettime() - ist->start;
+            if (pts > now)
+                usleep(pts - now);
 
 
-                ist->frame++;
-            }
+            ist->frame++;
+        }
 
 #if 0
 
 #if 0
-            /* mpeg PTS deordering : if it is a P or I frame, the PTS
-               is the one of the next displayed one */
-            /* XXX: add mpeg4 too ? */
-            if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
-                if (ist->st->codec->pict_type != B_TYPE) {
-                    int64_t tmp;
-                    tmp = ist->last_ip_pts;
-                    ist->last_ip_pts  = ist->frac_pts.val;
-                    ist->frac_pts.val = tmp;
-                }
+        /* mpeg PTS deordering : if it is a P or I frame, the PTS
+           is the one of the next displayed one */
+        /* XXX: add mpeg4 too ? */
+        if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
+            if (ist->st->codec->pict_type != B_TYPE) {
+                int64_t tmp;
+                tmp = ist->last_ip_pts;
+                ist->last_ip_pts  = ist->frac_pts.val;
+                ist->frac_pts.val = tmp;
             }
             }
+        }
 #endif
 #endif
-            /* if output time reached then transcode raw format,
-               encode packets and output them */
-            if (start_time == 0 || ist->pts >= start_time)
-                for(i=0;i<nb_ostreams;i++) {
-                    int frame_size;
+        /* if output time reached then transcode raw format,
+           encode packets and output them */
+        if (start_time == 0 || ist->pts >= start_time)
+            for(i=0;i<nb_ostreams;i++) {
+                int frame_size;
 
 
-                    ost = ost_table[i];
-                    if (ost->source_index == ist_index) {
-                        os = output_files[ost->file_index];
+                ost = ost_table[i];
+                if (ost->source_index == ist_index) {
+                    os = output_files[ost->file_index];
 
 #if 0
 
 #if 0
-                        printf("%d: got pts=%0.3f %0.3f\n", i,
-                               (double)pkt->pts / AV_TIME_BASE,
-                               ((double)ist->pts / AV_TIME_BASE) -
-                               ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
+                    printf("%d: got pts=%0.3f %0.3f\n", i,
+                           (double)pkt->pts / AV_TIME_BASE,
+                           ((double)ist->pts / AV_TIME_BASE) -
+                           ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
 #endif
 #endif
-                        /* set the input output pts pairs */
-                        //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
-
-                        if (ost->encoding_needed) {
-                            switch(ost->st->codec->codec_type) {
-                            case CODEC_TYPE_AUDIO:
-                                do_audio_out(os, ost, ist, data_buf, data_size);
-                                break;
-                            case CODEC_TYPE_VIDEO:
-                                    do_video_out(os, ost, ist, &picture, &frame_size);
-                                    video_size += frame_size;
-                                    if (do_vstats && frame_size)
-                                        do_video_stats(os, ost, frame_size);
-                                break;
-                            case CODEC_TYPE_SUBTITLE:
-                                do_subtitle_out(os, ost, ist, &subtitle,
-                                                pkt->pts);
-                                break;
-                            default:
-                                av_abort();
-                            }
-                        } else {
-                            AVFrame avframe; //FIXME/XXX remove this
-                            AVPacket opkt;
-                            av_init_packet(&opkt);
-
-                            /* no reencoding needed : output the packet directly */
-                            /* force the input stream PTS */
-
-                            avcodec_get_frame_defaults(&avframe);
-                            ost->st->codec->coded_frame= &avframe;
-                            avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
-
-                            if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
-                                audio_size += data_size;
-                            else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
-                                video_size += data_size;
-                                ost->sync_opts++;
-                            }
+                    /* set the input output pts pairs */
+                    //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
 
 
-                            opkt.stream_index= ost->index;
-                            if(pkt->pts != AV_NOPTS_VALUE)
-                                opkt.pts= av_rescale_q(av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q,  ost->st->time_base);
-                            else
-                                opkt.pts= AV_NOPTS_VALUE;
-
-                            {
-                                int64_t dts;
-                                if (pkt->dts == AV_NOPTS_VALUE)
-                                    dts = ist->next_pts;
-                                else
-                                    dts= av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
-                                opkt.dts= av_rescale_q(dts + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q,  ost->st->time_base);
-                            }
-                            opkt.flags= pkt->flags;
+                    if (ost->encoding_needed) {
+                        switch(ost->st->codec->codec_type) {
+                        case CODEC_TYPE_AUDIO:
+                            do_audio_out(os, ost, ist, data_buf, data_size);
+                            break;
+                        case CODEC_TYPE_VIDEO:
+                            do_video_out(os, ost, ist, &picture, &frame_size);
+                            video_size += frame_size;
+                            if (vstats_filename && frame_size)
+                                do_video_stats(os, ost, frame_size);
+                            break;
+                        case CODEC_TYPE_SUBTITLE:
+                            do_subtitle_out(os, ost, ist, &subtitle,
+                                            pkt->pts);
+                            break;
+                        default:
+                            abort();
+                        }
+                    } else {
+                        AVFrame avframe; //FIXME/XXX remove this
+                        AVPacket opkt;
+                        av_init_packet(&opkt);
+
+                        /* no reencoding needed : output the packet directly */
+                        /* force the input stream PTS */
+
+                        avcodec_get_frame_defaults(&avframe);
+                        ost->st->codec->coded_frame= &avframe;
+                        avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
+
+                        if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
+                            audio_size += data_size;
+                        else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
+                            video_size += data_size;
+                            ost->sync_opts++;
+                        }
 
 
-                            //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
-                            if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
-                                opkt.destruct= av_destruct_packet;
+                        opkt.stream_index= ost->index;
+                        if(pkt->pts != AV_NOPTS_VALUE)
+                            opkt.pts= av_rescale_q(av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q) + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q,  ost->st->time_base);
+                        else
+                            opkt.pts= AV_NOPTS_VALUE;
 
 
-                            write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][pkt->stream_index]);
-                            ost->st->codec->frame_number++;
-                            ost->frame_number++;
-                            av_free_packet(&opkt);
+                        {
+                            int64_t dts;
+                            if (pkt->dts == AV_NOPTS_VALUE)
+                                dts = ist->next_pts;
+                            else
+                                dts= av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
+                            opkt.dts= av_rescale_q(dts + input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q,  ost->st->time_base);
                         }
                         }
+                        opkt.flags= pkt->flags;
+
+                        //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
+                        if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
+                            opkt.destruct= av_destruct_packet;
+
+                        write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][pkt->stream_index]);
+                        ost->st->codec->frame_number++;
+                        ost->frame_number++;
+                        av_free_packet(&opkt);
                     }
                 }
                     }
                 }
-            av_free(buffer_to_free);
-            /* XXX: allocate the subtitles in the codec ? */
-            if (subtitle_to_free) {
-                if (subtitle_to_free->rects != NULL) {
-                    for (i = 0; i < subtitle_to_free->num_rects; i++) {
-                        av_free(subtitle_to_free->rects[i].bitmap);
-                        av_free(subtitle_to_free->rects[i].rgba_palette);
-                    }
-                    av_freep(&subtitle_to_free->rects);
+            }
+        av_free(buffer_to_free);
+        /* XXX: allocate the subtitles in the codec ? */
+        if (subtitle_to_free) {
+            if (subtitle_to_free->rects != NULL) {
+                for (i = 0; i < subtitle_to_free->num_rects; i++) {
+                    av_free(subtitle_to_free->rects[i].bitmap);
+                    av_free(subtitle_to_free->rects[i].rgba_palette);
                 }
                 }
-                subtitle_to_free->num_rects = 0;
-                subtitle_to_free = NULL;
+                av_freep(&subtitle_to_free->rects);
             }
             }
+            subtitle_to_free->num_rects = 0;
+            subtitle_to_free = NULL;
         }
         }
+    }
  discard_packet:
     if (pkt == NULL) {
         /* EOF handling */
  discard_packet:
     if (pkt == NULL) {
         /* EOF handling */
@@ -1355,7 +1353,6 @@ static int av_encode(AVFormatContext **output_files,
     AVOutputStream *ost, **ost_table = NULL;
     AVInputStream *ist, **ist_table = NULL;
     AVInputFile *file_table;
     AVOutputStream *ost, **ost_table = NULL;
     AVInputStream *ist, **ist_table = NULL;
     AVInputFile *file_table;
-    AVFormatContext *stream_no_data;
     int key;
 
     file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
     int key;
 
     file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile));
@@ -1542,7 +1539,7 @@ static int av_encode(AVFormatContext **output_files,
             case CODEC_TYPE_SUBTITLE:
                 break;
             default:
             case CODEC_TYPE_SUBTITLE:
                 break;
             default:
-                av_abort();
+                abort();
             }
         } else {
             switch(codec->codec_type) {
             }
         } else {
             switch(codec->codec_type) {
@@ -1578,7 +1575,7 @@ static int av_encode(AVFormatContext **output_files,
                                                     codec->sample_rate, icodec->sample_rate);
                     if(!ost->resample){
                         printf("Can't resample.  Aborting.\n");
                                                     codec->sample_rate, icodec->sample_rate);
                     if(!ost->resample){
                         printf("Can't resample.  Aborting.\n");
-                        av_abort();
+                        abort();
                     }
                 }
                 ist->decoding_needed = 1;
                     }
                 }
                 ist->decoding_needed = 1;
@@ -1613,9 +1610,11 @@ static int av_encode(AVFormatContext **output_files,
                 if (ost->video_resample) {
                     avcodec_get_frame_defaults(&ost->pict_tmp);
                     if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
                 if (ost->video_resample) {
                     avcodec_get_frame_defaults(&ost->pict_tmp);
                     if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
-                                         codec->width, codec->height ) )
+                                         codec->width, codec->height ) ) {
+                        fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
                         exit(1);
                         exit(1);
-
+                    }
+                    sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
                     ost->img_resample_ctx = sws_getContext(
                             icodec->width - (frame_leftBand + frame_rightBand),
                             icodec->height - (frame_topBand + frame_bottomBand),
                     ost->img_resample_ctx = sws_getContext(
                             icodec->width - (frame_leftBand + frame_rightBand),
                             icodec->height - (frame_topBand + frame_bottomBand),
@@ -1638,7 +1637,7 @@ static int av_encode(AVFormatContext **output_files,
                 ist->decoding_needed = 1;
                 break;
             default:
                 ist->decoding_needed = 1;
                 break;
             default:
-                av_abort();
+                abort();
                 break;
             }
             /* two pass mode */
                 break;
             }
             /* two pass mode */
@@ -1770,11 +1769,6 @@ static int av_encode(AVFormatContext **output_files,
         ist->is_start = 1;
     }
 
         ist->is_start = 1;
     }
 
-    /* compute buffer size max (should use a complete heuristic) */
-    for(i=0;i<nb_input_files;i++) {
-        file_table[i].buffer_size_max = 2048;
-    }
-
     /* set meta data information from input file if required */
     for (i=0;i<nb_meta_data_maps;i++) {
         AVFormatContext *out_file;
     /* set meta data information from input file if required */
     for (i=0;i<nb_meta_data_maps;i++) {
         AVFormatContext *out_file;
@@ -1822,8 +1816,8 @@ static int av_encode(AVFormatContext **output_files,
     }
     term_init();
 
     }
     term_init();
 
-    stream_no_data = 0;
     key = -1;
     key = -1;
+    timer_start = av_gettime();
 
     for(; received_sigterm == 0;) {
         int file_index, ist_index;
 
     for(; received_sigterm == 0;) {
         int file_index, ist_index;
@@ -1882,7 +1876,7 @@ static int av_encode(AVFormatContext **output_files,
             break;
 
         /* finish if limit size exhausted */
             break;
 
         /* finish if limit size exhausted */
-        if (limit_filesize != 0 && (limit_filesize * 1024) < url_ftell(&output_files[0]->pb))
+        if (limit_filesize != 0 && limit_filesize < url_ftell(&output_files[0]->pb))
             break;
 
         /* read a frame from it and output it in the fifo */
             break;
 
         /* read a frame from it and output it in the fifo */
@@ -1892,13 +1886,8 @@ static int av_encode(AVFormatContext **output_files,
             if (opt_shortest) break; else continue; //
         }
 
             if (opt_shortest) break; else continue; //
         }
 
-        if (!pkt.size) {
-            stream_no_data = is;
-        } else {
-            stream_no_data = 0;
-        }
         if (do_pkt_dump) {
         if (do_pkt_dump) {
-            av_pkt_dump(stdout, &pkt, do_hex_dump);
+            av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
         }
         /* the following test is needed in case new streams appear
            dynamically in stream : we ignore them */
         }
         /* the following test is needed in case new streams appear
            dynamically in stream : we ignore them */
@@ -2047,6 +2036,7 @@ static void opt_format(const char *arg)
         pgmyuv_compatibility_hack=1;
 //        opt_image_format(arg);
         arg = "image2";
         pgmyuv_compatibility_hack=1;
 //        opt_image_format(arg);
         arg = "image2";
+        fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
     }
 
     file_iformat = av_find_input_format(arg);
     }
 
     file_iformat = av_find_input_format(arg);
@@ -2080,7 +2070,7 @@ static void opt_verbose(const char *arg)
 
 static void opt_frame_rate(const char *arg)
 {
 
 static void opt_frame_rate(const char *arg)
 {
-    if (parse_frame_rate(&frame_rate, &frame_rate_base, arg) < 0) {
+    if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
         fprintf(stderr, "Incorrect frame rate\n");
         exit(1);
     }
         fprintf(stderr, "Incorrect frame rate\n");
         exit(1);
     }
@@ -2160,7 +2150,7 @@ static void opt_frame_crop_right(const char *arg)
 
 static void opt_frame_size(const char *arg)
 {
 
 static void opt_frame_size(const char *arg)
 {
-    if (parse_image_size(&frame_width, &frame_height, arg) < 0) {
+    if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
         fprintf(stderr, "Incorrect frame size\n");
         exit(1);
     }
         fprintf(stderr, "Incorrect frame size\n");
         exit(1);
     }
@@ -2256,10 +2246,24 @@ static void opt_frame_pad_right(const char *arg)
     }
 }
 
     }
 }
 
+void list_pix_fmts(void)
+{
+    int i;
+    char pix_fmt_str[128];
+    for (i=-1; i < PIX_FMT_NB; i++) {
+        avcodec_pix_fmt_string (pix_fmt_str, sizeof(pix_fmt_str), i);
+        fprintf(stdout, "%s\n", pix_fmt_str);
+    }
+}
 
 static void opt_frame_pix_fmt(const char *arg)
 {
 
 static void opt_frame_pix_fmt(const char *arg)
 {
-    frame_pix_fmt = avcodec_get_pix_fmt(arg);
+    if (strcmp(arg, "list"))
+        frame_pix_fmt = avcodec_get_pix_fmt(arg);
+    else {
+        list_pix_fmts();
+        exit(0);
+    }
 }
 
 static void opt_frame_aspect_ratio(const char *arg)
 }
 
 static void opt_frame_aspect_ratio(const char *arg)
@@ -2305,11 +2309,6 @@ static void opt_qdiff(const char *arg)
     }
 }
 
     }
 }
 
-static void opt_packet_size(const char *arg)
-{
-    packet_size= atoi(arg);
-}
-
 static void opt_strict(const char *arg)
 {
     strict= atoi(arg);
 static void opt_strict(const char *arg)
 {
     strict= atoi(arg);
@@ -2329,11 +2328,6 @@ static void opt_thread_count(const char *arg)
 #endif
 }
 
 #endif
 }
 
-static void opt_audio_bitrate(const char *arg)
-{
-    audio_bit_rate = atoi(arg) * 1000;
-}
-
 static void opt_audio_rate(const char *arg)
 {
     audio_sample_rate = atoi(arg);
 static void opt_audio_rate(const char *arg)
 {
     audio_sample_rate = atoi(arg);
@@ -2421,35 +2415,6 @@ static void add_frame_hooker(const char *arg)
     }
 }
 
     }
 }
 
-const char *motion_str[] = {
-    "zero",
-    "full",
-    "log",
-    "phods",
-    "epzs",
-    "x1",
-    "hex",
-    "umh",
-    "iter",
-    NULL,
-};
-
-static void opt_motion_estimation(const char *arg)
-{
-    const char **p;
-    p = motion_str;
-    for(;;) {
-        if (!*p) {
-            fprintf(stderr, "Unknown motion estimation method '%s'\n", arg);
-            exit(1);
-        }
-        if (!strcmp(*p, arg))
-            break;
-        p++;
-    }
-    me_method = (p - motion_str) + 1;
-}
-
 static void opt_video_codec(const char *arg)
 {
     opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg);
 static void opt_video_codec(const char *arg)
 {
     opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg);
@@ -2540,8 +2505,8 @@ static void opt_input_file(const char *filename)
     ap->prealloced_context = 1;
     ap->sample_rate = audio_sample_rate;
     ap->channels = audio_channels;
     ap->prealloced_context = 1;
     ap->sample_rate = audio_sample_rate;
     ap->channels = audio_channels;
-    ap->time_base.den = frame_rate;
-    ap->time_base.num = frame_rate_base;
+    ap->time_base.den = frame_rate.num;
+    ap->time_base.num = frame_rate.den;
     ap->width = frame_width + frame_padleft + frame_padright;
     ap->height = frame_height + frame_padtop + frame_padbottom;
     ap->pix_fmt = frame_pix_fmt;
     ap->width = frame_width + frame_padleft + frame_padright;
     ap->height = frame_height + frame_padtop + frame_padbottom;
     ap->pix_fmt = frame_pix_fmt;
@@ -2595,10 +2560,8 @@ static void opt_input_file(const char *filename)
     for(i=0;i<ic->nb_streams;i++) {
         int j;
         AVCodecContext *enc = ic->streams[i]->codec;
     for(i=0;i<ic->nb_streams;i++) {
         int j;
         AVCodecContext *enc = ic->streams[i]->codec;
-#if defined(HAVE_THREADS)
         if(thread_count>1)
             avcodec_thread_init(enc, thread_count);
         if(thread_count>1)
             avcodec_thread_init(enc, thread_count);
-#endif
         enc->thread_count= thread_count;
         switch(enc->codec_type) {
         case CODEC_TYPE_AUDIO:
         enc->thread_count= thread_count;
         switch(enc->codec_type) {
         case CODEC_TYPE_AUDIO:
@@ -2640,8 +2603,8 @@ static void opt_input_file(const char *filename)
                     (float)rfps / rfps_base, rfps, rfps_base);
             }
             /* update the current frame rate to match the stream frame rate */
                     (float)rfps / rfps_base, rfps, rfps_base);
             }
             /* update the current frame rate to match the stream frame rate */
-            frame_rate      = rfps;
-            frame_rate_base = rfps_base;
+            frame_rate.num = rfps;
+            frame_rate.den = rfps_base;
 
             enc->rate_emu = rate_emu;
             if(video_disable)
 
             enc->rate_emu = rate_emu;
             if(video_disable)
@@ -2656,7 +2619,7 @@ static void opt_input_file(const char *filename)
         case CODEC_TYPE_UNKNOWN:
             break;
         default:
         case CODEC_TYPE_UNKNOWN:
             break;
         default:
-            av_abort();
+            abort();
         }
     }
 
         }
     }
 
@@ -2698,7 +2661,7 @@ static void check_audio_video_inputs(int *has_video_ptr, int *has_audio_ptr)
             case CODEC_TYPE_SUBTITLE:
                 break;
             default:
             case CODEC_TYPE_SUBTITLE:
                 break;
             default:
-                av_abort();
+                abort();
             }
         }
     }
             }
         }
     }
@@ -2717,13 +2680,12 @@ static void new_video_stream(AVFormatContext *oc)
         fprintf(stderr, "Could not alloc stream\n");
         exit(1);
     }
         fprintf(stderr, "Could not alloc stream\n");
         exit(1);
     }
+    avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
     bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
     video_bitstream_filters= NULL;
 
     bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
     video_bitstream_filters= NULL;
 
-#if defined(HAVE_THREADS)
     if(thread_count>1)
         avcodec_thread_init(st->codec, thread_count);
     if(thread_count>1)
         avcodec_thread_init(st->codec, thread_count);
-#endif
 
     video_enc = st->codec;
 
 
     video_enc = st->codec;
 
@@ -2762,11 +2724,11 @@ static void new_video_stream(AVFormatContext *oc)
                  av_set_double(video_enc, opt_names[i], d);
         }
 
                  av_set_double(video_enc, opt_names[i], d);
         }
 
-        video_enc->time_base.den = frame_rate;
-        video_enc->time_base.num = frame_rate_base;
+        video_enc->time_base.den = frame_rate.num;
+        video_enc->time_base.num = frame_rate.den;
         if(codec && codec->supported_framerates){
             const AVRational *p= codec->supported_framerates;
         if(codec && codec->supported_framerates){
             const AVRational *p= codec->supported_framerates;
-            AVRational req= (AVRational){frame_rate, frame_rate_base};
+            AVRational req= (AVRational){frame_rate.num, frame_rate.den};
             const AVRational *best=NULL;
             AVRational best_error= (AVRational){INT_MAX, 1};
             for(; p->den!=0; p++){
             const AVRational *best=NULL;
             AVRational best_error= (AVRational){INT_MAX, 1};
             for(; p->den!=0; p++){
@@ -2843,16 +2805,9 @@ static void new_video_stream(AVFormatContext *oc)
         video_enc->intra_dc_precision= intra_dc_precision - 8;
         video_enc->strict_std_compliance = strict;
 
         video_enc->intra_dc_precision= intra_dc_precision - 8;
         video_enc->strict_std_compliance = strict;
 
-        if(packet_size){
-            video_enc->rtp_mode= 1;
-            video_enc->rtp_payload_size= packet_size;
-        }
-
         if (do_psnr)
             video_enc->flags|= CODEC_FLAG_PSNR;
 
         if (do_psnr)
             video_enc->flags|= CODEC_FLAG_PSNR;
 
-        video_enc->me_method = me_method;
-
         /* two pass mode */
         if (do_pass) {
             if (do_pass == 1) {
         /* two pass mode */
         if (do_pass) {
             if (do_pass == 1) {
@@ -2880,14 +2835,13 @@ static void new_audio_stream(AVFormatContext *oc)
         fprintf(stderr, "Could not alloc stream\n");
         exit(1);
     }
         fprintf(stderr, "Could not alloc stream\n");
         exit(1);
     }
+    avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
 
     bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
     audio_bitstream_filters= NULL;
 
 
     bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
     audio_bitstream_filters= NULL;
 
-#if defined(HAVE_THREADS)
     if(thread_count>1)
         avcodec_thread_init(st->codec, thread_count);
     if(thread_count>1)
         avcodec_thread_init(st->codec, thread_count);
-#endif
 
     audio_enc = st->codec;
     audio_enc->codec_type = CODEC_TYPE_AUDIO;
 
     audio_enc = st->codec;
     audio_enc->codec_type = CODEC_TYPE_AUDIO;
@@ -2917,7 +2871,6 @@ static void new_audio_stream(AVFormatContext *oc)
             codec_id = audio_codec_id;
         audio_enc->codec_id = codec_id;
 
             codec_id = audio_codec_id;
         audio_enc->codec_id = codec_id;
 
-        audio_enc->bit_rate = audio_bit_rate;
         if (audio_qscale > QSCALE_NONE) {
             audio_enc->flags |= CODEC_FLAG_QSCALE;
             audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
         if (audio_qscale > QSCALE_NONE) {
             audio_enc->flags |= CODEC_FLAG_QSCALE;
             audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
@@ -2928,7 +2881,7 @@ static void new_audio_stream(AVFormatContext *oc)
     audio_enc->sample_rate = audio_sample_rate;
     audio_enc->time_base= (AVRational){1, audio_sample_rate};
     if (audio_language) {
     audio_enc->sample_rate = audio_sample_rate;
     audio_enc->time_base= (AVRational){1, audio_sample_rate};
     if (audio_language) {
-        pstrcpy(st->language, sizeof(st->language), audio_language);
+        av_strlcpy(st->language, audio_language, sizeof(st->language));
         av_free(audio_language);
         audio_language = NULL;
     }
         av_free(audio_language);
         audio_language = NULL;
     }
@@ -2957,6 +2910,7 @@ static void opt_new_subtitle_stream(void)
         fprintf(stderr, "Could not alloc stream\n");
         exit(1);
     }
         fprintf(stderr, "Could not alloc stream\n");
         exit(1);
     }
+    avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
 
     subtitle_enc = st->codec;
     subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
 
     subtitle_enc = st->codec;
     subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
@@ -2973,7 +2927,7 @@ static void opt_new_subtitle_stream(void)
     }
 
     if (subtitle_language) {
     }
 
     if (subtitle_language) {
-        pstrcpy(st->language, sizeof(st->language), subtitle_language);
+        av_strlcpy(st->language, subtitle_language, sizeof(st->language));
         av_free(subtitle_language);
         subtitle_language = NULL;
     }
         av_free(subtitle_language);
         subtitle_language = NULL;
     }
@@ -3018,17 +2972,17 @@ static void opt_output_file(const char *filename)
     if (!file_oformat) {
         file_oformat = guess_format(NULL, filename, NULL);
         if (!file_oformat) {
     if (!file_oformat) {
         file_oformat = guess_format(NULL, filename, NULL);
         if (!file_oformat) {
-            fprintf(stderr, "Unable for find a suitable output format for '%s'\n",
+            fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
                     filename);
             exit(1);
         }
     }
 
     oc->oformat = file_oformat;
                     filename);
             exit(1);
         }
     }
 
     oc->oformat = file_oformat;
-    pstrcpy(oc->filename, sizeof(oc->filename), filename);
+    av_strlcpy(oc->filename, filename, sizeof(oc->filename));
 
     if (!strcmp(file_oformat->name, "ffm") &&
 
     if (!strcmp(file_oformat->name, "ffm") &&
-        strstart(filename, "http:", NULL)) {
+        av_strstart(filename, "http:", NULL)) {
         /* special case for files sent to ffserver: we get the stream
            parameters from ffserver */
         if (read_ffserver_streams(oc, filename) < 0) {
         /* special case for files sent to ffserver: we get the stream
            parameters from ffserver */
         if (read_ffserver_streams(oc, filename) < 0) {
@@ -3068,15 +3022,15 @@ static void opt_output_file(const char *filename)
         oc->timestamp = rec_timestamp;
 
         if (str_title)
         oc->timestamp = rec_timestamp;
 
         if (str_title)
-            pstrcpy(oc->title, sizeof(oc->title), str_title);
+            av_strlcpy(oc->title, str_title, sizeof(oc->title));
         if (str_author)
         if (str_author)
-            pstrcpy(oc->author, sizeof(oc->author), str_author);
+            av_strlcpy(oc->author, str_author, sizeof(oc->author));
         if (str_copyright)
         if (str_copyright)
-            pstrcpy(oc->copyright, sizeof(oc->copyright), str_copyright);
+            av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
         if (str_comment)
         if (str_comment)
-            pstrcpy(oc->comment, sizeof(oc->comment), str_comment);
+            av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
         if (str_album)
         if (str_album)
-            pstrcpy(oc->album, sizeof(oc->album), str_album);
+            av_strlcpy(oc->album, str_album, sizeof(oc->album));
     }
 
     output_files[nb_output_files++] = oc;
     }
 
     output_files[nb_output_files++] = oc;
@@ -3093,7 +3047,7 @@ static void opt_output_file(const char *filename)
         /* test if it already exists to avoid loosing precious files */
         if (!file_overwrite &&
             (strchr(filename, ':') == NULL ||
         /* test if it already exists to avoid loosing precious files */
         if (!file_overwrite &&
             (strchr(filename, ':') == NULL ||
-             strstart(filename, "file:", NULL))) {
+             av_strstart(filename, "file:", NULL))) {
             if (url_exist(filename)) {
                 int c;
 
             if (url_exist(filename)) {
                 int c;
 
@@ -3155,20 +3109,23 @@ static void opt_pass(const char *pass_str)
     do_pass = pass;
 }
 
     do_pass = pass;
 }
 
-#if defined(__MINGW32__) || defined(CONFIG_OS2)
-static int64_t getutime(void)
-{
-  return av_gettime();
-}
-#else
 static int64_t getutime(void)
 {
 static int64_t getutime(void)
 {
+#ifdef HAVE_GETRUSAGE
     struct rusage rusage;
 
     getrusage(RUSAGE_SELF, &rusage);
     return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
     struct rusage rusage;
 
     getrusage(RUSAGE_SELF, &rusage);
     return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
-}
+#elif defined(HAVE_GETPROCESSTIMES)
+    HANDLE proc;
+    FILETIME c, e, k, u;
+    proc = GetCurrentProcess();
+    GetProcessTimes(proc, &c, &e, &k, &u);
+    return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
+#else
+  return av_gettime();
 #endif
 #endif
+}
 
 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
 extern int ffm_nopts;
 
 #if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
 extern int ffm_nopts;
@@ -3180,7 +3137,7 @@ static void show_formats(void)
     AVOutputFormat *ofmt;
     URLProtocol *up;
     AVCodec *p, *p2;
     AVOutputFormat *ofmt;
     URLProtocol *up;
     AVCodec *p, *p2;
-    const char **pp, *last_name;
+    const char *last_name;
 
     printf("File formats:\n");
     last_name= "000";
 
     printf("File formats:\n");
     last_name= "000";
@@ -3281,25 +3238,13 @@ static void show_formats(void)
     printf("\n");
 
     printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
     printf("\n");
 
     printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
-    printf("Motion estimation methods:\n");
-    pp = motion_str;
-    while (*pp) {
-        printf(" %s", *pp);
-        if ((pp - motion_str + 1) == ME_ZERO)
-            printf("(fastest)");
-        else if ((pp - motion_str + 1) == ME_FULL)
-            printf("(slowest)");
-        else if ((pp - motion_str + 1) == ME_EPZS)
-            printf("(default)");
-        pp++;
-    }
-    printf("\n\n");
+    printf("\n");
     printf(
     printf(
-"Note, the names of encoders and decoders dont always match, so there are\n"
+"Note, the names of encoders and decoders do not always match, so there are\n"
 "several cases where the above table shows encoder only or decoder only entries\n"
 "several cases where the above table shows encoder only or decoder only entries\n"
-"even though both encoding and decoding are supported for example, the h263\n"
-"decoder corresponds to the h263 and h263p encoders, for file formats its even\n"
-"worse\n");
+"even though both encoding and decoding are supported. For example, the h263\n"
+"decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
+"worse.\n");
     exit(1);
 }
 
     exit(1);
 }
 
@@ -3349,7 +3294,7 @@ static void opt_target(const char *arg)
     } else {
         int fr;
         /* Calculate FR via float to avoid int overflow */
     } else {
         int fr;
         /* Calculate FR via float to avoid int overflow */
-        fr = (int)(frame_rate * 1000.0 / frame_rate_base);
+        fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
         if(fr == 25000) {
             norm = 0;
         } else if((fr == 29970) || (fr == 23976)) {
         if(fr == 25000) {
             norm = 0;
         } else if((fr == 29970) || (fr == 23976)) {
@@ -3403,7 +3348,7 @@ static void opt_target(const char *arg)
         opt_default("minrate", "1150000");
         opt_default("bufsize", "327680"); // 40*1024*8;
 
         opt_default("minrate", "1150000");
         opt_default("bufsize", "327680"); // 40*1024*8;
 
-        audio_bit_rate = 224000;
+        opt_default("ab", "224000");
         audio_sample_rate = 44100;
         audio_channels = 2;
 
         audio_sample_rate = 44100;
         audio_channels = 2;
 
@@ -3433,7 +3378,7 @@ static void opt_target(const char *arg)
         opt_default("flags", "+SCAN_OFFSET");
 
 
         opt_default("flags", "+SCAN_OFFSET");
 
 
-        audio_bit_rate = 224000;
+        opt_default("ab", "224000");
         audio_sample_rate = 44100;
 
         opt_default("packetsize", "2324");
         audio_sample_rate = 44100;
 
         opt_default("packetsize", "2324");
@@ -3456,7 +3401,7 @@ static void opt_target(const char *arg)
         opt_default("packetsize", "2048");  // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
         opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
 
         opt_default("packetsize", "2048");  // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
         opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
 
-        audio_bit_rate = 448000;
+        opt_default("ab", "448000");
         audio_sample_rate = 48000;
 
     } else if(!strncmp(arg, "dv", 2)) {
         audio_sample_rate = 48000;
 
     } else if(!strncmp(arg, "dv", 2)) {
@@ -3477,13 +3422,30 @@ static void opt_target(const char *arg)
     }
 }
 
     }
 }
 
+static void opt_vstats_file (const char *arg)
+{
+    av_free (vstats_filename);
+    vstats_filename=av_strdup (arg);
+}
+
+static void opt_vstats (void)
+{
+    char filename[40];
+    time_t today2 = time(NULL);
+    struct tm *today = localtime(&today2);
+
+    snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
+             today->tm_sec);
+    opt_vstats_file(filename);
+}
+
 static void opt_video_bsf(const char *arg)
 {
     AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
     AVBitStreamFilterContext **bsfp;
 
     if(!bsfc){
 static void opt_video_bsf(const char *arg)
 {
     AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
     AVBitStreamFilterContext **bsfp;
 
     if(!bsfc){
-        fprintf(stderr, "Unkown bitstream filter %s\n", arg);
+        fprintf(stderr, "Unknown bitstream filter %s\n", arg);
         exit(1);
     }
 
         exit(1);
     }
 
@@ -3501,7 +3463,7 @@ static void opt_audio_bsf(const char *arg)
     AVBitStreamFilterContext **bsfp;
 
     if(!bsfc){
     AVBitStreamFilterContext **bsfp;
 
     if(!bsfc){
-        fprintf(stderr, "Unkown bitstream filter %s\n", arg);
+        fprintf(stderr, "Unknown bitstream filter %s\n", arg);
         exit(1);
     }
 
         exit(1);
     }
 
@@ -3525,11 +3487,18 @@ static void show_version(void)
 
 static int opt_default(const char *opt, const char *arg){
     int type;
 
 static int opt_default(const char *opt, const char *arg){
     int type;
-    const AVOption *o;
-    for(type=0; type<CODEC_TYPE_NB; type++)
-        o = av_set_string(avctx_opts[type], opt, arg);
+    const AVOption *o= NULL;
+    int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
+
+    for(type=0; type<CODEC_TYPE_NB; type++){
+        const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
+        if(o2)
+            o = av_set_string(avctx_opts[type], opt, arg);
+    }
     if(!o)
         o = av_set_string(avformat_opts, opt, arg);
     if(!o)
         o = av_set_string(avformat_opts, opt, arg);
+    if(!o)
+        o = av_set_string(sws_opts, opt, arg);
     if(!o){
         if(opt[0] == 'a')
             o = av_set_string(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg);
     if(!o){
         if(opt[0] == 'a')
             o = av_set_string(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg);
@@ -3570,7 +3539,7 @@ const OptionDef options[] = {
     { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
     { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
     { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
     { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
     { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
     { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" },
-    { "fs", HAS_ARG | OPT_INT, {(void*)&limit_filesize}, "set the limit file size", "limit_size" }, //
+    { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
     { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
     { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
     { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
     { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
     { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
     { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
@@ -3604,7 +3573,7 @@ const OptionDef options[] = {
     { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
     { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
     { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
     { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
     { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
     { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
-    { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" },
+    { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
     { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
     { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
     { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
     { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
     { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
     { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
@@ -3622,10 +3591,7 @@ const OptionDef options[] = {
     { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
     { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
     { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
     { "rc_eq", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_eq}, "set rate control equation", "equation" },
     { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
     { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
-    { "me", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_motion_estimation}, "set motion estimation method",
-      "method" },
     { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold",  "" },
     { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold",  "" },
-    { "ps", HAS_ARG | OPT_EXPERT, {(void*)opt_packet_size}, "set packet size in bits", "size" },
     { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
     { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
       "use same video quality as source (implies VBR)" },
     { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
     { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
       "use same video quality as source (implies VBR)" },
@@ -3634,7 +3600,8 @@ const OptionDef options[] = {
     { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
       "deinterlace pictures" },
     { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
     { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
       "deinterlace pictures" },
     { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
-    { "vstats", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_vstats}, "dump video coding statistics to file" },
+    { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
+    { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
     { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
     { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
     { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
     { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
     { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
     { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
@@ -3646,7 +3613,6 @@ const OptionDef options[] = {
 
     /* audio options */
     { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
 
     /* audio options */
     { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
-    { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
     { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
     { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
     { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
     { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
     { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
     { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
@@ -3710,7 +3676,7 @@ static void show_license(void)
     "\n"
     "You should have received a copy of the GNU General Public License\n"
     "along with FFmpeg; if not, write to the Free Software\n"
     "\n"
     "You should have received a copy of the GNU General Public License\n"
     "along with FFmpeg; if not, write to the Free Software\n"
-    "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
+    "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
     );
 #else
     printf(
     );
 #else
     printf(
@@ -3732,8 +3698,18 @@ static void show_license(void)
     exit(1);
 }
 
     exit(1);
 }
 
+/**
+ * Trivial log callback.
+ * Only suitable for show_help and similar since it lacks prefix handling.
+ */
+static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
+{
+    vfprintf(stdout, fmt, vl);
+}
+
 static void show_help(void)
 {
 static void show_help(void)
 {
+    av_log_set_callback(log_callback_help);
     show_banner();
     printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
            "Hyper fast Audio and Video encoder\n");
     show_banner();
     printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
            "Hyper fast Audio and Video encoder\n");
@@ -3763,6 +3739,7 @@ static void show_help(void)
                       OPT_EXPERT);
     av_opt_show(avctx_opts[0], NULL);
     av_opt_show(avformat_opts, NULL);
                       OPT_EXPERT);
     av_opt_show(avctx_opts[0], NULL);
     av_opt_show(avformat_opts, NULL);
+    av_opt_show(sws_opts, NULL);
 
     exit(1);
 }
 
     exit(1);
 }
@@ -3779,9 +3756,11 @@ int main(int argc, char **argv)
 
     av_register_all();
 
 
     av_register_all();
 
-    for(i=0; i<CODEC_TYPE_NB; i++)
-        avctx_opts[i]= avcodec_alloc_context();
+    for(i=0; i<CODEC_TYPE_NB; i++){
+        avctx_opts[i]= avcodec_alloc_context2(i);
+    }
     avformat_opts = av_alloc_format_context();
     avformat_opts = av_alloc_format_context();
+    sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
 
     if (argc <= 1)
         show_help();
 
     if (argc <= 1)
         show_help();
@@ -3828,10 +3807,16 @@ int main(int argc, char **argv)
 
     av_free_static();
 
 
     av_free_static();
 
-    if(intra_matrix)
-        av_free(intra_matrix);
-    if(inter_matrix)
-        av_free(inter_matrix);
+    av_free(intra_matrix);
+    av_free(inter_matrix);
+
+    if (fvstats)
+        fclose(fvstats);
+    av_free(vstats_filename);
+
+    av_free(opt_names);
+
+    av_free(video_standard);
 
 #ifdef CONFIG_POWERPC_PERF
     extern void powerpc_display_perf_report(void);
 
 #ifdef CONFIG_POWERPC_PERF
     extern void powerpc_display_perf_report(void);