LINUX.ORG.RU

Сообщения wolverin

 

Права пользователю на asterisk?

Форум — Admin

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

От рута и через судо все работает, никак не удается с пользователем в группе выполнить asterisk -r

Варианты ошибок в зависимости от пользовательской учетки

$ asterisk -r
-bash: asterisk: команда не найдена

Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)

Все права файловые права есть на этот run

$ ls -l  /var/run/asterisk/
итого 8
-rwxr-xr-x 1 asterisk asterisk 786 дек 11 18:40 alt.asterisk.canary.tweet.tweet.tweet
srwxr-xr-x 1 asterisk asterisk   0 дек 10 18:11 asterisk.ctl
-rw-r--r-- 1 asterisk asterisk   4 дек 10 18:11 asterisk.pid

подозреваю selinux но это не точно

 ,

wolverin
()

Как еще обновить самого себя?

Форум — Development

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

Как я понимаю обычное решение это скопировать куда то новый бинарник, затем запустить его с какими то параметрами из своего процесса через exec* и уже в нем положить себя на свое старое место - неудобно в этом то, что нужно проверяться из какого места загружен и либо снова запускаться из старого места либо все время помнить что запущен из «клона», а нет ли более хитрого способа без внешнего кода на C/C++ подменить свой бинарник во время его исполнения???

может есть какие то штатные средства ОС?

 ,

wolverin
()

как корректно прочитать boost::asio::streambuf?

Форум — Development

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

Нужно скачать с http сервера файл и посчитать его md5, взял из документации пример, все в нем работает пока не вставляю в него свой кривой код вместо cout - в зависимости от размера файла получаю то корректные данные, то нет

#include <openssl/md5.h>
#include <fstream>
#include <iomanip>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

bool HTTPDownload(const std::string & host, const std::string & port, const std::string & file_src, const char * file_dst, const std::string & md5)
{
    std::ofstream outfile(file_dst, std::ios::binary);
    if (!outfile.is_open())
    {
        fprintf(stderr, "ERROR %s\n", file_dst);
        return false;
    }

    MD5_CTX md5Context;
    MD5_Init(&md5Context);
    try
    {
        boost::asio::io_service io_service;

        tcp::resolver resolver(io_service);
        tcp::resolver::query query(host, port);
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

        tcp::socket socket(io_service);
        boost::asio::connect(socket, endpoint_iterator);

        {
            boost::asio::streambuf request;
            std::ostream request_stream(&request);
            request_stream  << "GET " << file_src << " HTTP/1.0\r\n"
                            << "Host: " << host << "\r\n"
                            << "Accept: */*\r\n"
                            << "Connection: close\r\n\r\n";

            boost::asio::write(socket, request);
        }

        boost::asio::streambuf response;
        boost::asio::read_until(socket, response, "\r\n");

        std::istream response_stream(&response);
        std::string http_version;
        response_stream >> http_version;
        unsigned int status_code;
        response_stream >> status_code;
        std::string status_message;
        std::getline(response_stream, status_message);
        if (!response_stream || http_version.substr(0, 5) != "HTTP/")
        {
            fputs("ERROR HTTP response\n", stderr);
            return false;
        }
        if (status_code != 200)
        {
            fprintf(stderr, "ERROR %u\n", status_code);
            return false;
        }

        boost::asio::read_until(socket, response, "\r\n\r\n");

        std::string header;
        while (std::getline(response_stream, header) && header != "\r") fprintf(stdout, "%s\n", header.c_str());
        fputc('\n', stdout);

        boost::system::error_code error;
        while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error));;

        if (error != boost::asio::error::eof) return false;

        if (response.size() > 0)
        {
            auto response_data = boost::asio::buffer_cast<const char*>(response.data());
            MD5_Update(&md5Context, response_data, response.size());
            outfile << response_data;
        }
        else return false;
    }
    catch (std::exception& e)
    {
        fprintf(stderr, "ERROR [%s]: %s\n", file_dst, e.what());
        return false;
    }

    unsigned char md5hash[MD5_DIGEST_LENGTH];
    MD5_Final(md5hash, &md5Context);

    std::stringstream md5ss;
    md5ss << std::hex << std::setfill('0');
    for (const auto & byte: md5hash) md5ss << std::setw(2) << (int)byte;

    fprintf(stdout, "\n%s\n", md5ss.str().c_str());

    return true;
}

 , , streambuf

