LINUX.ORG.RU

Сообщения wolverin

 

Потоки и мутексы в Си

 ,

Нуждаюсь в ликбезе )

Раньше как то приходилось использовать только в С++ для контроля изменении в объекте класса, а что то в процедурном варианте не соображу как безопасно?

Есть 2 потока декодирования и кодирования, в неком участке кода декодирования мне нужно скопировать память для потока кодирования, понятно что это место нужно защитить мьютексом и хотелось бы это сделать в потоке кодирования, однако как правильно обрабатывать

  1. переменную int состояния ошибок в потоках - нужно ли 2 таких переменных (ошибка в любом потоке должна останавливать оба), можно ли писать и читать из разных потоков одновременно без мутексов когда их 2 (каждый либо пишет, либо читает), чтобы не тормозить выполнение?

  2. потоки должны ждать друг друга - после декодирования когда скопируется память, после кодирования когда будут готовы новые данные для копирования - получается еще 2 переменных!? каждую тоже нужно защищать мутексом? или как в п.1 раз один поток только пишет, а другой только читает можно без них обойтись?

или вообще какой то спецфический тип мутекса нужен!?

ПС. а то у меня получается 3 или 5 мутексов мне нужно чтоб каждую операцию обрабатывать.

wolverin
()

FFmpeg libav сыпется изображение на h264

 ,

Приветствую

Продолжаю мучать перекодировку из mjpeg в libx264 с отдачей в rtsp

Запускаю ffmpeg с параметрами и смотрю на другой локальной машине в ffplay (или через rtsp-simple-server в vlc)

# ./ffmpeg -f v4l2 -input_format mjpeg -video_size 640x480 -i /dev/video0 -c:v libx264 -pix_fmt yuv422p -preset ultrafast -r 30 -b:v 500k -minrate:v 300k -maxrate:v 500k -bufsize 1000k -f rtsp -rtsp_transport udp rtsp://192.168.36.212:554/cam
ffmpeg version N-107213-gfed07ef Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.12) 20160609
  configuration: --prefix=/usr --enable-nonfree --enable-gpl --enable-version3 --enable-libx264 --enable-libv4l2 --disable-libxcb --disable-vaapi --disable-bzlib --disable-zlib --disable-postproc --disable-xlib
  libavutil      57. 27.100 / 57. 27.100
  libavcodec     59. 33.100 / 59. 33.100
  libavformat    59. 25.100 / 59. 25.100
  libavdevice    59.  6.100 / 59.  6.100
  libavfilter     8. 41.100 /  8. 41.100
  libswscale      6.  6.100 /  6.  6.100
  libswresample   4.  6.100 /  4.  6.100
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 260677.910302, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 30 fps, 30 tbr, 1000k tbn
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[swscaler @ 0x14b65c0] [swscaler @ 0x14bfb20] deprecated pixel format used, make sure you did set range correctly
................
[swscaler @ 0x14b65c0] [swscaler @ 0x1536f00] deprecated pixel format used, make sure you did set range correctly
[libx264 @ 0x14a0b40] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x14a0b40] profile High 4:2:2, level 3.0, 4:2:2 8-bit
[libx264 @ 0x14a0b40] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc_lookahead=0 rc=cbr mbtree=0 bitrate=500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=500 vbv_bufsize=1000 nal_hrd=none filler=0 ip_ratio=1.40 aq=0
Output #0, rtsp, to 'rtsp://192.168.36.212:554/cam':
  Metadata:
    encoder         : Lavf59.25.100
  Stream #0:0: Video: h264, yuv422p(tv, bt470bg/unknown/unknown, progressive), 640x480, q=2-31, 500 kb/s, 30 fps, 90k tbn
    Metadata:
      encoder         : Lavc59.33.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 500000/0/500000 buffer size: 1000000 vbv_delay: N/A
frame=  964 fps= 29 q=26.0 size=N/A time=00:00:31.86 bitrate=N/A dup=227 drop=0 speed=0.957x

Выхлоп ffplay

Input #0, rtsp, from 'rtsp://192.168.36.212:554/cam':    0B f=0/0   
  Metadata:
    title           : No Name
  Duration: N/A, start: 0.130000, bitrate: N/A
    Stream #0:0: Video: h264 (High 4:2:2), yuv422p(tv, bt470bg/unknown/unknown), 640x480, 30 fps, 30 tbr, 90k tbn, 60 tbc
 117.44 M-V: -0.030 fd=   5 aq=    0KB vq=   11KB sq=    0B f=1/1

ВСЕ ИДЕАЛЬНО!!! сравнительно конечно

