# ADTS処理と診断用import hookの差分

固定した未改変source archiveへ適用する最小差分です。固定情報は[source-lock](../../source-lock.json)、接続は[vendorの説明](../../README.md)、採用原則は[設計09](../../../../docs/design/09-dependency-changes.md)を参照します。版や試験成績の経過は現行説明へ累積しません。

## パッチ集合と適用順

| パッチ | 変更対象 | 目的 |
| --- | --- | --- |
| [D01-adts-boundaries.patch](D01-adts-boundaries.patch) | libmediaのADTS2RawFilter.ts | header/payloadの多分割を有界carryで組み立てる |
| [D01b-adts-resync.patch](D01b-adts-resync.patch) | 同じfilter | frame途中開始の偽syncを後続headerと照合 |
| [D01c-adts-unsupported.patch](D01c-adts-unsupported.patch) | 同じfilter | PCE/複数raw blockをheader消失前に理由付き識別 |
| [D02-parent-import-observer.patch](D02-parent-import-observer.patch) | cheapのWebAssemblyRunner.ts | 診断用の親import observer |

filterの3差分はD01→D01b→D01cの順です。診断用D02の名前は設計上のTS探索の担当番号と同義ではありません。正式/診断ごとの適用集合は[ビルド境界](../../../../docs/design/12-diagnostics.md)に従い、実際の分離状況は[進捗](../../../../docs/progress.md)を参照します。

## filter内を変更する理由

IMpegtsFormat.handlePESは内部filterのsendAVPacket/receiveAVPacketを経てpacketを公開します。不完全frameの破棄・誤同期・header情報の消失が公開前に起きるため、後段adapterでは元byteから回復できません。demux全体の置換やcodecアルゴリズム変更ではなく、該当filterの最小差分とします。

### D01 境界保持

headerはCRCなし7byte/あり9byte、payloadは宣言長まで保持します。3回以上に分割されても不足分だけ補い、未完成frameを出力しません。header自体の分割、先頭断片のDTS/pos、完成frameのdurationを維持します。resetではheader/payload/cacheを破棄し、別seekや設定へcarryを混ぜません。

### D01b 再同期

frame途中のpayloadにはADTSに見えるsyncがあり得ます。探索候補はlayer/sample rate/payload長を検査し、そのframe長が指す次headerのprofile/rate/ch数が一致することを確かめます。次headerが分割されていれば有界carryで待ち、不一致なら次の候補へ進めます。

通常整列した単独frameとEOF末尾へ次headerを一律要求しません。保持はADTS長の上限と照合する次headerに制限し、resetで探索状態を破棄します。

### D01c 未採用構成

headerのchannel_configurationとraw_data_blocksを失う前に未対応を識別し、inputErrorをbridgeへ返します。PCEを2chへ置換せず、失敗後のpacket公開を止め、resetで理由を解除します。これをPCE/複数raw blockの復号採用と扱いません。[対応範囲](../../../../docs/requirements.md)。

## D02 親import observer

WebAssemblyRunnerのruntimeがpthread/atomicのJS/Wasm実装を選択した後、instantiate直前に任意のbeforeInstantiate callbackを呼びます。callbackがなければimportを変更せず、childのrunAsChildへ追加しません。

診断用映像bridgeは、実moduleがimportするmutex/condition wait等とallocatorのmalloc/free/realloc/posix_memalign等をcategory別に同期wrapperで計測します。返り値・例外を保持し、Promiseや待ちを追加しません。親import内の経過時間であり、子threadのCPU時間やOS実行待ちを完全分離した値ではありません。C/Wasm・thread数・同期方式を変更する差分ではありません。

## 更新と検査

archive hash、適用前のgit apply --check、patch hashを検査・記録します。取得archiveと比較基準のvendorを直接編集しません。固定版更新時は未改変版で必要性を再評価し、適用可能なことだけで継続採用しません。

境界試験はCRC有無・全byte分割・複数分割・reset・payload内偽header・未対応理由の解除を検査します。observerは無効時・対象import・返り値/例外・保持上限を検査します。実行コマンドは[開発手順](../../../../docs/development.md)に集約します。