wolverin
()

Как поймать Segmentation fault?

Форум — Development

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

Начал ловить SIGSEGV в непредсказуемые моменты в многопоточке через несколько часов штатной работы, как обычно запустил приложуху в gdb глянул backtrace после падения, вроде ничего криминального, но увеличил область видимость переменных и сделал копию памяти, теперь тот же bt выдает такое

ПРОЧИЙ-ВЫХОЛОП
[New Thread 0xb58ff410 (LWP 16262)]
[Thread 0xb58ff410 (LWP 16262) exited]
БЛА-БЛА-ВЫХЛОП-ПРИЛОЖУХИ
[New Thread 0xb58ff410 (LWP 16292)]
БЛА-БЛА-ВЫХЛОП-ПРИЛОЖУХИ
[Thread 0xb58ff410 (LWP 16292) exited]
БЛА-БЛА-ВЫХЛОП-ПРИЛОЖУХИ
[New Thread 0xb58ff410 (LWP 16418)]

Thread 14 "Recorder" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb0fff410 (LWP 14943)]
malloc_consolidate (av=av@entry=0xb1000010) at malloc.c:4174
4174    malloc.c: No such file or directory.
(gdb) bt
#0  malloc_consolidate (av=av@entry=0xb1000010) at malloc.c:4174
#1  0xb6abff54 in _int_malloc (av=av@entry=0xb1000010, bytes=bytes@entry=1264) at malloc.c:3457
#2  0xb6ac14a2 in __GI___libc_malloc (bytes=bytes@entry=1264) at malloc.c:2920
#3  0xb6ac1aca in __GI___libc_realloc (oldmem=0x0, bytes=1264) at malloc.c:3001
#4  0x00227164 in av_buffer_realloc (pbuf=pbuf@entry=0xb0ff9eb8, size=size@entry=1264) at libavutil/buffer.c:192
#5  0x0011113a in packet_alloc (size=1200, buf=0xb0ff9eb8) at libavcodec/avpacket.c:88
#6  av_new_packet (pkt=pkt@entry=0x6fb020, size=size@entry=1200) at libavcodec/avpacket.c:100
#7  0x00109736 in ff_h264_handle_frag_packet (nal_header_len=1, nal_header=<synthetic pointer>, start_bit=0, len=1200,
    buf=0x71265e "\212\225杖A\357̰\f\356\243\315\300\066T\353US{7\231^\035\271\214>Q\n\346\232{b<\032\067\070y\203_\277M\004l7\240\301\005\305\332\334\304\006\361\366K\310>\377|\310$\020\233\334\030\363L\212\224)b\207\n_\325_\023\321囖\022\062\034\254X\341\205A\353\035", pkt=0x6fb020) at libavformat/rtpdec_h264.c:273
#8  h264_handle_packet_fu_a (nal_counters=0x0, nal_mask=31, data=<optimized out>, len=1200,
    buf=0x71265e "\212\225杖A\357̰\f\356\243\315\300\066T\353US{7\231^\035\271\214>Q\n\346\232{b<\032\067\070y\203_\277M\004l7\240\301\005\305\332\334\304\006\361\366K\310>\377|\310$\020\233\334\030\363L\212\224)b\207\n_\325_\023\321囖\022\062\034\254X\341\205A\353\035", pkt=0x6fb020, ctx=<optimized out>) at libavformat/rtpdec_h264.c:308
#9  h264_handle_packet (ctx=<optimized out>, data=<optimized out>, st=0x6fea10, pkt=0x6fb020, timestamp=0xb0ff9f48,
    buf=0x71265c "|\001\212\225杖A\357̰\f\356\243\315\300\066T\353US{7\231^\035\271\214>Q\n\346\232{b<\032\067\070y\203_\277M\004l7\240\301\005\305\332\334\304\006\361\366K\310>\377|\310$\020\233\334\030\363L\212\224)b\207\n_\325_\023\321囖\022\062\034\254X\341\205A\353\035", len=1202, seq=4736, flags=0) at libavformat/rtpdec_h264.c:359
