AwesomePlayer::onVideoEvent
除了透過
OMXCodec::read
取得解碼後的資料外,還必須將這些資料
(mVideoBuffer)
傳給
video renderer
,以便畫到螢幕上去。
(1)
要將
mVideoBuffer
中的資料畫出來之前,必須先建立
mVideoRenderer
void
AwesomePlayer:
:
onVideoEvent(
)
{
.
.
.
if
(
mVideoRenderer =
=
NULL
)
{
initRenderer_l(
)
;
}
.
.
.
}
void
AwesomePlayer:
:
initRenderer_l(
)
{
if
(
!
strncmp
(
"OMX."
,
component,
4)
)
{
mVideoRenderer =
new
AwesomeRemoteRenderer(
mClient.
interface(
)
-
>
createRenderer(
mISurface,
component,
.
.
.
)
)
;
.
.
.
.
.
.
.
.
.
.
(
2)
}
else
{
mVideoRenderer =
new
AwesomeLocalRenderer(
.
.
.
,
component,
mISurface)
;
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
3)
}
}
|
(2)
如果
video decoder
是
OMX component
,則建立一個
AwesomeRemoteRenderer
作為
mVideoRenderer
從上段的程式碼
(1)
來看,
AwesomeRemoteRenderer
的本質是由
OMX::createRenderer
所創建的。
createRenderer
會先建立一個
hardware renderer --
SharedVideoRenderer (libstagefrighthw.so)
;若失敗,則建立
software renderer -- SoftwareRenderer (surface)
。
sp<
IOMXRenderer>
OMX:
:
createRenderer(
.
.
.
)
{
VideoRenderer *
impl =
NULL
;
libHandle =
dlopen(
"libstagefrighthw.so"
,
RTLD_NOW)
;
if
(
libHandle)
{
CreateRendererFunc func =
dlsym(
libHandle,
.
.
.
)
;
impl =
(
*
func)
(
.
.
.
)
;
<----------------- Hardware Renderer
}
if
(
!
impl)
{
impl =
new
SoftwareRenderer(
.
.
.
)
;
<---- Software Renderer
}
}
|
(3)
如果
video decoder
是
software component
,則建立一個
AwesomeLocalRenderer
作為
mVideoRenderer
AwesomeLocalRenderer
的
constructor
會呼叫本身的
init
函式,其所做的事和
OMX::createRenderer
一模一樣。
void
AwesomeLocalRenderer:
:
init(
.
.
.
)
{
mLibHandle =
dlopen(
"libstagefrighthw.so"
,
RTLD_NOW)
;
if
(
mLibHandle)
{
CreateRendererFunc func =
dlsym(
.
.
.
)
;
mTarget =
(
*
func)
(
.
.
.
)
;
<---------------- Hardware Renderer
}
if
(
mTarget =
=
NULL
)
{
mTarget =
new
SoftwareRenderer(
.
.
.
)
;
<--- Software Renderer
}
}
|
(4) mVideoRenderer
一經建立就可以開始將解碼後的資料傳給它
void
AwesomePlayer:
:
onVideoEvent(
)
{
if
(
!
mVideoBuffer)
{
mVideoSource-
>
read
(
&
mVideoBuffer,
.
.
.
)
;
}
[
Check Timestamp]
if
(
mVideoRenderer =
=
NULL
)
{
initRenderer_l(
)
;
}
mVideoRenderer-
>
render(
mVideoBuffer)
;
<
-
-
-
-
-
Render Data
}
|