запускаю свой говнокод, дампы

Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 260917.808496, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 30 fps, 30 tbr, 1000k tbn
[libx264 @ 0x14e82c0] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x14e82c0] profile High 4:2:2, level 3.0, 4:2:2 8-bit
[libx264 @ 0x14e82c0] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc_lookahead=0 rc=cbr mbtree=0 bitrate=500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=500 vbv_bufsize=1000 nal_hrd=none filler=0 ip_ratio=1.40 aq=0
Output #0, rtsp, to 'rtsp://192.168.36.212:554/cam':
  Stream #0:0: Video: h264, yuv422p, 640x480, q=2-31, 500 kb/s, 90k tbn

Выхлоп ffplay

Input #0, rtsp, from 'rtsp://192.168.36.212:554/cam':    0B f=0/0   
  Metadata:
    title           : No Name
  Duration: N/A, start: 0.406333, bitrate: N/A
    Stream #0:0: Video: h264 (High 4:2:2), yuv422p, 640x480, 30 fps, 30 tbr, 90k tbn, 60 tbc
   7.28 M-V:  7.655 fd= 147 aq=    0KB vq=    0KB sq=    0B f=727/727

И с середины изображения сыпется вниз и тормоза...

Подскажите, если есть телепаты куда смотреть, замучался уже гадать.

wolverin
()

FFmpeg libav и многопоточность?

 , ,

Приветствую

Продолжаю мучать перекодировку из mjpeg в libx264 с отдачей в rtsp

В целом задача выглядит как писать на флешку mjpeg 1920х1080 хотя б по 15 кадров и отдавать по запросу максимально возможное fps в rtsp с разрешением 640х480, но не меньше 15 кадров

И тут опять затык, требующий совета или поругайте идею, пожалста.

Стандартная последовательность действий такова:

  1. Захватываем пакет (и скорее всего его тут же пишем, но через каждый 2 кадр из 30 фреймрейт)
  2. Декодируем пакет во фрейм
  3. Масштабируем фрейм
  4. Кодируем фрейм в пакет
  5. Отправляем пакет в сокет

Как уже до меня дошло

  • как минимум п.4 (кодирование) выполняется на всех ядрах цпу
  • п.2 (декодирование) непонятно, полагаю в один поток идет mjpeg -> raw
  • если исключить п.3 (масштабирование) с 1920х1080 -> 640x480, то фпс растет в 4 раза (получается 0.25 сек. каждый кадр, вместо 0.06 сек.)

Работа в одном потоке очевидно похожа на эстафету, когда «бежит» только один участок, поэтому очевидно надо вводить мутексы и разделять ими все участки, чтобы пока предыдущий бежит, следующий за ним этап ждет, т.е. создаем 4 потока, в котором одновременно выполняются 1 и 3, а 2 и 4,5 ждут, либо наоборот

Но насколько это поможет? ведь п.3 (масштабирование) занимает больше всего времени и получается нужно держать какой то массив входящих-исходящих фреймов (видимо по 5 пар судя по времени выполнения) и заполнять ее еще 5 потоками *безумныйсмайл*

зы. всего 4 ядра, при этом на одном потоке вижу загрузку до 130% всего лишь, но при полной задаче с машстабированием получаю всего 4 фпс ...

wolverin
()

FFmpeg libav какие настройки для H264???

 ,

Приветствую

Продолжаю мучать перекодировку из mjpeg в libx264 с отдачей в rtsp

Имею вот такие дампы входного-выходного потоков

Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 360486.479951, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 15 fps, 15 tbr, 1000k tbn
[libx264 @ 0x14e82c0] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x14e82c0] profile Main, level 2.2
[libx264 @ 0x14e82c0] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=15 b_pyramid=2 b_adapt=0 b_bias=0 direct=1 weightb=0 open_gop=0 weightp=0 keyint=450 keyint_min=30 scenecut=0 intra_refresh=0 rc=abr mbtree=0 bitrate=500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 pb_ratio=1.30 aq=0
Output #0, rtsp, to 'rtsp://IP:554/cam':
  Stream #0:0: Video: h264, yuv420p, 640x480, q=2-31, 500 kb/s, 15 tbn

Из всего этого выхлопа для х264 мной явно задано

bframes=15
b_adapt=0
keyint=450
keyint_min=30
bitrate=500

+    av_dict_set(&pOutDic, "rtsp_transport", "udp", 0);
+    av_dict_set(&pOutDic, "preset", "ultrafast", 0);

И решил значит глянуть а что же там с размерами, почему видео тормозит (хоть и не рассыпается)