#10 0x00107308 in rtp_parse_packet_internal (s=0x6ff020, pkt=0x6fb020,
    buf=0x71265c "|\001\212\225杖A\357̰\f\356\243\315\300\066T\353US{7\231^\035\271\214>Q\n\346\232{b<\032\067\070y\203_\277M\004l7\240\301\005\305\332\334\304\006\361\366K\310>\377|\310$\020\233\334\030\363L\212\224)b\207\n_\325_\023\321囖\022\062\034\254X\341\205A\353\035", len=1202) at libavformat/rtpdec.c:762
#11 0x001080ce in rtp_parse_one_packet (len=1214, bufptr=<optimized out>, pkt=0x6fb020, s=0x6ff020) at libavformat/rtpdec.c:916
#12 ff_rtp_parse_packet (s=0x6ff020, pkt=pkt@entry=0x6fb020, bufptr=bufptr@entry=0x6fd490, len=len@entry=1214)
    at libavformat/rtpdec.c:950
#13 0x000e8f98 in ff_rtsp_fetch_packet (s=s@entry=0x6fabb0, pkt=pkt@entry=0x6fb020) at libavformat/rtsp.c:2276
#14 0x000ead78 in rtsp_read_packet (s=0x6fabb0, pkt=0x6fb020) at libavformat/rtspdec.c:912
#15 0x000b58a4 in ff_read_packet (s=s@entry=0x6fabb0, pkt=pkt@entry=0x6fb020) at libavformat/demux.c:570
#16 0x000b6288 in read_frame_internal (s=0x6fabb0, pkt=0x6fb020) at libavformat/demux.c:1248
#17 0x000b6cf0 in av_read_frame (s=0x6fabb0, pkt=0x6fb020) at libavformat/demux.c:1455
#18 0x000301dc in CHandleH264::HandleRead(CHandlers::stPkt_t&) ()
#19 0x0002e7ea in CHandlers::VideoReaderLoop() ()
#20 0xb6c87dc8 in ?? () from /usr/lib/arm-linux-gnueabihf/libstdc++.so.6
#21 0xb6f2d5b4 in start_thread (arg=0x0) at pthread_create.c:335
#22 0xb6b01c3c in ?? () at ../sysdeps/unix/sysv/linux/arm/clone.S:89 from /lib/arm-linux-gnueabihf/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

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

Погуглил про malloc_consolidate, пишут сделать export MALLOC_CHECK_=3 для поиска кривого места в коде и теперь уже скоро сутки не могу уронить приложение как не гоняю, хотя падало вообще даже не под особой нагрузкой, почти в простое, через 2-6 часов…

Осталось еще valgrind попробовать, но раньше использовал его только для поиска места утечки в чужом коде, но визуально за 12 часов процессорного времени течи не наблюдаю (26мб памяти + 140мб виртуальной).

 , ,

wolverin
()

mmap + madvise верно использую?

Форум — Development

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

В продолжении темы

Задача отдать одновременно записываемый видео архив в сеть с флешки без файловой системы в один поток после успешного боевого тестирования идеи rtsp публикацией перетекла в задачу многопотока (предварительно до 50 штук). Как советовали в той теме решил попробовать mmap всего сырого носителя иба ручное управление буфером как то не улыбает.

Наваял нечто похожее

if ((fd = open(device, O_RDONLY)) < 0)
   fprintf(...);
else if ((md = mmap(NULL, partition_size, PROT_READ, MAP_SHARED, fd, (first_lba - 1) * sector_size + 1)) == MAP_FAILED)
   close(fd);
else if (madvise(md, partition_size, MADV_SEQUENTIAL) < 0)
   fprintf(...);

Вопросы

  1. корректно ли выполнять madvise и munmap без offset с учетом того что он не нулевой только на величину partition_size?
  2. при обращении к (uint8_t*)md + позиция_байта offset надо учитывать?
  3. на всякий случай - потокобезопасен п.2 так же как и системный вызов read/pread с учетом того что выполняется запись через fwrite/fflush со своим дескриптором?

 , ,

