diff options
author | Anton Khirnov <anton@khirnov.net> | 2023-11-24 19:08:15 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2023-12-14 08:11:05 +0100 |
commit | 9d7000b1bea097d715166e93475c71a0fb237f05 (patch) | |
tree | 8c5fc7d07e595ed4e8813e7cc67d7c23b1e081f6 /fftools/ffmpeg_dec.c | |
parent | c9f38210fc498ada2605a1faac8aceb3d76e69c6 (diff) | |
download | ffmpeg-9d7000b1bea097d715166e93475c71a0fb237f05.tar.gz |
fftools/ffmpeg: attach wallclock timing information to packets and frames
Will become useful in following commits.
Diffstat (limited to 'fftools/ffmpeg_dec.c')
-rw-r--r-- | fftools/ffmpeg_dec.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/fftools/ffmpeg_dec.c b/fftools/ffmpeg_dec.c index 5dde82a276..ce5aa33f73 100644 --- a/fftools/ffmpeg_dec.c +++ b/fftools/ffmpeg_dec.c @@ -22,6 +22,7 @@ #include "libavutil/log.h" #include "libavutil/pixdesc.h" #include "libavutil/pixfmt.h" +#include "libavutil/time.h" #include "libavutil/timestamp.h" #include "libavcodec/avcodec.h" @@ -475,6 +476,13 @@ static int packet_decode(InputStream *ist, AVPacket *pkt, AVFrame *frame) pkt->dts = AV_NOPTS_VALUE; } + if (pkt) { + FrameData *fd = packet_data(pkt); + if (!fd) + return AVERROR(ENOMEM); + fd->wallclock[LATENCY_PROBE_DEC_PRE] = av_gettime_relative(); + } + ret = avcodec_send_packet(dec, pkt); if (ret < 0 && !(ret == AVERROR_EOF && !pkt)) { // In particular, we don't expect AVERROR(EAGAIN), because we read all @@ -528,8 +536,6 @@ static int packet_decode(InputStream *ist, AVPacket *pkt, AVFrame *frame) return AVERROR_INVALIDDATA; } - - av_assert0(!frame->opaque_ref); fd = frame_data(frame); if (!fd) { av_frame_unref(frame); @@ -540,6 +546,8 @@ static int packet_decode(InputStream *ist, AVPacket *pkt, AVFrame *frame) fd->dec.frame_num = dec->frame_num - 1; fd->bits_per_raw_sample = dec->bits_per_raw_sample; + fd->wallclock[LATENCY_PROBE_DEC_POST] = av_gettime_relative(); + frame->time_base = dec->pkt_timebase; if (dec->codec_type == AVMEDIA_TYPE_AUDIO) { @@ -932,6 +940,8 @@ int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx) if (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC) av_dict_set(&ist->decoder_opts, "threads", "1", 0); + av_dict_set(&ist->decoder_opts, "flags", "+copy_opaque", AV_DICT_MULTIKEY); + ret = hw_device_setup_for_decode(ist); if (ret < 0) { av_log(ist, AV_LOG_ERROR, |