From 3cfae9e038a501d89af6cd11b6843e31dcf3c161 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Fri, 6 May 2022 18:37:18 +0200 Subject: avformat/internal: Move definition of FFStream->info to demux.h It is only used by avformat_find_stream_info(). Signed-off-by: Andreas Rheinhardt --- libavformat/demux.c | 45 +++++++++++++++++++++++---------------------- libavformat/demux.h | 29 +++++++++++++++++++++++++++++ libavformat/internal.h | 30 +----------------------------- libavformat/utils.c | 1 + 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" -- cgit v1.2.3