diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-02-27 05:33:48 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-02-27 07:35:35 +0400 |
commit | 574dcb5baf26c7cce755b51e445ca7109f0f1260 (patch) | |
tree | 1a2fd2363b4b0b9a50ed7f2dd9f2b3aff08b72eb /ffmpeg.c | |
parent | 59affed23c3a30b85c006c45f9e5d3aa8ce50741 (diff) | |
parent | 7929e22bdea3bc40735d31ed7ddbf047732c3b9f (diff) |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
lavf: don't guess r_frame_rate from either stream or codec timebase.
avconv: set discard on input streams automatically.
Fix parser not to clobber has_b_frames when extradata is set.
lavf: don't set codec timebase in avformat_find_stream_info().
avconv: saner output video timebase.
rawdec: set timebase to 1/fps.
avconv: refactor vsync code.
FATE: remove a bunch of useless -vsync 0
cdxl: bit line plane arrangement support
cdxl: remove early check for bpp
cdxl: set pix_fmt PAL8 only if palette is available
Conflicts:
ffmpeg.c
libavcodec/h264_parser.c
libavformat/rawdec.c
tests/fate/demux.mak
tests/fate/ea.mak
tests/fate/h264.mak
tests/fate/prores.mak
tests/fate/video.mak
tests/ref/fate/bethsoft-vid
tests/ref/fate/creatureshock-avs
tests/ref/fate/ea-cmv
tests/ref/fate/interplay-mve-16bit
tests/ref/fate/interplay-mve-8bit
tests/ref/fate/nuv
tests/ref/fate/prores-alpha
tests/ref/fate/qtrle-16bit
tests/ref/fate/qtrle-1bit
tests/ref/fate/real-rv40
tests/ref/fate/rpza
tests/ref/fate/wmv8-drm
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'ffmpeg.c')
-rw-r--r-- | ffmpeg.c | 66 |
1 files changed, 31 insertions, 35 deletions
@@ -1506,7 +1506,7 @@ static void do_video_out(AVFormatContext *s, OutputStream *ost, int nb_frames, i, ret, format_video_sync; AVFrame *final_picture; AVCodecContext *enc; - double sync_ipts; + double sync_ipts, delta; double duration = 0; int frame_size = 0; float quality = same_quant ? in_picture->quality @@ -1523,6 +1523,7 @@ static void do_video_out(AVFormatContext *s, OutputStream *ost, } sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base); + delta = sync_ipts - ost->sync_opts + duration; /* by default, we output a single frame */ nb_frames = 1; @@ -1531,31 +1532,37 @@ static void do_video_out(AVFormatContext *s, OutputStream *ost, if (format_video_sync == VSYNC_AUTO) format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1; - if (format_video_sync != VSYNC_PASSTHROUGH && format_video_sync != VSYNC_DROP) { - double vdelta = sync_ipts - ost->sync_opts + duration; + switch (format_video_sync) { + case VSYNC_CFR: // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c - if (vdelta < -1.1) + if (delta < -1.1) nb_frames = 0; - else if (format_video_sync == VSYNC_VFR) { - if (vdelta <= -0.6) { - nb_frames = 0; - } else if (vdelta > 0.6) - ost->sync_opts = lrintf(sync_ipts); - } else if (vdelta > 1.1) - nb_frames = lrintf(vdelta); - if (nb_frames == 0) { - ++nb_frames_drop; - av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n"); - } else if (nb_frames > 1) { - nb_frames_dup += nb_frames - 1; - av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1); - } - } else + else if (delta > 1.1) + nb_frames = lrintf(delta); + break; + case VSYNC_VFR: + if (delta <= -0.6) + nb_frames = 0; + else if (delta > 0.6) + ost->sync_opts = lrintf(sync_ipts); + break; + case VSYNC_DROP: + case VSYNC_PASSTHROUGH: ost->sync_opts = lrintf(sync_ipts); + break; + default: + av_assert0(0); + } nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number); - if (nb_frames <= 0) + if (nb_frames == 0) { + nb_frames_drop++; + av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n"); return; + } else if (nb_frames > 1) { + nb_frames_dup += nb_frames - 1; + av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1); + } do_video_resample(ost, ist, in_picture, &final_picture); @@ -3523,6 +3530,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) ist->st = st; ist->file_index = nb_input_files; ist->discard = 1; + st->discard = AVDISCARD_ALL; ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st); ist->ts_scale = 1.0; @@ -3539,12 +3547,6 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) ist->dec = choose_decoder(o, ic, st); switch (dec->codec_type) { - case AVMEDIA_TYPE_AUDIO: - if (!ist->dec) - ist->dec = avcodec_find_decoder(dec->codec_id); - if (o->audio_disable) - st->discard = AVDISCARD_ALL; - break; case AVMEDIA_TYPE_VIDEO: if(!ist->dec) ist->dec = avcodec_find_decoder(dec->codec_id); @@ -3552,20 +3554,12 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) dec->flags |= CODEC_FLAG_EMU_EDGE; } - if (o->video_disable) - st->discard = AVDISCARD_ALL; - else if (video_discard) - st->discard = video_discard; break; + case AVMEDIA_TYPE_AUDIO: case AVMEDIA_TYPE_DATA: - if (o->data_disable) - st->discard= AVDISCARD_ALL; - break; case AVMEDIA_TYPE_SUBTITLE: if(!ist->dec) ist->dec = avcodec_find_decoder(dec->codec_id); - if(o->subtitle_disable) - st->discard = AVDISCARD_ALL; break; case AVMEDIA_TYPE_ATTACHMENT: case AVMEDIA_TYPE_UNKNOWN: @@ -4328,6 +4322,7 @@ static void opt_output_file(void *optctx, const char *filename) ost->source_index = index;\ ost->sync_ist = &input_streams[index];\ input_streams[index].discard = 0;\ + input_streams[index].st->discard = AVDISCARD_NONE;\ } /* video: highest resolution */ @@ -4400,6 +4395,7 @@ static void opt_output_file(void *optctx, const char *filename) ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index + map->sync_stream_index]; ist->discard = 0; + ist->st->discard = AVDISCARD_NONE; } } |