Android Surface ICS에서 변경된 부분. native media
Android :
2012. 3. 16. 11:39
반응형
NDK에 Native media 라는게 생겨서 봤더니 native로 surface 를 전달하는게 있었습니다.
옛날에 삽질하던것이 아예 native에 추가가 되었네요
그래서 SurfaceControl 쪽에 friend 클래스로 native쪽이 추가되었나? 하는 생각이 들어서 그쪽을 봤더니
기존에
이렇게 되어 있던 것들이 다 바뀌어서
달랑 이렇게 되어버렸네요
그래서 ISurface를 어떻게 가져오나 봤더니
이런게 생겨서 Parcel 타입으로 가져올수 있게 되었네요.
현대 mn 할때 ISurface Parcel에 담아서 binder로 전달하고 하던 과정이 한방에 처리되게 바꼈어요.
우왕 굳.
옛날에 삽질하던것이 아예 native에 추가가 되었네요
그래서 SurfaceControl 쪽에 friend 클래스로 native쪽이 추가되었나? 하는 생각이 들어서 그쪽을 봤더니
기존에
- CODE: SELECT ALL
private:
// can't be copied
SurfaceControl& operator = (SurfaceControl& rhs);
SurfaceControl(const SurfaceControl& rhs);
friend class SurfaceComposerClient;
// camera and camcorder need access to the ISurface binder interface for preview
friend class Camera;
friend class MediaRecorder;
// mediaplayer needs access to ISurface for display
friend class MediaPlayer;
// for testing
friend class Test;
const sp<ISurface>& getISurface() const { return mSurface; }
이렇게 되어 있던 것들이 다 바뀌어서
- CODE: SELECT ALL
private:
// can't be copied
SurfaceControl& operator = (SurfaceControl& rhs);
SurfaceControl(const SurfaceControl& rhs);
friend class SurfaceComposerClient;
friend class Surface;
달랑 이렇게 되어버렸네요
그래서 ISurface를 어떻게 가져오나 봤더니
- CODE: SELECT ALL
status_t Surface::writeToParcel(
const sp<Surface>& surface, Parcel* parcel)
{
sp<ISurface> sur;
sp<ISurfaceTexture> st;
uint32_t identity = 0;
if (Surface::isValid(surface)) {
sur = surface->mSurface;
st = surface->getISurfaceTexture();
identity = surface->mIdentity;
} else if (surface != 0 &&
(surface->mSurface != NULL ||
surface->getISurfaceTexture() != NULL)) {
ALOGE("Parceling invalid surface with non-NULL ISurface/ISurfaceTexture as NULL: "
"mSurface = %p, surfaceTexture = %p, mIdentity = %d, ",
surface->mSurface.get(), surface->getISurfaceTexture().get(),
surface->mIdentity);
}
parcel->writeStrongBinder(sur != NULL ? sur->asBinder() : NULL);
parcel->writeStrongBinder(st != NULL ? st->asBinder() : NULL);
parcel->writeInt32(identity);
return NO_ERROR;
}
Mutex Surface::sCachedSurfacesLock;
DefaultKeyedVector<wp<IBinder>, wp<Surface> > Surface::sCachedSurfaces;
sp<Surface> Surface::readFromParcel(const Parcel& data) {
Mutex::Autolock _l(sCachedSurfacesLock);
sp<IBinder> binder(data.readStrongBinder());
sp<Surface> surface = sCachedSurfaces.valueFor(binder).promote();
if (surface == 0) {
surface = new Surface(data, binder);
sCachedSurfaces.add(binder, surface);
} else {
// The Surface was found in the cache, but we still should clear any
// remaining data from the parcel.
data.readStrongBinder(); // ISurfaceTexture
data.readInt32(); // identity
}
if (surface->mSurface == NULL && surface->getISurfaceTexture() == NULL) {
surface = 0;
}
cleanCachedSurfacesLocked();
return surface;
}
이런게 생겨서 Parcel 타입으로 가져올수 있게 되었네요.
현대 mn 할때 ISurface Parcel에 담아서 binder로 전달하고 하던 과정이 한방에 처리되게 바꼈어요.
우왕 굳.
반응형
'Android' 카테고리의 다른 글
ICS Video Render 과정 (0) | 2012.04.20 |
---|---|
android make update-api (0) | 2012.03.15 |
Android Camera 분석자료 (0) | 2012.03.10 |