Recherche avancée

Médias (0)

Mot : - Tags -/clipboard

Aucun média correspondant à vos critères n’est disponible sur le site.

Autres articles (95)

  • Amélioration de la version de base

    13 septembre 2013

    Jolie sélection multiple
    Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
    Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...)

  • Le plugin : Gestion de la mutualisation

    2 mars 2010, par

    Le plugin de Gestion de mutualisation permet de gérer les différents canaux de mediaspip depuis un site maître. Il a pour but de fournir une solution pure SPIP afin de remplacer cette ancienne solution.
    Installation basique
    On installe les fichiers de SPIP sur le serveur.
    On ajoute ensuite le plugin "mutualisation" à la racine du site comme décrit ici.
    On customise le fichier mes_options.php central comme on le souhaite. Voilà pour l’exemple celui de la plateforme mediaspip.net :
    < ?php (...)

  • Gestion de la ferme

    2 mars 2010, par

    La ferme est gérée dans son ensemble par des "super admins".
    Certains réglages peuvent être fais afin de réguler les besoins des différents canaux.
    Dans un premier temps il utilise le plugin "Gestion de mutualisation"

Sur d’autres sites (10738)

  • Frames took with ELP camera has unknown pixel format at FHD ?

    11 novembre 2024, par Marcel Kopera

    I'm trying to take a one frame ever x seconds from my usb camera. Name of the camera is : ELP-USBFHD06H-SFV(5-50).&#xA;Code is not 100% done yet, but I'm using it this way right now ↓ (shot fn is called from main.py in a loop)

    &#xA;

    &#xA;import cv2&#xA;import subprocess&#xA;&#xA;from time import sleep&#xA;from collections import namedtuple&#xA;&#xA;from errors import *&#xA;&#xA;class Camera:&#xA;    def __init__(self, cam_index, res_width, res_height, pic_format, day_time_exposure_ms, night_time_exposure_ms):&#xA;        Resolution = namedtuple("resolution", ["width", "height"])&#xA;        self.manual_mode(True)&#xA;&#xA;        self.cam_index = cam_index&#xA;        self.camera_resolution = Resolution(res_width, res_height)&#xA;        self.picture_format = pic_format&#xA;        self.day_time_exposure_ms = day_time_exposure_ms&#xA;        self.night_time_exposure_ms = night_time_exposure_ms&#xA;&#xA;        self.started: bool = False&#xA;        self.night_mode = False&#xA;&#xA;        self.cap = cv2.VideoCapture(self.cam_index, cv2.CAP_V4L2)&#xA;        self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, self.camera_resolution.width)&#xA;        self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, self.camera_resolution.height)&#xA;        self.cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*self.picture_format))&#xA;&#xA;    &#xA;&#xA;    def start(self):&#xA;        sleep(1)&#xA;        if not self.cap.isOpened():&#xA;            return CameraCupError()&#xA;&#xA;        self.set_exposure_time(self.day_time_exposure_ms)&#xA;        self.set_brightness(0)&#xA;        sleep(0.1)&#xA;        &#xA;        self.started = True&#xA;&#xA;&#xA;&#xA;    def shot(self, picture_name, is_night):&#xA;        if not self.started:&#xA;            return InitializationError()&#xA;&#xA;        self.configure_mode(is_night)&#xA;&#xA;        # Clear buffer&#xA;        for _ in range(5):&#xA;            ret, _ = self.cap.read()&#xA;&#xA;        ret, frame = self.cap.read()&#xA;&#xA;        sleep(0.1)&#xA;&#xA;        if ret:&#xA;            print(picture_name)&#xA;            cv2.imwrite(picture_name, frame)&#xA;            return True&#xA;&#xA;        else:&#xA;            print("No photo")&#xA;            return False&#xA;&#xA;&#xA;    &#xA;    def release(self):&#xA;        self.set_exposure_time(156)&#xA;        self.set_brightness(0)&#xA;        self.manual_mode(False)&#xA;        self.cap.release()&#xA;&#xA;&#xA;&#xA;    def manual_mode(self, switch: bool):&#xA;        if switch:&#xA;            subprocess.run(["v4l2-ctl", "--set-ctrl=auto_exposure=1"])&#xA;        else:&#xA;            subprocess.run(["v4l2-ctl", "--set-ctrl=auto_exposure=3"])&#xA;        sleep(1)&#xA;&#xA;    &#xA;    &#xA;    def configure_mode(self, is_night):&#xA;        if is_night == self.night_mode:&#xA;            return&#xA;&#xA;        if is_night:&#xA;            self.night_mode = is_night&#xA;            self.set_exposure_time(self.night_time_exposure_ms)&#xA;            self.set_brightness(64)&#xA;        else:&#xA;            self.night_mode = is_night&#xA;            self.set_exposure_time(self.day_time_exposure_ms)&#xA;            self.set_brightness(0)&#xA;        sleep(0.1)&#xA;&#xA;&#xA;&#xA;    def set_exposure_time(self, ms: int):&#xA;        ms = int(ms)&#xA;        default_val = 156&#xA;&#xA;        if ms &lt; 1 or ms > 5000:&#xA;            ms = default_val&#xA;&#xA;        self.cap.set(cv2.CAP_PROP_EXPOSURE, ms)&#xA;&#xA;&#xA;&#xA;    def set_brightness(self, value: int):&#xA;        value = int(value)&#xA;        default_val = 0&#xA;&#xA;        if value &lt; -64 or value > 64:&#xA;            value = default_val&#xA;&#xA;        self.cap.set(cv2.CAP_PROP_BRIGHTNESS, value)&#xA;

    &#xA;

    Here are settings for the camera (yaml file)

    &#xA;

    camera:&#xA;  camera_index: 0&#xA;  res_width: 1920&#xA;  res_height: 1080&#xA;  picture_format: "MJPG"&#xA;  day_time_exposure_ms: 5&#xA;  night_time_exposure_ms: 5000&#xA;  photos_format: "jpg"&#xA;&#xA;

    &#xA;

    I do some configs like set manual mode for the camera, change exposure/brightness and saving frame.&#xA;Also the camera is probably catching the frames to the buffer (it is not saving latest frame in real time : it's more laggish), so I have to clear buffer every time. like this

    &#xA;

            # Clear buffer from old frames&#xA;        for _ in range(5):&#xA;            ret, _ = self.cap.read()&#xA;        &#xA;        # Get a new frame&#xA;        ret, frame = self.cap.read()&#xA;

    &#xA;

    What I really don't like, but I could find a better way (tldr : setting buffer for 1 frame doesn't work on my camera).

    &#xA;

    Frames saved this method looks good with 1920x1080 resolution. BUT when I try to run ffmpeg command to make a timelapse from saved jpg file like this

    &#xA;

    ffmpeg -framerate 20 -pattern_type glob -i "*.jpg" -c:v libx264 output.mp4&#xA;

    &#xA;

    I got an error like this one

    &#xA;

    [image2 @ 0x555609c45240] Could not open file : 08:59:20.jpg&#xA;[image2 @ 0x555609c45240] Could not find codec parameters for stream 0 (Video: mjpeg, none(bt470bg/unknown/unknown)): unspecified size&#xA;Consider increasing the value for the &#x27;analyzeduration&#x27; (0) and &#x27;probesize&#x27; (5000000) options&#xA;Input #0, image2, from &#x27;*.jpg&#x27;:&#xA;  Duration: 00:00:00.05, start: 0.000000, bitrate: N/A&#xA;  Stream #0:0: Video: mjpeg, none(bt470bg/unknown/unknown), 20 fps, 20 tbr, 20 tbn&#xA;Output #0, mp4, to &#x27;output.mp4&#x27;:&#xA;Output file #0 does not contain any stream&#xA;

    &#xA;

    Also when I try to copy the files from Linux to Windows I get some weird copy failing error and option to skip the picture. But even when I press the skip button, the picture is copied and can be opened. I'm not sure what is wrong with the format, but the camera is supporting MPEG at 1920x1080.

    &#xA;

    >>> v4l2-ctl --all&#xA;&#xA;Driver Info:&#xA;        Driver name      : uvcvideo&#xA;        Card type        : H264 USB Camera: USB Camera&#xA;        Bus info         : usb-xhci-hcd.1-1&#xA;        Driver version   : 6.6.51&#xA;        Capabilities     : 0x84a00001&#xA;                Video Capture&#xA;                Metadata Capture&#xA;                Streaming&#xA;                Extended Pix Format&#xA;                Device Capabilities&#xA;        Device Caps      : 0x04200001&#xA;                Video Capture&#xA;                Streaming&#xA;                Extended Pix Format&#xA;Media Driver Info:&#xA;        Driver name      : uvcvideo&#xA;        Model            : H264 USB Camera: USB Camera&#xA;        Serial           : 2020032801&#xA;        Bus info         : usb-xhci-hcd.1-1&#xA;        Media version    : 6.6.51&#xA;        Hardware revision: 0x00000100 (256)&#xA;        Driver version   : 6.6.51&#xA;Interface Info:&#xA;        ID               : 0x03000002&#xA;        Type             : V4L Video&#xA;Entity Info:&#xA;        ID               : 0x00000001 (1)&#xA;        Name             : H264 USB Camera: USB Camera&#xA;        Function         : V4L2 I/O&#xA;        Flags            : default&#xA;        Pad 0x0100000d   : 0: Sink&#xA;          Link 0x0200001a: from remote pad 0x1000010 of entity &#x27;Extension 4&#x27; (Video Pixel Formatter): Data, Enabled, Immutable&#xA;Priority: 2&#xA;Video input : 0 (Camera 1: ok)&#xA;Format Video Capture:&#xA;        Width/Height      : 1920/1080&#xA;        Pixel Format      : &#x27;MJPG&#x27; (Motion-JPEG)&#xA;        Field             : None&#xA;        Bytes per Line    : 0&#xA;        Size Image        : 4147789&#xA;        Colorspace        : sRGB&#xA;        Transfer Function : Default (maps to sRGB)&#xA;        YCbCr/HSV Encoding: Default (maps to ITU-R 601)&#xA;        Quantization      : Default (maps to Full Range)&#xA;        Flags             :&#xA;Crop Capability Video Capture:&#xA;        Bounds      : Left 0, Top 0, Width 1920, Height 1080&#xA;        Default     : Left 0, Top 0, Width 1920, Height 1080&#xA;        Pixel Aspect: 1/1&#xA;Selection Video Capture: crop_default, Left 0, Top 0, Width 1920, Height 1080, Flags:&#xA;Selection Video Capture: crop_bounds, Left 0, Top 0, Width 1920, Height 1080, Flags:&#xA;Streaming Parameters Video Capture:&#xA;        Capabilities     : timeperframe&#xA;        Frames per second: 15.000 (15/1)&#xA;        Read buffers     : 0&#xA;&#xA;User Controls&#xA;&#xA;                     brightness 0x00980900 (int)    : min=-64 max=64 step=1 default=0 value=64&#xA;                       contrast 0x00980901 (int)    : min=0 max=64 step=1 default=32 value=32&#xA;                     saturation 0x00980902 (int)    : min=0 max=128 step=1 default=56 value=56&#xA;                            hue 0x00980903 (int)    : min=-40 max=40 step=1 default=0 value=0&#xA;        white_balance_automatic 0x0098090c (bool)   : default=1 value=1&#xA;                          gamma 0x00980910 (int)    : min=72 max=500 step=1 default=100 value=100&#xA;                           gain 0x00980913 (int)    : min=0 max=100 step=1 default=0 value=0&#xA;           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=1 value=1 (50 Hz)&#xA;                                0: Disabled&#xA;                                1: 50 Hz&#xA;                                2: 60 Hz&#xA;      white_balance_temperature 0x0098091a (int)    : min=2800 max=6500 step=1 default=4600 value=4600 flags=inactive&#xA;                      sharpness 0x0098091b (int)    : min=0 max=6 step=1 default=3 value=3&#xA;         backlight_compensation 0x0098091c (int)    : min=0 max=2 step=1 default=1 value=1&#xA;&#xA;Camera Controls&#xA;&#xA;                  auto_exposure 0x009a0901 (menu)   : min=0 max=3 default=3 value=1 (Manual Mode)&#xA;                                1: Manual Mode&#xA;                                3: Aperture Priority Mode&#xA;         exposure_time_absolute 0x009a0902 (int)    : min=1 max=5000 step=1 default=156 value=5000&#xA;     exposure_dynamic_framerate 0x009a0903 (bool)   : default=0 value=0&#xA;

    &#xA;

    I also tried to save the picture using ffmpeg in a case something is not right with opencv like this :

    &#xA;

    ffmpeg -f v4l2 -framerate 30 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -preset fast -crf 23 -t 00:01:00 output.mp4&#xA;&#xA;

    &#xA;

    It is saving the picture but also changing its format

    &#xA;

    [video4linux2,v4l2 @ 0x555659ed92b0] The V4L2 driver changed the video from 1920x1080 to 800x600&#xA;[video4linux2,v4l2 @ 0x555659ed92b0] The driver changed the time per frame from 1/30 to 1/15&#xA;

    &#xA;

    But the format looks right when set it back to FHD using v4l2

    &#xA;

    &#xA;>>> v4l2-ctl --device=/dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=MJPG&#xA;>>> v4l2-ctl --get-fmt-video&#xA;&#xA;Format Video Capture:&#xA;        Width/Height      : 1920/1080&#xA;        Pixel Format      : &#x27;MJPG&#x27; (Motion-JPEG)&#xA;        Field             : None&#xA;        Bytes per Line    : 0&#xA;        Size Image        : 4147789&#xA;        Colorspace        : sRGB&#xA;        Transfer Function : Default (maps to sRGB)&#xA;        YCbCr/HSV Encoding: Default (maps to ITU-R 601)&#xA;        Quantization      : Default (maps to Full Range)&#xA;        Flags             :&#xA;

    &#xA;

    I'm not sure what could be wrong with the format/camera and I don't think I have enough information to figure it out.

    &#xA;

    I tried to use ffmpeg instead of opencv and also change a few settings in opencv&#x27;s cup config.

    &#xA;

  • Use ffmpeg multiple h264_nvenc instances will crash occurs during release

    13 août 2024, par yang zhao

    Use FFMpeg, When multiple threads use multiple h264_nvenc instances(one instance per thread), an exception crash occurs during release(avcodec_free_context), and the final exception occurs in libnvcuvid.so.&#xA;I don't know what the reason is ? Please help, thanks.&#xA;The same problem exists : ffmpeg v5.0.1 + cuda v11.6 and ffmpeg v7.0.1 + cuda v12.2&#xA;operating system:Ubuntu 22.04.4 LTS

    &#xA;

    The specific code is as follows :

    &#xA;

    class NvencEncoder {&#xA;public:&#xA;    NvencEncoder() {}&#xA;    ~NvencEncoder { Close(); }&#xA;    &#xA;    bool Open() {&#xA;        auto encoder = avcodec_find_encoder_by_name("h264_nvenc");&#xA;        pCodecCtx_ = avcodec_alloc_context3(encoder);&#xA;        if (!pCodecCtx_)&#xA;            return false;&#xA;&#xA;        int width = 1920;&#xA;        int height = 1080;&#xA;        int bitrate = 1000000;&#xA;        &#xA;        pCodecCtx_->codec_type = AVMEDIA_TYPE_VIDEO;&#xA;        pCodecCtx_->pix_fmt = AV_PIX_FMT_YUV420P;&#xA;        pCodecCtx_->width = width;&#xA;        pCodecCtx_->height = height;&#xA;        pCodecCtx_->bit_rate = bitrate;&#xA;        pCodecCtx_->rc_min_rate = bitrate;&#xA;        pCodecCtx_->rc_max_rate = bitrate;&#xA;        pCodecCtx_->bit_rate_tolerance = bitrate;&#xA;        pCodecCtx_->rc_buffer_size = bitrate / 2;&#xA;        pCodecCtx_->time_base = AVRational{ 1, 90000 };&#xA;        pCodecCtx_->framerate = AVRational{ 25, 1 };&#xA;        pCodecCtx_->gop_size = 50;&#xA;        pCodecCtx_->max_b_frames = 0;&#xA;        pCodecCtx_->delay = 0;&#xA;        pCodecCtx_->refs = 2;&#xA;        pCodecCtx_->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;&#xA;&#xA;        av_opt_set_int(pCodecCtx_->priv_data, "gpu", 0, 0);&#xA;        av_opt_set(pCodecCtx_->priv_data, "preset", "llhp", 0);&#xA;        av_opt_set(pCodecCtx_->priv_data, "rc", "cbr", 0);&#xA;        av_opt_set(pCodecCtx_->priv_data, "profile", "main", 0);&#xA;        av_opt_set(pCodecCtx_->priv_data, "zerolatency", "1", 0);&#xA;        av_opt_set(pCodecCtx_->priv_data, "delay", "0", 0);&#xA;        av_opt_set(pCodecCtx_->priv_data, "preset", "medium", 0);&#xA;&#xA;        int ret = avcodec_open2(pCodecCtx_, encoder, nullptr);&#xA;        if (ret &lt; 0)&#xA;            return false;&#xA;&#xA;        pkt_ = av_packet_alloc();&#xA;        if (!pkt_)&#xA;            return false;&#xA;&#xA;        char output_mp4[] = "output.mp4";&#xA;        ret = avformat_alloc_output_context2(&amp;avMp4Context_, NULL, "mp4", output_mp4);&#xA;        if (ret &lt; 0)&#xA;            return false;&#xA;            &#xA;        mp4_stream_ = avformat_new_stream(avMp4Context_, nullptr);&#xA;        if (!mp4_stream_)&#xA;            return false;&#xA;&#xA;        ret = avcodec_parameters_copy(mp4_stream_->codecpar, out_stream_->codecpar);&#xA;        if (ret &lt; 0)&#xA;            return false;&#xA;            &#xA;        mp4_stream_->codecpar->codec_tag = 0;&#xA;&#xA;        if (!(avMp4Context_->oformat->flags &amp; AVFMT_NOFILE)) {&#xA;            ret = avio_open(&amp;avMp4Context_->pb, output_mp4_.c_str(), AVIO_FLAG_WRITE);&#xA;            if (ret &lt; 0) {&#xA;                return false;&#xA;        }&#xA;        return true;&#xA;    }&#xA;&#xA;    void Close() {&#xA;        if (pCodecCtx_)&#xA;            avcodec_free_context(&amp;pCodecCtx_); // Crash will occur in libnvcuvid.so&#xA;&#xA;        if (avMp4Context_) {&#xA;            if (avMp4Context_->oformat &amp;&amp; !(avMp4Context_->oformat->flags &amp; AVFMT_NOFILE)) {&#xA;                avio_closep(&amp;avMp4Context_->pb);&#xA;            }&#xA;            avformat_free_context(avMp4Context_);&#xA;            avMp4Context_ = nullptr;&#xA;        }&#xA;        &#xA;        if (pkt_)&#xA;            av_packet_free(&amp;pkt_);&#xA;    }&#xA;&#xA;    bool InputFrame(AVFrame* frame) {&#xA;        int ret = avcodec_send_frame(pEncoderVideoCodecCtx_, frame);&#xA;        if (ret &lt; 0)&#xA;            return false;&#xA;            &#xA;        while (ret >= 0) {&#xA;            ret = avcodec_receive_packet(pEncoderVideoCodecCtx_, pkt_);&#xA;            if (ret &lt; 0)&#xA;                break;&#xA;&#xA;            if (avNotHeadWrited_) {&#xA;                ret = avformat_write_header(avMp4Context_, &amp;opts);&#xA;                if (ret &lt; 0) {&#xA;                    av_packet_unref(pkt_);&#xA;                    break;&#xA;                }&#xA;                avNotHeadWrited_ = false;&#xA;            }&#xA;&#xA;            av_packet_rescale_ts(pkt_, pCodecCtx_->time_base, mp4_stream_->time_base);&#xA;            ret = av_write_frame(avMp4Context_, pkt_);&#xA;            if (ret &lt; 0) {&#xA;                av_packet_unref(pkt_);&#xA;                break;&#xA;            }&#xA;&#xA;            av_packet_unref(pkt_);&#xA;        }&#xA;        &#xA;        return (ret >= 0);&#xA;    }&#xA;private:&#xA;    AVPacket* pkt_ = nullptr;&#xA;    AVCodecContext* pCodecCtx_ = nullptr;&#xA;    AVFormatContext* avMp4Context_ = nullptr;&#xA;    AVStream* mp4_stream_ = nullptr;&#xA;    avNotHeadWrited_ = true;&#xA;}&#xA;&#xA;uint8_t* data = nullptr; //a frame of yuv420 data&#xA;void Run(int idx);&#xA;&#xA;int main() {&#xA;    //Fill a frame of yuv420 data here&#xA;    ...&#xA;&#xA;    std::thread th[3];&#xA;    for (int i = 0; i &lt; 3; i&#x2B;&#x2B;) {&#xA;        th[i] = std::thread(Run, i);&#xA;        sleep(3);&#xA;    }&#xA;&#xA;    sleep(35);&#xA;&#xA;    for (int i = 0; i &lt; 3; i&#x2B;&#x2B;) {&#xA;        if (th[i].joinable()) {&#xA;            printf("thread %d join()\n", i);&#xA;            th[i].join();&#xA;        }&#xA;    }&#xA;&#xA;    free(data);&#xA;    printf("Exit\n");&#xA;}&#xA;&#xA;void Run(int idx) {&#xA;    printf("Run() thread(%d)\n", idx);&#xA;    //cudaSetDevice(0);&#xA;&#xA;    auto nvenc = new NvencEncoder(ffpar, FFOutputCB);&#xA;    if (!nvenc->Open()) {&#xA;        delete nvenc;&#xA;        return;&#xA;    }&#xA;&#xA;    auto avframe_ = av_frame_alloc();&#xA;    avframe_->width = 1920;&#xA;    avframe_->height = 1080;&#xA;    avframe_->format = AV_PIX_FMT_YUV420P;&#xA;&#xA;    int ret = av_frame_get_buffer(avframe_, 0);&#xA;    if (ret &lt; 0) {&#xA;        printf("av_frame_get_buffer() is error %d\n", ret);&#xA;        delete nvenc;&#xA;        av_frame_free(&amp;avframe_);&#xA;        return;&#xA;    }&#xA;&#xA;    int frame_size = 1920 * 1080;&#xA;    double one_frame_us = 1000000.0 / 25.0;&#xA;    unsigned long frame_count = 0;&#xA;    struct timeval t1, t2;&#xA;    double timeuse;&#xA;&#xA;    AVRational timebase = { ffpar.timebase_num, ffpar.timebase_den };&#xA;    std::int64_t llCalcDuration = (double)AV_TIME_BASE / 25.0;&#xA;    double in_stream_timebase = av_q2d(timebase);&#xA;    std::int64_t duration = (double)llCalcDuration / (double)(in_stream_timebase * AV_TIME_BASE);&#xA;    avframe_->time_base = timebase;&#xA;    gettimeofday(&amp;t1, NULL);&#xA;&#xA;    while (frame_count &lt; 25*30) { //30 seconds&#xA;&#xA;        avframe_->pts = (double)(frame_count * llCalcDuration) / (double(in_stream_timebase * AV_TIME_BASE));&#xA;        //avframe_->duration = duration;&#xA;        frame_count&#x2B;&#x2B;;&#xA;&#xA;        ret = av_frame_make_writable(avframe_);&#xA;        if (ret &lt; 0) {&#xA;            printf("av_frame_make_writable() is error %d\n", ret);&#xA;            break;&#xA;        }&#xA;&#xA;        // copy YUV420&#xA;        memcpy(avframe_->data[0], data, frame_size);&#xA;        memcpy(avframe_->data[1], data &#x2B; frame_size, frame_size / 4);&#xA;        memcpy(avframe_->data[2], data &#x2B; frame_size * 5 / 4, frame_size / 4);&#xA;&#xA;        ret = nvenc->InputFrame(avframe_);&#xA;        if (ret &lt; 0) {&#xA;            printf("InputFrame() is error: %d\n", ret);&#xA;            break;&#xA;        }&#xA;&#xA;        // frame rate&#xA;        gettimeofday(&amp;t2, NULL);&#xA;        timeuse = (t2.tv_sec - t1.tv_sec) * 1000000 &#x2B; (t2.tv_usec - t1.tv_usec); //us&#xA;        if (timeuse &lt; one_frame_us) {&#xA;            usleep(one_frame_us - timeuse);&#xA;        }&#xA;        gettimeofday(&amp;t1, NULL);&#xA;    }&#xA;&#xA;    if (frame_count > 0) {&#xA;        nvenc->WriteTrailer();&#xA;    }&#xA;&#xA;    printf("do Close() thread(%d)\n", idx);&#xA;    nvenc->Close();  // Crash will occur&#xA;    printf("Closed thread(%d)\n", idx);&#xA;    delete nvenc;&#xA;    av_frame_free(&amp;avframe_);&#xA;}&#xA;

    &#xA;

  • Need help using libavfilter for adding overlay to frames [closed]

    30 juillet 2024, par Michael Werner

    Hello gentlemen and ladies,

    &#xA;

    I am working with libavfilter and I am getting crazy.

    &#xA;

    On Windows 11 OS with latest libav (full build) a C/C++ app reads YUV420P frames from a frame grabber card.

    &#xA;

    I want to draw a bitmap (BGR24) overlay image from file on every frame via libavfilter. First I convert the BGR24 overlay image via format filter to YUV420P. Then I feed the YUV420P frame from frame grabber and the YUV420P overlay into the overlay filter.

    &#xA;

    Everything seems to be fine but when I try to get the frame out of the filter graph I always get an "Resource is temporary not available" (EAGAIN) return code, independent on how many frames I put into the graph.

    &#xA;

    The frames from the frame grabber card are fine, I could encode them or write them to a .yuv file. The overlay frame looks fine too.

    &#xA;

    My current initialization code looks like below. It does not report any errors or warnings but when I try to get the filtered frame out of the graph via av_buffersink_get_frame I always get an EAGAIN return code.

    &#xA;

    Here is my current initialization code :

    &#xA;

    int init_overlay_filter(AVFilterGraph** graph, AVFilterContext** src_ctx, AVFilterContext** overlay_src_ctx,&#xA;                        AVFilterContext** sink_ctx)&#xA;{&#xA;    AVFilterGraph* filter_graph;&#xA;    AVFilterContext* buffersrc_ctx;&#xA;    AVFilterContext* overlay_buffersrc_ctx;&#xA;    AVFilterContext* buffersink_ctx;&#xA;    AVFilterContext* overlay_ctx;&#xA;    AVFilterContext* format_ctx;&#xA;    const AVFilter *buffersrc, *buffersink, *overlay_buffersrc, *overlay_filter, *format_filter;&#xA;    int ret;&#xA;&#xA;    // Create the filter graph&#xA;    filter_graph = avfilter_graph_alloc();&#xA;    if (!filter_graph)&#xA;    {&#xA;        fprintf(stderr, "Unable to create filter graph.\n");&#xA;        return AVERROR(ENOMEM);&#xA;    }&#xA;&#xA;    // Create buffer source filter for main video&#xA;    buffersrc = avfilter_get_by_name("buffer");&#xA;    if (!buffersrc)&#xA;    {&#xA;        fprintf(stderr, "Unable to find buffer filter.\n");&#xA;        return AVERROR_FILTER_NOT_FOUND;&#xA;    }&#xA;&#xA;    // Create buffer source filter for overlay image&#xA;    overlay_buffersrc = avfilter_get_by_name("buffer");&#xA;    if (!overlay_buffersrc)&#xA;    {&#xA;        fprintf(stderr, "Unable to find buffer filter.\n");&#xA;        return AVERROR_FILTER_NOT_FOUND;&#xA;    }&#xA;&#xA;    // Create buffer sink filter&#xA;    buffersink = avfilter_get_by_name("buffersink");&#xA;    if (!buffersink)&#xA;    {&#xA;        fprintf(stderr, "Unable to find buffersink filter.\n");&#xA;        return AVERROR_FILTER_NOT_FOUND;&#xA;    }&#xA;&#xA;    // Create overlay filter&#xA;    overlay_filter = avfilter_get_by_name("overlay");&#xA;    if (!overlay_filter)&#xA;    {&#xA;        fprintf(stderr, "Unable to find overlay filter.\n");&#xA;        return AVERROR_FILTER_NOT_FOUND;&#xA;    }&#xA;&#xA;    // Create format filter&#xA;    format_filter = avfilter_get_by_name("format");&#xA;    if (!format_filter) &#xA;    {&#xA;        fprintf(stderr, "Unable to find format filter.\n");&#xA;        return AVERROR_FILTER_NOT_FOUND;&#xA;    }&#xA;&#xA;    // Initialize the main video buffer source&#xA;    char args[512];&#xA;    snprintf(args, sizeof(args),&#xA;             "video_size=1920x1080:pix_fmt=yuv420p:time_base=1/25:pixel_aspect=1/1");&#xA;    ret = avfilter_graph_create_filter(&amp;buffersrc_ctx, buffersrc, "in", args, NULL, filter_graph);&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        fprintf(stderr, "Unable to create buffer source filter for main video.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Initialize the overlay buffer source&#xA;    snprintf(args, sizeof(args),&#xA;             "video_size=165x165:pix_fmt=bgr24:time_base=1/25:pixel_aspect=1/1");&#xA;    ret = avfilter_graph_create_filter(&amp;overlay_buffersrc_ctx, overlay_buffersrc, "overlay_in", args, NULL,&#xA;                                       filter_graph);&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        fprintf(stderr, "Unable to create buffer source filter for overlay.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Initialize the format filter to convert overlay image to yuv420p&#xA;    snprintf(args, sizeof(args), "pix_fmts=yuv420p");&#xA;    ret = avfilter_graph_create_filter(&amp;format_ctx, format_filter, "format", args, NULL, filter_graph);&#xA;&#xA;    if (ret &lt; 0) &#xA;    {&#xA;        fprintf(stderr, "Unable to create format filter.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Initialize the buffer sink&#xA;    ret = avfilter_graph_create_filter(&amp;buffersink_ctx, buffersink, "out", NULL, NULL, filter_graph);&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        fprintf(stderr, "Unable to create buffer sink filter.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Initialize the overlay filter&#xA;    ret = avfilter_graph_create_filter(&amp;overlay_ctx, overlay_filter, "overlay", "W-w:H-h:enable=&#x27;between(t,0,20)&#x27;:format=yuv420", NULL, filter_graph);&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        fprintf(stderr, "Unable to create overlay filter.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Connect the filters&#xA;    ret = avfilter_link(overlay_buffersrc_ctx, 0, format_ctx, 0);&#xA;&#xA;    if (ret >= 0)&#xA;    {&#xA;        ret = avfilter_link(buffersrc_ctx, 0, overlay_ctx, 0);&#xA;    }&#xA;    else&#xA;    {&#xA;        fprintf(stderr, "Unable to configure filter graph.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;&#xA;    if (ret >= 0) &#xA;    {&#xA;        ret = avfilter_link(format_ctx, 0, overlay_ctx, 1);&#xA;    }&#xA;    else&#xA;    {&#xA;        fprintf(stderr, "Unable to configure filter graph.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    if (ret >= 0) &#xA;    {&#xA;        if ((ret = avfilter_link(overlay_ctx, 0, buffersink_ctx, 0)) &lt; 0)&#xA;        {&#xA;            fprintf(stderr, "Unable to link filter graph.\n");&#xA;            return ret;&#xA;        }&#xA;    }&#xA;    else&#xA;    {&#xA;        fprintf(stderr, "Unable to configure filter graph.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Configure the filter graph&#xA;    if ((ret = avfilter_graph_config(filter_graph, NULL)) &lt; 0)&#xA;    {&#xA;        fprintf(stderr, "Unable to configure filter graph.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    *graph = filter_graph;&#xA;    *src_ctx = buffersrc_ctx;&#xA;    *overlay_src_ctx = overlay_buffersrc_ctx;&#xA;    *sink_ctx = buffersink_ctx;&#xA;&#xA;    return 0;&#xA;}&#xA;

    &#xA;

    Feeding the filter graph is done this way :

    &#xA;

    av_buffersrc_add_frame_flags(buffersrc_ctx, pFrameGrabberFrame, AV_BUFFERSRC_FLAG_KEEP_REF)&#xA;av_buffersink_get_frame(buffersink_ctx, filtered_frame)&#xA;

    &#xA;

    av_buffersink_get_frame returns always EAGAIN, no matter how many frames I feed into the graph. The frames (from framegrabber and the overlay frame) itself are looking fine.

    &#xA;

    I did set libav logging level to maximum but I do not see any warnings or errors or helpful, related information in the log.

    &#xA;

    Here the log output related to the filter configuration :

    &#xA;

    [in @ 00000288ee494f40] Setting &#x27;video_size&#x27; to value &#x27;1920x1080&#x27;&#xA;[in @ 00000288ee494f40] Setting &#x27;pix_fmt&#x27; to value &#x27;yuv420p&#x27;&#xA;[in @ 00000288ee494f40] Setting &#x27;time_base&#x27; to value &#x27;1/25&#x27;&#xA;[in @ 00000288ee494f40] Setting &#x27;pixel_aspect&#x27; to value &#x27;1/1&#x27;&#xA;[in @ 00000288ee494f40] w:1920 h:1080 pixfmt:yuv420p tb:1/25 fr:0/1 sar:1/1 csp:unknown range:unknown&#xA;[overlay_in @ 00000288ff1013c0] Setting &#x27;video_size&#x27; to value &#x27;165x165&#x27;&#xA;[overlay_in @ 00000288ff1013c0] Setting &#x27;pix_fmt&#x27; to value &#x27;bgr24&#x27;&#xA;[overlay_in @ 00000288ff1013c0] Setting &#x27;time_base&#x27; to value &#x27;1/25&#x27;&#xA;[overlay_in @ 00000288ff1013c0] Setting &#x27;pixel_aspect&#x27; to value &#x27;1/1&#x27;&#xA;[overlay_in @ 00000288ff1013c0] w:165 h:165 pixfmt:bgr24 tb:1/25 fr:0/1 sar:1/1 csp:unknown range:unknown&#xA;[format @ 00000288ff1015c0] Setting &#x27;pix_fmts&#x27; to value &#x27;yuv420p&#x27;&#xA;[overlay @ 00000288ff101880] Setting &#x27;x&#x27; to value &#x27;W-w&#x27;&#xA;[overlay @ 00000288ff101880] Setting &#x27;y&#x27; to value &#x27;H-h&#x27;&#xA;[overlay @ 00000288ff101880] Setting &#x27;enable&#x27; to value &#x27;between(t,0,20)&#x27;&#xA;[overlay @ 00000288ff101880] Setting &#x27;format&#x27; to value &#x27;yuv420&#x27;&#xA;[auto_scale_0 @ 00000288ff101ec0] w:iw h:ih flags:&#x27;&#x27; interl:0&#xA;[format @ 00000288ff1015c0] auto-inserting filter &#x27;auto_scale_0&#x27; between the filter &#x27;overlay_in&#x27; and the filter &#x27;format&#x27;&#xA;[auto_scale_1 @ 00000288ee4a4cc0] w:iw h:ih flags:&#x27;&#x27; interl:0&#xA;[overlay @ 00000288ff101880] auto-inserting filter &#x27;auto_scale_1&#x27; between the filter &#x27;format&#x27; and the filter &#x27;overlay&#x27;&#xA;[AVFilterGraph @ 00000288ee495c80] query_formats: 5 queried, 6 merged, 6 already done, 0 delayed&#xA;[auto_scale_0 @ 00000288ff101ec0] w:165 h:165 fmt:bgr24 csp:gbr range:pc sar:1/1 -> w:165 h:165 fmt:yuv420p csp:unknown range:unknown sar:1/1 flags:0x00000004&#xA;[auto_scale_1 @ 00000288ee4a4cc0] w:165 h:165 fmt:yuv420p csp:unknown range:unknown sar:1/1 -> w:165 h:165 fmt:yuva420p csp:unknown range:unknown sar:1/1 flags:0x00000004&#xA;[overlay @ 00000288ff101880] main w:1920 h:1080 fmt:yuv420p overlay w:165 h:165 fmt:yuva420p&#xA;[overlay @ 00000288ff101880] [framesync @ 00000288ff1019a8] Selected 1/25 time base&#xA;[overlay @ 00000288ff101880] [framesync @ 00000288ff1019a8] Sync level 2&#xA;

    &#xA;