外部流輸入的 Layer

在 Android 的 SurfaceFlinger 體系中,外部流輸入的 Layer 通常通過 Sideband StreamBufferQueue 機制傳遞給 SurfaceFlinger,然后由 HWC(Hardware Composer)或 OpenGL ES 進行合成。


1. 什么是外部流輸入的 Layer?

外部流輸入的 Layer 通常指的是:

  • 硬件視頻解碼(MediaCodec 硬件解碼的輸出)

  • Camera HAL 的預覽流

  • Miracast / DisplayLink 無線顯示

  • 外部 HDMI / USB-C 連接的顯示設備

這些 Layer 不是應用程序直接繪制的,而是由外部設備或硬件解碼器提供的流


2. Sideband Stream 機制

dumpsys SurfaceFlinger 里,你看到的:

 
sideband stream=0x0

說明這個 Layer 沒有使用 sideband stream,但如果有值(例如 0xb40000770a9cf000),說明它是一個外部流輸入的 Layer

什么是 Sideband Stream?

  • Sideband Stream 是 Android 提供的一種 "旁路" 機制,讓 HWC 直接接受外部設備或者MediaCodec 硬件解碼的流,而不需要經過 CPU/GPU 處理

  • 這種機制可以極大提高視頻播放性能,避免 GPU 復制大量像素數據,提高功耗效率。

SurfaceFlinger 如何處理 Sideband Stream?

  1. 應用程序或系統服務(如 MediaCodec)創建一個 Surface

  2. Surface 綁定到外部流(比如硬件解碼器)

  3. SurfaceFlinger 檢測到 sideband stream 并交給 HWC 進行合成

  4. HWC 直接從解碼器獲取數據,繞過 GPU

  5. 最終顯示在屏幕上

📌 舉例:MediaCodec 硬解碼

 
// 創建 Surface
sp<Surface> surface = new Surface(bufferProducer);// MediaCodec 綁定 Sideband Stream
mediaCodec->setOutputSurface(surface);

當 MediaCodec 開啟硬件解碼時,它會把解碼后的幀直接輸出到 Surface,而 SurfaceFlinger 看到這個 Surface 綁定了 Sideband Stream,就不會讓 OpenGL ES 處理,而是交給 HWC。


3. BufferQueue 機制

對于 大部分普通的外部流輸入(比如 Camera 預覽),Android 使用 BufferQueue 在應用、SurfaceFlinger 和 HWC 之間傳遞 buffer。

流程:

  1. Camera HAL / MediaCodec 產生 YUV/NV12/NV21 buffer

  2. Buffer 通過 BufferQueue 傳遞給 SurfaceFlinger

  3. SurfaceFlinger 決定是用 HWC 還是 GPU 進行合成

  4. 最終渲染到屏幕

📌 舉例:Camera 預覽

 
// 創建 Surface
sp<IGraphicBufferProducer> producer;
sp<IGraphicBufferConsumer> consumer;
BufferQueue::createBufferQueue(&producer, &consumer);// 綁定到 Camera HAL
camera->setPreviewTarget(producer);

這樣 Camera 直接向 Surface 發送幀數據,SurfaceFlinger 會收到 buffer 并決定是否使用 HWC 直接合成。


4. 如何區分 Sideband Stream 和 BufferQueue?

dumpsys SurfaceFlinger 里,你可以檢查:

  • 如果 sideband stream != 0x0,說明這個 Layer 使用的是 Sideband Stream,HWC 可能直接處理它。

  • 如果 buffer != 0x0,說明這個 Layer 使用的是 BufferQueue,SurfaceFlinger 可能需要用 GPU 合成它。

如果你 dump 的內容里:

 
sideband stream=0xb40000770a9cf000
buffer: buffer=0x0

那么這個 Layer 是 直接由 HWC 處理的,可能是 MediaCodec 硬解碼輸出外部 HDMI 輸入

而如果:

 
sideband stream=0x0
buffer: buffer=0xb40000770a9d0000

那么這個 Layer 是 普通的 BufferQueue 方式提交給 SurfaceFlinger,可能是 Camera 預覽APP 繪制的 UI 界面


5. 總結

