You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
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.
This commit is contained in:
@@ -434,9 +434,15 @@ InputStream *ist_iter(InputStream *prev)
|
|||||||
FrameData *frame_data(AVFrame *frame)
|
FrameData *frame_data(AVFrame *frame)
|
||||||
{
|
{
|
||||||
if (!frame->opaque_ref) {
|
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)
|
if (!frame->opaque_ref)
|
||||||
return NULL;
|
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;
|
return (FrameData*)frame->opaque_ref->data;
|
||||||
|
@@ -626,9 +626,13 @@ typedef struct OutputFile {
|
|||||||
|
|
||||||
// optionally attached as opaque_ref to decoded AVFrames
|
// optionally attached as opaque_ref to decoded AVFrames
|
||||||
typedef struct FrameData {
|
typedef struct FrameData {
|
||||||
uint64_t idx;
|
// properties that come from the decoder
|
||||||
int64_t pts;
|
struct {
|
||||||
AVRational tb;
|
uint64_t frame_num;
|
||||||
|
|
||||||
|
int64_t pts;
|
||||||
|
AVRational tb;
|
||||||
|
} dec;
|
||||||
|
|
||||||
AVRational frame_rate_filter;
|
AVRational frame_rate_filter;
|
||||||
|
|
||||||
|
@@ -612,9 +612,9 @@ static int packet_decode(InputStream *ist, const AVPacket *pkt, AVFrame *frame)
|
|||||||
av_frame_unref(frame);
|
av_frame_unref(frame);
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
}
|
}
|
||||||
fd->pts = frame->pts;
|
fd->dec.pts = frame->pts;
|
||||||
fd->tb = dec->pkt_timebase;
|
fd->dec.tb = dec->pkt_timebase;
|
||||||
fd->idx = dec->frame_num - 1;
|
fd->dec.frame_num = dec->frame_num - 1;
|
||||||
fd->bits_per_raw_sample = dec->bits_per_raw_sample;
|
fd->bits_per_raw_sample = dec->bits_per_raw_sample;
|
||||||
|
|
||||||
frame->time_base = dec->pkt_timebase;
|
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)) {
|
if ((frame && frame->opaque_ref) || (pkt && pkt->opaque_ref)) {
|
||||||
fd = (const FrameData*)(frame ? frame->opaque_ref->data : pkt->opaque_ref->data);
|
fd = (const FrameData*)(frame ? frame->opaque_ref->data : pkt->opaque_ref->data);
|
||||||
tbi = fd->tb;
|
tbi = fd->dec.tb;
|
||||||
ptsi = fd->pts;
|
ptsi = fd->dec.pts;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < es->nb_components; i++) {
|
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 ?
|
case ENC_STATS_PTS_TIME_IN: avio_printf(io, "%g", ptsi == INT64_MAX ?
|
||||||
INFINITY : ptsi * av_q2d(tbi)); continue;
|
INFINITY : ptsi * av_q2d(tbi)); continue;
|
||||||
case ENC_STATS_FRAME_NUM: avio_printf(io, "%"PRIu64, frame_num); 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) {
|
if (frame) {
|
||||||
|
Reference in New Issue
Block a user