OSSCA Chromium

기여 목록 / 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.h include 다섯 개를 함께 제거했습니다.
-    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 뒤 첫 빌드는 전체 재빌드로 계획합니다.

참고 자료