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