You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
avformat/internal: Move definition of FFStream->info to demux.h
It is only used by avformat_find_stream_info(). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
@@ -2173,59 +2173,60 @@ static int tb_unreliable(AVCodecContext *c)
|
|||||||
int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
|
int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
|
||||||
{
|
{
|
||||||
FFStream *const sti = ffstream(st);
|
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
|
if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
|
||||||
&& ts - (uint64_t)last < INT64_MAX) {
|
&& ts - (uint64_t)last < INT64_MAX) {
|
||||||
double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
|
double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
|
||||||
int64_t duration = ts - last;
|
int64_t duration = ts - last;
|
||||||
|
|
||||||
if (!sti->info->duration_error)
|
if (!info->duration_error)
|
||||||
sti->info->duration_error = av_mallocz(sizeof(sti->info->duration_error[0])*2);
|
info->duration_error = av_mallocz(sizeof(info->duration_error[0])*2);
|
||||||
if (!sti->info->duration_error)
|
if (!info->duration_error)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
// if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
|
// if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
|
||||||
// av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
|
// av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
|
||||||
for (int i = 0; i < MAX_STD_TIMEBASES; i++) {
|
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);
|
int framerate = get_std_framerate(i);
|
||||||
double sdts = dts*framerate/(1001*12);
|
double sdts = dts*framerate/(1001*12);
|
||||||
for (int j = 0; j < 2; j++) {
|
for (int j = 0; j < 2; j++) {
|
||||||
int64_t ticks = llrint(sdts+j*0.5);
|
int64_t ticks = llrint(sdts+j*0.5);
|
||||||
double error = sdts - ticks + j*0.5;
|
double error = sdts - ticks + j*0.5;
|
||||||
sti->info->duration_error[j][0][i] += error;
|
info->duration_error[j][0][i] += error;
|
||||||
sti->info->duration_error[j][1][i] += error*error;
|
info->duration_error[j][1][i] += error*error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sti->info->rfps_duration_sum <= INT64_MAX - duration) {
|
if (info->rfps_duration_sum <= INT64_MAX - duration) {
|
||||||
sti->info->duration_count++;
|
info->duration_count++;
|
||||||
sti->info->rfps_duration_sum += duration;
|
info->rfps_duration_sum += duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sti->info->duration_count % 10 == 0) {
|
if (info->duration_count % 10 == 0) {
|
||||||
int n = sti->info->duration_count;
|
int n = info->duration_count;
|
||||||
for (int i = 0; i < MAX_STD_TIMEBASES; i++) {
|
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) {
|
||||||
double a0 = sti->info->duration_error[0][0][i] / n;
|
double a0 = info->duration_error[0][0][i] / n;
|
||||||
double error0 = sti->info->duration_error[0][1][i] / n - a0*a0;
|
double error0 = info->duration_error[0][1][i] / n - a0*a0;
|
||||||
double a1 = sti->info->duration_error[1][0][i] / n;
|
double a1 = info->duration_error[1][0][i] / n;
|
||||||
double error1 = sti->info->duration_error[1][1][i] / n - a1*a1;
|
double error1 = info->duration_error[1][1][i] / n - a1*a1;
|
||||||
if (error0 > 0.04 && error1 > 0.04) {
|
if (error0 > 0.04 && error1 > 0.04) {
|
||||||
sti->info->duration_error[0][1][i] = 2e10;
|
info->duration_error[0][1][i] = 2e10;
|
||||||
sti->info->duration_error[1][1][i] = 2e10;
|
info->duration_error[1][1][i] = 2e10;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ignore the first 4 values, they might have some random jitter
|
// ignore the first 4 values, they might have some random jitter
|
||||||
if (sti->info->duration_count > 3 && is_relative(ts) == is_relative(last))
|
if (info->duration_count > 3 && is_relative(ts) == is_relative(last))
|
||||||
sti->info->duration_gcd = av_gcd(sti->info->duration_gcd, duration);
|
info->duration_gcd = av_gcd(info->duration_gcd, duration);
|
||||||
}
|
}
|
||||||
if (ts != AV_NOPTS_VALUE)
|
if (ts != AV_NOPTS_VALUE)
|
||||||
sti->info->last_dts = ts;
|
info->last_dts = ts;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -26,6 +26,35 @@
|
|||||||
#include "libavcodec/packet.h"
|
#include "libavcodec/packet.h"
|
||||||
#include "avformat.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))
|
#define RELATIVE_TS_BASE (INT64_MAX - (1LL << 48))
|
||||||
|
|
||||||
static av_always_inline int is_relative(int64_t ts)
|
static av_always_inline int is_relative(int64_t ts)
|
||||||
|
@@ -245,38 +245,10 @@ typedef struct FFStream {
|
|||||||
|
|
||||||
FFFrac *priv_pts;
|
FFFrac *priv_pts;
|
||||||
|
|
||||||
#define MAX_STD_TIMEBASES (30*12+30+3+6)
|
|
||||||
/**
|
/**
|
||||||
* Stream information used internally by avformat_find_stream_info()
|
* Stream information used internally by avformat_find_stream_info()
|
||||||
*/
|
*/
|
||||||
struct {
|
struct FFStreamInfo *info;
|
||||||
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;
|
|
||||||
|
|
||||||
AVIndexEntry *index_entries; /**< Only used if the format does not
|
AVIndexEntry *index_entries; /**< Only used if the format does not
|
||||||
support seeking natively. */
|
support seeking natively. */
|
||||||
|
@@ -40,6 +40,7 @@
|
|||||||
|
|
||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
#include "avio_internal.h"
|
#include "avio_internal.h"
|
||||||
|
#include "demux.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#if CONFIG_NETWORK
|
#if CONFIG_NETWORK
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
|
Reference in New Issue
Block a user