wolverin
()

Поделить канал между загрузками

Форум — Development

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

На SoC выполняю запись архива локально, передача которого через интернеты может быть либо через rtsp публикацию с выравниванием (паузами отправки) по времени rtp пакетов, либо через использование реализации «протокола» tcp в ffmpeg, когда используется вся пропускная способность канала, предоставленная провайдером.

Как бы вот так сделать, чтобы ничего не меряя до хоста на который происходит передача или rtsp шлюза, но по ходу передачи знать, что нужно удлинять паузы между параллельными отправками (возможно даже что то пропуская при передаче, чтобы не тормозило как ютуба :) ) ???

В памяти мелькает, что в Linux есть какие то счетчики на сеть, где вроде как можно проанализировать длину очереди tcp пакетов (скорее всего только его и буду использовать) или это бесполезно и нужно, например, прикручивать к проекту iperf и измерять скорость до шлюза?

 , ,

wolverin
()

string[] to char * char[]

Форум — Development

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

День тупняка сегодня…

Надобно передать мне в сишную функцию чужой либы статичный массив char * const *, но как бы вот так хитрожопо его создать вроде

char * services[] = {(char*)"1", (char*)"22", (char*)"333"};

но что бы можно было собрать его из std::string по типу

std::string services[] = {"1"+var1, var2+"22", "333" + var3 + "333"};

штоб не создавать левых переменных, динамических массивов, циклов переприсвоения и все освободилось атхаматом выйдя из области видимости )

 ,

wolverin
()

Инициализация const переменной класса?

Форум — Development

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

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

Т.е. что то вроде


class X
{
private:
  T * ptr;
public:
  const std::string city;
  X ()
  {
     ...
     ptr->start();
     city = ptr->CalcCity();
  }
}

 

wolverin
()

memcmp вместо strncmp для оптимизации?

Форум — Development

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

Построено у меня взаимодействие с тысячами железок через mqtt сервер, из всего многообразия «сообщений» приходящих через либу в типе char * msg есть пересылка снимков в jpeg, которые тоже приходят одномоментно тысячами штук на свой сервис, весь «парсинг заголовка сообщения» на этом сервисе выполнял обычным strncmp и для жпега это выглядит как

if (!strncmp(msg, "\xFF\xD8\xFF", 3)) { ... }
else if ...

как я понимаю memcmp быстрее strncmp, тем более мне нужно сравнить байты а не строки и понятно что так тоже как минимум компилируется

if (!memcmp(msg, "\xFF\xD8\xFF", 3)) { ... }

а можно БЕЗ объявления переменной выполнять сравнение набора байт любой длины?

мне такой в голову пришел перл, но что то сомнительна его производительность )

if (memcmp(msg, std::array<uint8_t,3>({0xFF, 0xD8, 0xFF}).data(), 3) == 0)

 , , memcmp, strncmp

wolverin
()

forward declaration возможен?

Форум — Development

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

В продолжении темы ) Как обратиться к std::shared_ptr<void> ???

Хотелось бы из boost сделать forward declaration для boost::property_tree::ptree в классе по типу

class CJSON
{
private:
    boost::property_tree::ptree  pt;

public:
    CJSON(const char * msg, const int lmsg);
};

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