方式適用場景SurfaceFlinger 處理方式性能
Sideband StreamMediaCodec 硬解碼、HDMI 輸入HWC 直接合成(不經過 OpenGL ES)? 高效
BufferQueueCamera 預覽、普通圖層可能用 GPU 處理或交給 HWC?? 視情況而定

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899879.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899879.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899879.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

31-體測管理系統

介紹 技術&#xff1a; 基于 B/S 架構 SpringBootMySQLvueelementui 環境&#xff1a; Idea mysql maven jdk1.8 node 用戶端功能 1.系統首頁展示輪播圖及公告信息 2.測試項目:展示可以參加測試的項目列表 3.公告信息:公告信息列表及詳情 可進行點贊和收藏 4.在線留言 5.個人…

NVR接入錄像回放平臺EasyCVR視頻系統守護舌尖上的安全,打造“明廚亮灶”云監管平臺

一、方案背景 近年來&#xff0c;餐飲行業食品安全和衛生等問題頻發&#xff0c;比如后廚衛生臟亂差等&#xff0c;持續引發關注&#xff0c;這些事情導致連鎖反應&#xff0c;使其收益遭受損失。同時&#xff0c;給消費者造成了心理和生理上的傷害。 加強餐飲行業的監管成為…

Python辦公自動化(3)對Excel的操作

1.讀取excel文件 1.安裝工具 終端下載讀取excel文檔的工具庫&#xff1a; pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd 若對版本有特殊需求&#xff1a; 刪除當前版本&#xff1a;pip3 uninstall xlrd 下載所需要的版本&#xff1a;pip3 install -i htt…

go語言:開發一個最簡單的用戶登錄界面

1.用deepseek生成前端頁面&#xff1a; 1.提問&#xff1a;請你用html幫我設計一個用戶登錄頁面&#xff0c;要求特效采用科技感的背景渲染加粒子流動&#xff0c;用css、div、span標簽&#xff0c;并給出最終合并后的代碼。 生成的完整代碼如下&#xff1a; <!DOCTYPE h…

blender二次元上色

前&#xff1a; 后&#xff1a;&#xff08;臉自己會發光) 參考&#xff1a;05-模型導入與材質整理_嗶哩嗶哩_bilibili

Mysql+Demo 獲取當前日期時間的方式

記錄一下使用Mysql獲取當前日期時間的方式 獲取當前完整的日期時間有常見的四種方式&#xff0c;獲取得到的默認格式(mysql的格式標準)是 %Y-%m-%d %H:%i:%s其它格式 %Y-%m-%d %H:%i:%s.%f方式一&#xff1a;now()函數 select now();mysql> select now(); -------------…

C#核心學習(六)面向對象--封裝(5)靜態成員及靜態構造函數和靜態類 以及和常量的區別

目錄 一、什么是靜態的&#xff1f;什么是常量&#xff1f; 1. ?靜態&#xff08;Static&#xff09;? 2. ?常量&#xff08;const&#xff09;? 二、類中的靜態成員有什么用&#xff1f; 1. ?共享數據 2. ?工具方法與全局配置 3. ?單例模式 三、靜態類和靜態成…

FreeRTOS源碼下載分享

FreeRTOS源碼下載分享 官網下載太慢了&#xff0c;分享下FreeRTOSv202411 FreeRTOSv202411.00.zip 鏈接: https://pan.baidu.com/s/1P4sVS5WroYEl0WTlPD7GXg 提取碼: g6aq

2025年win10使用dockerdesktop安裝k8s

一、寫作背景 百度了一圈&#xff0c; 要么教程老&#xff0c;很多操作步驟冗余&#xff0c; 要么跑不通&#xff0c;或者提供的鏈接失效等情況。 二、看前須知 1、安裝過程使用的AI輔助&#xff0c; 因為參考的部分博客卡柱了。 2、如果操作過程中遇到卡頓&#xff0c; …

一段式端到端自動駕駛:UniAD:Planning-oriented Autonomous Driving

論文地址:https://arxiv.org/pdf/2212.10156 代碼地址:https://github.com/OpenDriveLab/UniAD 1. 摘要 現代自動駕駛系統通常由一系列按順序執行的模塊任務構成,例如感知、預測和規劃。為了完成多種任務并實現高級別的智能化,當前的方法要么為每個任務部署獨立模型,要…

【企業文化】CXO是什么?

