|
@@ -447,18 +447,20 @@ static int init_convert_timestamp(AVFormatContext *ctx, int64_t ts)
|
|
|
return 0;
|
|
|
}
|
|
|
#if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
|
|
|
- now = av_gettime_monotonic();
|
|
|
- if (s->ts_mode == V4L_TS_MONO2ABS ||
|
|
|
- (ts <= now + 1 * AV_TIME_BASE && ts >= now - 10 * AV_TIME_BASE)) {
|
|
|
- AVRational tb = {AV_TIME_BASE, 1};
|
|
|
- int64_t period = av_rescale_q(1, tb, ctx->streams[0]->avg_frame_rate);
|
|
|
- av_log(ctx, AV_LOG_INFO, "Detected monotonic timestamps, converting\n");
|
|
|
- /* microseconds instead of seconds, MHz instead of Hz */
|
|
|
- s->timefilter = ff_timefilter_new(1, period, 1.0E-6);
|
|
|
- if (!s->timefilter)
|
|
|
- return AVERROR(ENOMEM);
|
|
|
- s->ts_mode = V4L_TS_CONVERT_READY;
|
|
|
- return 0;
|
|
|
+ if (ctx->streams[0]->avg_frame_rate.num) {
|
|
|
+ now = av_gettime_monotonic();
|
|
|
+ if (s->ts_mode == V4L_TS_MONO2ABS ||
|
|
|
+ (ts <= now + 1 * AV_TIME_BASE && ts >= now - 10 * AV_TIME_BASE)) {
|
|
|
+ AVRational tb = {AV_TIME_BASE, 1};
|
|
|
+ int64_t period = av_rescale_q(1, tb, ctx->streams[0]->avg_frame_rate);
|
|
|
+ av_log(ctx, AV_LOG_INFO, "Detected monotonic timestamps, converting\n");
|
|
|
+ /* microseconds instead of seconds, MHz instead of Hz */
|
|
|
+ s->timefilter = ff_timefilter_new(1, period, 1.0E-6);
|
|
|
+ if (!s->timefilter)
|
|
|
+ return AVERROR(ENOMEM);
|
|
|
+ s->ts_mode = V4L_TS_CONVERT_READY;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
#endif
|
|
|
av_log(ctx, AV_LOG_ERROR, "Unknown timestamps\n");
|
|
@@ -949,7 +951,8 @@ static int v4l2_read_header(AVFormatContext *s1)
|
|
|
st->codec->codec_tag = MKTAG('Y', 'V', 'U', '9');
|
|
|
st->codec->width = s->width;
|
|
|
st->codec->height = s->height;
|
|
|
- st->codec->bit_rate = s->frame_size * av_q2d(st->avg_frame_rate) * 8;
|
|
|
+ if (st->avg_frame_rate.den)
|
|
|
+ st->codec->bit_rate = s->frame_size * av_q2d(st->avg_frame_rate) * 8;
|
|
|
|
|
|
return 0;
|
|
|
}
|