fprintf(stdout, "Packet size inp: %d out: %d bytes Frame type: %d/%d\n", pInpPkt->size, pOutPkt->size, pFrm->key_frame, pFrm->pict_type);

Packet size inp: 70736 out: 50267 bytes Frame type: 1/1
Packet size inp: 70924 out: 49739 bytes Frame type: 1/1
Packet size inp: 70896 out: 49747 bytes Frame type: 1/1
Packet size inp: 70992 out: 49694 bytes Frame type: 1/1
Packet size inp: 70948 out: 49946 bytes Frame type: 1/1
Packet size inp: 70960 out: 49851 bytes Frame type: 1/1
Packet size inp: 70992 out: 88760 bytes Frame type: 1/1
Packet size inp: 71120 out: 154355 bytes Frame type: 1/1
Packet size inp: 71160 out: 161420 bytes Frame type: 1/1
Packet size inp: 71244 out: 161778 bytes Frame type: 1/1
Packet size inp: 71216 out: 161368 bytes Frame type: 1/1
Packet size inp: 71420 out: 161916 bytes Frame type: 1/1
Packet size inp: 71308 out: 161637 bytes Frame type: 1/1
Packet size inp: 71440 out: 162195 bytes Frame type: 1/1
Packet size inp: 71564 out: 162253 bytes Frame type: 1/1
Packet size inp: 71516 out: 162041 bytes Frame type: 1/1
Packet size inp: 71712 out: 162148 bytes Frame type: 1/1
Packet size inp: 71880 out: 162662 bytes Frame type: 1/1

А как так получается, что кодированный поток х264 занимает БОЛЬШЕ места, чем мжпег??? и почему у меня каждый кадр ключевой?

Если не сложно, может еще что важно указать??? Нужно более менее качество, чтоб без квадратов, главное чтобы не тормозило видео.

wolverin
()

FFmpeg libav* time_incr

 ,

Приветствую

Пытаюсь перекодировать mjpeg в h264, при попытке кодировать фрейм через avcodec_send_frame(pOutCdcCtx, pFrm) получаю ошибку

mpeg4 time_incr 12884901888 too large

time_base вроде задал

ошибка описана в исходнике mpeg4videoenc.c, как вычисление из MpegEncContext->time, но где задать это время???

во входном потоке с усб камеры как бы и нету такого значения временной метки...

wolverin
()

FFmpeg libav av_find_input_format + avformat_find_stream_info

 ,

Приветствую

Вдруг кто знает

1. Так и должно быть, что avformat_open_input обнуляет параметр AVDictionary ? Если да, то как правильно тогда проинициализировать?

const AVInputFormat * pInpFmt = av_find_input_format("v4l2");
AVDictionary * pInpDic = NULL
av_dict_set(&pInpDic, "pixel_format", format, 0);
av_dict_set(&pInpDic, "video_size", size, 0);
av_dict_set(&pInpDic, "framerate", rate, 0);
avformat_open_input(&pInpFmtCtx, device, pInpFmt, &pInpDic)

2. Четко после вызова avformat_find_stream_info если попытаться сразу освободить ресурсы, то вываливается ошибка

avformat_find_stream_info(pInpFmtCtx, NULL);

if (pInpDic) av_dict_free(&pInpDic);
ЗДЕСЬ ---» if (pInpFmtCtx) avformat_close_input(&pInpFmtCtx);


video4linux2,v4l2 @ 0x14dcf10] Some buffers are still owned by the caller on close.
ioctl(VIDIOC_QBUF): Bad file descriptor
wolverin
()

iptables и маски?

 

Приветствую, подскажите, в чем косякнул?

нужно банально прокинуть порт, просто адресов много, чтобы не заморачиваться каждым правилом, сделал через маркировку и цепочки

в mangle

-A PREROUTING -p tcp -m tcp --dport 5060 -j asterisk
-A PREROUTING -p udp -m udp -m multiport --dports 4569,5060,10000:20000 -j asterisk
-A PREROUTING -i eth1 -j CONNMARK --set-xmark 0x100/0xfff
-A PREROUTING -i eth0.41 -j CONNMARK --set-xmark 0x100/0xfff
-A asterisk -s ИП.1/32 -j asterisk_nat
-A asterisk -s ИП.2/32 -j asterisk_nat
-A asterisk -s ИП.3/32 -j asterisk_nat
-A asterisk -s ИП.4/32 -j asterisk_nat
-A asterisk -s ИП.N/32 -j asterisk_nat
-A asterisk_accept -j CONNMARK --set-xmark 0x1/0xfff
-A asterisk_nat -j CONNMARK --set-xmark 0x10/0xfff
-A asterisk_nat -j asterisk_accept