Возможно такое??? Вариант моего нерабочего тупизма (

namespace boost {
    namespace property_tree {
        class basic_ptree;
        typedef basic_ptree<std::string, std::string> ptree;
    }
}

 ,

wolverin
()

php 7.4 amd64 для debian 10 (buster) подскажите?

Форум — Admin

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

Где раздобыть? Что то помыкался в гугле не могу живых зеркал найти с этой версией.

 , , php7.4

wolverin
()

Максимальное количество сетевых дисков?

Форум — Admin

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

Есть некая идея у коллег - чтобы ничего не кодить - внутри vpn подключить 100500 сетевых дисков от openipc к серверу и забирать с них выборочно поштучно файлы, коих где то 7000 штук.

Есть какие то ограничения именно по количеству если не учитывать пока вопрос производительности такой затеи??? Насколько знаю для того же nfs это ограничение на количество портов для клиента, где в данном случае клиентом будет железный сервер debian, а нфс сервером openipc.

 ,

wolverin
()

В ffmpeg тот самый SRTP для WebRTC?

Форум — Development

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

Есть хитрожопая надежда не писать велосипед в части реализации SRTP для сервера WebRTC, который бы полноценно работал БЕЗ промежуточного прокси сервера.

https://ffmpeg.org/ffmpeg-protocols.html#srtp Может кто знает прокатит это?

Или без вариантов нужно RTP пакеты пропускать через libsrtp?

 , ,

wolverin
()

Как использовать vdpau в ffmpeg?

Форум — Multimedia

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

Есть usb камера

# v4l2-ctl --all -d 0
Driver Info (not using libv4l2):
    Driver name   : uvcvideo
    Card type     : CS-USB-IMX307: UVC Camera
    Bus info      : usb-1c1d000.usb-1
    Driver version: 4.14.111
    Capabilities  : 0x84200001
        Video Capture
        Streaming
        Extended Pix Format
        Device Capabilities
    Device Caps   : 0x04200001
        Video Capture
        Streaming
        Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
    Width/Height      : 1920/1080
    Pixel Format      : 'H264'
    Field             : None
    Bytes per Line    : 3840
    Size Image        : 4147200
    Colorspace        : sRGB
    Transfer Function : Default
    YCbCr Encoding    : Default
    Quantization      : Default
    Flags             :
Crop Capability Video Capture:
    Bounds      : Left 0, Top 0, Width 1920, Height 1080
    Default     : Left 0, Top 0, Width 1920, Height 1080
    Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 1920, Height 1080
Selection: crop_bounds, Left 0, Top 0, Width 1920, Height 1080
Streaming Parameters Video Capture:
    Capabilities     : timeperframe
    Frames per second: 30.000 (30/1)
    Read buffers     : 0
                     brightness (int)    : min=0 max=100 step=1 default=50 value=50
                       contrast (int)    : min=0 max=100 step=1 default=50 value=50
                     saturation (int)    : min=0 max=100 step=1 default=50 value=50
                            hue (int)    : min=0 max=100 step=1 default=50 value=50
error 5 getting ctrl White Balance Temperature, Auto

с такими потоками

# v4l2-ctl --list-formats-ext -d 0
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUYV 4:2:2
        Size: Discrete 640x360
         Interval: Discrete 0.033s (30.000 fps)

    Index       : 1
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : Motion-JPEG
        Size: Discrete 640x360
         Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
         Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1920x1080
         Interval: Discrete 0.033s (30.000 fps)

    Index       : 2
    Type        : Video Capture
    Pixel Format: 'H264' (compressed)
    Name        : H.264
        Size: Discrete 640x360
         Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
         Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1920x1080
         Interval: Discrete 0.033s (30.000 fps)

есть ффмпег с поддержкой декодера на вдпау

# ./ffmpeg-ubrv -codecs | grep vdpau | grep 264
ffmpeg version git-2015-01-22-f86a076 Copyright (c) 2000-2014 the FFmpeg developers
  built on Jul 18 2024 12:09:53 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-vdpau --enable-libx264 --enable-libv4l2 --disable-doc
  libavutil      54.  6.100 / 54.  6.100
  libavcodec     56.  0.101 / 56.  0.101
  libavformat    56.  2.100 / 56.  2.100
  libavdevice    56.  0.100 / 56.  0.100
  libavfilter     5.  0.102 /  5.  0.102
  libswscale      3.  0.100 /  3.  0.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  0.100 / 53.  0.100
 DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_vdpau ) (encoders: libx264 libx264rgb cedrus264 )

пытаюсь проверить декодер как

# VDPAU_DRIVER=sunxi ./ffmpeg-ubrv -f v4l2 -input_format h264 -video_size 1920x1080 -pix_fmt yuyv422 -c:v h264_vdpau -i /dev/video0 -f null /dev/null

