Автор Тема: Аппаратный encoder h264 для Allwinner H3  (Прочитано 10307 раз)

Оффлайн igzero

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #45 : Май 10, 2019, 07:48:48 am »
Ну и как, результаты есть?
Хотелось бы увидеть что именно вставлялось в dts.
Я в свое время делала так
 
               ve: video-codec@01c0e000 {
                        compatible = "allwinner,sunxi-cedar-ve";
                        reg = <0x01c0e000 0x1000>,
                                <0x01c00000 0x10>,
                                <0x01c20000 0x80>;
                        memory-region = <&cma_pool>;
                        syscon = <&syscon>;
                        clocks = <&ccu CLK_BUS_VE>, <&ccu CLK_VE>, <&ccu CLK_DRAM_VE>;
                        clock-names = "ahb", "mod", "ram";
                        resets = <&ccu RST_BUS_VE>;
                        interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>;
               };

               reserved-memory {
                       #address-cells = <1>;
                       #size-cells = <1>;
                       ranges;

                       cma_poll: linux,cma {
                               compatible = "shared-dma-pool";
                               reusable;
                               size = <0x8000000>;
                               alignment = <0x2000>;
                               linux,cma-default;
                       };
               };


Оффлайн spectre.spc

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #46 : Май 10, 2019, 11:55:05 am »
А разве для активации ve не надо делать в dts
&ve {
        status = "okay";
};
Вообще энкодинг удалось запустить?
Я столкнулся по всей видимости с 2мя проблемами за раз, по этому ничего не вышло. Первая видимо с адресами регистров, вторая с драйвером ov5640.

Оффлайн igzero

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #47 : Май 10, 2019, 12:33:27 pm »
А разве для активации ve не надо делать в dts
&ve {
        status = "okay";
};
Вообще энкодинг удалось запустить?
Я столкнулся по всей видимости с 2мя проблемами за раз, по этому ничего не вышло. Первая видимо с адресами регистров, вторая с драйвером ov5640.
Конечно надо, я не стал указывать на очевидные вещи  ;)

Оффлайн igzero

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #48 : Май 10, 2019, 12:36:04 pm »

Вообще энкодинг удалось запустить?


