2014-12-02 5 views
67

Ich habe seit mehr als einer Woche mit diesem Problem zu kämpfen, und es ist wahrscheinlich ein Fehler in der Qualcomm GPU/Hardware-Video-Encoder. Da wir gezwungen sind, die Anwendung zu veröffentlichen, und ihre Entwicklerforen keine Rückmeldung gegeben haben, poste ich sie auch hier, in der Hoffnung, dass jemand in der Lage ist, einige Hinweise zu geben, oder besser noch, einen Workaround, so dass der Fehler im Encoder ist nicht ausgelöst.Encoder Absturz auf Adreno GPU während der Codierung von Surface

Die Anwendung codiert von einer Oberfläche. Wenn bestimmte Bilder auf die Oberfläche gerendert werden, schlägt der Encoder (100%) an derselben Stelle fehl (wenn der aktuell codierte Frame ein Schlüsselbild ist). Die Logcat Ausgabe vom Codierer an der Stelle des Absturzes ist (mit den letzten Zeilen bei einer sehr hohen Rate wiederholt):

11-26 11:41:33.312: E/OMX-VENC-720p(25949): ERROR: async_msg_process() - Error statuscode = 1 
11-26 11:41:33.312: E/ACodec(29317): [OMX.qcom.video.encoder.avc] ERROR(0x80001009) 
11-26 11:41:33.312: E/MediaCodec(29317): Codec reported an error. (omx error 0x80001009, internalError -2147483648) 
11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: venc_use_buf:set input buffer failed 
11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: in dev_use_buf 
11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: empty_buffer_done() failed! 
11-26 11:41:33.372: E/OMX-VENC-720p(25949): m_fbd_count at o/p flush = 306 
11-26 11:41:33.372: E/OMX-VENC-720p(25949): m_etb_count at i/p flush = 313 
11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed 
11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: dev_fill_buf() Failed 
11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: FTBProxy() failed! 

Ich kann es auch durch einfaches Austauschen in der Bilanz GL App auf Grafika replizieren das Zeichnen von zwei geometrischen Formen mit dem Zeichnen eines der problematischen Bilder im Vollbildmodus im Querformat und das Ändern der Bitrate auf einen höheren Wert (7 Mbit/s). Der Absturz des Encoders passiert eher für größere Bitrate.

Hier ist eine image, die scheint es leicht zu brechen und hier ist RecordFBOActivity.java mit den erforderlichen Änderungen.

Mit Grafika habe ich getestet und der Encoder stürzt sowohl auf Samsung S4, internationale Version, und auf dem ursprünglichen Nexus 4 ab. Mit unserer Software, die ein wenig komplexer als das Rendern des normalen Bildes ist, stürzt es immer noch auf beiden ab. Nicht auf anderen Adreno-Geräten getestet. Auf Samsung S3, mit einem Mali 400 GPU, funktioniert es gut.

Bei 4Mbps stürzt der Encoder in unserer Anwendung immer noch auf S4 und N4 ab, aber später. Grafika stürzt am selben Ort auf N4 ab, aber nicht auf S4.

EDIT: Nach den Kommentaren unten, kann es auch bei der Codierung des gleichen Bildes aus dem Puffer reproduziert werden. Verschiedene Tests scheinen die Bedingungen zu verengen, um es zu reproduzieren: h264 hw - Encoder auf Qualcomm - Geräten, Kodierung eines Standbildes für viele Frames (dies bestimmt sehr niedrige Bitraten im Encoder aufgrund ähnlicher Frames), Fehler beim Kodieren eines Keyframes (der Fehler tritt nur beim Verschlüsseln bestimmter Bilder auf, die mehr Details zu haben scheinen, dh viele Bits zur Intra-Codierung benötigen).

+1

Der 'omx' Fehlercode von' 0x80001009' ist 'OMX_ErrorHardware', was bedeutet, dass die Komponente einen Fehler zurückgibt, der sich auf die zugrunde liegende Hardware bezieht. Können Sie bei einer Oberflächenaufnahme schnell das Farbformat des Frames überprüfen, der der zugrunde liegenden HW zur Verfügung gestellt wird? Können Sie versuchen, indem Sie vom RGB- in den YUV-Raum umwandeln, sagen Sie 'YUV420 Planar' oder' YUV420 Interleaved' und rufen Sie dann den Encoder zum Codieren auf? – Ganesh

+3

Bitte versuchen Sie das INDE Media for Mobile-, GLCapture-Beispiel von: https://github.com/INDExOS/media-for-mobile. Stürzt es ab? Es wurde auf jeden Fall überprüft, um S4 zu bearbeiten. Ich erinnere mich auch, dass auf einigen Geräten Probleme mit hohen Bitraten aufgrund zu kleiner (optimaler) Speicherpufferzuweisungen für codierte Frames auftraten, so dass wir die maximale Bitrate begrenzen mussten: – Marlon

+0

@Ganesh: mEncoder.getCodecInfo(). GetCapabilitiesForType ("video/avc ") gibt 0x7FA30C06 (nicht in den Definitionen aus der statischen Klasse CodecCapabilities gefunden, nur gefunden COLOR_QCOM_FormatYUV420SemiPlanar, was tatsächlich 0x7FA30C00 ist), 0x7F000789 (COLOR_FormatSurface), 21 (COLOR_FormatYUV420SemiPlanar), -1320330260 (konnte es nicht identifizieren). Ich verwende COLOR_FormatSurface, wenn das Format des Encoders konfiguriert ist, was "anzeigt, dass die Daten eine GraphicBuffer-Metadatenreferenz sind". Mit RGB-> YUV und dann encodieren, meinen Sie glReadPixels, führen die Konvertierung durch und kodieren dann aus dem Puffer? Oder? – user1592546

Antwort

1

Es scheint sich um einen Fehler zu handeln, wie oben erwähnt.

Verwandte Themen