в nat

-A PREROUTING -m connmark --mark 0x10/0xfe -m comment --comment VoIP -j DNAT --to-destination ИПЛОКАЛЬНЫЙ

в фильтре

-A FORWARD -m connmark --mark 0x1/0x1 -m comment --comment VoIP -j ACCEPT

wolverin
()

Отдать RTSP из Си библиотек FFMPEG

 ,

Приветствую!

Буду благодарен подсказке направления или примеру куда двигаться.

Скачал git исходники, собрал, подключил к своему Сишному проекту библиотеки, получаю в нем кадры с usb камеры и пишу их на диск - как бы теперь не изобретая велосипед самими библиотеками организовать и слушающий сокет и запись в него SDP и RTP потока.

Просто в море информации не могу найти то что нужно для решения задачи. Вроде бы ffmpeg умеет стримить в rtsp

wolverin
()

fread/fwrite

 ,

Приветствую!

Продолжаю мучать тему С++ vs прямая запись на флешку

Как я понял эти методы буферные и фактическая запись осуществляется либо по fflush, либо где то задан системный размер кеша? как его менять? а «померить» можно текущий размер буфера? например, делать ффлуш через заданный размер, а не количество циклов записи или держать кеш выравненной длины относительно размера сектора

актуально для ubuntu/debian

wolverin
()

_FILE_OFFSET_BITS вкуда?

 

Приветствую, опять мучения с GCC ))

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

#define _FILE_OFFSET_BITS 64

один фиг ftell вываливается на больше 2гб с

Value too large for defined data type

wolverin
()

GCC как прочитать и задать частоту ЦПУ?

 ,

Так чтоб без отличий по архитектуре и желательно ядер (хотя бы в пределах ветки) на ubuntu/debian

Так понимаю надо что надо в каких то файлах здесь читать-писать?

/sys/devices/system/cpu

или еще лучше governor=ondemand менять с ondemand на турбабуст

wolverin
()

C++ вызвать указатель на метод класса внутри метода класса?

 ,

Приветствую

Объявил внутри класса «переменную» как void (CJpgFrame::*Write)();

Внутри метода класса присваиваю этой «переменно» функцию как Write = &CJpgFrame::WritePckWithTime;

Понятно, что вне класса вызов

CJpgFrame jpg();
(jpg.*jpg.Write)();

но как вызвать ВНУТРИ метода самого класса? или это не поддерживается?

валится ошибка

Recoder.cpp:85:11: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘((CJpgFrame*)this)->CJpgFrame::Write (...)’, e.g. ‘(... ->* ((CJpgFrame*)this)->CJpgFrame::Write) (...)’
     Write();
           ^

Переопределять не хочется, т.к. там всего лишь ветвление в if чтобы не повторять.

wolverin
()

Как make C vs C++

 ,

Подскажите, как правильно сделать make?

Есть мейкфайл с содержимым

gcc -c RecoderFDisk.c -I./util-linux/ -Wall -pedantic -O3
gcc -c RecoderFFmpeg.c -I./FFmpeg/ -Wall -pedantic -O3
gcc -o Recoder Recoder.c RecoderFDisk.o RecoderFFmpeg.o                         \
    ./util-linux/libblkid/src/libblkid_la-probe.o                               \
    ./util-linux/libuuid/src/libuuid_la-parse.o                                 \
    ./util-linux/libuuid/src/libuuid_la-unparse.o                               \
    ./util-linux/libuuid/src/libuuid_la-gen_uuid.o                              \
    ./util-linux/disk-utils/fdisk-fdisk-list.o                                  \
    ./util-linux/.libs/libcommon.a                                              \
    ./util-linux/.libs/libsmartcols.a                                           \
    ./util-linux/.libs/libtcolors.a                                             \
    ./util-linux/.libs/libblkid.a                                               \
    ./util-linux/.libs/libuuid.a                                                \
    ./util-linux/.libs/libfdisk.a                                               \
    ./FFmpeg/libavdevice/libavdevice.a                                          \
    ./FFmpeg/libavfilter/libavfilter.a                                          \
    ./FFmpeg/libavformat/libavformat.a                                          \
    ./FFmpeg/libavcodec/libavcodec.a                                            \
    ./FFmpeg/libswscale/libswscale.a                                            \
    ./FFmpeg/libswresample/libswresample.a                                      \
    ./FFmpeg/libavutil/libavutil.a                                              \
    -ltinfo -lpthread -lm -lx264 -lv4l2 -lpostproc -lasound -lvdpau -lX11 -Wall -pedantic -O3

