อุโมงค์ข้อมูลมัลติมีเดียช่วยให้ข้อมูลวิดีโอที่บีบอัดสามารถเจาะช่องสัญญาณผ่านตัวถอดรหัสวิดีโอฮาร์ดแวร์ไปยังจอแสดงผลได้โดยตรง โดยไม่ต้องประมวลผลด้วยโค้ดแอปหรือโค้ดเฟรมเวิร์กของ Android รหัสเฉพาะอุปกรณ์ด้านล่างสแต็ค Android กำหนดเฟรมวิดีโอที่จะส่งไปยังจอแสดงผลและเมื่อใดที่จะส่งโดยเปรียบเทียบการประทับเวลาการนำเสนอเฟรมวิดีโอกับนาฬิกาภายในประเภทใดประเภทหนึ่งต่อไปนี้:
สำหรับการเล่นวิดีโอแบบออนดีมานด์ใน Android 5 หรือสูงกว่า นาฬิกา
AudioTrack
จะซิงโครไนซ์กับการประทับเวลาการนำเสนอเสียงที่ ส่งผ่าน โดยแอปสำหรับการเล่นถ่ายทอดสดใน Android 11 หรือสูงกว่า นาฬิกาอ้างอิงโปรแกรม (PCR) หรือนาฬิกาเวลาของระบบ (STC) ที่ขับเคลื่อนโดย จูนเนอ ร์
พื้นหลัง
การเล่นวิดีโอแบบดั้งเดิมบน Android จะแจ้งเตือน แอปเมื่อมีการถอดรหัสเฟรมวิดีโอที่บีบอัด จากนั้นแอปจะ เผยแพร่ เฟรมวิดีโอที่ถอดรหัสไปยังจอแสดงผลเพื่อแสดงผลในเวลานาฬิกาของระบบเดียวกันกับเฟรมเสียงที่เกี่ยวข้อง โดย ดึงข้อมูล อินสแตนซ์ AudioTimestamps
ในอดีตเพื่อคำนวณเวลาที่ถูกต้อง
เนื่องจากการเล่นวิดีโอแบบทันเนลจะข้ามโค้ดของแอปและลดจำนวนกระบวนการที่ดำเนินการกับวิดีโอ จึงสามารถให้การแสดงวิดีโอที่มีประสิทธิภาพมากขึ้นโดยขึ้นอยู่กับการใช้งาน OEM นอกจากนี้ยังสามารถให้จังหวะวิดีโอที่แม่นยำยิ่งขึ้นและการซิงโครไนซ์กับนาฬิกาที่เลือก (PRC, STC หรือเสียง) โดยหลีกเลี่ยงปัญหาเรื่องเวลาที่เกิดจากความเบ้ระหว่างระยะเวลาของคำขอ Android ในการแสดงผลวิดีโอและระยะเวลาของ vsync ฮาร์ดแวร์ที่แท้จริง อย่างไรก็ตาม การขุดอุโมงค์ยังช่วยลดการรองรับเอฟเฟกต์ GPU เช่น การ เบลอ หรือมุมโค้งมนในหน้าต่างภาพซ้อนภาพ (PiP) เนื่องจากบัฟเฟอร์จะข้ามสแต็กกราฟิก Android
ไดอะแกรมต่อไปนี้แสดงให้เห็นว่าการทันเนลทำให้กระบวนการเล่นวิดีโอง่ายขึ้นได้อย่างไร
รูปที่ 1 การเปรียบเทียบกระบวนการเล่นวิดีโอแบบดั้งเดิมและแบบทันเนล
สำหรับนักพัฒนาแอพ
เนื่องจากนักพัฒนาแอปส่วนใหญ่ผสานรวมกับไลบรารีเพื่อการใช้งานการเล่น ในกรณีส่วนใหญ่ การใช้งานจำเป็นต้องกำหนดค่าไลบรารีนั้นใหม่เพื่อการเล่นแบบทันเนลเท่านั้น สำหรับการใช้งานโปรแกรมเล่นวิดีโอแบบทันเนลในระดับต่ำ ให้ใช้คำแนะนำต่อไปนี้
สำหรับการเล่นวิดีโอตามความต้องการใน Android 5 หรือสูงกว่า:
สร้างอินสแตนซ์
SurfaceView
สร้างอินสแตนซ์
audioSessionId
สร้างอินสแตนซ์
AudioTrack
และMediaCodec
ด้วยอินสแตนซ์audioSessionId
ที่สร้างในขั้นตอนที่ 2จัดคิวข้อมูลเสียงไปที่
AudioTrack
ด้วยการประทับเวลาการนำเสนอสำหรับเฟรมเสียงแรกในข้อมูลเสียง
สำหรับการเล่นถ่ายทอดสดใน Android 11 หรือสูงกว่า:
สร้างอินสแตนซ์
SurfaceView
รับอินสแตนซ์
avSyncHwId
จากTuner
สร้างอินสแตนซ์
AudioTrack
และMediaCodec
ด้วยอินสแตนซ์avSyncHwId
ที่สร้างในขั้นตอนที่ 2
ขั้นตอนการเรียก API จะแสดงในข้อมูลโค้ดต่อไปนี้:
aab.setContentType(AudioAttributes.CONTENT_TYPE_MOVIE);
// configure for audio clock sync
aab.setFlag(AudioAttributes.FLAG_HW_AV_SYNC);
// or, for tuner clock sync (Android 11 or higher)
new tunerConfig = TunerConfiguration(0, avSyncId);
aab.setTunerConfiguration(tunerConfig);
if (codecName == null) {
return FAILURE;
}
// configure for audio clock sync
mf.setInteger(MediaFormat.KEY_AUDIO_SESSION_ID, audioSessionId);
// or, for tuner clock sync (Android 11 or higher)
mf.setInteger(MediaFormat.KEY_HARDWARE_AV_SYNC_ID, avSyncId);
พฤติกรรมการเล่นวิดีโอแบบออนดีมานด์
เนื่องจากการเล่นวิดีโอแบบทันเนลตามต้องการจะเชื่อมโยงกับการเล่น AudioTrack
โดยนัย ลักษณะการทำงานของการเล่นวิดีโอแบบทันเนลอาจขึ้นอยู่กับลักษณะการทำงานของการเล่นเสียง
ในอุปกรณ์ส่วนใหญ่ ตามค่าเริ่มต้น เฟรมวิดีโอจะไม่แสดงผลจนกว่าจะเริ่มเล่นเสียง อย่างไรก็ตาม แอปอาจต้องแสดงเฟรมวิดีโอก่อนเริ่มเล่นเสียง เช่น เพื่อแสดงตำแหน่งวิดีโอปัจจุบันให้ผู้ใช้เห็นขณะค้นหา
หากต้องการส่งสัญญาณว่าเฟรมวิดีโอที่เข้าคิวแรกควรแสดงผลทันทีที่ถอดรหัส ให้ตั้ง
PARAMETER_KEY_TUNNEL_PEEK
เป็น1
เมื่อมีการจัดลำดับเฟรมวิดีโอที่บีบอัดใหม่ในคิว (เช่น เมื่อ มีเฟรม B ) นี่หมายความว่าเฟรมวิดีโอที่แสดงครั้งแรกควรเป็นเฟรม I เสมอหากคุณไม่ต้องการให้เฟรมวิดีโอที่เข้าคิวแรกถูกแสดงจนกว่าการเล่นเสียงจะเริ่มขึ้น ให้ตั้งค่าพารามิเตอร์นี้เป็น
0
หากไม่ได้ตั้งค่าพารามิเตอร์นี้ OEM จะกำหนดลักษณะการทำงานของอุปกรณ์
เมื่อไม่มีข้อมูลเสียงใน
AudioTrack
และบัฟเฟอร์ว่างเปล่า (เสียงขาดหายไป) การเล่นวิดีโอจะหยุดทำงานจนกว่าจะมีการเขียนข้อมูลเสียงมากขึ้นเนื่องจากนาฬิกาเสียงไม่ก้าวหน้าอีกต่อไปในระหว่างการเล่น ความไม่ต่อเนื่องที่แอปแก้ไขไม่ได้อาจปรากฏในการประทับเวลาของการนำเสนอเสียง เมื่อสิ่งนี้เกิดขึ้น OEM จะแก้ไขช่องว่างเชิงลบโดยการทำให้เฟรมวิดีโอปัจจุบันหยุดชะงัก และช่องว่างที่เป็นบวกโดยการวางเฟรมวิดีโอหรือแทรกเฟรมเสียงที่เงียบ (ขึ้นอยู่กับการใช้งาน OEM) ตำแหน่งเฟรมของ
AudioTimestamp
ไม่เพิ่มขึ้นสำหรับเฟรมเสียงที่ไม่มีการแทรก
สำหรับผู้ผลิตอุปกรณ์
การกำหนดค่า
OEM ควรสร้างตัวถอดรหัสวิดีโอแยกต่างหากเพื่อรองรับการเล่นวิดีโอแบบทันเนล ตัวถอดรหัสนี้ควรโฆษณาว่าสามารถเล่นทันเนลในไฟล์ media_codecs.xml
:
<Feature name="tunneled-playback" required="true"/>
เมื่อมีการกำหนดค่าอินสแตนซ์ MediaCodec
แบบทันเนลด้วย ID เซสชันเสียง จะสอบถาม AudioFlinger
สำหรับ HW_AV_SYNC
ID นี้:
if (entry.getKey().equals(MediaFormat.KEY_AUDIO_SESSION_ID)) {
int sessionId = 0;
try {
sessionId = (Integer)entry.getValue();
}
catch (Exception e) {
throw new IllegalArgumentException("Wrong Session ID Parameter!");
}
keys[i] = "audio-hw-sync";
values[i] = AudioSystem.getAudioHwSyncForSession(sessionId);
}
ในระหว่างการสืบค้นนี้ AudioFlinger
ดึง HW_AV_SYNC
ID จากอุปกรณ์เสียงหลักและเชื่อมโยงภายในกับ ID เซสชันเสียง:
audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
char *reply = dev->get_parameters(dev, AUDIO_PARAMETER_HW_AV_SYNC);
AudioParameter param = AudioParameter(String8(reply));
int hwAVSyncId;
param.getInt(String8(AUDIO_PARAMETER_HW_AV_SYNC), hwAVSyncId);
หากสร้างอินสแตนซ์ AudioTrack
แล้ว รหัส HW_AV_SYNC
จะถูกส่งไปยังสตรีมเอาต์พุตที่มีรหัสเซสชันเสียงเดียวกัน หากยังไม่ได้สร้าง HW_AV_SYNC
ID จะถูกส่งต่อไปยังเอาต์พุตสตรีมระหว่างการสร้าง AudioTrack
ทำได้โดย เธรดการเล่น :
mOutput->stream->common.set_parameters(&mOutput->stream->common, AUDIO_PARAMETER_STREAM_HW_AV_SYNC, hwAVSyncId);
รหัส HW_AV_SYNC
ไม่ว่าจะสอดคล้องกับกระแสข้อมูลเสียงออกหรือการกำหนดค่าเครื่องรับ Tuner
จะถูกส่งผ่านไปยังคอมโพเนนต์ OMX หรือ Codec2 เพื่อให้รหัส OEM สามารถเชื่อมโยงตัวแปลงสัญญาณกับกระแสข้อมูลเสียงที่ตรงกันหรือสตรีมเครื่องรับ
ในระหว่างการกำหนดค่าส่วนประกอบ ส่วนประกอบ OMX หรือ Codec2 ควรส่งคืนหมายเลขอ้างอิงไซด์แบนด์ที่สามารถใช้เพื่อเชื่อมโยงตัวแปลงสัญญาณกับเลเยอร์ Hardware Composer (HWC) เมื่อแอปเชื่อมโยงพื้นผิวกับ MediaCodec
ตัวจัดการแถบด้านข้างนี้จะถูกส่งต่อไปยัง HWC ผ่าน SurfaceFlinger
ซึ่งกำหนดค่าเลเยอร์เป็นเลเยอร์ แถบด้านข้าง
err = native_window_set_sideband_stream(nativeWindow.get(), sidebandHandle);
if (err != OK) {
ALOGE("native_window_set_sideband_stream(%p) failed! (err %d).", sidebandHandle, err);
return err;
}
HWC มีหน้าที่รับบัฟเฟอร์รูปภาพใหม่จากเอาต์พุตของตัวแปลงสัญญาณในเวลาที่เหมาะสม ไม่ว่าจะซิงโครไนซ์กับสตรีมเอาต์พุตเสียงที่เกี่ยวข้องหรือนาฬิกาอ้างอิงโปรแกรมจูนเนอร์ ประกอบบัฟเฟอร์กับเนื้อหาปัจจุบันของเลเยอร์อื่น และแสดงภาพที่ได้ สิ่งนี้เกิดขึ้นโดยไม่ขึ้นกับวงจรการเตรียมและการตั้งค่าปกติ การจัดเตรียมและตั้งค่าการโทรจะเกิดขึ้นก็ต่อเมื่อเลเยอร์อื่นเปลี่ยนแปลง หรือเมื่อคุณสมบัติของเลเยอร์ไซด์แบนด์ (เช่น ตำแหน่งหรือขนาด) เปลี่ยนไป
OMX
คอมโพเนนต์ตัวถอดรหัสแบบทันเนลควรสนับสนุนสิ่งต่อไปนี้:
การตั้งค่าพารามิเตอร์เพิ่มเติม
OMX.google.android.index.configureVideoTunnelMode
ซึ่งใช้โครงสร้างConfigureVideoTunnelModeParams
เพื่อส่งผ่านในHW_AV_SYNC
ID ที่เชื่อมโยงกับอุปกรณ์เอาต์พุตเสียงการกำหนดค่าพารามิเตอร์
OMX_IndexConfigAndroidTunnelPeek
ที่บอกให้ตัวแปลงสัญญาณแสดงผลหรือไม่แสดงเฟรมวิดีโอที่ถอดรหัสแรก โดยไม่คำนึงว่าการเล่นเสียงจะเริ่มต้นขึ้นหรือไม่กำลังส่งเหตุการณ์
OMX_EventOnFirstTunnelFrameReady
เมื่อเฟรมวิดีโอช่องสัญญาณแรกถูกถอดรหัสและพร้อมที่จะแสดงผล
การใช้งาน AOSP จะกำหนดค่าโหมดช่องสัญญาณใน ACodec
ผ่าน OMXNodeInstance
ตามที่แสดงในข้อมูลโค้ดต่อไปนี้:
OMX_INDEXTYPE index;
OMX_STRING name = const_cast<OMX_STRING>(
"OMX.google.android.index.configureVideoTunnelMode");
OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
ConfigureVideoTunnelModeParams tunnelParams;
InitOMXParams(&tunnelParams);
tunnelParams.nPortIndex = portIndex;
tunnelParams.bTunneled = tunneled;
tunnelParams.nAudioHwSync = audioHwSync;
err = OMX_SetParameter(mHandle, index, &tunnelParams);
err = OMX_GetParameter(mHandle, index, &tunnelParams);
sidebandHandle = (native_handle_t*)tunnelParams.pSidebandWindow;
ถ้าส่วนประกอบสนับสนุนการกำหนดค่านี้ ก็ควรจัดสรรหมายเลขอ้างอิงไซด์แบนด์ให้กับตัวแปลงสัญญาณนี้ และส่งกลับผ่านสมาชิก pSidebandWindow
เพื่อให้ HWC สามารถระบุตัวแปลงสัญญาณที่เกี่ยวข้อง หากคอมโพเนนต์ไม่สนับสนุนการกำหนดค่านี้ ควรตั้งค่า bTunneled
เป็น OMX_FALSE
Codec2
ใน Android 11 หรือสูงกว่า Codec2
รองรับการเล่นแบบทันเนล คอมโพเนนต์ตัวถอดรหัสควรสนับสนุนสิ่งต่อไปนี้:
การกำหนดค่า
C2PortTunneledModeTuning
ซึ่งกำหนดค่าโหมดช่องสัญญาณและส่งผ่านในHW_AV_SYNC
ที่ดึงมาจากอุปกรณ์เอาต์พุตเสียงหรือการกำหนดค่าเครื่องรับสัญญาณC2_PARAMKEY_OUTPUT_TUNNEL_HANDLE
เพื่อจัดสรรและดึงหมายเลขอ้างอิงไซด์แบนด์สำหรับ HWCการจัดการ
C2_PARAMKEY_TUNNEL_HOLD_RENDER
เมื่อต่อกับC2Work
ซึ่งสั่งให้ตัวแปลงสัญญาณถอดรหัสและส่งสัญญาณให้เสร็จสิ้นการทำงาน แต่ไม่แสดงบัฟเฟอร์เอาต์พุตจนกว่า 1) ตัวแปลงสัญญาณจะได้รับคำสั่งในภายหลังให้แสดงผลหรือ 2) การเล่นเสียงเริ่มต้นขึ้นการจัดการ
C2_PARAMKEY_TUNNEL_START_RENDER
ซึ่งสั่งให้ตัวแปลงสัญญาณแสดงเฟรมที่ทำเครื่องหมายด้วยC2_PARAMKEY_TUNNEL_HOLD_RENDER
แม้ว่าการเล่นเสียงจะยังไม่เริ่มต้นก็ตามปล่อยให้
debug.stagefright.ccodec_delayed_params
(แนะนำ) หากคุณกำหนดค่า ให้ตั้งค่าfalse
การใช้งาน AOSP จะกำหนดค่าโหมดช่องสัญญาณใน CCodec
ผ่าน C2PortTunnelModeTuning
ดังที่แสดงในข้อมูลโค้ดต่อไปนี้:
if (msg->findInt32("audio-hw-sync", &tunneledPlayback->m.syncId[0])) {
tunneledPlayback->m.syncType =
C2PortTunneledModeTuning::Struct::sync_type_t::AUDIO_HW_SYNC;
} else if (msg->findInt32("hw-av-sync-id", &tunneledPlayback->m.syncId[0])) {
tunneledPlayback->m.syncType =
C2PortTunneledModeTuning::Struct::sync_type_t::HW_AV_SYNC;
} else {
tunneledPlayback->m.syncType =
C2PortTunneledModeTuning::Struct::sync_type_t::REALTIME;
tunneledPlayback->setFlexCount(0);
}
c2_status_t c2err = comp->config({ tunneledPlayback.get() }, C2_MAY_BLOCK,
failures);
std::vector<std::unique_ptr<C2Param>> params;
c2err = comp->query({}, {C2PortTunnelHandleTuning::output::PARAM_TYPE},
C2_DONT_BLOCK, ¶ms);
if (c2err == C2_OK && params.size() == 1u) {
C2PortTunnelHandleTuning::output *videoTunnelSideband =
C2PortTunnelHandleTuning::output::From(params[0].get());
return OK;
}
ถ้าส่วนประกอบสนับสนุนการกำหนดค่านี้ ก็ควรจัดสรรหมายเลขอ้างอิงไซด์แบนด์ให้กับตัวแปลงสัญญาณนี้ และส่งกลับผ่าน C2PortTunnelHandlingTuning
เพื่อให้ HWC สามารถระบุตัวแปลงสัญญาณที่เกี่ยวข้อง
เครื่องเสียง HAL
สำหรับการเล่นวิดีโอแบบออนดีมานด์ Audio HAL จะได้รับการประทับเวลาของการนำเสนอเสียงแบบอินไลน์กับข้อมูลเสียงในรูปแบบ big-endian ภายในส่วนหัวที่พบที่จุดเริ่มต้นของแต่ละบล็อกของข้อมูลเสียงที่แอปเขียน:
struct TunnelModeSyncHeader {
// The 32-bit data to identify the sync header (0x55550002)
int32 syncWord;
// The size of the audio data following the sync header before the next sync
// header might be found.
int32 sizeInBytes;
// The presentation timestamp of the first audio sample following the sync
// header.
int64 presentationTimestamp;
// The number of bytes to skip after the beginning of the sync header to find the
// first audio sample (20 bytes for compressed audio, or larger for PCM, aligned
// to the channel count and sample size).
int32 offset;
}
เพื่อให้ HWC แสดงเฟรมวิดีโอให้ตรงกับเฟรมเสียงที่เกี่ยวข้อง Audio HAL ควรแยกวิเคราะห์ส่วนหัวของการซิงค์และใช้การประทับเวลาของการนำเสนอเพื่อซิงโครไนซ์นาฬิกาเล่นซ้ำกับการแสดงเสียง ในการซิงโครไนซ์อีกครั้งเมื่อกำลังเล่นเสียงที่บีบอัด Audio HAL อาจจำเป็นต้องแยกวิเคราะห์ข้อมูลเมตาภายในข้อมูลเสียงที่บีบอัดเพื่อกำหนดระยะเวลาในการเล่น
หยุดสนับสนุน
Android 5 หรือต่ำกว่าไม่รองรับการหยุดชั่วคราว คุณสามารถหยุดการเล่นแบบทันเนลชั่วคราวได้ด้วยการอดอาหาร A/V เท่านั้น แต่ถ้าบัฟเฟอร์ภายในสำหรับวิดีโอมีขนาดใหญ่ (เช่น มีข้อมูล 1 วินาทีในคอมโพเนนต์ OMX) จะทำให้การหยุดชั่วคราวดูไม่ตอบสนอง
ใน Android 5.1 หรือสูงกว่า AudioFlinger
รองรับการหยุดชั่วคราวและเล่นต่อสำหรับเอาต์พุตเสียงโดยตรง (แบบอุโมงค์) หาก HAL ใช้การหยุดชั่วคราวและเล่นต่อ การติดตามการหยุดชั่วคราวและการดำเนินการต่อจะถูกส่งต่อไปยัง HAL
ลำดับการเรียกหยุดชั่วคราว ล้าง และเล่นต่อนั้นทำได้โดยเรียกใช้การเรียก HAL ในเธรดการเล่น (เหมือนกับ offload)
คำแนะนำในการดำเนินการ
เครื่องเสียง HAL
สำหรับ Android 11 สามารถใช้ HW sync ID จาก PCR หรือ STC สำหรับการซิงค์ A/V ได้ ดังนั้นจึงรองรับการสตรีมเฉพาะวิดีโอเท่านั้น
สำหรับ Android 10 หรือต่ำกว่า อุปกรณ์ที่รองรับการเล่นวิดีโอแบบทันเนลควรมีโปรไฟล์สตรีมเอาต์พุตเสียงอย่างน้อยหนึ่งโปรไฟล์ที่มีแฟล็ก FLAG_HW_AV_SYNC
และ AUDIO_OUTPUT_FLAG_DIRECT
ในไฟล์ audio_policy.conf
แฟล็กเหล่านี้ใช้เพื่อตั้งค่านาฬิการะบบจากนาฬิกาเสียง
OMX
ผู้ผลิตอุปกรณ์ควรมีส่วนประกอบ OMX แยกต่างหากสำหรับการเล่นวิดีโอแบบทันเนล (ผู้ผลิตสามารถมีส่วนประกอบ OMX เพิ่มเติมสำหรับการเล่นเสียงและวิดีโอประเภทอื่นๆ เช่น การเล่นที่ปลอดภัย) ส่วนประกอบทันเนลควร:
ระบุ 0 บัฟเฟอร์ (
nBufferCountMin
,nBufferCountActual
) บนพอร์ตเอาต์พุตใช้ส่วนขยาย
OMX.google.android.index.prepareForAdaptivePlayback setParameter
ระบุความสามารถในไฟล์
media_codecs.xml
และประกาศคุณลักษณะการเล่นทันเนล นอกจากนี้ยังควรชี้แจงข้อจำกัดเกี่ยวกับขนาดเฟรม การจัดตำแหน่ง หรือบิตเรต ตัวอย่างแสดงอยู่ด้านล่าง:<MediaCodec name="OMX.OEM_NAME.VIDEO.DECODER.AVC.tunneled" type="video/avc" > <Feature name="adaptive-playback" /> <Feature name="tunneled-playback" required=”true” /> <Limit name="size" min="32x32" max="3840x2160" /> <Limit name="alignment" value="2x2" /> <Limit name="bitrate" range="1-20000000" /> ... </MediaCodec>
หากใช้คอมโพเนนต์ OMX เดียวกันเพื่อรองรับการถอดรหัสแบบทันเนลและแบบไม่ทันเนล คอมโพเนนต์ดังกล่าวควรปล่อยให้ฟีเจอร์การเล่นแบบทันเนลเป็นแบบไม่จำเป็น ตัวถอดรหัสทั้งแบบอุโมงค์และแบบไม่มีช่องสัญญาณจะมีข้อจำกัดด้านความสามารถเหมือนกัน ตัวอย่างแสดงอยู่ด้านล่าง:
<MediaCodec name="OMX._OEM\_NAME_.VIDEO.DECODER.AVC" type="video/avc" >
<Feature name="adaptive-playback" />
<Feature name="tunneled-playback" />
<Limit name="size" min="32x32" max="3840x2160" />
<Limit name="alignment" value="2x2" />
<Limit name="bitrate" range="1-20000000" />
...
</MediaCodec>
นักแต่งเพลงฮาร์ดแวร์ (HWC)
เมื่อมีเลเยอร์ทันเนล (เลเยอร์ที่มี HWC_SIDEBAND
compositionType
) บนจอแสดงผล sidebandStream
ของเลเยอร์จะเป็นที่จับไซด์แบนด์ที่จัดสรรโดยคอมโพเนนต์วิดีโอ OMX
HWC จะซิงโครไนซ์เฟรมวิดีโอที่ถอดรหัสแล้ว (จากองค์ประกอบ OMX แบบทันเนล) กับแทร็กเสียงที่เกี่ยวข้อง (ด้วย ID audio-hw-sync
) เมื่อเฟรมวิดีโอใหม่กลายเป็นเฟรมปัจจุบัน HWC จะรวมเฟรมกับเนื้อหาปัจจุบันของเลเยอร์ทั้งหมดที่ได้รับในระหว่างการเตรียมการหรือตั้งค่าครั้งล่าสุด และแสดงภาพที่ได้ การจัดเตรียมหรือตั้งค่าการโทรจะเกิดขึ้นเมื่อเลเยอร์อื่นเปลี่ยนแปลง หรือเมื่อคุณสมบัติของเลเยอร์ไซด์แบนด์ (เช่น ตำแหน่งหรือขนาด) เปลี่ยนไป
รูปต่อไปนี้แสดงถึง HWC ที่ทำงานร่วมกับฮาร์ดแวร์ซิงโครไนซ์ (หรือเคอร์เนลหรือไดรเวอร์) เพื่อรวมเฟรมวิดีโอ (7b) กับองค์ประกอบล่าสุด (7a) สำหรับการแสดงผลในเวลาที่ถูกต้อง โดยอิงตามเสียง (7c)
รูปที่ 2. ตัวซิงโครไนซ์ฮาร์ดแวร์ HWC (หรือเคอร์เนลหรือไดรเวอร์)