LibMedia: Stop using av_find_best_stream() to select preferred tracks

Apparently this function uses a bitrate heuristic to determine which
track is best. We don't want or need that, so just select the first
track with default disposition (e.g. FlagDefault=1 in Matroska).
This commit is contained in:
Zaggy1024 2026-03-27 16:27:18 -05:00 committed by Gregory Bertilson
parent a3309fe5f6
commit b5eddc4ff0
4 changed files with 17 additions and 17 deletions

View file

@ -156,14 +156,14 @@ DecoderErrorOr<NonnullRefPtr<FFmpegDemuxer>> FFmpegDemuxer::from_stream(NonnullR
}
demuxer->m_preferred_track_for_type.fill(-1);
for (size_t type_index = 0; type_index < demuxer->m_preferred_track_for_type.size(); type_index++) {
auto type = static_cast<TrackType>(type_index);
auto media_type = ffmpeg_media_type_from_track_type(type);
auto best_stream_index = av_find_best_stream(format_context, media_type, -1, -1, nullptr, 0);
if (best_stream_index >= 0) {
VERIFY(static_cast<size_t>(best_stream_index) < demuxer->m_stream_info.size());
demuxer->m_preferred_track_for_type[type_index] = best_stream_index;
}
for (u32 i = 0; i < format_context->nb_streams; i++) {
auto& stream = *format_context->streams[i];
auto type = track_type_from_ffmpeg_media_type(stream.codecpar->codec_type);
auto type_index = to_underlying(type);
if (demuxer->m_preferred_track_for_type[type_index] >= 0)
continue;
if (stream.disposition & AV_DISPOSITION_DEFAULT)
demuxer->m_preferred_track_for_type[type_index] = static_cast<int>(i);
}
avformat_close_input(&format_context);

View file

@ -114,10 +114,10 @@ TEST_CASE(audio_provider_underspecified_5_1_channel_map)
auto stream = load_test_file("WAV/tone_44100_5_1_underspecified.wav"sv);
auto demuxer = create_demuxer(stream);
auto track = TRY_OR_FAIL(demuxer->get_preferred_track_for_type(Media::TrackType::Audio));
VERIFY(track.has_value());
auto tracks = TRY_OR_FAIL(demuxer->get_tracks_for_type(Media::TrackType::Audio));
VERIFY(!tracks.is_empty());
auto provider = TRY_OR_FAIL(Media::AudioDataProvider::try_create(Core::EventLoop::current_weak(), demuxer, track.release_value()));
auto provider = TRY_OR_FAIL(Media::AudioDataProvider::try_create(Core::EventLoop::current_weak(), demuxer, tracks[0]));
provider->start();

View file

@ -76,9 +76,9 @@ static void decode_and_expect()
auto stream = Media::IncrementallyPopulatedStream::create_from_buffer(wav_data);
auto demuxer = MUST(Media::FFmpeg::FFmpegDemuxer::from_stream(stream));
auto track = TRY_OR_FAIL(demuxer->get_preferred_track_for_type(Media::TrackType::Audio));
VERIFY(track.has_value());
auto provider = TRY_OR_FAIL(Media::AudioDataProvider::try_create(Core::EventLoop::current_weak(), demuxer, track.release_value()));
auto tracks = TRY_OR_FAIL(demuxer->get_tracks_for_type(Media::TrackType::Audio));
VERIFY(!tracks.is_empty());
auto provider = TRY_OR_FAIL(Media::AudioDataProvider::try_create(Core::EventLoop::current_weak(), demuxer, tracks[0]));
bool reached_end_of_stream = false;
provider->set_error_handler([&](Media::DecoderError&& error) {

View file

@ -80,9 +80,9 @@ static inline void decode_audio(StringView path, u32 sample_rate, u8 channel_cou
return matroska_result.release_value();
return Media::FFmpeg::FFmpegDemuxer::from_stream(stream);
}());
auto track = TRY_OR_FAIL(demuxer->get_preferred_track_for_type(Media::TrackType::Audio));
VERIFY(track.has_value());
auto provider = TRY_OR_FAIL(Media::AudioDataProvider::try_create(Core::EventLoop::current_weak(), demuxer, track.release_value()));
auto tracks = TRY_OR_FAIL(demuxer->get_tracks_for_type(Media::TrackType::Audio));
VERIFY(!tracks.is_empty());
auto provider = TRY_OR_FAIL(Media::AudioDataProvider::try_create(Core::EventLoop::current_weak(), demuxer, tracks[0]));
auto reached_end = false;
provider->set_error_handler([&](Media::DecoderError&& error) {