fftools/ffmpeg: add more structure to FrameData

It now contains data from multiple sources, so group those items that
always come from the decoder. Also, initialize them to invalid values,
so that frames that did not originate from a decoder can be
distinguished.
pull/389/head
Anton Khirnov 2 years ago
parent 75d0af388f
commit 4d06742b93
  1. 8
      fftools/ffmpeg.c
  2. 10
      fftools/ffmpeg.h
  3. 6
      fftools/ffmpeg_dec.c
  4. 6
      fftools/ffmpeg_enc.c

@ -434,9 +434,15 @@ InputStream *ist_iter(InputStream *prev)
FrameData *frame_data(AVFrame *frame)
{
if (!frame->opaque_ref) {
frame->opaque_ref = av_buffer_allocz(sizeof(FrameData));
FrameData *fd;
frame->opaque_ref = av_buffer_allocz(sizeof(*fd));
if (!frame->opaque_ref)
return NULL;
fd = (FrameData*)frame->opaque_ref->data;
fd->dec.frame_num = UINT64_MAX;
fd->dec.pts = AV_NOPTS_VALUE;
}
return (FrameData*)frame->opaque_ref->data;

@ -626,9 +626,13 @@ typedef struct OutputFile {
// optionally attached as opaque_ref to decoded AVFrames
typedef struct FrameData {
uint64_t idx;
int64_t pts;
AVRational tb;
// properties that come from the decoder
struct {
uint64_t frame_num;
int64_t pts;
AVRational tb;
} dec;
AVRational frame_rate_filter;

@ -612,9 +612,9 @@ static int packet_decode(InputStream *ist, const AVPacket *pkt, AVFrame *frame)
av_frame_unref(frame);
return AVERROR(ENOMEM);
}
fd->pts = frame->pts;
fd->tb = dec->pkt_timebase;
fd->idx = dec->frame_num - 1;
fd->dec.pts = frame->pts;
fd->dec.tb = dec->pkt_timebase;
fd->dec.frame_num = dec->frame_num - 1;
fd->bits_per_raw_sample = dec->bits_per_raw_sample;
frame->time_base = dec->pkt_timebase;

@ -569,8 +569,8 @@ void enc_stats_write(OutputStream *ost, EncStats *es,
if ((frame && frame->opaque_ref) || (pkt && pkt->opaque_ref)) {
fd = (const FrameData*)(frame ? frame->opaque_ref->data : pkt->opaque_ref->data);
tbi = fd->tb;
ptsi = fd->pts;
tbi = fd->dec.tb;
ptsi = fd->dec.pts;
}
for (size_t i = 0; i < es->nb_components; i++) {
@ -588,7 +588,7 @@ void enc_stats_write(OutputStream *ost, EncStats *es,
case ENC_STATS_PTS_TIME_IN: avio_printf(io, "%g", ptsi == INT64_MAX ?
INFINITY : ptsi * av_q2d(tbi)); continue;
case ENC_STATS_FRAME_NUM: avio_printf(io, "%"PRIu64, frame_num); continue;
case ENC_STATS_FRAME_NUM_IN: avio_printf(io, "%"PRIu64, fd ? fd->idx : -1); continue;
case ENC_STATS_FRAME_NUM_IN: avio_printf(io, "%"PRIu64, fd ? fd->dec.frame_num : -1); continue;
}
if (frame) {

Loading…
Cancel
Save