C++程序  |  94行  |  2.33 KB

/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Copied from frameworks/base/cmds/stagefright/stream.cpp

// Note to NDK developers who happen to see this: this module uses Android internal platform APIs
// that are not part of the NDK supported APIs, and are subject to change at any time.

#include <binder/ProcessState.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <utils/String8.h>

#include "nativewindow.h"

#if 1
#include <assert.h>
#define CHECK assert
#define CHECK_EQ(a,b) CHECK((a)==(b))
#else
#include <media/stagefright/foundation/ADebug.h>
#endif

namespace android {

sp<Surface> gSurface;
sp<SurfaceComposerClient> gComposerClient;
sp<SurfaceControl> gControl;

ANativeWindow *getNativeWindow_()
{
#if 0
    android::ProcessState::self()->startThreadPool();
#endif

    sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient;
    CHECK_EQ(composerClient->initCheck(), (status_t)OK);

    sp<SurfaceControl> control =
        composerClient->createSurface(
                String8("A Surface"),
                1280,
                800,
                PIXEL_FORMAT_RGB_565,
                0);

    CHECK(control != NULL);
    CHECK(control->isValid());

    SurfaceComposerClient::Transaction{}
            .setLayer(control, 30000)
            .show(control)
            .apply();

    sp<Surface> surface = control->getSurface();
    CHECK(surface != NULL);

    gSurface = surface;
    gComposerClient = composerClient;
    gControl = control;
    // composerClient->dispose() at exit
    return surface.get();
}

void disposeNativeWindow_()
{
    gComposerClient->dispose();
}

} // namespace android

ANativeWindow *getNativeWindow()
{
    return android::getNativeWindow_();
}

void disposeNativeWindow()
{
    android::disposeNativeWindow_();
}