diff options
| author | Carl Hetherington <cth@carlh.net> | 2022-01-11 16:34:26 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2022-01-11 22:16:04 +0100 |
| commit | b703142e8750c509174b4d964009aecf93f3d834 (patch) | |
| tree | 22936a3161af7df64acb42f95d0b08d32e9593dd /src/lib/ffmpeg_examiner.cc | |
| parent | 5cb5c48441b20c478eb29001cebe3b08c0422341 (diff) | |
Use a separate AVFrame for each stream when decoding.
This seems to be what ffplay does and it feels like it makes sense
as frames may be built from multiple packets AFAICS.
Diffstat (limited to 'src/lib/ffmpeg_examiner.cc')
| -rw-r--r-- | src/lib/ffmpeg_examiner.cc | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index 0a236d836..5e53f0974 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -229,7 +229,7 @@ FFmpegExaminer::video_packet (AVCodecContext* context, string& temporal_referenc throw DecodeError (N_("avcodec_send_packet"), N_("FFmpegExaminer::video_packet"), r); } - r = avcodec_receive_frame (context, _frame); + r = avcodec_receive_frame (context, _video_frame); if (r == AVERROR(EAGAIN)) { /* More input is required */ return true; @@ -239,16 +239,17 @@ FFmpegExaminer::video_packet (AVCodecContext* context, string& temporal_referenc } if (!_first_video) { - _first_video = frame_time (_format_context->streams[_video_stream.get()]); + _first_video = frame_time (_video_frame, _format_context->streams[_video_stream.get()]); } if (_need_video_length) { _video_length = frame_time ( + _video_frame, _format_context->streams[_video_stream.get()] ).get_value_or (ContentTime ()).frames_round (video_frame_rate().get ()); } if (temporal_reference.size() < (PULLDOWN_CHECK_FRAMES * 2)) { - temporal_reference += (_frame->top_field_first ? "T" : "B"); - temporal_reference += (_frame->repeat_pict ? "3" : "2"); + temporal_reference += (_video_frame->top_field_first ? "T" : "B"); + temporal_reference += (_video_frame->repeat_pict ? "3" : "2"); } return true; @@ -271,22 +272,24 @@ FFmpegExaminer::audio_packet (AVCodecContext* context, shared_ptr<FFmpegAudioStr throw DecodeError (N_("avcodec_send_packet"), N_("FFmpegExaminer::audio_packet"), r); } - if (avcodec_receive_frame (context, _frame) < 0) { + auto frame = audio_frame (stream); + + if (avcodec_receive_frame (context, frame) < 0) { return; } - stream->first_audio = frame_time (stream->stream(_format_context)); + stream->first_audio = frame_time (frame, stream->stream(_format_context)); } optional<ContentTime> -FFmpegExaminer::frame_time (AVStream* s) const +FFmpegExaminer::frame_time (AVFrame* frame, AVStream* stream) const { optional<ContentTime> t; - int64_t const bet = _frame->best_effort_timestamp; + int64_t const bet = frame->best_effort_timestamp; if (bet != AV_NOPTS_VALUE) { - t = ContentTime::from_seconds (bet * av_q2d (s->time_base)); + t = ContentTime::from_seconds (bet * av_q2d(stream->time_base)); } return t; |
