diff options
| author | Carl Hetherington <cth@carlh.net> | 2024-10-19 20:20:00 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-10-19 20:20:00 +0200 |
| commit | 904538721cf2b69bb8d80059d13ae20e4f256fce (patch) | |
| tree | c2db7d001d8c1046a3f8c8b1715856bb09eafffb | |
| parent | 2c26dd2573977a940d003a58f2ccd408a5657aab (diff) | |
Tidy up and fix obtaining video length when it's not in the header.
I think this has been broken for a while as we would come out of the
loop even if we still wanted to find the video length.
| -rw-r--r-- | src/lib/ffmpeg_examiner.cc | 26 | ||||
| -rw-r--r-- | src/lib/ffmpeg_examiner.h | 2 |
2 files changed, 15 insertions, 13 deletions
diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index 51ade8e89..6d3b61473 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -144,24 +144,25 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Jo auto context = _codec_context[packet->stream_index]; + auto carry_on = false; + if (_video_stream && packet->stream_index == _video_stream.get()) { - video_packet (context, temporal_reference, packet); + if (video_packet(context, temporal_reference, packet)) { + carry_on = true; + } } - bool got_all_audio = true; - for (size_t i = 0; i < _audio_streams.size(); ++i) { if (_audio_streams[i]->uses_index(_format_context, packet->stream_index)) { - audio_packet (context, _audio_streams[i], packet); - } - if (!_audio_streams[i]->first_audio) { - got_all_audio = false; + if (audio_packet(context, _audio_streams[i], packet)) { + carry_on = true; + } } } av_packet_free (&packet); - if (_first_video && got_all_audio && temporal_reference.size() >= (PULLDOWN_CHECK_FRAMES * 2)) { + if (!carry_on) { /* All done */ break; } @@ -261,26 +262,27 @@ FFmpegExaminer::video_packet (AVCodecContext* context, string& temporal_referenc } -void +bool FFmpegExaminer::audio_packet (AVCodecContext* context, shared_ptr<FFmpegAudioStream> stream, AVPacket* packet) { if (stream->first_audio) { - return; + return false; } int r = avcodec_send_packet (context, packet); if (r < 0) { LOG_WARNING("avcodec_send_packet returned %1 for an audio packet", r); - return; + return false; } auto frame = audio_frame (stream); if (avcodec_receive_frame (context, frame) < 0) { - return; + return false; } stream->first_audio = frame_time (frame, stream->stream(_format_context)); + return true; } diff --git a/src/lib/ffmpeg_examiner.h b/src/lib/ffmpeg_examiner.h index 45313ec18..b2dcbb27d 100644 --- a/src/lib/ffmpeg_examiner.h +++ b/src/lib/ffmpeg_examiner.h @@ -89,7 +89,7 @@ public: private: bool video_packet (AVCodecContext* context, std::string& temporal_reference, AVPacket* packet); - void audio_packet (AVCodecContext* context, std::shared_ptr<FFmpegAudioStream>, AVPacket* packet); + bool audio_packet (AVCodecContext* context, std::shared_ptr<FFmpegAudioStream>, AVPacket* packet); std::string stream_name (AVStream* s) const; std::string subtitle_stream_name (AVStream* s) const; |
