Revision 4ad08021

View differences:

Changelog
48 48
- cropdetect filter
49 49
- ffmpeg -crop* options removed
50 50
- transpose filter added
51
- ffmpeg -force_key_frames option added
51 52

  
52 53

  
53 54
version 0.6:
doc/ffmpeg-doc.texi
495 495
@example
496 496
ffmpeg -i h264.mp4 -vcodec copy -vbsf h264_mp4toannexb -an out.h264
497 497
@end example
498
@item -force_key_frames @var{time}[,@var{time}...]
499
Force key frames at the specified timestamps, more precisely at the first
500
frames after each specified time.
501
This option can be useful to ensure that a seek point is present at a
502
chapter mark or any other designated place in the output file.
503
The timestamps must be specified in ascending order.
498 504
@end table
499 505

  
500 506
@section Audio Options
ffmpeg.c
225 225
static int input_sync;
226 226
static uint64_t limit_filesize = 0;
227 227
static int force_fps = 0;
228
static char *forced_key_frames = NULL;
228 229

  
229 230
static int pgmyuv_compatibility_hack=0;
230 231
static float dts_delta_threshold = 10;
......
272 273
    int original_height;
273 274
    int original_width;
274 275

  
276
    /* forced key frames */
277
    int64_t *forced_kf_pts;
278
    int forced_kf_count;
279
    int forced_kf_index;
280

  
275 281
    /* audio only */
276 282
    int audio_resample;
277 283
    ReSampleContext *resample; /* for audio resampling */
......
1189 1195
            big_picture.pts= ost->sync_opts;
1190 1196
//            big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1191 1197
//av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1198
            if (ost->forced_kf_index < ost->forced_kf_count &&
1199
                big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1200
                big_picture.pict_type = FF_I_TYPE;
1201
                ost->forced_kf_index++;
1202
            }
1192 1203
            ret = avcodec_encode_video(enc,
1193 1204
                                       bit_buffer, bit_buffer_size,
1194 1205
                                       &big_picture);
......
1837 1848
    return 0;
1838 1849
}
1839 1850

  
1851
static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1852
                                    AVCodecContext *avctx)
1853
{
1854
    char *p;
1855
    int n = 1, i;
1856
    int64_t t;
1857

  
1858
    for (p = kf; *p; p++)
1859
        if (*p == ',')
1860
            n++;
1861
    ost->forced_kf_count = n;
1862
    ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1863
    if (!ost->forced_kf_pts) {
1864
        av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1865
        ffmpeg_exit(1);
1866
    }
1867
    for (i = 0; i < n; i++) {
1868
        p = i ? strchr(p, ',') + 1 : kf;
1869
        t = parse_time_or_die("force_key_frames", p, 1);
1870
        ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1871
    }
1872
}
1873

  
1840 1874
/*
1841 1875
 * The following code is the main loop of the file converter
1842 1876
 */
......
2578 2612
                av_fifo_free(ost->fifo); /* works even if fifo is not
2579 2613
                                             initialized but set to zero */
2580 2614
                av_free(ost->pict_tmp.data[0]);
2615
                av_free(ost->forced_kf_pts);
2581 2616
                if (ost->video_resample)
2582 2617
                    sws_freeContext(ost->img_resample_ctx);
2583 2618
                if (ost->resample)
......
3333 3368
                video_enc->flags |= CODEC_FLAG_PASS2;
3334 3369
            }
3335 3370
        }
3371

  
3372
        if (forced_key_frames)
3373
            parse_forced_key_frames(forced_key_frames, ost, video_enc);
3336 3374
    }
3337 3375
    if (video_language) {
3338 3376
        av_metadata_set2(&st->metadata, "language", video_language, 0);
......
3342 3380
    /* reset some key parameters */
3343 3381
    video_disable = 0;
3344 3382
    av_freep(&video_codec_name);
3383
    av_freep(&forced_key_frames);
3345 3384
    video_stream_copy = 0;
3346 3385
    frame_pix_fmt = PIX_FMT_NONE;
3347 3386
}
......
3644 3683
    set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3645 3684

  
3646 3685
    nb_streamid_map = 0;
3686
    av_freep(&forced_key_frames);
3647 3687
}
3648 3688

  
3649 3689
/* same option as mencoder */
......
4094 4134
    { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4095 4135
    { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4096 4136
    { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4137
    { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4097 4138

  
4098 4139
    /* audio options */
4099 4140
    { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },

Also available in: Unified diff