Видеозахват V4L2 на Android

Я пытаюсь запустить пример видеозахвата здесь на Samsung Galaxy S3.
Сначала я столкнулся с несколькими ошибками во многих операциях VIDIOC (например, S_FMT или STREAMON ), которые я мог решить:

  1. Посмотрите на kmsg и проследите код драйвера ядра, чтобы угадать, что пошло не так.
  2. Добавьте отсутствующие операции или исправьте некоторые конфигурации в примере кода.
    Сравнение журнала kmsg с запуском кода примера с запуском приложения для родной камеры помогло многим .. (поскольку последнее мы уверены, что оно работает)

Теперь я пришел к этому. Все ioctls закончены успешно, но я получаю 0 данных. v4l2_buffer->bytesused всегда 0.

Я получил отчаяние, поэтому я добавил журналы printk в каждую функцию в fimc_v4l2.c и fimc_capture.c (FIMC является драйвером V4L2 от Samsung), и это все, что я вижу при использовании приложения для камеры : (Я только вставляю часть после возвращения От STREAMON )

@@@ fimc_dqbuf # bytesused = 0 length = 0
### fimc_dqbuf_capture start # bytesused = 0 length = 0
### fimc_dqbuf_capture # list empty

Fimc_irq_cap [0], fimc0, cnt [0]
Fimc_irq_cap [0] ПРОПУСТИТЬ
Fimc_irq_cap [1], fimc0, cnt [1]

@@@ fimc_dqbuf # bytesused = 0 length = 65545
### fimc_dqbuf_capture start # bytesused = 0 length = 65545
### fimc_dqbuf_capture # list не пуст
### fimc_dqbuf_capture # length = 65545
### fimc_dqbuf_capture end # length = 65545, bytesused = 0

@@@ fimc_qbuf # bytesused = 0 length = 0
### fimc_qbuf_capture start
### fimc_qbuf_capture # buf state ok
### fimc_qbuf_capture # index = 0
### fimc_qbuf_capture end

@@@ fimc_dqbuf # bytesused = 3225703951 length = 0
### fimc_dqbuf_capture start # bytesused = 3225703951 length = 0
### fimc_dqbuf_capture # list empty

Fimc_irq_cap [2], fimc0, cnt [2]

@@@ fimc_dqbuf # bytesused = 3225703951 длина = 65545
### fimc_dqbuf_capture start # bytesused = 3225703951 length = 65545
### fimc_dqbuf_capture # list не пуст
### fimc_dqbuf_capture # length = 65545
### fimc_dqbuf_capture end # length = 65545, bytesused = 3225703951

@@@ fimc_qbuf # bytesused = 0 length = 0
### fimc_qbuf_capture start
### fimc_qbuf_capture # buf state ok
### fimc_qbuf_capture # index = 1
### fimc_qbuf_capture end

Я разделил журнал на блоки: это в основном DQBUF(empty) -> IRQ -> DQBUF -> QBUF . Я выделен жирным шрифтом, где b->lenght и b->bytesused сначала получают ненулевые значения.

Я изменил код примера v4l2, чтобы имитировать этот точный поток.
Но, как вы видите, я получаю только 0 для b->bytesused и b->bytesused :

@@@ fimc_dqbuf # bytesused = 0 length = 0
### fimc_dqbuf_capture start # bytesused = 0 length = 0
### fimc_dqbuf_capture # list empty

Fimc_irq_cap [0], fimc0, cnt [0]
Fimc_irq_cap [0] ПРОПУСТИТЬ
Fimc_irq_cap [1], fimc0, cnt [1]

@@@ fimc_dqbuf # bytesused = 0 length = 0
### fimc_dqbuf_capture start # bytesused = 0 length = 0
### fimc_dqbuf_capture # list не пуст
### fimc_dqbuf_capture # length = 0
### fimc_dqbuf_capture end # length = 0, bytesused = 0

@@@ fimc_qbuf # bytesused = 0 length = 0
### fimc_qbuf_capture start
### fimc_qbuf_capture # buf state ok
### fimc_qbuf_capture # index = 0
### fimc_qbuf_capture end

@@@ fimc_dqbuf # bytesused = 0 length = 0
### fimc_dqbuf_capture start # bytesused = 0 length = 0
### fimc_dqbuf_capture # list empty

Fimc_irq_cap [2], fimc0, cnt [2]

@@@ fimc_dqbuf # bytesused = 0 length = 0
### fimc_dqbuf_capture start # bytesused = 0 length = 0
### fimc_dqbuf_capture # list не пуст
### fimc_dqbuf_capture # length = 0
### fimc_dqbuf_capture end # length = 0, bytesused = 0

@@@ fimc_qbuf # bytesused = 0 length = 0
### fimc_qbuf_capture start
### fimc_qbuf_capture # buf state ok
### fimc_qbuf_capture # index = 1
### fimc_qbuf_capture end

Я попытался использовать grep в исходном коде драйвера ядра, чтобы узнать, когда может быть присвоен bytesused , но не удалось найти правильное местоположение.

У кого-нибудь есть идеи? Я был бы глубоко благодарен

редактировать

Когда я использую strlen() в указателе моего буфера mmap ped, он фактически возвращает разумное значение. Возвращаемый размер изменяется в зависимости от того, где я указываю камеру (она 1 или действительно маленькая, когда я закрываю линзы своей рукой, и около 10 тысяч, когда она яркая, она также меняется, когда я перемещаю камеру). Я предполагаю, что это означает, что я действительно получаю фреймы.
Но я до сих пор не могу понять, почему bytesused всегда 0.