기여 목록 / 8423462
[WebCodecs] Remove the kWebCodecsDecoderFlushOptimizations kill switch
BlinkcleanupMerged
WebCodecs 오디오·비디오 디코더의 flush()/configure() 최적화를 감싸고 있던 킬스위치 kWebCodecsDecoderFlushOptimizations를 제거했습니다. 올해 1월(M145)에 «M145가 안정되면 제거»라는 주석과 함께 들어온 뒤 10개 마일스톤을 더 살아 있던 플래그로, 도입 이래 기본 켜짐이었으므로 동작은 바뀌지 않습니다(crbug.com/474398415). 7파일 +4/−26. 2026-09-22에 머지됐습니다(1e1052fd23521). CQ dry run이 무관한 트리 파손으로 한 번 실패했다가 재요청 뒤 통과했습니다.
문제 설명
- issue url: https://crbug.com/474398415
- 원래 WebCodecs 디코더는 flush()마다
(Audio|Video)DecoderBroker::Initialize()를 다시 타며 활성 디코더를 파괴하고 새로 골랐습니다. Android에서는 이 때문에 아직 렌더되지 않은 프레임이 사라지는 버그(마지막 몇 프레임 누락)가 있었습니다. 수정 CL 7428252가 기존 디코더를 재사용하고 configure() 시 EOS 버퍼에 다음 config를 실어 보내도록 바꾸면서, 롤백용 킬스위치로 감싸 두었습니다. - 트리가 M155인 지금은 브로커 두 곳과
DecoderTemplate한 곳에FeatureList조회와 죽은 분기만 남아 있었고, 테스트 두 곳은 플래그를 굳이 켜고 있었습니다.
해결 내용
media/base/media_switches.{h,cc}에서 플래그 선언·정의를 지웠습니다.audio_decoder_broker.cc·video_decoder_broker.cc의 Initialize()에서 플래그 항만 빼고 «기존 디코더를 selector 앞에 붙여 재사용»하는 동작을 그대로 두었습니다.decoder_template.cc의 configure() 경로에서 EOS 버퍼에 다음 config를 싣는 쪽만 남겼습니다.video_decoder_broker_test.cc는 다른 플래그(kResolutionBasedDecoderPriority)만 켜도록,video_decoder_test.cc는 플래그 설정 자체를 지웠습니다.- 각 파일에서만 쓰이던
base/feature_list.h·media/base/media_switches.h·base/test/scoped_feature_list.hinclude 다섯 개를 함께 제거했습니다.
- if (decoder_ && !decoder_factory_needs_update_ &&
- base::FeatureList::IsEnabled(
- media::kWebCodecsDecoderFlushOptimizations)) {
+ if (decoder_ && !decoder_factory_needs_update_) {
selector_->PrependDecoder(std::move(decoder_));
}about_flags·flag-metadata·enums.xml·fieldtrial_testing_config에 등록되지 않은 플래그라 다른 파일은 손댈 것이 없었습니다. gn check 통과.
발굴 과정
«Remove … after M» 만료 주석 스윕에서 나온 항목입니다. 도입 CL과 버그 원문을 읽어 «플래그가 꺼진 쪽이 버그 있던 옛 동작»임을 확인했고, 플래그 이름이 든 열린 CL이 없는지, 세 파일의 열린 CL이 우리 줄과 무관한 옛 리팩터링 시리즈뿐인지 확인한 뒤 OSSCA #478로 등록하고 착수했습니다.
테스트 방법
동작 불변 정리라 새 테스트는 없고 기존 테스트 통과가 검증입니다.
gclient sync후blink_unittests빌드: Mac M5,-j 4, 4시간 56분 / 39,600 스텝blink_unittests --gtest_filter='AudioDecoder*:VideoDecoder*:DecoderTemplate*:DecoderSelector*'24/24 통과- 배치 실행에서
DecoderTemplateTest/0.ResetDuringFlush가 크래시했는데, 변경 없는 main 바이너리로 같은 배치를 돌려도 동일하게 크래시해 기존 테스트 격리 문제(audio_decoder_broker_test.cc가 전역 브로커에 등록한 가짜 InterfaceFactory를 뒤 테스트가 재바인드)임을 확인했습니다. 해당 세 테스트는 단독 실행으로 통과시켰습니다.
배운 점
- 배치 실행에서 크래시가 나면 «단독 재실행 → 같은 배치 재실행 → 변경 없는 바이너리로 같은 배치 실행» 순으로 우리 변경 탓인지 가립니다. 재링크는 3분이면 되니 baseline 확인을 아끼지 않는 게 낫습니다.
- 킬스위치를 지울 때 테스트가 플래그를 «켜는» 코드도 함께 지워야 합니다. 여러 플래그를 한 번에 켜는
InitWithFeatures는 나머지 플래그만 남깁니다. git fetch로 DEPS만 앞서간 트리는gn check조차 «out of scope»로 실패합니다.gclient sync를 먼저 하고, sync 뒤 첫 빌드는 전체 재빌드로 계획합니다.