summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2024-10-19 20:20:00 +0200
committerCarl Hetherington <cth@carlh.net>2024-10-19 20:20:00 +0200
commit904538721cf2b69bb8d80059d13ae20e4f256fce (patch)
treec2db7d001d8c1046a3f8c8b1715856bb09eafffb
parent2c26dd2573977a940d003a58f2ccd408a5657aab (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.cc26
-rw-r--r--src/lib/ffmpeg_examiner.h2
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;