Мне не удалось :( но я долго и не парился, сразу не вышло, ну и ладно
Сейчас играюсь с платой "NanoPI M1 +", под армбианом 5.65 с кастомным ядром версии 4.14.106.  Cedar драйвер собрал, запустил, вроде работает. Энкодер не хочет. В варианте автора энкодер вываливался после того как выгружал модуль v4l2loopback и пытался заново загрузить его, с ошибкой на неизвестный EXE формат. Закоментировал выгрузку и загрузку модуля v4l2loopback, запускается пишет что  все ок, но при попытке просмотра любым плеером картинка с зеленью и изображение жутко тормозит. В чем может быть проблема?
« Последнее редактирование: Май 10, 2019, 12:39:09 pm от igzero »

Оффлайн ubobrov

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #49 : Июль 07, 2019, 10:03:43 pm »
написал здесь про энкодер

Оффлайн ubobrov

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #50 : Ноябрь 19, 2019, 03:13:50 pm »
Доработал драйвер cedrus, что позволило существенно повысить производительность энкодера. Сейчас работает 1280x720 30fps без тормозов. Это было реализовано в старых ядрах от allwinner, но почему-то этот момент в новой версии драйвера я упустил...

Из приятно, удалось проверить работу и декодара в связке libcedrus+libvdpau+ffmpeg на данном драйвере и ядре 4.20.17. Работает замечательно. Ещё проверил декодер h264 на ядре linux-5.3.5+libv4l2_request+ffmpeg от libreelec. Тоже всё ожидаемо круто.

Оффлайн igzero

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #51 : Ноябрь 23, 2019, 01:36:39 pm »
SKIP...
Ещё проверил декодер h264 на ядре linux-5.3.5+libv4l2_request+ffmpeg от libreelec. Тоже всё ожидаемо круто.
День добрый! Вот про это можно по подробнее? Что, как и где?

Оффлайн ubobrov

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #52 : Ноябрь 25, 2019, 08:40:44 am »
Я написал об этом здесь

Оффлайн igzero

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #53 : Ноябрь 26, 2019, 10:08:27 am »
Я написал об этом здесь
Спасибо. Здесь я сразу прочитал. Интересуют подробности работы Вашего енкодера под ядром 5.3 со стандартным Bootlin драйвером Cedrus (v4l2_request)

Оффлайн ubobrov

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #54 : Ноябрь 26, 2019, 01:12:19 pm »
энкодер работает только с sunxi_cedar на ядре 4.x
прочитайте внимательнее мой пост:
Цитировать
Ещё проверил декодер h264 на ядре linux-5.3.5+libv4l2_request+ffmpeg от libreelec. Тоже всё ожидаемо круто.

Оффлайн mollex

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #55 : Ноябрь 27, 2019, 04:45:39 pm »
Цитировать
энкодер работает только с sunxi_cedar на ядре 4.x

Подтверждаю, удалось запустить пример автора ubobrov на FriendlyARM neo air H3

Вопрос по энкодеру
Какую частоту кодирования можно получить для разрешения 640*480 ?
С каким максимальным разрешением может рабоать энкодер ?
Есть ли документация на этот аппаратный модуль который вы пользовались, нашел только  https://linux-sunxi.org/VE_Register_guide 

Оффлайн ubobrov

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #56 : Ноябрь 29, 2019, 02:46:00 pm »
я не делал тестов производительности энкодера.
производительность зависит от разных факторов, например от источника данных:
* можно сырой файл в NV12 считывать прямо с карты sd, тогда приплюсуйте время на чтения с файловой системы и sd карты
* можно сжимать кадры от usb камеры, приплюсуйте время на обработку данных от usb и v4l2 устройства
* можно прямо из памяти ddr3 (разместить там видео в формате NV12), получится самый чистый результат
...
ничего из этого я не тестил за ненадобностью.
заметил только, что если через ffmpeg кодировать, то производительность немного хуже чем просто standalone энкодером. вывод => тормозит где-то в ffmpeg...
с другой стороны, если кодировать через ffmpeg из файла NV12, то производительность хуже чем если через ffmpeg сначала аппаратно декодировать h264, а затем аппаратно-же кодировать в h264 из файла. это говорит о том, что декодирует он быстрее и данные помещает в память, а из неё и кодирует без промежуточного хранения на файловой системе.

640х480 с камеры usb пойдёт в 30fps даже если будите сначала преобразовывать формат с камеры, обычно YCbCr 4:2:2, в NV12, а потом только данные засовывать в энкодер.
точно знаю, что энкодер  работает с 1080Р, но сам не тестировал. пользовал 720Р и 640х480.
документации нет. есть только реверс инженеринг гайд по регистрам, который Вы указали по ссылке.
« Последнее редактирование: Ноябрь 29, 2019, 02:59:00 pm от ubobrov »

Оффлайн mollex

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #57 : Декабрь 02, 2019, 07:28:22 am »
Произвел замеры для FriendlyARM neo air H3  одноптотчное приложение.

Видео захват через CSI 1280*768

преобразование  YCbCr 4:2:2, в NV12 с использванием NEON занимает -  24мс
Энкодер - 11мс

Если забирать видео поток с камеры в NV12 и копировать в буффер энкодер через memcpy , функция копирования - 39 мс
переписал memcpy через NEON  - 7 мс

Итого 720P успевает 30fps

Оффлайн ubobrov

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #58 : Декабрь 03, 2019, 10:28:52 am »
можно ещё выделить пулл буферов в dma и назначить их для захвата v4l2 (V4L2_MEMORY_USERPTR), и с каждым захваченым NV12 кадром обновлять адрес bitstream буфера в энкодере.
получится вообще без копирования.
мы так делаем для imx6

Оффлайн mollex

Re: Аппаратный encoder h264 для Allwinner H3
« Ответ #59 : Декабрь 06, 2019, 09:51:11 am »
Цитировать
можно ещё выделить пулл буферов в dma и назначить их для захвата v4l2 (V4L2_MEMORY_USERPTR)
Можете поделится или сослаться на похожий пример?  Не сильно пока силен в работе с v4l2

Из того что есть в драйвере как понимаю действительно возможность забирать через DMA картинку заложена.
	/* Initialize videobuf2 queue */
vidq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
vidq->io_modes = VB2_MMAP | VB2_DMABUF;
vidq->drv_priv = video;
vidq->buf_struct_size = sizeof(struct sun6i_csi_buffer);
vidq->ops = &sun6i_csi_vb2_ops;
vidq->mem_ops = &vb2_dma_contig_memops;
vidq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
vidq->lock = &video->lock;


Правильно ли понимаю что для Енкодера необходимо чтобы данные кадра лежали в DDR он оттуда сам их забирает и кладедет результат так же в DDR самостоятельно.