android video android-ndk hardware-acceleration stagefright

android - Creando el codificador OMXCodec en modo HW



video android-ndk (1)

Estoy tratando de implementar la codificación de video H264 acelerada por HW en Android ICS 4.0.4. Como la clase MediaCodec no está disponible, tengo que usar la API stagefright. Pero cuando pongo el indicador HardwareCodecsOnly , OMXCodec :: Create siempre devuelve NULL. Si llamo a OMXCodec :: findMatchingCodecs () con el indicador kHardwareCodecsOnly, obtuve la siguiente lista:
- OMX.TI.DUCATI1.VIDEO.H264E
- OMX.qcom.7x30.video.encoder.avc
- OMX.qcom.video.encoder.avc
- OMX.TI.Video.encoder
- OMX.Nvidia.h264.encoder
- OMX.SEC.AVC.Encoder

así que supongo que significa que la codificación HW es compatible con hardware.

Cuando no puse banderas en OMXCodec :: Create - codec creado bien, pero supongo que está en modo de software (por cierto, ¿cómo puedo verificar qué códec fue exactamente creado?)

Buscando fuentes de OMXCodec he encontrado líneas interesantes:

if (createEncoder) { sp<MediaSource> softwareCodec = InstantiateSoftwareEncoder(componentName, source, meta); if (softwareCodec != NULL) { LOGV("Successfully allocated software codec ''%s''", componentName); return softwareCodec; } }

parece que para Encoder siempre intenta instanciar el códec de software primero. ¿Qué estoy haciendo mal? Cualquier ayuda será muy apreciada. Gracias

Aquí hay un código de creación de OMXCodec:

mClient = new OMXClient(); mClient->connect(); logger->log("mClient.connect();"); enc_meta = new MetaData; // frame size of target video file int width = 640; //720; int height = 480; int kFramerate = 15; int kVideoBitRate = 500000; int kIFramesIntervalSec = 5; int32_t colorFormat = OMX_COLOR_FormatYUV420SemiPlanar; enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); //MEDIA_MIMETYPE_VIDEO_MPEG4); //MEDIA_MIMETYPE_VIDEO_H263);//MEDIA_MIMETYPE_VIDEO_AVC); enc_meta->setInt32(kKeyWidth, width); enc_meta->setInt32(kKeyHeight, height); enc_meta->setInt32(kKeyFrameRate, kFramerate); enc_meta->setInt32(kKeySampleRate, 44100); enc_meta->setInt32(kKeyBitRate, kVideoBitRate); enc_meta->setInt32(kKeyStride, width); enc_meta->setInt32(kKeySliceHeight, height); enc_meta->setInt32(kKeyIFramesInterval, kIFramesIntervalSec); enc_meta->setInt32(kKeyColorFormat, colorFormat); mVideoSource = OMXCodec::Create( mClient->interface(), enc_meta, true, mSrc, NULL, OMXCodec::kHardwareCodecsOnly ); logger->log("OMXCodec_CREATED result: %d", (mVideoSource!=NULL) ? 1 : 0);


En Android ICS 4.0.4 , el registro del códec era estático, es decir, todos los códecs se registraron como parte de una matriz KEncoderInfo como se puede encontrar aquí .

La metodología para diferenciar entre códecs de hardware y software es bastante simple. Si el nombre del componente no comienza con OMX , se interpreta como un códec de software como se muestra en el método IsSoftwareCodec .

Como está probando un codificador AVC , el códec de software si se creó sería AVCEncoder como se puede encontrar en su referencia de Factory .

Para verificar qué códec se creó, puede habilitar los registros en el archivo OMXCodec.cpp eliminando el comentario como #define LOG_NDEBUG 0 en esta línea, guardar y libstagefright.so a compilar para compilar libstagefright.so que se podría usar para generar los registros en la pantalla de logcat .

EDITAR:

En el caso de la transmisión rtsp , es necesario habilitar los registros en ACodec.cpp .

Es necesario determinar si libstagefrighthw.so está presente en /system/lib que registrará el núcleo OMX con el framework Stagefright .