]> git.sesse.net Git - ffmpeg/blobdiff - ffmpeg.c
mpegts muxer now needs mpeg4audio code like adts muxer
[ffmpeg] / ffmpeg.c
index 4220c278ccd31fcb75ffbc9840c756da7c5ae4e6..61b833212788b6f463327359fdfb3c22c9304b50 100644 (file)
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -40,6 +40,7 @@
 #include "libavutil/fifo.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/avstring.h"
+#include "libavutil/libm.h"
 #include "libavformat/os_support.h"
 
 #if HAVE_SYS_RESOURCE_H
@@ -66,7 +67,6 @@
 #elif HAVE_CONIO_H
 #include <conio.h>
 #endif
-#undef time //needed because HAVE_AV_CONFIG_H is defined on top
 #include <time.h>
 
 #include "cmdutils.h"
@@ -74,8 +74,6 @@
 #undef NDEBUG
 #include <assert.h>
 
-#undef exit
-
 const char program_name[] = "FFmpeg";
 const int program_birth_year = 2000;
 
@@ -902,6 +900,7 @@ static void do_video_out(AVFormatContext *s,
     AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
     AVFrame picture_crop_temp, picture_pad_temp;
     AVCodecContext *enc, *dec;
+    double sync_ipts;
 
     avcodec_get_frame_defaults(&picture_crop_temp);
     avcodec_get_frame_defaults(&picture_pad_temp);
@@ -909,14 +908,15 @@ static void do_video_out(AVFormatContext *s,
     enc = ost->st->codec;
     dec = ist->st->codec;
 
+    sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
+
     /* by default, we output a single frame */
     nb_frames = 1;
 
     *frame_size = 0;
 
     if(video_sync_method){
-        double vdelta;
-        vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
+        double vdelta = sync_ipts - ost->sync_opts;
         //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
         if (vdelta < -1.1)
             nb_frames = 0;
@@ -924,7 +924,7 @@ static void do_video_out(AVFormatContext *s,
             if(vdelta<=-0.6){
                 nb_frames=0;
             }else if(vdelta>0.6)
-            ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
+            ost->sync_opts= lrintf(sync_ipts);
         }else if (vdelta > 1.1)
             nb_frames = lrintf(vdelta);
 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
@@ -938,7 +938,7 @@ static void do_video_out(AVFormatContext *s,
                 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
         }
     }else
-        ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
+        ost->sync_opts= lrintf(sync_ipts);
 
     nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
     if (nb_frames <= 0)
@@ -1850,7 +1850,7 @@ static int av_encode(AVFormatContext **output_files,
         while ((t = av_metadata_get(ist->st->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) {
             if (lang && !strcmp(t->key, "language"))
                 continue;
-            av_metadata_set2(&ost->st->metadata, t->key, t->value, NULL);
+            av_metadata_set2(&ost->st->metadata, t->key, t->value, 0);
         }
 
         ost->st->disposition = ist->st->disposition;
@@ -3147,7 +3147,11 @@ static void new_video_stream(AVFormatContext *oc)
                 if(*p == video_enc->pix_fmt)
                     break;
             }
-            if(*p == -1)
+            if(*p == -1
+               && !(   video_enc->codec_id==CODEC_ID_MJPEG
+                    && video_enc->strict_std_compliance <= FF_COMPLIANCE_INOFFICIAL
+                    && (   video_enc->pix_fmt == PIX_FMT_YUV420P
+                        || video_enc->pix_fmt == PIX_FMT_YUV422P)))
                 video_enc->pix_fmt = codec->pix_fmts[0];
         }