summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/demux.c45
-rw-r--r--libavformat/demux.h29
-rw-r--r--libavformat/internal.h30
-rw-r--r--libavformat/utils.c1
4 files changed, 54 insertions, 51 deletions
diff --git a/libavformat/demux.c b/libavformat/demux.c
index 5d83d81665..1620716716 100644
--- a/libavformat/demux.c
+++ b/libavformat/demux.c
@@ -2173,59 +2173,60 @@ static int tb_unreliable(AVCodecContext *c)
int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
{
FFStream *const sti = ffstream(st);
- int64_t last = sti->info->last_dts;
+ FFStreamInfo *info = sti->info;
+ int64_t last = info->last_dts;
if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
&& ts - (uint64_t)last < INT64_MAX) {
double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
int64_t duration = ts - last;
- if (!sti->info->duration_error)
- sti->info->duration_error = av_mallocz(sizeof(sti->info->duration_error[0])*2);
- if (!sti->info->duration_error)
+ if (!info->duration_error)
+ info->duration_error = av_mallocz(sizeof(info->duration_error[0])*2);
+ if (!info->duration_error)
return AVERROR(ENOMEM);
// if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
// av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
for (int i = 0; i < MAX_STD_TIMEBASES; i++) {
- if (sti->info->duration_error[0][1][i] < 1e10) {
+ if (info->duration_error[0][1][i] < 1e10) {
int framerate = get_std_framerate(i);
double sdts = dts*framerate/(1001*12);
for (int j = 0; j < 2; j++) {
int64_t ticks = llrint(sdts+j*0.5);
double error = sdts - ticks + j*0.5;
- sti->info->duration_error[j][0][i] += error;
- sti->info->duration_error[j][1][i] += error*error;
+ info->duration_error[j][0][i] += error;
+ info->duration_error[j][1][i] += error*error;
}
}
}
- if (sti->info->rfps_duration_sum <= INT64_MAX - duration) {
- sti->info->duration_count++;
- sti->info->rfps_duration_sum += duration;
+ if (info->rfps_duration_sum <= INT64_MAX - duration) {
+ info->duration_count++;
+ info->rfps_duration_sum += duration;
}
- if (sti->info->duration_count % 10 == 0) {
- int n = sti->info->duration_count;
+ if (info->duration_count % 10 == 0) {
+ int n = info->duration_count;
for (int i = 0; i < MAX_STD_TIMEBASES; i++) {
- if (sti->info->duration_error[0][1][i] < 1e10) {
- double a0 = sti->info->duration_error[0][0][i] / n;
- double error0 = sti->info->duration_error[0][1][i] / n - a0*a0;
- double a1 = sti->info->duration_error[1][0][i] / n;
- double error1 = sti->info->duration_error[1][1][i] / n - a1*a1;
+ if (info->duration_error[0][1][i] < 1e10) {
+ double a0 = info->duration_error[0][0][i] / n;
+ double error0 = info->duration_error[0][1][i] / n - a0*a0;
+ double a1 = info->duration_error[1][0][i] / n;
+ double error1 = info->duration_error[1][1][i] / n - a1*a1;
if (error0 > 0.04 && error1 > 0.04) {
- sti->info->duration_error[0][1][i] = 2e10;
- sti->info->duration_error[1][1][i] = 2e10;
+ info->duration_error[0][1][i] = 2e10;
+ info->duration_error[1][1][i] = 2e10;
}
}
}
}
// ignore the first 4 values, they might have some random jitter
- if (sti->info->duration_count > 3 && is_relative(ts) == is_relative(last))
- sti->info->duration_gcd = av_gcd(sti->info->duration_gcd, duration);
+ if (info->duration_count > 3 && is_relative(ts) == is_relative(last))
+ info->duration_gcd = av_gcd(info->duration_gcd, duration);
}
if (ts != AV_NOPTS_VALUE)
- sti->info->last_dts = ts;
+ info->last_dts = ts;
return 0;
}
diff --git a/libavformat/demux.h b/libavformat/demux.h
index f003d81f52..c667f304a5 100644
--- a/libavformat/demux.h
+++ b/libavformat/demux.h
@@ -26,6 +26,35 @@
#include "libavcodec/packet.h"
#include "avformat.h"
+#define MAX_STD_TIMEBASES (30*12+30+3+6)
+typedef struct FFStreamInfo {
+ int64_t last_dts;
+ int64_t duration_gcd;
+ int duration_count;
+ int64_t rfps_duration_sum;
+ double (*duration_error)[2][MAX_STD_TIMEBASES];
+ int64_t codec_info_duration;
+ int64_t codec_info_duration_fields;
+ int frame_delay_evidence;
+
+ /**
+ * 0 -> decoder has not been searched for yet.
+ * >0 -> decoder found
+ * <0 -> decoder with codec_id == -found_decoder has not been found
+ */
+ int found_decoder;
+
+ int64_t last_duration;
+
+ /**
+ * Those are used for average framerate estimation.
+ */
+ int64_t fps_first_dts;
+ int fps_first_dts_idx;
+ int64_t fps_last_dts;
+ int fps_last_dts_idx;
+} FFStreamInfo;
+
#define RELATIVE_TS_BASE (INT64_MAX - (1LL << 48))
static av_always_inline int is_relative(int64_t ts)
diff --git a/libavformat/internal.h b/libavformat/internal.h
index c123c8d1ae..b72c051afe 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -245,38 +245,10 @@ typedef struct FFStream {
FFFrac *priv_pts;
-#define MAX_STD_TIMEBASES (30*12+30+3+6)
/**
* Stream information used internally by avformat_find_stream_info()
*/
- struct {
- int64_t last_dts;
- int64_t duration_gcd;
- int duration_count;
- int64_t rfps_duration_sum;
- double (*duration_error)[2][MAX_STD_TIMEBASES];
- int64_t codec_info_duration;
- int64_t codec_info_duration_fields;
- int frame_delay_evidence;
-
- /**
- * 0 -> decoder has not been searched for yet.
- * >0 -> decoder found
- * <0 -> decoder with codec_id == -found_decoder has not been found
- */
- int found_decoder;
-
- int64_t last_duration;
-
- /**
- * Those are used for average framerate estimation.
- */
- int64_t fps_first_dts;
- int fps_first_dts_idx;
- int64_t fps_last_dts;
- int fps_last_dts_idx;
-
- } *info;
+ struct FFStreamInfo *info;
AVIndexEntry *index_entries; /**< Only used if the format does not
support seeking natively. */
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 5bda45d124..175f9caf8a 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -40,6 +40,7 @@
#include "avformat.h"
#include "avio_internal.h"
+#include "demux.h"
#include "internal.h"
#if CONFIG_NETWORK
#include "network.h"