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:
parent
a3309fe5f6
commit
b5eddc4ff0
4 changed files with 17 additions and 17 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue