mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
avformat: Remove use of AVFrac and AVStream->pts
Move field to internal part of AVStream and struct to internal.h Reviewed-by: Andreas Cadhalpun <andreas.cadhalpun@googlemail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
6638e4a950
commit
b4d68e7cdb
@ -1170,6 +1170,8 @@ typedef struct AVStream {
|
|||||||
* - decoding: Set by libavformat to calculate sample_aspect_ratio internally
|
* - decoding: Set by libavformat to calculate sample_aspect_ratio internally
|
||||||
*/
|
*/
|
||||||
AVRational display_aspect_ratio;
|
AVRational display_aspect_ratio;
|
||||||
|
|
||||||
|
struct FFFrac *priv_pts;
|
||||||
} AVStream;
|
} AVStream;
|
||||||
|
|
||||||
AVRational av_stream_get_r_frame_rate(const AVStream *s);
|
AVRational av_stream_get_r_frame_rate(const AVStream *s);
|
||||||
|
@ -49,6 +49,18 @@ typedef struct CodecMime{
|
|||||||
enum AVCodecID id;
|
enum AVCodecID id;
|
||||||
} CodecMime;
|
} CodecMime;
|
||||||
|
|
||||||
|
/*************************************************/
|
||||||
|
/* fractional numbers for exact pts handling */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The exact value of the fractional number is: 'val + num / den'.
|
||||||
|
* num is assumed to be 0 <= num < den.
|
||||||
|
*/
|
||||||
|
typedef struct FFFrac {
|
||||||
|
int64_t val, num, den;
|
||||||
|
} FFFrac;
|
||||||
|
|
||||||
|
|
||||||
struct AVFormatInternal {
|
struct AVFormatInternal {
|
||||||
/**
|
/**
|
||||||
* Number of streams relevant for interleaving.
|
* Number of streams relevant for interleaving.
|
||||||
|
@ -61,7 +61,7 @@
|
|||||||
* @param num must be >= 0
|
* @param num must be >= 0
|
||||||
* @param den must be >= 1
|
* @param den must be >= 1
|
||||||
*/
|
*/
|
||||||
static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
|
static void frac_init(FFFrac *f, int64_t val, int64_t num, int64_t den)
|
||||||
{
|
{
|
||||||
num += (den >> 1);
|
num += (den >> 1);
|
||||||
if (num >= den) {
|
if (num >= den) {
|
||||||
@ -79,7 +79,7 @@ static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
|
|||||||
* @param f fractional number
|
* @param f fractional number
|
||||||
* @param incr increment, can be positive or negative
|
* @param incr increment, can be positive or negative
|
||||||
*/
|
*/
|
||||||
static void frac_add(AVFrac *f, int64_t incr)
|
static void frac_add(FFFrac *f, int64_t incr)
|
||||||
{
|
{
|
||||||
int64_t num, den;
|
int64_t num, den;
|
||||||
|
|
||||||
@ -414,11 +414,17 @@ static int init_pts(AVFormatContext *s)
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!st->priv_pts)
|
||||||
|
st->priv_pts = av_mallocz(sizeof(*st->priv_pts));
|
||||||
|
if (!st->priv_pts)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
if (den != AV_NOPTS_VALUE) {
|
if (den != AV_NOPTS_VALUE) {
|
||||||
if (den <= 0)
|
if (den <= 0)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
frac_init(&st->pts, 0, 0, den);
|
frac_init(st->priv_pts, 0, 0, den);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -502,7 +508,7 @@ static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
|
|||||||
}
|
}
|
||||||
pkt->dts =
|
pkt->dts =
|
||||||
// pkt->pts= st->cur_dts;
|
// pkt->pts= st->cur_dts;
|
||||||
pkt->pts = st->pts.val;
|
pkt->pts = st->priv_pts->val;
|
||||||
}
|
}
|
||||||
|
|
||||||
//calculate dts from pts
|
//calculate dts from pts
|
||||||
@ -538,7 +544,7 @@ static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
|
|||||||
av_ts2str(pkt->pts), av_ts2str(pkt->dts));
|
av_ts2str(pkt->pts), av_ts2str(pkt->dts));
|
||||||
|
|
||||||
st->cur_dts = pkt->dts;
|
st->cur_dts = pkt->dts;
|
||||||
st->pts.val = pkt->dts;
|
st->priv_pts->val = pkt->dts;
|
||||||
|
|
||||||
/* update pts */
|
/* update pts */
|
||||||
switch (st->codec->codec_type) {
|
switch (st->codec->codec_type) {
|
||||||
@ -550,12 +556,12 @@ static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
|
|||||||
/* HACK/FIXME, we skip the initial 0 size packets as they are most
|
/* HACK/FIXME, we skip the initial 0 size packets as they are most
|
||||||
* likely equal to the encoder delay, but it would be better if we
|
* likely equal to the encoder delay, but it would be better if we
|
||||||
* had the real timestamps from the encoder */
|
* had the real timestamps from the encoder */
|
||||||
if (frame_size >= 0 && (pkt->size || st->pts.num != st->pts.den >> 1 || st->pts.val)) {
|
if (frame_size >= 0 && (pkt->size || st->priv_pts->num != st->priv_pts->den >> 1 || st->priv_pts->val)) {
|
||||||
frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
|
frac_add(st->priv_pts, (int64_t)st->time_base.den * frame_size);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AVMEDIA_TYPE_VIDEO:
|
case AVMEDIA_TYPE_VIDEO:
|
||||||
frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
|
frac_add(st->priv_pts, (int64_t)st->time_base.den * st->codec->time_base.num);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -116,7 +116,10 @@ MAKE_ACCESSORS(AVFormatContext, format, AVOpenCallback, open_cb)
|
|||||||
|
|
||||||
int64_t av_stream_get_end_pts(const AVStream *st)
|
int64_t av_stream_get_end_pts(const AVStream *st)
|
||||||
{
|
{
|
||||||
return st->pts.val;
|
if (st->priv_pts) {
|
||||||
|
return st->priv_pts->val;
|
||||||
|
} else
|
||||||
|
return AV_NOPTS_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
|
struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
|
||||||
@ -3668,6 +3671,7 @@ void ff_free_stream(AVFormatContext *s, AVStream *st) {
|
|||||||
av_freep(&st->info->duration_error);
|
av_freep(&st->info->duration_error);
|
||||||
av_freep(&st->info);
|
av_freep(&st->info);
|
||||||
av_freep(&st->recommended_encoder_configuration);
|
av_freep(&st->recommended_encoder_configuration);
|
||||||
|
av_freep(&st->priv_pts);
|
||||||
av_freep(&s->streams[ --s->nb_streams ]);
|
av_freep(&s->streams[ --s->nb_streams ]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user