6

BigFlakeの例に続いて、次のようなコメントがあります。

// Acquire a new frame of input, and render it to the Surface.  If we had a
// GLSurfaceView we could switch EGL contexts and call drawImage() a second
// time to render it on screen.  The texture can be shared between contexts by
// passing the GLSurfaceView's EGLContext as eglCreateContext()'s share_context
// argument.

EGL14.getCurrentContext()は現在のコンテキストを照会し、それをEGL14.eglCreateContext()share_context パラメーターに渡しますが、どのように「EGL コンテキストを切り替える」のですか?

GLSurfaceView と MediaCodec.inputSurface には 2 つの異なるサーフェスと 2 つの異なるコンテキストがあるためeglMakeCurrent()、各セットを個別に呼び出すだけだと思いますが、正しいですか? またはする必要がありますeglDestroyContext()eglDestroySurface()

追加されたアップデート

ありがとうFadden、私はdrawFrameの代わりにdrawImageを呼んでいたが、もう一度画像を更新する必要はないはずだ、このエラーを理解したと思う.

glError 1285EOS が設定された後に dequeueBuffer が呼び出されると、メモリ不足エラーが発生しますか??? 録音が停止した後に呼び出しているのかもしれません。ご協力いただきありがとうございます。

MyEGLWrapper.java に EGLSurface を作成する

saveToScreenRenderState();
mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], mScreenEglContext, 
        contextAttribs, 0);
checkEglError("eglCreateContext");

// Create a window surface, and attach it to the Surface we received.
mEGLSurface = EGL14.eglCreateWindowSurface(mEGLDisplay, configs[0], mSurface,
        surfaceAttribs, 0);
checkEglError("eglCreateWindowSurface");

...

private void saveToScreenRenderState() {
    //System.arraycopy(mProjectionMatrix, 0, mSavedMatrix, 0, mProjectionMatrix.length);
    mScreenEglDisplay = EGL14.eglGetCurrentDisplay();
    mScreenEglDrawSurface = EGL14.eglGetCurrentSurface(EGL14.EGL_DRAW);
    mScreenEglReadSurface = EGL14.eglGetCurrentSurface(EGL14.EGL_READ);
    mScreenEglContext = EGL14.eglGetCurrentContext();
}

public void makeCurrent(boolean toScreen, Surface surface) {
    if (toScreen) { //as opposed to toEncoder
        makeScreenSurfaceCurrent();
        return;
    } 
    EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext);
    checkEglError("eglMakeCurrent");
}

private void makeScreenSurfaceCurrent() {
    EGL14.eglMakeCurrent(mScreenEglDisplay, mScreenEglDrawSurface, 
            mScreenEglReadSurface, mScreenEglContext);
    checkEglError("eglMakeCurrent");
}

CaptureManager.java 内

private void drawFrameOnInputSurface() {
    //draw a second time for inputSurface 
    mEGLWrapper.makeCurrent(false, videoCodec.videoCodecInputSurface);
    drawFrame(false);
    //ByteBuffer frame = mStManager.drawImage();
    videoCodec.runQue(false); // clear que before posting should this be on this thread???
    mEGLWrapper.setPresentationTime(mSt.getTimestamp(),!recordingStopped);
    mEGLWrapper.swapBuffers(!recordingStopped);
    videoHandler.post(new Runnable(){
        @Override
        public void run(){
            videoCodec.updateFrame(!isRecording);
        }
    });
}

private void drawFrame(boolean updateImage){
    mStManager.drawImage(updateImage);
    mGLView.mRenderer.drawFrame();
}

SurfaceTextureManager.java 内

public ByteBuffer drawImage(boolean updateImage) {
    // Latch the data.
    if (updateImage){
        mTextureRender.checkGlError("before updateTexImage");
        mSurfaceTexture.updateTexImage();
    }
    return mTextureRender.drawFrame(mSurfaceTexture);
}

SurfaceTextureManager.javaのエラーmSurfaceTexture.updateTexImage();

4

1 に答える 1

5

はい、eglMakeCurrent2 つのコンテキストを切り替えるために使用します。

現在使用していないコンテキストまたはサーフェスを破棄する必要はありません (とにかくシャットダウンするまで)。

共有コンテキストで 2 回レンダリングする例については、bigflake Breakout ゲーム レコーダー パッチを参照してください。

于 2013-10-31T14:55:54.667 に答える