這篇文章將介紹
Stagefright
中是如何和
OMX video decoder
傳遞
buffer
。

(1) OMXCodec
會在一開始的時候透過
read
函式來傳送未解碼的
data
給
decoder
,並且要求
decoder
將解碼後的
data
傳回來
|
(2) Decoder
從
input port
讀取資料後,開始進行解碼,並且回傳
EmptyBufferDone
通知
OMXCodec
|
OMXCodec
收到
EMPTY_BUFFER_DONE
之後,繼續傳送下一個未解碼的資料給
decoder
。
(3) Decoder
將解碼完的資料送到
output port
,並回傳
FillBufferDone
通知
OMXCodec
|
OMXCodec
收到
FILL_BUFFER_DONE
之後,將解碼後的資料放入
mFilledBuffers
,發出
mBufferFilled
信號,並且要求
decoder
繼續送出資料。
(4) read
函式在後段等待
mBufferFilled
信號。當
mFilledBuffers
被填入資料後,
read
函式將其指定給
buffer
指標,並回傳給
AwesomePlayer
status_t OMXCodec:
:
read
(
MediaBuffer *
*
buffer,
.
.
.
)
{
.
.
.
while
(
mFilledBuffers.
empty(
)
)
{
mBufferFilled.
wait(
mLock)
;
}
BufferInfo *
info =
&
mPortBuffers[
kPortIndexOutput]
.
editItemAt(
index)
;
info-
>
mMediaBuffer-
>
add_ref(
)
;
*
buffer =
info-
>
mMediaBuffer;
}