李升偉 整理 CXO 是企業中高層管理職位的統稱&#xff0c;其中的 “X” 是一個變量&#xff0c;代表不同的職能領域。CXO 通常指企業最高管理層中的各個負責人&#xff0c;他們共同參與企業的戰略決策和運營管理。以下是一些常見的 CXO 職位及其職責&#xff1a; 1. CEO&…

python中的 f 是什么意思,f‘{username}_log_archive_{int(time.time())}.txt‘

python中的 f 是什么意思,f’{username}log_archive{int(time.time())}.txt’ 在 Python 中,f 是一種字符串前綴,用于創建格式化字符串(也稱為 f-string),它是 Python 3.6 及更高版本引入的一種方便的字符串格式化方式。 基本語法和功能 當你在字符串前加上 f 前綴時,…

論文淺嘗 | Interactive-KBQA:基于大語言模型的多輪交互KBQA(ACL2024)

轉載至&#xff1a;何駿昊 開放知識圖譜 原文地址&#xff1a;論文淺嘗 | Interactive-KBQA&#xff1a;基于大語言模型的多輪交互KBQA&#xff08;ACL2024&#xff09; 筆記整理&#xff1a;何駿昊&#xff0c;東南大學碩士&#xff0c;研究方向為語義解析 論文鏈接&#xff…

MySQL注入中user-agent和cookie存在的注入

uagent注入 1、漏洞成因&#xff1a; 當Web應用程序將用戶提供的User-Agent值未經處理直接拼接到SQL查詢語句時&#xff0c;攻擊者可以通過構造惡意User-Agent值閉合原有SQL語句并注入任意SQL代碼。 2、以less-18為例&#xff1a; 相比前幾關&#xff0c;第18關對于uname和pa…

【算法數學篇】試除法求約數

題解&#xff1a;試除法求約數 題目傳送門 869. 試除法求約數 一、題目描述 給定 n 個正整數 a?&#xff0c;對于每個整數 a?&#xff0c;按照從小到大的順序輸出它的所有約數。 輸入格式&#xff1a; 第一行包含整數 n接下來 n 行&#xff0c;每行包含一個整數 a? 輸…

《UNIX網絡編程卷1:套接字聯網API》第5章 TCP客戶服務器程序示例

《UNIX網絡編程卷1&#xff1a;套接字聯網API》第5章 TCP客戶/服務器程序示例 5.1 本章目標與示例程序概述 本章通過一個完整的TCP回射&#xff08;Echo&#xff09;客戶/服務器程序&#xff0c;深入解析TCP套接字編程的核心流程與關鍵問題。示例程序的功能為&#xff1a;客戶…

封裝可拖動彈窗(vue jquery引入到html的版本)

vue cli上簡單的功能&#xff0c;在js上太難弄了&#xff0c;這個彈窗功能時常用到&#xff0c;保存起來備用吧 備注&#xff1a;deepseek這個人工智障寫一堆有問題的我&#xff0c;還老服務器繁忙 效果圖&#xff1a; html代碼&#xff1a; <div class"modal-mask&qu…

編譯器工具鏈是什么?

編譯器工具鏈&#xff08;Compiler Toolchain&#xff09; 是一組用于將源代碼轉換為可執行程序的工具和庫的集合。它涵蓋了從源代碼編寫到程序運行的整個構建過程&#xff0c;包括編譯、匯編、鏈接等多個階段。以下是關于編譯器工具鏈的詳細解釋&#xff1a; 一、編譯器工具鏈…

Spring Boot 集成Redis中 RedisTemplate 及相關操作接口對比與方法說明

RedisTemplate 及相關操作接口對比與方法說明 1. RedisTemplate 核心接口與實現類 RedisTemplate 是 Spring Data Redis 的核心模板類&#xff0c;通過 opsFor... 方法返回不同數據類型的操作接口&#xff0c;每個接口對應 Redis 的一種數據結構。以下是主要接口及其實現類&am…

linux內核漏洞檢測利用exp提權

案例一dirtycow&#xff08;CVE-2016-5159&#xff09; 有個前置知識就是 獲取liunx的內核 hostnamectl uname -a 然后這個內核漏洞進行提權的步驟也是和手工win進行提權差不多 也是需要使用輔助工具在本地進行輔助檢測 然后去nomi-sec/PoC-in-GitHub&#xff1a; &#…