все прекрасно компилится, как только просто меняю расширение Recoder.c на Recoder.cpp (векторами захотелось побаловаться в main), получаю
Recoder.cpp:(.text.startup+0x9a): undefined reference to
на то, что лежит в RecoderFDisk.o RecoderFFmpeg.o

wolverin
()

Си hex to file

 , ,

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

еще бы в 4-5 байты записать длину time(NULL)+2байта и после само это значение

uint8_t * buf = malloc(1024 * sizeof(uint8_t));

buf[0] = strtol("FF", NULL, 16);
buf[1] = strtol("D8", NULL, 16);
buf[2] = strtol("FF", NULL, 16);
buf[3] = strtol("FE", NULL, 16);
buf[4] = strtol("00", NULL, 16);
buf[5] = strtol("04", NULL, 16);

buf[10] = '\0';

FILE * pf = fopen("./test.jpg", "wb");
fwrite(buf, 1, 11, pf);
fclose(pf);

free(buf);

wolverin
()

MJPEG + ffmpeg + прямая запись на флешку

 , ,

Продолжаю вникать вопрос записи MJPEG на флешку без файловой системы С++ vs прямая запись на флешку

Удалось прикрутить fdisk и ffmpeg, имею такую тестовую приблуду

root@NanoPi-NEO-Core:/home/pi# head -c 200 /dev/mmcblk1 | xxd
00000000: fab8 0010 8ed0 bc00 b0b8 0000 8ed8 8ec0  ................
00000010: fbbe 007c bf00 06b9 0002 f3a4 ea21 0600  ...|.........!..
00000020: 00be be07 3804 750b 83c6 1081 fefe 0775  ....8.u........u
00000030: f3eb 16b4 02b0 01bb 007c b280 8a74 018b  .........|...t..
00000040: 4c02 cd13 ea00 7c00 00eb fe00 0000 0000  L.....|.........
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000c0: 0000 0000 0000 0000                      ........
root@NanoPi-NEO-Core:/home/pi# ./Recoder /dev/mmcblk1 /dev/video0
Device: /dev/mmcblk1 Physical sector size: 512 bytes First unpartitioned space: 29.14 GiB LBA begin: 2048 end: 61120511
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 959002.771778, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 15 fps, 15 tbr, 1000k tbn
Packet 901l size 57940 bytes Total capture 52918224l bytes
root@NanoPi-NEO-Core:/home/pi# head -c 200 /dev/mmcblk1 | xxd
00000000: ffd8 ffdb 0043 0002 0202 0202 0202 0202  .....C..........
00000010: 0202 0202 0203 0604 0303 0303 0705 0504  ................
00000020: 0609 0709 0908 0708 080a 0b0e 0c0a 0a0d  ................
00000030: 0a08 080c 100c 0d0e 0f0f 100f 090b 1112  ................
00000040: 110f 120e 0f0f 0fff db00 4301 0202 0203  ..........C.....
00000050: 0303 0704 0407 0f0a 080a 0f0f 0f0f 0f0f  ................
00000060: 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f  ................
00000070: 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f  ................
00000080: 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f ffc0 0011  ................
00000090: 0801 e002 8003 0121 0002 1101 0311 01ff  .......!........
000000a0: c400 1f00 0001 0501 0101 0101 0100 0000  ................
000000b0: 0000 0000 0001 0203 0405 0607 0809 0a0b  ................
000000c0: ffc4 00b5 1000 0201                      ........

В целом что то пишется, пока не понятно кратно сектору в 512 байт такая кривота пишет или нет?

    pf = fopen(dev_disk, "wb");
    if (!pf)
    {
        fprintf(stderr, "Open frame data %s failed\n", dev_disk);
        rt = -1;
        goto END;
    }

unsigned int i = 0, l = 0;
    while ((rt = av_read_frame(pFormatCtx, packet)) >= 0)
    {
        l += packet->size;
        fprintf(stdout, "Packet %ul size %d bytes Total capture %ul bytes\r", i, packet->size, l);
        fwrite(packet->data, 1, packet->size, pf);
        av_packet_unref(packet);
if (i++ > 15*60) break;
    }

Вопрос больше в другом - наблюдаю что при avformat_find_stream_info(pFormatCtx, NULL) появляется как я понимаю временная метка start: 959002.771778, как я понимаю штатно в мжпег кадре нет временной метки и она появляется только в заголовке «пакета» из ффмпег? а где бы ее надыбать теперь на сыром диске? т.е. какая структура это «пакета» от ффмпег с мжпег кадром???

