6

Я пытаюсь выполнить аппаратное кодирование (avc) потока NV12 с помощью Android MediaCodec API.Получение кодеков QualComm для работы через API MediaCodec

При использовании OMX.qcom.video.encoder.avc, разрешение 1280x720 и 640x480 прекрасно работает, в то время как другие (т.е. 640x360, 320x240, 800x480) производит вывод, где компонент цветности кажется сдвинутым (см snapshot).

Я проверил два раза правильное входное изображение, сохранив его в файле jpeg. Эта проблема возникает только на устройствах QualComm (например, Samsung Galaxy S4).

У кого-нибудь это работает нормально? Необходимы ли дополнительные настройки/quirks?

+1

Android 4.3 добавил некоторые полезные новые функции, а также добавил тесты CTS, которые передают данные YUV в 'MediaCodec'. Тестирование буфера в буфер и буфера на поверхность в http://bigflake.com/mediacodec/#EncodeDecodeTest может быть информативным. – fadden

+1

BTW, есть дискуссия в андроидной платформе Google Group, в которой упоминаются кодеры QualComm: https://groups.google.com/d/msg/android-platform/awaNwgb6EbY/a-YiIOwaL0QJ Один из комментаторов заявляет, что цветной плоскость должен быть выровнен на границе 2048 байт, но это работает только для меня. Некоторые разрешения по-прежнему неэффективны, например, 176x144. –

ответ

3

Декодер (MediaCodec) имеет свой MediaFormat, его можно получить с помощью getOutputFormat. Возвращенный экземпляр можно распечатать в журнале. И там вы можете увидеть полезную информацию. Например, в вашем случае может быть полезно значение типа «slice-height». Я подозреваю, что он равен высоте для 1280x720 и 640x480 и отличается для других разрешений. Вероятно, вы должны использовать это значение для получения смещения цветности.

+0

В качестве быстрого исправления я изменил разрешения в соответствии с тем, что я увидел в «slice-height» и «stride» декодера. Например, 640x384 вместо 640x360 и 384x256 вместо 320x200. Тогда это сработало отлично :) Спасибо! – badbadboy

+0

@badbadboy Вы нашли способ динамически рассчитать шаг и sliceHeight, учитывая фиксированное разрешение для кодека qualcomm? – dmarcato

+0

@dmarcato Пока не изучил это. – badbadboy

3

Да, OMX.qcom.video.encoder.avc делает это, но не на всех устройствах/версии для Android. На моем Nexus 4 с Android 4.3 кодер работает нормально, но не на моем S3 (работает 4.1)

Решение для S3, работающего 4.1, с OMX.qcom.video.encoder.avc (кажется, что некоторые S3 имеют другой кодер) заключается в том, чтобы добавить 1024 байта непосредственно перед панелью Chroma.

// The encoder may need some padding before the Chroma pane 
int padding = 1024;      
if ((mWidth==640 && mHeight==480) || mWidth==1280 && mHeight==720) padding = 0; 

// Interleave the U and V channel 
System.arraycopy(buffer, 0, tmp, 0, mYSize); // Y 
for (i = 0; i < mUVSize; i++) { 
    tmp[mYSize + i*2 + padding] = buffer[mYSize + i + mUVSize]; // Cb (U) 
    tmp[mYSize + i*2+1 + padding] = buffer[mYSize + i]; // Cr (V) 
} 
return tmp; 

Камера использует YV12 и кодер COLOR_FormatYUV420SemiPlanar.

Ваш снимок показывает тот же вид артефактов, которые я имел, вам может понадобиться подобный хак для некоторых разрешений, может быть, с другой длиной отступа

Вы также должны избегать решений, которые не кратны 16, даже на 4,3 очевидно (http://code.google.com/p/android/issues/detail?id=37769)!

+0

Как определить mYSize и mUVSize? –

 Смежные вопросы

  • Нет связанных вопросов^_^