MediaPlayer setDisplay
来源:互联网 发布:plc编码器编程 编辑:程序博客网 时间:2024/06/03 23:43
flow:
setDisplay(MediaPlayer .java)>>_setVideoSurface(android.media.MediaPlayer.cpp)>>setVideoSurface(android.media.MediaPlayer.cpp)
>>setVideoSurfaceTexture(MediaPlayer.cpp)>>setVideoSurfaceTextureAsync(Nuplayer.cpp)
//java
public void setDisplay(SurfaceHolder sh) {
mSurfaceHolder = sh;
Surface surface;
if (sh != null) {
surface = sh.getSurface();
} else {
surface = null;
}
_setVideoSurface(surface);
updateSurfaceScreenOn();
}
private native void _setVideoSurface(Surface surface);
//jni
static void
android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
{
setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */);
}
static void
setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive)
{
sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
if (mp == NULL) {
if (mediaPlayerMustBeAlive) {
jniThrowException(env, "java/lang/IllegalStateException", NULL);
}
return;
}
decVideoSurfaceRef(env, thiz);
sp<IGraphicBufferProducer> new_st;
if (jsurface) {
sp<Surface> surface(android_view_Surface_getSurface(env, jsurface));
if (surface != NULL) {
new_st = surface->getIGraphicBufferProducer();
if (new_st == NULL) {
jniThrowException(env, "java/lang/IllegalArgumentException",
"The surface does not have a binding SurfaceTexture!");
return;
}
new_st->incStrong((void*)decVideoSurfaceRef);
} else {
jniThrowException(env, "java/lang/IllegalArgumentException",
"The surface has been released");
return;
}
}
env->SetLongField(thiz, fields.surface_texture, (jlong)new_st.get());
// This will fail if the media player has not been initialized yet. This
// can be the case if setDisplay() on MediaPlayer.java has been called
// before setDataSource(). The redundant call to setVideoSurfaceTexture()
// in prepare/prepareAsync covers for this case.
mp->setVideoSurfaceTexture(new_st);
}
//c++
status_t MediaPlayer::setVideoSurfaceTexture(
const sp<IGraphicBufferProducer>& bufferProducer)
{
ALOGV("setVideoSurfaceTexture");
Mutex::Autolock _l(mLock);
if (mPlayer == 0) return NO_INIT;
return mPlayer->setVideoSurfaceTexture(bufferProducer);
}
void NuPlayer::setVideoSurfaceTextureAsync(
const sp<IGraphicBufferProducer> &bufferProducer) {
sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
if (bufferProducer == NULL) {
msg->setObject("native-window", NULL);
} else {
msg->setObject(
"native-window",
new NativeWindowWrapper(
new Surface(bufferProducer, true /* controlledByApp */)));
}
msg->post();
}
- MediaPlayer setDisplay
- Android Media Server - MediaPlayer - setDisplay
- setDisPlay
- mediaplayer
- mediaplayer
- mediaplayer
- MediaPlayer
- MediaPlayer
- MediaPlayer
- MediaPlayer
- mediaplayer
- MediaPlayer
- MediaPlayer
- mediaplayer
- MediaPlayer
- MediaPlayer
- Mediaplayer
- MediaPlayer
- box2d错误 Assertion failed: (area > 1.19209290e-7F), function ComputeCentroid
- Redis源码学习笔记(一)-- 整体运行流程详解
- 1014. 福尔摩斯的约会 (20)
- POJ1651 Multiplication Puzzle ACM解题报告(区间dp)
- A. Mr. Kitayuta's Gift(暴力求加一个字符是否构成回文字符)
- MediaPlayer setDisplay
- 图像滤镜处理算法:柔化、光照、放大镜、哈哈镜
- 黑马程序员----OC学习总结--Founation框架
- iOS 开发——关于App 图标
- Maven学习笔记(三)安装目录分析
- B. Mr. Kitayuta's Colorful Graph( Codeforces Round #286 (Div. 2))
- 1015. 德才论 (25)
- OC笔记 - 类的概念(2015.1.26)
- 二级指针和内存分配问题 形参和实参