History

avconv: fix -force_key_frames

parse_forced_keyframes() relies in encoder timebase being set, so call it from transcode_init() after it is known.

Anton Khirnov committed 14 years ago

Commit 19ad5671 parent ea1c5011 file · +32 −27Browse files

Unified · Split

avconv.c+32−27
@@ -270,6 +270,7 @@ typedef struct OutputStream { · 269 unmodified lines
270 int64_t *forced_kf_pts;270 int64_t *forced_kf_pts;
271 int forced_kf_count;271 int forced_kf_count;
272 int forced_kf_index;272 int forced_kf_index;
273 char *forced_keyframes;
273 274
274 FILE *logfile;275 FILE *logfile;
275 276
@@ -1062,6 +1063,7 @@ void exit_program(int ret) · 786 unmodified lines
1062 }1063 }
1063 output_streams[i]->bitstream_filters = NULL;1064 output_streams[i]->bitstream_filters = NULL;
1064 1065
1066 av_freep(&output_streams[i]->forced_keyframes);
1065 av_freep(&output_streams[i]->avfilter);1067 av_freep(&output_streams[i]->avfilter);
1066 av_freep(&output_streams[i]->filtered_frame);1068 av_freep(&output_streams[i]->filtered_frame);
1067 av_freep(&output_streams[i]);1069 av_freep(&output_streams[i]);
@@ -2327,6 +2329,29 @@ static InputStream *get_input_stream(OutputStream *ost) · 1259 unmodified lines
2327 return NULL;2329 return NULL;
2328}2330}
2329 2331
2332static void parse_forced_key_frames(char *kf, OutputStream *ost,
2333 AVCodecContext *avctx)
2334{
2335 char *p;
2336 int n = 1, i;
2337 int64_t t;
2338
2339 for (p = kf; *p; p++)
2340 if (*p == ',')
2341 n++;
2342 ost->forced_kf_count = n;
2343 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
2344 if (!ost->forced_kf_pts) {
2345 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
2346 exit_program(1);
2347 }
2348 for (i = 0; i < n; i++) {
2349 p = i ? strchr(p, ',') + 1 : kf;
2350 t = parse_time_or_die("force_key_frames", p, 1);
2351 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2352 }
2353}
2354
2330static int transcode_init(void)2355static int transcode_init(void)
2331{2356{
2332 int ret = 0, i, j, k;2357 int ret = 0, i, j, k;
@@ -2528,6 +2553,9 @@ static int transcode_init(void) · 195 unmodified lines
2528 codec->bits_per_raw_sample = 0;2553 codec->bits_per_raw_sample = 0;
2529 }2554 }
2530 2555
2556 if (ost->forced_keyframes)
2557 parse_forced_key_frames(ost->forced_keyframes, ost,
2558 ost->st->codec);
2531 break;2559 break;
2532 case AVMEDIA_TYPE_SUBTITLE:2560 case AVMEDIA_TYPE_SUBTITLE:
2533 codec->time_base = (AVRational){1, 1000};2561 codec->time_base = (AVRational){1, 1000};
@@ -3645,29 +3673,6 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena · 1111 unmodified lines
3645 return 0;3673 return 0;
3646}3674}
3647 3675
3648static void parse_forced_key_frames(char *kf, OutputStream *ost,
3649 AVCodecContext *avctx)
3650{
3651 char *p;
3652 int n = 1, i;
3653 int64_t t;
3654
3655 for (p = kf; *p; p++)
3656 if (*p == ',')
3657 n++;
3658 ost->forced_kf_count = n;
3659 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3660 if (!ost->forced_kf_pts) {
3661 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3662 exit_program(1);
3663 }
3664 for (i = 0; i < n; i++) {
3665 p = i ? strchr(p, ',') + 1 : kf;
3666 t = parse_time_or_die("force_key_frames", p, 1);
3667 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3668 }
3669}
3670
3671static uint8_t *get_line(AVIOContext *s)3676static uint8_t *get_line(AVIOContext *s)
3672{3677{
3673 AVIOContext *line;3678 AVIOContext *line;
@@ -3865,7 +3870,7 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc) · 191 unmodified lines
3865 3870
3866 if (!ost->stream_copy) {3871 if (!ost->stream_copy) {
3867 const char *p = NULL;3872 const char *p = NULL;
3868 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;3873 char *frame_rate = NULL, *frame_size = NULL;
3869 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;3874 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3870 char *intra_matrix = NULL, *inter_matrix = NULL;3875 char *intra_matrix = NULL, *inter_matrix = NULL;
3871 const char *filters = "null";3876 const char *filters = "null";
@@ -3949,9 +3954,9 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc) · 77 unmodified lines
3949 }3954 }
3950 }3955 }
3951 3956
3952 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);3957 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
3953 if (forced_key_frames)3958 if (ost->forced_keyframes)
3954 parse_forced_key_frames(forced_key_frames, ost, video_enc);3959 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
3955 3960
3956 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);3961 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
3957 3962

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t