Resize Surface beim Ändern der Größe von VirtualDisplay

or einiger Zeit habe ich @ gefradiese Frag die eine Antwort erhalten hat.

Ich habe einen Vermittler implementiertSurface wie die Antwort schon sagt, aber jetzt bin ich auf ein anderes Problem gestoßen. Zu bestimmten Zeitpunkten während meiner Bewerbung wurde meinVirtualDisplay kann die Auflösung ändern. Daher möchte ich auch die Größe meines Vermittlers @ aktualisiereSurface, um der Änderung der Auflösung des @ zu entsprechVirtualDisplay. Ich hatte gehofft, dies wäre ein einfacher Anruf ansetDefaultBufferSize auf derSurface's zugrunde liegendenSurfaceTexture, aber das scheint nicht zu funktionieren.

Ich habe mich umgesehen, als ich meinen Vermittler freigabSurface undSurfaceTexture und mache neue, aber dann muss ich die Ausgabefläche für das @ setzVirtualDisplay, um null zu sein und einige andere Synchronisationsschritte auszuführen, die ich nach Möglichkeit vermeiden möchte.

Gibt es eine Möglichkeit, die Größe eines @ dynamisch zu aktualisiereSurface/SurfaceTexture nach der Erstellung?

AKTUALISIEREN

Ich habe versucht, @ anzurufVirtualDisplay.setSurface(null) zusammen mitVirtualDisplay.resize(newSize.width, newSize.height) und dann eine Nachricht an den Thread senden, der die Rückrufe für den Vermittler behandeltSurfaceTexture um die Textur über @ zu verändesetDefaultBufferSize und dann den Haupt-Thread den Sekundär-Thread abfragen lassen, bis dieser festgelegte Aufruf beendet ist, und dann @ aufrufVirtualDisplay.setSurface(surfaceFromSecondaryThread)

Das funktioniert manchmal. Ein anderes Mal ist die Textur ganz grün mit einem grauen Balken darüber (das ist auch meine glClearColor, nicht sicher, ob das mit @ zusammenhängHie). Manchmal ist das aktuelle Bildschirmbild doppelt / kleiner in meinem @ zu seheVirtualDisplay. Es scheint also ein Timing-Problem zu sein, aber auf welches Timing ich warten sollte, weiß ich nicht genau. Die Dokumentation fürsetDefaultBufferSize Zustände

For OpenGL ES, the EGLSurface should be destroyed (via eglDestroySurface), made not-current (via eglMakeCurrent), and then recreated (via eglCreateWindowSurface) to ensure that the new default size has taken effect.

Das Problem ist, dass mein Code kein EGLSurface aus der SurfaceTexture / Surface erstellt, sodass ich keine Möglichkeit habe, es zu zerstören. Ich gehe davon aus, dass der Produzent VirtualDisplay) tut es, aber es gibt keine öffentlichen APIs für mich, die ich an der EGLSurface erhalten kann.

[UPDATE 2] Also, wenn ich das Problem sehe (grüner Bildschirm mit Balken, Korruption, vielleicht weil meinglClearColor ist grün) wenn ich ein @ macglReadPixels bevor ich @ anrueglSwapBuffers an das @ schreibSurface für dasMediaCodec, Ich lese grüne Pixel. Dies sagt mir, dass es kein @ iMediaCodec Problem, dass entweder die Informationen in das @ geschriebSurface von demVirtualDisplay ist beschädigt (und bleibt beschädigt) oder die Konvertierung von YUV-Raum in RGBA-Raum, wenn von @ aSurface -> OpenGL Textur ist irgendwie kaputt. Ich neige dazu, ein Problem mit @ zu habVirtualDisplay

Antworten auf die Frage(0)

Ihre Antwort auf die Frage