기여 목록 / 8522240
[media] Remove kRustMpegAudioDataParser and the legacy MPEG audio parser
MSE의 MP3·ADTS 파서를 Rust 구현으로 바꾸면서 남겨 둔 플래그 kRustMpegAudioDataParser와, 그 플래그가 꺼졌을 때만 쓰이던 C++ 파싱 경로를 지웠습니다. 플래그 작성자가 «M152 stable 뒤에 제거»라고 적어 둔 것을 M155가 stable인 시점에 정리한 것으로, 8파일 +114/−518, 동작은 바뀌지 않습니다. 플래그 작성자이자 media OWNER인 dalecurtis@가 PS1을 승인한 뒤, 커미터 승인이 하나 더 필요해 Rust MPEG 파서 도입 CL들을 리뷰한 tguilbert@를 두 번째 리뷰어로 더했습니다. tguilbert@가 지운 접근자만 쓰던 media_log_ 멤버와 쓰지 않게 된 <optional> include를 짚어 PS2에서 함께 지웠고(−4줄), 두 리뷰어가 PS2를 승인한 뒤 dalecurtis@가 CQ를 돌려 2026-10-08(UTC)에 머지됐습니다(c26d63ab45992).
문제 설명
- crrev.com/c8cf5c6948fe2(2026-07, dalecurtis@)가 MSE용 MPEG-1 오디오(MP3)·ADTS 파서를 Rust로 다시 쓰면서, 되돌릴 수 있도록 플래그
kRustMpegAudioDataParser(기본 켜짐)를 두고 «Remove after M152 stable»이라는 주석을 달았습니다. - M152는 2026-08-25에 stable이 됐고 트리는 M157입니다. 플래그는 한 번도 꺼진 적이 없어,
MPEGAudioStreamParserBase::Parse()의 C++ 경로(ParseLegacy())와 그 경로만 쓰는 헬퍼가 죽은 코드로 남아 있었습니다. - 지운 C++ 경로에는
UNSAFE_TODO로 표시된 포인터 연산이 15곳 있었습니다.
해결 내용
media/base/media_switches.{cc,h}에서 플래그 정의·선언을 지웠습니다.MPEGAudioStreamParserBase에서 Rust 경로(ParseRust())의 본문을Parse()로 합치고, C++ 경로만 쓰던ParseLegacy()·ParseFrame()·Icecast/ID3v1/ID3v2 처리·ParseSyncSafeInt()·FindNextValidStartCode()·LocateEndOfHeaders()와 상수 7개, start code mask 멤버를 지웠습니다.- ADTS·MPEG-1 서브클래스에서 C++ 경로용 오버라이드(
GetMinHeaderSize()·ParseFrameHeader())와 로그 제한 카운터를 지우고, 생성자에서 start code mask 인자를 뺐습니다. 그 오버라이드만 쓰던media_log()접근자와 쓰지 않게 된 include도 정리했습니다. 리뷰에서 tguilbert@가 짚은 대로, 그 접근자가 돌려주던media_log_멤버(Init()에서 복제만 하고 읽는 곳이 없어짐)와media_log.h·<optional>include도 PS2에서 지웠습니다. - 다른 코드가 쓰는 헤더 헬퍼(
ParseHeader(),kHeaderSize)는 남겼습니다.
StreamParser::ParseStatus MPEGAudioStreamParserBase::Parse(
int max_pending_bytes_to_inspect) {
...
- if (base::FeatureList::IsEnabled(kRustMpegAudioDataParser)) {
- return ParseRust(max_pending_bytes_to_inspect);
- }
- return ParseLegacy(max_pending_bytes_to_inspect);
-}
+ base::span<const uint8_t> queue_span = queue_.Data();
+ ... // 이전 ParseRust() 본문발굴 과정
리뷰어 신뢰를 쌓기 위해 지금까지 승인을 많이 받은 영역(media·net·storage)으로 범위를 좁힌 스캔에서, «Remove after M» 형태의 제거 예정 주석을 훑다가 찾았습니다. 주석의 마일스톤이 지났는지는 chromiumdash의 stable 날짜로 확인했습니다. 같은 스캔에서 나온 kPauseBackgroundTimer 정리(8522238)를 플래그 작성자인 dalecurtis@가 승인한 뒤, 같은 리뷰어에게 이어서 보냈습니다. 두 번째 리뷰어는 media OWNER를 더 부르는 대신, 8522238에서 OWNER 승인이 끝난 CL에 OWNER를 더 부르자 «더할 몫이 없다»며 빠진 경험을 따라 이 코드를 아는 사람으로 골랐습니다. Rust 파서 도입 CL(7884328·7922899)을 리뷰한 tguilbert@인데, 추가한 뒤 1시간 45분 만에 코멘트와 승인이 왔습니다.
테스트 방법
동작 불변 정리라 새 테스트는 없고 기존 테스트 통과가 검증입니다.
media_unittests증분 빌드 후--gtest_filter='*MPEG1AudioStreamParser*:*ADTS*:*Mp3*:*MP3*:*StreamParserTest*'60/60 — MPEG-1 파서, MP3 seek,AudioFileReader, 파이프라인 통합,StreamParser테스트- 기존 단위 테스트는 플래그를 건드리지 않아 원래부터 Rust 경로만 검증하고 있었습니다(테스트 변경 0).
- ADTS 파서와 그 테스트는
proprietary_codecs빌드에서만 컴파일되어 로컬 빌드에 없습니다. 지운 심볼을 참조하는 곳과 지운 include에 기대던 파일이 없는지 직접 확인하고, 컴파일은 CQ에 맡겼습니다. git cl presubmit --upload경고 0- PS2(include·멤버 삭제 4줄)도 같은 러너로 증분 빌드(9스텝) 뒤 같은 필터 60/60, presubmit 0을 확인하고 올렸습니다. CQ는 한 번에 통과했습니다.
배운 점
- «Remove after M stable» 주석은 트렁크 번호가 아니라 stable 출시 날짜로 판단합니다. chromiumdash 마일스톤 일정에서 M152 stable(2026-08-25)을 확인한 뒤 착수했습니다.
- 조건부로 빌드되는 파일(
proprietary_codecs)은 로컬 테스트 필터에 0건으로 잡힙니다. 0건은 «통과»가 아니라 «안 돌았음»이므로, 그 파일은 따로 검토해야 합니다. - 접근자를 지우면 그 접근자가 감싸던 멤버와 include가 고아가 됩니다. «지운 심볼을 쓰는 곳이 0인가»만 보지 말고, «지운 것이 유일한 사용자였던 멤버·include가 있는가»도 거꾸로 훑어야 합니다. 이번엔
media_log()를 지우면서media_log_멤버와media_log.h·<optional>include를 남겼고, 리뷰어가 찾았습니다. - 코드가 한 줄이라도 바뀐 새 PS에는 다른 리뷰어의 +1이 복사되지 않습니다(Gerrit 복사 조건은 코드 변경 없음·trivial rebase만). 새 PS를 올리면서 «무엇이 바뀌었고 누구의 재승인이 필요하다»를 한 줄로 적어 두니, 첫 리뷰어가 근무 시작 뒤 재촉 없이 다시 승인하고 CQ까지 돌렸습니다.