т.е. вопрос в том, как продолжить запись и перечитывать временные метки для поиска???

wolverin
()

c.h как без ошибки подключить?

 ,

Приветствую!

Нужен некий функционал из fdisk (проблема не в нем), взял его с git, собрал, все работает, пытаюсь тянуть инклуды в свой проект простым

#include "./util-linux/include/c.h"

после чего получаю ошибку

In file included from Recoder.cpp:30:0:
./util-linux/include/c.h:402:3: error: #error "System with usleep() or nanosleep() required!"
 # error "System with usleep() or nanosleep() required!"
   ^~~~~
./util-linux/include/c.h: In function ‘void errmsg(char, int, char, const char*, ...)’:
./util-linux/include/c.h:222:39: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   prog_inv_sh_nm_from_file(__FILE__, 1)
                                       ^
./util-linux/include/c.h:251:26: note: in expansion of macro ‘program_invocation_short_name’
  fprintf(stderr, "%s: ", program_invocation_short_name);
                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
makefile:37: ошибка выполнения рецепта для цели «Recoder»
make: *** [Recoder] Ошибка 1

Сам c.h понимаю стандартный, но что нужно компилятору не понимаю в этом месте, подскажите???

static inline int xusleep(useconds_t usec)
{
#ifdef HAVE_NANOSLEEP
        struct timespec waittime = {
                .tv_sec   =  usec / 1000000L,
                .tv_nsec  = (usec % 1000000L) * 1000
        };
        return nanosleep(&waittime, NULL);
#elif defined(HAVE_USLEEP)
        return usleep(usec);
#else
# error "System with usleep() or nanosleep() required!"
#endif
}

wolverin
()

Падает «сеть» на ядре 4.14.111

 ,

Есть железка в хозяйстве Нанопи Нео Коре, там убунта 16.04 ЛТС, поднял на ней для теста v4l2rtspserver на усб uvc камеру, смотрю rtsp с нее в максималках mjpeg 1920х1080 на 30 кадрах в VLC

На некоторых железках на одном потоке, на других только на 3х клиентах vlc отваливается сеть с таким вот dmeg

[  260.070727] INFO: rcu_sched self-detected stall on CPU
[  260.076830]  0-...: (4190 ticks this GP) idle=70e/140000000000002/0 softirq=17072/17072 fqs=1976
[  260.079968] INFO: rcu_sched detected stalls on CPUs/tasks:
[  260.085937]
[  260.091905]  (t=4204 jiffies g=8837 c=8836 q=1672)
[  260.093825]  0-...: (4190 ticks this GP) idle=70e/140000000000002/0 softirq=17072/17072 fqs=1978
[  260.102957]
[  260.103041] NMI backtrace for cpu 0
[  260.103318] CPU: 0 PID: 29 Comm: kworker/0:1 Tainted: G         C O    4.14.111 #126
[  260.104951] (detected by 1, t=4206 jiffies, g=8837, c=8836, q=1672)
[  260.105020] Hardware name: sun8i
[  260.105412] Workqueue: events dbs_work_handler
.......................
[  260.125393] Sending NMI from CPU 1 to CPUs 0:
[  270.155454] rcu_sched kthread starved for 2000 jiffies! g8837 c8836 f0x0 RCU_GP_DOING_FQS(4) ->state=0x0 ->cpu=2
[  270.165927] rcu_sched       R  running task        0     8      2 0x00000000
[  270.166732] [<c0a2f9b8>] (__schedule) from [<c0a300d8>] (preempt_schedule_common+0x1c/0x2c)
[  270.167133] [<c0a300d8>] (preempt_schedule_common) from [<c0a30124>] (_cond_resched+0x3c/0x44)
[  270.167538] [<c0a30124>] (_cond_resched) from [<c0292824>] (rcu_gp_kthread+0x57c/0x928)
[  270.167960] [<c0292824>] (rcu_gp_kthread) from [<c025d020>] (kthread+0x128/0x158)
[  270.168347] [<c025d020>] (kthread) from [<c0222058>] (ret_from_fork+0x14/0x3c)
[  270.173442] NMI backtrace for cpu 0
[  270.173601] CPU: 0 PID: 29 Comm: kworker/0:1 Tainted: G         C O    4.14.111 #126
[  270.173668] Hardware name: sun8i
[  270.173743] Workqueue: events dbs_work_handler
[  270.173881] task: db1c0000 task.stack: db1ba000
[  270.173968] PC is at __usb_hcd_giveback_urb+0x80/0x148
[  270.174044] LR is at ehci_urb_enqueue+0xa3c/0xd98
[  270.174136] pc : [<c06d9da0>]    lr : [<c06f39d8>]    psr: 60010113
[  270.174216] sp : db1bbc60  ip : db001a80  fp : 40000000
[  270.174295] r10: c1202080  r9 : c1061520  r8 : c9ff9ce8
[  270.174390] r7 : 00000000  r6 : c9ff9c00  r5 : 60010113  r4 : d98cc000
[  270.174483] r3 : bf544f8c  r2 : 00000003  r1 : 00000000  r0 : 00000000
[  270.174582] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[  270.174666] Control: 30c5387d  Table: 5a761240  DAC: fffffffd
[  270.174780] CPU: 0 PID: 29 Comm: kworker/0:1 Tainted: G         C O    4.14.111 #126
[  270.174845] Hardware name: sun8i
[  270.174912] Workqueue: events dbs_work_handler

