專家
轉碼器
定義於 fuchsia.mediacodec/codec_factory.fidl
media::CodecFactory 介面的用途是建立 media::StreamProcessor 執行個體,以供解碼器和編碼器使用。
介面方法不會嘗試整體化所有轉碼器類型,其偏好向解碼器提供專屬訊息。
附加生命週期追蹤
AttachLifetimeTracking:
將事件配對端點附加至下一個 Create{X}(),以便在分配的緩衝區數量達到「buffers_remaining」時關閉 codec_end。每個建立都可附加多個事件配對端點,並強制執行 CODEC_FACTORY_LIFETIME_TRACKING_EVENTPAIR_PER_CREATE_MAX。
此事件的生命週期信號是用來追蹤轉碼器使用的所有資源,包括轉碼器在內部建立的 sysmem-assignd 緩衝區。 針對輸入和輸出緩衝區,系統內會顯示的 sysmem 緩衝區集合 不包含在用戶端內這可讓您輕鬆避免用戶端需要多個單獨的非同步等待。
發生伺服器處理程序當機的情形,或編碼器用於將轉碼器_end 傳輸至 sysmem 時,ZX_EVENTPAIR_PEER_CLOSED 表示,ZX_EVENTPAIR_PEER_CLOSED 會在所有資源釋放前不久發出「codec_end」的對等點。
在任何 Create{X}() 之前,您最多只能呼叫 CODEC_FACTORY_LIFETIME_TRACKING_EVENTPAIR_PER_CREATE_MAX 對 AttachLifetimeTracking() 呼叫。如果缺少關閉的 CodecFactory 管道,則無法取消附加。關閉事件組合的用戶端不會從待處理連接的數量減去。因此,最好只在相關 Create{X}() 之前傳送附加訊息,如果用戶端已知會同時傳送附加訊息和 Create{X}() 訊息,就可以採用這種做法。
關閉用戶端不會導致伺服器執行任何動作。如果伺服器完全監聽來自用戶端的事件,這僅適用於偵錯記錄。
伺服器刻意不信任用戶端發出的任何位元。這項機制只會使用無法提早觸發的 ZX_EVENTPAIR_PEER_CLOSED,而且只會在所有用於 Codec_end 的控點關閉時觸發。沒有任何意義與任何其他信號位元沒有關聯,用戶端應在事件配對或對等點結束時以功能方式忽略任何其他信號位元。
轉碼器_end 可能缺少 ZX_RIGHT_SIGNAL 或 ZX_RIGHT_SIGNAL_PEER,但必須具有 ZX_RIGHT_DUPLICATE (且必須具有 ZX_RIGHT_TRANSFER 才能轉移,不會導致 CodecFactory 管道故障)。
要求
名稱 | 類型 |
---|---|
codec_end |
handle<eventpair>
|
建立解碼器
CreateDecoder:
decoder_params - 如要瞭解建立解碼器的必要和選用參數,請參閱 CreateDecoder_Params 註解。
是可能會連線至 Codec 伺服器的 Codec.NewRequest();如果找不到適合的轉碼器,就會關閉 Codec 管道。由於尋找 Codec 能夠完全非同步,因此我們不會在此傳回任何額外的 Codec 專屬狀態,因此我們不知道從傳回到此方法時就會選取 Codec (如果有的話)。
用於建立解碼器的粗序列:
Factory = ConnectToEnvironmentService(CodecFactory); CreateDecoder_Params 參數; [填入參數] CreateDecoder(params, decoder_request);
詳情請參閱 use_media_decoder 程式碼。
要求
名稱 | 類型 |
---|---|
decoder_params |
CreateDecoder_Params
|
decoder |
server_end<fuchsia.media/StreamProcessor>
|
CreateEncoder
CreateEncoder:
Encoder_params:請參閱 CreateEncoder_Params 註解,瞭解建立解碼器的必要和選用參數。
編碼器 - 這個 Codec.NewRequest() 希望能夠連線至 Codec 伺服器;如果找不到適合的轉碼器,就會關閉 Codec 管道。由於尋找 Codec 能夠完全非同步,因此我們不會在此傳回任何額外的 Codec 專屬狀態,因此我們不知道從傳回到此方法時就會選取 Codec (如果有的話)。
要求
名稱 | 類型 |
---|---|
encoder_params |
CreateEncoder_Params
|
encoder |
server_end<fuchsia.media/StreamProcessor>
|
取得詳細 CodecDescription
用戶端應呼叫 |GetDetailsCodecDescriptions()| 來取得軟體實作或基礎硬體支援的轉碼器清單。
要求
<空白>
回應
名稱 | 類型 |
---|---|
payload |
CodecFactoryGetDetailedCodecDescriptionsResponse
|
OnCodecList
以驅動程式為基礎的本機 CodecFactory 會在主要 CodecFactory 連線至驅動程式-本機 CodecFactory 後不久傳送此訊息。
目前主要 CodecFactory 不會傳送這項資訊。
以 SW 為基礎的本機 CodecFactory 不會傳送這個事件。
清單中的每個轉碼器都必須個別說明,才能清除匯總結果。
回應
名稱 | 類型 |
---|---|
codecs |
vector<CodecDescription>[256]
|
結構
轉碼器說明
定義於 fuchsia.mediacodec/codec_factory.fidl
已淘汰。
比起監聽 OnCodecList,用戶端在透過 CodecFactory.CreateDecoder 或 CodecFactory.CreateEncoder 要求轉碼器前,必須先取得轉碼器資訊,才能改為使用 GetDetailscDescription 資料表,取得與這些欄位對應的每個設定檔項目。如果用戶端在要求編碼器之前就沒有轉碼器資訊,可以依據該要求中設定的相關規定來呼叫 CodecFactory.CreateDecoder 或 CodecFactory.CreateEncoder,然後串流處理序 (StreamProcessor.Sync) 來確認轉碼器是否確實建立成功。
相較於根據歷史事件排序的 OnCodecList 使用 FIDL 結構,GetDetailCodecDescriptions 會使用 FIDL 資料表,因此無須淘汰,因為我們可以視需要新增資料表欄位,並視情況逐步淘汰舊的資料表欄位,而不淘汰整個內容。
個別代碼的伺服器不需要填寫此結構或傳送 OnCodecList,因為主要 CodecFactory 會透過 GetDetailscFactory 資訊建構 OnCodecList 資訊,進而使每個轉碼器立即 (選擇性) 立即停止傳送 OnCodecList,而不需等待所有用戶端停止監聽 OnCodecList,這項作業可能需要一些時間。但是,所有轉碼器「同時」必須實作 GetDetailsCodecDescriptions。
欄位 | 類型 | 說明 | 預設 |
---|---|---|---|
codec_type |
CodecType
|
解碼器或編碼器 |
無預設 |
mime_type |
string[256]
|
壓縮格式的 MIME 類型。對解碼器來說,這會是輸入內容的 MIME 類型。對編碼器而言,這是指輸出的 MIME 類型。 |
無預設 |
can_stream_bytes_input |
bool
|
每個欄位的預設值都是最強大的設定,但如果轉碼器不支援最強大的行為,則轉碼器必須覆寫預設值。 |
true |
can_find_start |
bool
|
true | |
can_re_sync |
bool
|
true | |
will_report_all_detected_errors |
bool
|
true | |
is_hw |
bool
|
true | |
split_header_handling |
bool
|
true |
表情符號
CodecType 嚴格
類型:uint32
定義於 fuchsia.mediacodec/codec_factory.fidl
名稱 | 值 | 說明 |
---|---|---|
程式碼範例 |
0 |
|
編碼器 |
1 |
SecureMemoryMode 嚴格
類型:uint32
定義於 fuchsia.mediacodec/codec_factory.fidl
緩衝區是否需要安全。如未指定,則預設為關閉。
此列舉可能會在稍後加入其他值;處理這類類型的程式碼時應注意這一點。例如,在 C++ 中,如果這個類型的任何切換按鈕陳述式為「預設」情況,則新增新值時,可避免編譯警告/錯誤。
名稱 | 值 | 說明 |
---|---|---|
關閉 |
0 |
|
開啟 |
1 |
資料表
CodecFactoryGetDetailsCodecDescriptions 回應
定義於 fuchsia.mediacodec/codec_factory.fidl
序數 | 欄位 | 類型 | 說明 |
---|---|---|---|
1 |
codecs |
vector<DetailedCodecDescription>[256]
|
CreateDecoder_Params
定義於 fuchsia.mediacodec/codec_factory.fidl
序數 | 欄位 | 類型 | 說明 |
---|---|---|---|
1 |
input_details |
fuchsia.media/FormatDetails
|
解碼器的輸入 MIME 類型。 目前可識別的 MIME 類型: video/h264 video/vp9 audio/aac input_details.oob_bytes 必須是 Audio 特定 Config() (依照 AAC 規格定義)。 audio/sbc input_details.oob_bytes 必須為 SBC 的 Codec 特定資訊元素,具體由 A2DP 規格定義。 |
2 |
promise_separate_access_units_on_input |
bool
|
設為 true 之後,用戶端才能在輸入封包中放置時間戳記,而這也會導致用戶端取得任何輸出封包上的任何時間戳記。 向解碼器提供個別的存取單位 (因此 AU) 一律合法,但這個布林值必須設為 true,解碼器才能接受並傳播時間戳記值。 建立影片編碼器時,這個值必須為 true,否則 CodecFactory 管道會關閉。 如果未設定,則解讀為 false。 |
3 |
require_can_stream_bytes_input |
bool
|
要求所選轉碼器能接受非獨立封包的輸入。 這不代表解碼器可以找到第一個 AU 的開頭;如需該範例,請參閱 required_can_find_start。這不代表解碼器可以在串流資料損壞時自行重新同步處理;如需瞭解 required_can_re_sync, 如果 promise_Separate_access_units_on_input 和 require_can_stream_bytes_input 皆為 true,CodecFactory 管道將會關閉。 如果是 false,客戶就必須在 fuchsia.ui.input 中分別動態饋給 AU。如果是影片編碼器,這個值必須為「false」,如為 True,CodecFactory 管道會關閉。 除非用戶端要求解碼器能處理串連的 AU (require_can_stream_bytes_input true),否則用戶端必須分別向解碼器傳送 AU。這表示用戶端不得在同一個封包中同時包含兩個獨立的 AU 部分,除非 required_can_stream_bytes_input 為 true。 如果未設定,則解讀為 false。 |
4 |
require_can_find_start |
bool
|
解碼器可以串流位元組,但無法搜尋第一個可用的 AU。如要要求兩者,請同時設定 require_can_stream_bytes_input 和 Require_can_find_start。設定 if_can_find_start without required_can_stream_bytes_input 無效。 如果使用 required_can_stream_bytes_input true,但 required_can_find_start false,用戶端就必須從 AU 開始啟動第一個封包,但可以在之後傳送一串位元組。 如果未設定,則解讀為 false。 |
5 |
require_can_re_sync |
bool
|
對於有問題的輸入資料,所有解碼器都至少應能夠關閉管道,而不是卡在失敗和/或毀損狀態。 透過 required_can_re_sync 要求傳回的解碼器,或許可以在不關閉 Codec 管道的情況下處理受損的輸入。我們建議 (但非強制性) 轉碼器同時符合 require_report_all_detected_errors 的要求。 如果未設定,則解讀為 false。 |
6 |
require_report_all_detected_errors |
bool
|
有時用戶端會失敗,導致解碼器的整體使用失敗,而不是發現資料毀損。針對這類情況,用戶端可以指定 require_report_all_detected_errors。針對已設定 required_report_all_detected_errors 的要求所傳回的任何轉碼器,當偵測任何輸入資料毀損時,轉碼器會透過下列一或多種方式回報:
如果為 false,轉碼器可能會在沒有訊息的情況下略過毀損的輸入資料。 沒有任何解碼器可以偵測到所有損毀情形,因為某些損毀的情況可能為有效的串流資料。這項要求僅適用於要求寫入的轉碼器,用於偵測「並回報」輸入串流損毀的情形。 這個標記的用途並非 100% 項目符號。如果用戶端需要可靠確保「一律」偵測到「所有」可偵測到的串流毀損情形,則這個標記無法保證一定達成此目的。由於某些串流損毀的本質在任何情況下均無法偵測,因此用戶端應考慮使用更強大的上游技術,確保即使有必要機率非常接近 1,仍可偵測毀損情形。 這個標記為 true 不代表轉碼器會捨棄毀損的資料,也不會產生相應的損壞輸出。只有轉碼器會在適當情況下將 error_detected_* 布林值設為 true。 無論這項設定為何,您在輸入內容時提供的所有 timestamp_ish 值都不保證會顯示在輸出中。 如果未設定,則解讀為 false。 |
7 |
require_hw |
bool
|
如為 true,要求傳回的轉碼器採用 HW 加速功能。另請參閱 如果未設定,則解讀為 false。 |
8 |
permit_lack_of_split_header_handling |
bool
|
allow_lack_of_split_header_handling 這個欄位是臨時欄位,之後將停用。 TODO(dustingreen):在我們停止運作到零轉碼器,導致處理分割標頭時發生問題,請移除這個欄位。 根據預設,必須使用 Codec 執行個體來處理「分割標頭」,意味著用戶端可以一次傳送 AU1 位元組的部分,包括 AU 開頭附近的部分,並且需要轉碼器才能妥善容許和處理。不過,可惜並非所有轉碼器都能正確支援分割標頭。如果用戶端願意允許使用這類轉碼器,用戶端可以將這個值設為 true。用戶端不建議進行這項設定,但可能「目前」需要進行設定,才能找到某些格式的轉碼器。如果用戶端將這個值設為 true,用戶端應傳送每個 AU 的資料,當中包含每個 AU 開頭的連續非分割位元組。用戶端不必每次都傳送一個 AU,只確保所有 AU 位元組都位於單一封包中,或是在每個 AU 開始時都含有幾個位元組。 用戶端應如何使用這個規格,以及用戶端在設為 true 時應採取的行為是否模糊,因為缺少標頭分割的支援機制,並建議為暫時性措施,且所有轉碼器應長期處理分割標頭。這個欄位的主要用途是,避免在無法正確處理分割標頭的轉碼器使用預設值 false 提供無益的用戶端。這不會嘗試完全解決無法處理分割標頭的轉碼器。 如果未設定,則解讀為 false。 |
9 |
secure_output_mode |
SecureMemoryMode
|
如果設為「ON」,解碼器必須在輸出時支援安全緩衝區,且必須在輸出時拒絕不安全的緩衝區。 如果設為「關閉」或不設定,建立的解碼器會關閉 StreamProcessor 管道,在輸出時拒絕安全緩衝區。 如果「secure_input_mode」已設為「ON」,則「secure_output_mode」必須設為「開啟」。 |
10 |
secure_input_mode |
SecureMemoryMode
|
如果設為「開啟」,解碼器必須在輸入時支援安全緩衝區,且必須在輸入內容時拒絕非安全緩衝區。 如果設為「關閉」或不設定,建立的解碼器會關閉 StreamProcessor 管道,在輸入時拒絕安全緩衝區。 如果「secure_input_mode」已設為「ON」,則「secure_output_mode」必須設為「開啟」。 |
11 |
require_sw |
bool
|
設為 true 時,要求傳回的轉碼器完全以 SW 為基礎,而非 HW 加速 (使用向量 CPU 指令時除外)。這適用於測試目的或其他特殊情況,但不建議用於易受效能影響的情境。此外,部分建構作業可能會針對部分格式缺少以 SW 為基礎的解碼器。另請參閱 如果未設定,則解讀為 false。 |
CreateEncoder_Params
定義於 fuchsia.mediacodec/codec_factory.fidl
用於要求編碼器的參數。
序數 | 欄位 | 類型 | 說明 |
---|---|---|---|
1 |
input_details |
fuchsia.media/FormatDetails
|
未壓縮輸入資料的格式。 這個欄位應為原始 mime_type (例如「video/raw」) 和未壓縮格式的詳細資料,供編碼器在讀取緩衝區時使用。 如要有效使用編碼器,編碼器必須支援輸入格式。 |
2 |
require_hw |
bool
|
如為 true,要求傳回的轉碼器採用 HW 加速功能。 如果未設定,則解讀為 false。 |
解碼器設定檔說明
定義於 fuchsia.mediacodec/codec_factory.fidl
指定影片解碼器支援的參數。
設定此資料表中的對應欄位時,凡是名稱與 CodecDescription 中欄位相同的欄位,其意義皆與 CodecDescription 結構中的欄位相同。
如未設定對應欄位,系統會根據這個資料表中欄位的對應文件註解來解讀每個欄位 (CodecDescription 結構 re 中欄位的文件註解。結構欄位預設值與這個資料表未設定欄位的解釋無關)。
影片解碼器一律必須符合下列條件:
- 當輸入影格對單一輸入緩衝區而言太大時,處理分割輸入酬載 (與分割標頭不同)。已加上虛線的輸入區塊的下一個部分 (可能是剩餘部分) 會在下一個輸入封包中傳遞。
如果是音訊解碼器,一律必須設定以下項目:
- 系統一律允許透過輸入內容串連多個壓縮音訊區塊。
序數 | 欄位 | 類型 | 說明 |
---|---|---|---|
1 |
profile |
fuchsia.media/CodecProfile
|
這個解碼器支援的轉碼器設定檔。如果用戶端想要使用這個設定檔,請務必遵守此資料表中指定的要求。 |
2 |
min_image_size |
fuchsia.math/SizeU
|
這個解碼器為指定的 |profile| 支援的圖片大小下限。解碼器必須設定這個欄位,且這個欄位必須指定 >= 為轉碼器規格為設定檔定義的最小尺寸。 此大小是指記憶體中的像素版面配置,而不是 display_rect 小於 fuchsia.Images2.ImageFormat.size / fuchsia.sysmem.ImageFormat2.coded_width/height, |
3 |
max_image_size |
fuchsia.math/SizeU
|
此解碼器支援的圖片大小上限。 解碼器必須設定這個欄位,且這個欄位必須指定在轉碼器規格中為設定檔定義的大小上限 <=。 此大小是指記憶體中的像素版面配置,而不是 display_rect 小於 fuchsia.Images2.ImageFormat.size / fuchsia.sysmem.ImageFormat2.coded_width/height, 設定這個欄位後,解碼器即使指定的串流大小大於串流設定檔通常允許的大小,也不需要解碼器。解碼器不一定會將未列出的設定檔或不在所列設定檔大小邊界的串流解碼。 |
4 |
allow_encryption |
bool
|
這個 |profile| 項目可套用至已加密的輸入資料。如果 requirements_encryption 為 false 或未設定,這個 |profile| 項目也可以套用至未加密的輸入資料。 在 Fuchsia 支援解碼過程中,系統會取消這項設定 (即使 allow_input_protection 或 requirements_input_protection 為 true),直到程式碼的一部分進行解密為止 (對比,它是牽涉保護記憶體的另一個步驟)。如果 allow_encryption 為 false/un-set,但 allow_input_protection 為 true,用戶端在解碼 DRM 解碼之前,應先將解密功能設為獨立步驟,之後才能在解密和解碼之間使用受保護的記憶體進行解碼。 |
5 |
require_encryption |
bool
|
這個 |profile| 項目僅適用於輸入資料經過加密的情況。這個 |profile| 項目不適用於未加密的輸入資料。未設定時,系統會將未設定狀態視為 false。 如果設為 true,且同一個詳細 CodecDescription 中沒有含 required_encryption false 設定檔,則解碼器僅支援加密的輸入內容。 在 Fuchsia 支援解碼時進行解密 (即使 allow_input_protection 或 required_input_protection 為 true) ,這項設定才會取消設定。另請參閱 allow_encryption、allow_input_protection、require_input_protection。 |
6 |
allow_input_protection |
bool
|
這個 |profile| 項目適用於透過受保護的記憶體傳送的資料。指定是否保護輸入,以及要保護輸入的受保護「堆積」(如果保護輸入的話) 會在 sysmem 限制匯總期間,並透過 DRM 機制決定。另請參閱 required_input_protection、allow_encryption、require_encryption。 |
7 |
require_input_protection |
bool
|
此 |profile| 項目僅適用於透過受保護的記憶體傳送輸入資料時。是否要保護輸入,以及保護輸入的受保護「堆積」(如果保護輸入的話) 會在 sysmem 限制匯總期間,以及個別的 DRM 機制來決定。 如果設為 true,且同一個 DetailCodecDescription 中沒有含有 required_input_protection false 設定檔,這個解碼器就只會支援受保護的輸入內容。 在 sysmem 中匯總輸出緩衝區限制時,以及透過 DRM 機制,系統會分別協商輸出保護機制。 另請參閱 allow_input_protection、allow_encryption、require_encryption。 |
8 |
can_stream_bytes_input |
bool
|
如果設為 true,解碼器可以處理跨封包邊界 (標頭與酬載之間,或酬載位元組之間) 分割的輸入區塊酬載 (包含壓縮資料),而解碼器也能在單一輸入封包中處理多個包含壓縮輸入資料的輸入區塊。另請參閱 split_header_handling,確認解碼器是否也能處理分割標頭。 如未設定,則代表 false。 雖然這個欄位一律表示可以將輸入區塊分割至一個封包界線,但這個欄位設定一律表示可以有來自多個輸入區塊的單一輸入封包,其中包含來自多個輸入區塊的位元組,包括輸入區塊包含壓縮的輸入資料時,還是有一些細微的意義不同。 無論設定或未設定這個欄位,音訊解碼器一律必須允許單一輸入封包中的多個輸入區塊,包括多個輸入區塊,每個區塊都含有經過壓縮的輸入資料 (而不僅是開頭的「內容」標頭)。針對音訊解碼器,這個欄位只能表示是否允許將輸入區塊分割到不同封包。 除非音訊解碼器同時將 can_stream_bytes_input 設為 true,否則音訊解碼器不應將 split_header_handling 設為 true,因為除非允許分割輸入區塊,否則允許分割標頭位元組並無意義。 對於影片解碼器,如果這個欄位未設定或設為 false,解碼器可能無法在單一輸入封包中處理超過一個輸入區塊的位元組。不過,對於所有解碼器 (包括視訊和音訊),先前「內容」標頭 (例如 h264 SPS 和 PPS 標頭) 一律可以接受,與下列包含壓縮輸入資料 (例如 h264 配量) 的輸入封包相同。影片解碼器一律必須允許繼續在下一個封包中的輸入區塊,包含標頭位元組和壓縮的輸入資料位元組,或在不同壓縮的輸入資料位元組之間 (但不一定是介於兩個標頭位元組之間;請參閱 split_header_handling)。 解碼器將 can_stream_bytes_input 設為 true 通常很常見,但由於 HW、FW 或驅動程式庫中的剖析限制,讓 split_header_handling 取消設定,或者將 Split_header_handling 設為 false。將 can_stream_bytes_input false 設為 false 或離開 can_stream_bytes_input 的解碼器,可能會強迫輸入資料在某些情境中重新封裝。如果可以,建議一併設定 allow_encryption 的設定檔,因為在某些涉及加密的情境中,重新封裝輸入資料可能比較困難。 |
9 |
can_find_start |
bool
|
如果設為 true,解碼器可以在串流開始時進行掃描,找出第一個完全呈現的輸入區塊的開頭,即使輸入資料從區塊中間的位元組開始也一樣。 對影片和音訊解碼器來說,將這個欄位設為 true 表示能處理 (略過或部分使用) 因為缺少參照之前資料,而無法解碼 (或無法完全解碼) 的任何輸入區塊。 如果未設定或為 False,解碼器可能無法掃描向前掃描與輸入串流,除非輸入串流的開頭從適當區塊的開頭開始。 |
10 |
can_re_sync |
bool
|
如果設為 True,即使缺少輸入區塊,解碼器仍可與輸入串流 (最終) 重新同步,並且可以處理部分輸入區塊,而不會讓串流或 StreamProcessor 控制連線失敗。 |
11 |
will_report_all_detected_errors |
bool
|
如果設為 true,解碼器會視情況設定 error_detected_before 和/或 error_detected_during,藉此指出部分或偵測到遺漏或偵測到損壞的輸入區塊。值得注意的是,即使這個欄位設為 true,解碼器通常也無法偵測所有可能的資料毀損情形,因為轉碼器通常也不會在串流中納入錯誤偵測位元。這並不會取代真實 (如同極可能針對隨機位元翻轉和位元插入/刪除) 資料完整性檢查的情況。 |
12 |
split_header_handling |
bool
|
如果設為 true,解碼器可以處理任何標頭在封包邊界分割的位元組。如果設為 False 或未設定,解碼器會要求標頭的所有標頭位元組都必須在同一封包內。 系統一律允許在兩個正式獨立輸入區塊之間,於兩個標頭之間的指定界限啟動新封包。 為了使用這個欄位,h264 SPS 和 PPS 標頭等標頭會視為不同的輸入區塊,因此無論這個欄位的設定為何,具有專屬輸入區塊的標頭都能透過獨立封包傳送,而後續的 h264 配量標頭可以放在另一個封包中。 無論這個欄位的「內容」標頭 (例如 h264 SPS 和 PPS 標頭) 設定在與後續傳送壓縮圖片資料 (例如 h264 配量) 相同的封包中傳送,一律是可接受的。 即使這個欄位設為 true,也無法在 codec_oob_bytes 與串流資料之間分割單一標頭 (如同用戶端一律不得依賴), 另請參閱 can_stream_bytes_input。 包含 can_stream_bytes_input true 的影片解碼器,但 split_header_handling 否含有 can_stream_bytes_input false 和 split_header_handling true 的影片解碼器無法容忍單一封包中超過一個輸入區塊的位元組,但無論分割發生位置為何,都可以容忍輸入區塊的連續位元組 (例如在 h264 SPS、PPS 或切片標頭中發生)。 除非音訊解碼器也將 can_stream_bytes_input 設為 true,否則音訊解碼器不應將 split_header_handling 設為 true,因為對音訊解碼器來說,要分割標頭位元組並不明確 (針對音訊解碼器),除非也允許分割輸入區塊。 |
詳細轉碼器說明
定義於 fuchsia.mediacodec/codec_factory.fidl
使用 CodecFactory.CreateDecoder 或 CodecFactory.CreateEncoder 來要求轉碼器之前,用戶端需要用轉碼器資訊取得此資料表,其中包含了 Codec 和轉碼器支援的設定檔項目詳細資料。
如果用戶端在要求轉碼器之前沒有使用轉碼器資訊,只要使用 CodecFactory.CreateDecoder 或 CodecFactory.CreateEncoder 並搭配該要求中設定的相關規定,然後呼叫 StreamProcessor.Sync (來回),看看是否成功建立轉碼器。
序數 | 欄位 | 類型 | 說明 |
---|---|---|---|
1 |
codec_type |
CodecType
|
解碼器或編碼器 |
2 |
mime_type |
string[256]
|
壓縮格式的 MIME 類型。對解碼器來說,這會是輸入內容的 MIME 類型。對編碼器而言,這是指輸出的 MIME 類型。 |
3 |
is_hw |
bool
|
如果解碼器/編碼器會使用基礎硬體執行作業 |
4 |
profile_descriptions |
ProfileDescriptions
|
設定檔說明清單,說明這個編碼器/解碼器支援的轉碼器設定檔,以及每個設定檔的使用要求。 |
EncoderProfileDescription
定義於 fuchsia.mediacodec/codec_factory.fidl
序數 | 欄位 | 類型 | 說明 |
---|---|---|---|
1 |
profile |
fuchsia.media/CodecProfile
|
聯合國
個人資料說明嚴格
定義於 fuchsia.mediacodec/codec_factory.fidl
序數 | Variant | 類型 | 說明 |
---|---|---|---|
1 |
decoder_profile_descriptions |
vector<DecoderProfileDescription>[256]
|
|DecoderProfileDescription| 清單,說明這個解碼器支援哪些轉碼器設定檔,以及用戶端在使用解碼器時必須遵循的規定。CodecFactory 會向用戶端保證 |decoder_profile_descriptions| 中的每個 |DecoderProfileDescription| 都有專屬的 |profile|。 |
2 |
encoder_profile_descriptions |
vector<EncoderProfileDescription>[256]
|
場景
名稱 | 值 | 類型 | 說明 |
---|---|---|---|
CODEC_FACTORY_CODEC_LIST_SIZE_MAX |
256
|
uint32 |
限制透過 |
CODEC_FACTORY_LIFETIME_TRACKING_EVENTPAIR_PER_CREATE_MAX |
16
|
uint32 |
如果呼叫 AttachLifetimeTracking() 沒有超過此呼叫,就會從伺服器端關閉 CodecFactory 管道。 |
CODEC_FACTORY_MAX_MIME_TYPE_LENGTH |
256
|
uint32 |
將 mime_type 限制在不會造成問題的大小。 |