при поступлении опорного кадра падает с ошибкой

[video4linux2,v4l2 @ 0xf4c480] decoding for stream 0 failed
[video4linux2,v4l2 @ 0xf4c480] Could not find codec parameters for stream 0 (Video: h264 (Baseline), 1920x1080, -5 kb/s): unspecified pixel format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
/dev/video0: could not find codec parameters
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: h264 (Baseline), 1920x1080, -5 kb/s, 30 fps, 30 tbr, 1000k tbn, 2000k tbc
[buffer @ 0x1157c00] Unable to parse option value "-1" as pixel format
    Last message repeated 1 times
[buffer @ 0x1157c00] Error setting option pix_fmt to value -1.
[graph 0 input from stream 0:0 @ 0xf45620] Error applying options to the filter.
Error opening filters!

к слову использую

# ls -l /usr/lib/arm-linux-gnueabihf/vdpau/libvdpau_sunxi.so*
lrwxrwxrwx 1 root root 19 Jul 19 09:47 /usr/lib/arm-linux-gnueabihf/vdpau/libvdpau_sunxi.so -> libvdpau_sunxi.so.1
lrwxrwxrwx 1 root root 28 Jul 19 08:40 /usr/lib/arm-linux-gnueabihf/vdpau/libvdpau_sunxi.so.1 -> /home/pi/libvdpau_sunxi.so.1

но запрос не показывает какой либой пользуется

# vdpauinfo
vdpauinfo: cannot connect to X server

 ,

wolverin
()

Очистить буферы libav/ffmpeg?

Форум — Development

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

Вдрух кто знает - выполняю пересжатие из мжпег или х264 снова в х264, затем через локальный интерфейс отправляю в свой же rtsp сервер - никак не удается понять, почему при остановке стрима и его запуске вижу 1-2 секунды предыдущего стрима.

Все делаю через api ффмпега.

Думал кодер нужно сбрасывать через avcodec_flush_buffers в ответ ошибка Ignoring attempt to flush encoder that doesn't support it, может быть в декодере х264 накопилось - так нет, для мжпег те же 1-2 секунды предыдущих мусорных кадров, попытался сбросить входящий буфер ртсп сервера через avformat_flush(f) толку нет, варианты av_write_frame(f, NULL) avcodec_send_frame(c, NULL) и тп тоже ничего не сбрасывают.

Да важно - на кодер в начале стрима всегда поступает не сжатый кадр с признаками что он ключевой и типом I, поэтому стрим начинается всегда мгновенно, НО откуда то 1-2 секунды от предыдущего ((

 ,

wolverin
()

Кодек для ffmpeg или писать самому?

Форум — Development

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

В продолжении темы

Сцуть - в древней версии ffmpeg есть отреверсированный кодек cedrus для аппаратного УСКОРЕНИЯ кодирования в H264 на SoC.

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

Из опыта имею только поднятие ffserver до 5 ветки и реализация на его базе простого RTSP сервера )

 , ,

wolverin
()

fwrite + много pread

Форум — Development

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

В продолжении темы

Напомню - пишу по кольцу с камеры на флешку без файловой системы через буфер fwrite кусками по 256КБ, из за нехватки времени заняться вопросом скачивание архива выполнялось в полурукопашном режиме через открытие отдельного FILE* или дескриптора в отдельном потоке и долгая перекачка по ентернетам.

Пришло время заняться вопросом отдать архив нескольким клиентам одновременно и собсна вопрос - можно ли через уже открытый FILE* и int fd = fileno(FILE*), используя pread со своим смещением в каждом потоке безопасно выполнять выгрузку одного и того же «файла»? или лучше для каждой выгрузки-потока выполнять свой open?

ЗЫ. на старте не знаю сколько будет одновременно читающих потоков.

 ,

wolverin
()

Все таки fread или mmap?

Форум — Development

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

В продолжении темы

Имеется армка 512МБ рам и 512ГБ сд карта.

Суть - для построения журнала видео архива на носителе без файловой системы при прямом проходе (при обратном смещение 1 минута и перечитывается флешка за секунды) флешки выполняю смещение на размер кадра, для поиска нужным мне меток. Все в целом устраивало при перечитывании временных меток пока писал JPEG, который был размером где то 220КБ, но как только начал писать H264 перечитать флешку «вперед» стало проблемой иба кадры в основном около 15КБ.

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

Собсна глобальный вопрос - как бы ускорить чтение с носителя???

Второстепенный - fread vs fseeko какими буферами оперируют если читается фридом условно 20 байт и как его менять? setvbuf почему то чем то вроде setvbuf(pf, NULL, _IOFBF, 32 * 1024 * 1024) никак не влияет на скорость перечитывания носителя

Или может я просто уперся в физическую скорость флешки!?

 , fread, ,

wolverin
()

avcodec_send_frame потокобезопасен?

Форум — Development

жизнь боль )