предполагаю, что одно ядро не успевает отрабовать прерывания ИСХОДЯЩЕГО трафика, умозаключения сделал на основе темы Расшифровка краха

Судя по предложенным там к просмотру счетчикам, у меня занимается отправкой пакетов NET_TX только 1 ядро, как бы починить-сбалансировать???

Every 2.0s: cat /proc/softirqs               Fri Jun 10 07:52:46 2022

                    CPU0       CPU1       CPU2       CPU3
          HI:    4241341          8          0          7
       TIMER:    1051360     966099     993020     922395
      NET_TX:      40438       8454       5959       6224
      NET_RX:      36476        317        374        123
       BLOCK:          0          0          0          0
    IRQ_POLL:          0          0          0          0
     TASKLET:       1371        149         21         20
       SCHED:     736057     759687     765668     686260
     HRTIMER:          0          0          0          0
         RCU:     702873     605518     618290     591059

Every 2.0s: cat /proc/interrupts                                          Fri Jun 10 07:52:47 2022

           CPU0       CPU1       CPU2       CPU3
 16:          0          0          0          0     GICv2  25 Level     vgic
 17:          0          0          0          0     GICv2  50 Level     /soc/timer@01c20c00
 18:          0          0          0          0     GICv2  29 Level     arch_timer
 19:    4656560    6907099    7007158    7089333     GICv2  30 Level     arch_timer
 20:          0          0          0          0     GICv2  27 Level     kvm guest timer
 22:          0          0          0          0     GICv2 120 Level     1ee0000.hdmi, dw-hdmi-cec
 24:          0          0          0          0     GICv2 118 Level     1c0c000.lcd-controller
 25:          0          0          0          0     GICv2  82 Level     1c02000.dma-controller
 26:         25          0          0          0     GICv2  92 Level     sunxi-mmc
 27:      32580          0          0          0     GICv2  94 Level     sunxi-mmc
 28:          1          0          0          0     GICv2 103 Level     musb-hdrc.4.auto
 29:          0          0          0          0     GICv2 104 Level     ehci_hcd:usb1
 30:          0          0          0          0     GICv2 105 Level     ohci_hcd:usb2
 31:          0          0          0          0     GICv2 106 Level     ehci_hcd:usb3
 32:          0          0          0          0     GICv2 107 Level     ohci_hcd:usb6
 33:          0          0          0          0     GICv2 108 Level     ehci_hcd:usb4
 34:          0          0          0          0     GICv2 109 Level     ohci_hcd:usb7
 35:    4316809          0          0          0     GICv2 110 Level     ehci_hcd:usb5
 36:          0          0          0          0     GICv2 111 Level     ohci_hcd:usb8
 39:      31658          0          0          0     GICv2  63 Level     1c25000.ths
 41:      35715          0          0          0     GICv2 114 Level     eth0
 42: 1373870485          0          0          0     GICv2  97 Level     sun6i-spi
 45:        462          0          0          0     GICv2  32 Level     ttyS0
 46:       8732          0          0          0     GICv2  33 Level     ttyS1
 49:          0          0          0          0     GICv2  38 Level     mv64xxx_i2c
 50:          0          0          0          0     GICv2  39 Level     mv64xxx_i2c
 51:          0          0          0          0     GICv2  40 Level     mv64xxx_i2c
 52:          0          0          0          0     GICv2  72 Level     1f00000.rtc
106:          1          0          0          0  sunxi_pio_edge  44 Edge      usb0-id-det
129:          1          0          0          0  sunxi_pio_edge   3 Edge      k1
IPI0:          0          0          0          0  CPU wakeup interrupts
IPI1:          0          0          0          0  Timer broadcast interrupts
IPI2:    3920333   14075889   14485381   14792281  Rescheduling interrupts
IPI3:         56        280        309         68  Function call interrupts
IPI4:          0          0          0          0  CPU stop interrupts
IPI5:       4367       1341       1399       1418  IRQ work interrupts
IPI6:          0          0          0          0  completion interrupts
Err:          0

