175290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten/*
275290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten * Copyright (C) 2011 The Android Open Source Project
375290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten *
475290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
575290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten * you may not use this file except in compliance with the License.
675290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten * You may obtain a copy of the License at
775290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten *
875290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
975290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten *
1075290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten * Unless required by applicable law or agreed to in writing, software
1175290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
1275290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1375290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten * See the License for the specific language governing permissions and
1475290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten * limitations under the License.
1575290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten */
1675290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
1775290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten// Copied from frameworks/base/cmds/stagefright/stream.cpp
1875290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
1975290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten// Note to NDK developers who happen to see this: this module uses Android internal platform APIs
2075290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten// that are not part of the NDK supported APIs, and are subject to change at any time.
2175290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
2275290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#include <binder/ProcessState.h>
2301e4a8ff63523bba5c8f919a72e0adb66daf4b98Mathias Agopian#include <gui/Surface.h>
2401e4a8ff63523bba5c8f919a72e0adb66daf4b98Mathias Agopian#include <gui/SurfaceComposerClient.h>
2575290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#include <utils/String8.h>
2675290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
2775290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#include "nativewindow.h"
2875290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
2975290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#if 1
3075290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#include <assert.h>
3175290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#define CHECK assert
3275290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#define CHECK_EQ(a,b) CHECK((a)==(b))
3375290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#else
3475290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#include <media/stagefright/foundation/ADebug.h>
3575290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#endif
3675290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
3775290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kastennamespace android {
3875290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
3975290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kastensp<Surface> gSurface;
4075290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kastensp<SurfaceComposerClient> gComposerClient;
4175290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kastensp<SurfaceControl> gControl;
4275290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
4375290ff394698c53f35a21612c03b8ddd21fecf9Glenn KastenANativeWindow *getNativeWindow_()
4475290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten{
4575290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#if 0
4675290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    android::ProcessState::self()->startThreadPool();
4775290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten#endif
4875290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
4975290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient;
5075290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    CHECK_EQ(composerClient->initCheck(), (status_t)OK);
5175290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
5275290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    sp<SurfaceControl> control =
5375290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten        composerClient->createSurface(
5475290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten                String8("A Surface"),
5575290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten                1280,
5675290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten                800,
5775290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten                PIXEL_FORMAT_RGB_565,
5875290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten                0);
5975290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
6075290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    CHECK(control != NULL);
6175290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    CHECK(control->isValid());
6275290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
6375290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    SurfaceComposerClient::openGlobalTransaction();
6475290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    CHECK_EQ(control->setLayer(30000), (status_t)OK);
6575290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    CHECK_EQ(control->show(), (status_t)OK);
6675290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    SurfaceComposerClient::closeGlobalTransaction();
6775290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
6875290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    sp<Surface> surface = control->getSurface();
6975290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    CHECK(surface != NULL);
7075290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
7175290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    gSurface = surface;
7275290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    gComposerClient = composerClient;
7375290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    gControl = control;
7475290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    // composerClient->dispose() at exit
7575290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    return surface.get();
7675290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten}
7775290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
78b17edb96ba759cd1197bf13cd13e279ee144da60Glenn Kastenvoid disposeNativeWindow_()
79b17edb96ba759cd1197bf13cd13e279ee144da60Glenn Kasten{
80b17edb96ba759cd1197bf13cd13e279ee144da60Glenn Kasten    gComposerClient->dispose();
81b17edb96ba759cd1197bf13cd13e279ee144da60Glenn Kasten}
82b17edb96ba759cd1197bf13cd13e279ee144da60Glenn Kasten
8375290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten} // namespace android
8475290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten
8575290ff394698c53f35a21612c03b8ddd21fecf9Glenn KastenANativeWindow *getNativeWindow()
8675290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten{
8775290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten    return android::getNativeWindow_();
8875290ff394698c53f35a21612c03b8ddd21fecf9Glenn Kasten}
89b17edb96ba759cd1197bf13cd13e279ee144da60Glenn Kasten
90b17edb96ba759cd1197bf13cd13e279ee144da60Glenn Kastenvoid disposeNativeWindow()
91b17edb96ba759cd1197bf13cd13e279ee144da60Glenn Kasten{
92b17edb96ba759cd1197bf13cd13e279ee144da60Glenn Kasten    android::disposeNativeWindow_();
93b17edb96ba759cd1197bf13cd13e279ee144da60Glenn Kasten}
94