в продолжении темы Как разблокировать одновременно 2 потока?

3 потока - декодер, енкодер и снимков, декодер ждет переключения между 2 декодированными буферами по барьеру и после переключения отпускает семафоры нужных потоков енкодеров, когда их 2 все работает, только становится на 1 больше и avcodec_send_frame потока снимков начинает переодически слать ошибку -22, даже засегфолился уже ((

для примера обработчик потока снимков

int SnapshotEncode(int (*callback)(const char * topic, const uint8_t * buf, int lbuf), const char * topic)
{
    const AVCodec * pCdc = avcodec_find_encoder(AV_CODEC_ID_MJPEG);
    if (!pCdc)
    {
        fprintf(stderr, "ERROR find snapshot encoder for '%s'\n", avcodec_get_name(AV_CODEC_ID_MJPEG));
        return -1;
    }

    struct stEncoder_t * enc = EncoderNew("snapshot");
    if (!enc) return -2;

    int rt = 0;
    AVCodecContext * pCdcCtx = avcodec_alloc_context3(pCdc);
    if (!pCdcCtx)
    {
        PrintErrorAV("alloc snapshot an encoding context", (rt = AVERROR(ENOMEM)));
        return rt;
    }

    pCdcCtx->time_base = DEFAULT_TIME_BASE;
    pCdcCtx->pix_fmt = pCdcCtxInp->pix_fmt;
    pCdcCtx->height = pCdcCtxInp->height;
    pCdcCtx->width = pCdcCtxInp->width;

    if ((rt = avcodec_open2(pCdcCtx, pCdc, NULL)))
    {
        PrintErrorAV("open snapshot encoder", rt);
        goto END;
    }

    AVPacket * pPkt = av_packet_alloc();
    if (!pPkt)
    {
        PrintErrorAV("allocate snapshot AVPacket", (rt = AVERROR(ENOMEM)));
        goto END;
    }

    EncoderRun(enc, 1);
    if ((rt = sem_wait(&enc->sem)) < 0)
        fprintf(stderr, "ERROR lock encoder semaphore: %d %s\n", errno, strerror(errno));

    if (rt)
    {
        EncoderRun(enc, 0);
        pthread_barrier_wait(&stDec.bar);
        goto END;
    }

    if ((rt = avcodec_send_frame(pCdcCtx, stEnc.pFrm)))
        PrintErrorAV("snapshot encode send", rt);
    else if ((rt = avcodec_receive_packet(pCdcCtx, pPkt)))
        PrintErrorAV("snapshot encode receive", rt);

    EncoderRun(enc, 0);
    pthread_barrier_wait(&stDec.bar);

    if (rt == 0) callback(topic, pPkt->data, pPkt->size);

    av_packet_unref(pPkt);

END:
    EncoderFree(enc);
    if (pPkt) av_packet_free(&pPkt);
    if (pCdcCtx) avcodec_free_context(&pCdcCtx);

    return rt;
}

 , ,

wolverin
()

Как разблокировать одновременно 2 потока?

Форум — Development

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

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

Вопрос - как бэ из потока декодера запускать сразу 2 потока енкодеров, при этом поток декодера должен ждать завершения обоих???

В идеале бы конешно на С, т.к. сишный модуль этим занимается.

Спасибо за любые идеи )

 ,

wolverin
()

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