wolverin
()

RTSP через ffserver

 ,

Приветствую.

Подскажите, что не так в моем конфиге?

Нужно стримануть усб камеру через rtsp рабочая команда ffmpeg выглядит так

./ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -c:v cedrus264 -r 5 -pix_fmt nv12 -f rtp rtp://127.0.0.1:554/

то что удалось наваять в ffserver.conf

RTSPPort 554

<Feed blabla.ffm>
    File /tmp/blabla.ffm
    FileMaxSize 10M
    Launch ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -c:v cedrus264 -r 5 -pix_fmt nv12
</Feed>

<Stream cam>
    Feed blabla.ffm
    Format rtp
    VideoCodec cedrus264
    VideoSize 640x480
    AVOptionVideo flags +global_header

    Noaudio
</Stream>
wolverin
()

Исправить DTS для ffmpeg vs Cedrus H264

 , , ,

Приветствую!

Как бы включить аппаратную поддежку кодирования h264 на железке Nanopi neo core с ядром

# uname -a
Linux NanoPi-NEO-Core 4.14.111 #126 SMP Mon Feb 22 17:04:18 CST 2021 armv7l armv7l armv7l GNU/Linux

Скомпилил и установил ffmpeg с Cedrus H264 и cedar_ve.ko


# dmesg | grep cedar
[    4.982170] cedar_ve: loading out-of-tree module taints kernel.
[    4.988972] sunxi cedar version 0.1

правлю /boot/sun8i-h3-nanopi-neo-core.dts

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

                cma@43c00000 {
                        compatible = "shared-dma-pool";
                        reusable;
                        reg = < 0x57c00000 0x6000000 >;
                        linux,cma-default;
                        phandle = < 0x84 >;
                };
        };

..................
                video-engine@01c0e000 {
                        compatible = "allwinner,sunxi-cedar-ve";
                        reg = < 0x1c0e000 0x1000 0x1c00000 0x10 0x1c20000 0x800 >;
                        memory-region = < 0x84 >;
                        syscon = < 0x15 >;
                        clocks = < 0x03 0x29 0x03 0x6c 0x03 0x61 >;
                        clock-names = "ahb", "mod", "ram";
                        resets = < 0x03 0x1a >;
                        interrupts = < 0x00 0x3a 0x04 >;
                        status = "okay";
                };

теперь имеем

# dmesg | grep CMA
[    0.000000] Reserved memory: created CMA memory pool at 0x000000004a000000, size 96 MiB

# dmesg | grep cedar
[    4.944911] cedar_ve: loading out-of-tree module taints kernel.
[    4.951697] sunxi cedar version 0.1
[    4.955629] [cedar]: install start!!!
[    4.959521] cedar_ve: cedar-ve the get irq is 55
[    4.964193] sunxi-cedar 1c0e000.video-engine: assigned reserved memory node cma@43c00000
[    4.972512] sunxi-cedar 1c0e000.video-engine: syscon failed...
[    4.998164] sunxi-cedar 1c0e000.video-engine: failed to get ahb clock

теперь правлю syscon

                syscon@1c00000 {
                        compatible = "allwinner,sun8i-h3-system-controller", "syscon";
                        reg = < 0x1c00000 0x1000 >;
                        #address-cells = < 0x01 >;
                        #size-cells = < 0x01 >;
                        ranges;

                        sram@1d00000 {
                            compatible = "mmio-sram";
                            reg = < 0x1d00000 0x80000 >;
                            #address-cells = < 0x01 >;
                            #size-cells = < 0x01 >;
                            ranges = < 0x00 0x1d00000 0x80000 >;

                            sram-section@0 {
                                compatible = "allwinner,sun8i-h3-sram-c1", "allwinner,sun4i-a10-sram-c1";
                                reg = < 0x00 0x80000 >;
                            };
                        };
                };

и все, больше железка не бутиться ((

wolverin
()

mount файла как?

 

Подскажите, вроде в букваре написано, что можно монтировать файл в другую папку, но что то не выходит каменный цветок, чего ему не хватает? что то нагуглить не удалось, все папки монтируют и iso образы с файловой системой

mount –bind /usr/bin/qemu-arm-static /sandbox/usr/bin/

mount: mount(2) failed: Not a directory

wolverin
()

RSS подписка на новые темы