Merge commit 'aa499568afc01d59215eef7e5b14b949a9671afc'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 25 Mar 2014 18:24:40 +0000 (19:24 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 25 Mar 2014 18:25:10 +0000 (19:25 +0100)
* commit 'aa499568afc01d59215eef7e5b14b949a9671afc':
  avconv: More descriptive message about framedrop

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
ffmpeg.c

diff --cc ffmpeg.c
+++ b/ffmpeg.c
@@@ -829,86 -503,32 +829,88 @@@ static void do_video_out(AVFormatContex
      int ret, format_video_sync;
      AVPacket pkt;
      AVCodecContext *enc = ost->st->codec;
 +    int nb_frames, i;
 +    double sync_ipts, delta;
 +    double duration = 0;
 +    int frame_size = 0;
 +    InputStream *ist = NULL;
  
 -    *frame_size = 0;
 +    if (ost->source_index >= 0)
 +        ist = input_streams[ost->source_index];
 +
 +    if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
 +        duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
 +
 +    sync_ipts = in_picture->pts;
 +    delta = sync_ipts - ost->sync_opts + duration;
 +
 +    /* by default, we output a single frame */
 +    nb_frames = 1;
  
      format_video_sync = video_sync_method;
 -    if (format_video_sync == VSYNC_AUTO)
 -        format_video_sync = (s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH :
 -                            (s->oformat->flags & AVFMT_VARIABLE_FPS) ? VSYNC_VFR : VSYNC_CFR;
 -    if (format_video_sync != VSYNC_PASSTHROUGH &&
 -        ost->frame_number &&
 -        in_picture->pts != AV_NOPTS_VALUE &&
 -        in_picture->pts < ost->sync_opts) {
 +    if (format_video_sync == VSYNC_AUTO) {
 +        if(!strcmp(s->oformat->name, "avi")) {
 +            format_video_sync = VSYNC_VFR;
 +        } else
 +            format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : VSYNC_CFR;
 +        if (   ist
 +            && format_video_sync == VSYNC_CFR
 +            && input_files[ist->file_index]->ctx->nb_streams == 1
 +            && input_files[ist->file_index]->input_ts_offset == 0) {
 +            format_video_sync = VSYNC_VSCFR;
 +        }
 +        if (format_video_sync == VSYNC_CFR && copy_ts) {
 +            format_video_sync = VSYNC_VSCFR;
 +        }
 +    }
 +
 +    switch (format_video_sync) {
 +    case VSYNC_VSCFR:
 +        if (ost->frame_number == 0 && delta - duration >= 0.5) {
 +            av_log(NULL, AV_LOG_DEBUG, "Not duplicating %d initial frames\n", (int)lrintf(delta - duration));
 +            delta = duration;
 +            ost->sync_opts = lrint(sync_ipts);
 +        }
 +    case VSYNC_CFR:
 +        // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
 +        if (delta < -1.1)
 +            nb_frames = 0;
 +        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 = lrint(sync_ipts);
 +        break;
 +    case VSYNC_DROP:
 +    case VSYNC_PASSTHROUGH:
 +        ost->sync_opts = lrint(sync_ipts);
 +        break;
 +    default:
 +        av_assert0(0);
 +    }
 +
 +    nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
 +    if (nb_frames == 0) {
          nb_frames_drop++;
-         av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
+         av_log(NULL, AV_LOG_WARNING,
+                "*** dropping frame %d from stream %d at ts %"PRId64"\n",
+                ost->frame_number, ost->st->index, in_picture->pts);
          return;
 +    } else if (nb_frames > 1) {
 +        if (nb_frames > dts_error_threshold * 30) {
 +            av_log(NULL, AV_LOG_ERROR, "%d frame duplication too large, skipping\n", nb_frames - 1);
 +            nb_frames_drop++;
 +            return;
 +        }
 +        nb_frames_dup += nb_frames - 1;
 +        av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
      }
  
 -    if (in_picture->pts == AV_NOPTS_VALUE)
 -        in_picture->pts = ost->sync_opts;
 -    ost->sync_opts = in_picture->pts;
 -
 -
 -    if (!ost->frame_number)
 -        ost->first_pts = in_picture->pts;
 -
 +  /* duplicates frame if needed */
 +  for (i = 0; i < nb_frames; i++) {
      av_init_packet(&pkt);
      pkt.data = NULL;
      pkt.size = 0;