Recherche avancée

Médias (91)

Autres articles (71)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

  • Le profil des utilisateurs

    12 avril 2011, par

    Chaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
    L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...)

  • Configurer la prise en compte des langues

    15 novembre 2010, par

    Accéder à la configuration et ajouter des langues prises en compte
    Afin de configurer la prise en compte de nouvelles langues, il est nécessaire de se rendre dans la partie "Administrer" du site.
    De là, dans le menu de navigation, vous pouvez accéder à une partie "Gestion des langues" permettant d’activer la prise en compte de nouvelles langues.
    Chaque nouvelle langue ajoutée reste désactivable tant qu’aucun objet n’est créé dans cette langue. Dans ce cas, elle devient grisée dans la configuration et (...)

Sur d’autres sites (9533)

  • avcodec_decode_video2 RETURNS THE VALUE -1094995529 in the threaded function

    2 février 2016, par Whoami

    I am developing rtsp streaming player, and followed the below approach.

    1) Read packet, decode, display -> works perfectly.

    while (1) {
       if ( av_read_frame(pFormatCtx, &packet) >= 0) {
           if (packet.stream_index == videoStream) {
               retDecoder = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
               if  ( retDecoder <= 0)
                   LOGD (" Unable to Decode...retval %d ", retDecoder);
               if (frameFinished) {
               }
           }
           av_free_packet (&packet);
       }
    }

    Whereas,

    I introduced two threads, one is reading and pushing into the queue and the second one is reading from the queue.

    My problem is while reading the same packet, and decode, i m unable to decode, the return value of the av_video_decode2 is -1094995529.

    Below is the short description of code. Kindly help to solve this issue ?.

    AVPacketList *firstNode=NULL, *lastNode=NULL;

    int pushPacket (AVPacket * pkt)
    {
       AVPacketList *newNode = av_malloc(sizeof(AVPacketList));
       newNode->pkt = *pkt;
       newNode->next = NULL;

       SDL_LockMutex (rwMutex);

       if (lastNode != NULL )  {
           lastNode->next = newNode;
           lastNode = newNode;
       } else {
           firstNode = lastNode = newNode;
       }

    SDL_UnlockMutex (rwMutex);
    }

    int pullPacket ()
    {
       AVPacketList *tempNode;
       AVPacket *pkt;
       int res=0;

       SDL_LockMutex (rwMutex);
       if ( firstNode != NULL ) {
           tempNode = firstNode;
           *pkt = tempNode->pkt;
           res = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, pkt);  // HERE IS THE PROBLEM.
           if (frameFinished) {
               LOGD (" fRAME DECODED.. %d \n", counter++);
           }

           if (firstNode->next != NULL) {  
               firstNode = firstNode->next;
           }
           else {
               firstNode = NULL;
               lastNode = NULL;
           }
           av_free (tempNode);
       }
    }

    In Thread 1 :

    int PacketReader (void *ptr)
    {
       AVPacket pkt1, *rpacket;
       rpacket = &pkt1;
       while (globalQuit != 0)  {
           if ( av_read_frame(pFormatCtx, rpacket) >= 0) {
               if (packet.stream_index == videoStream) {
                   pushPacket (rpacket);
               }
               av_free_packet(rpacket);
           }
       }
    }

    In thread 2 :

    while (1) {
      pullPacket ();
    }
  • av_read_frame() in ffmpeg returns -5 while receiving UDP data [closed]

    26 février 2024, par zttang

    I'm working on an app which is using ffmpeg lib. There is a living source keep sending TS stream thru udp. Then I allocated a thread use ffmpeg receive the TS packets. the code for this thread is like :

    


    void* av_source_thread(void *data) {
    char udp_url[50];
    snprintf(udp_url, sizeof(udp_url), "udp://127.0.0.1:12345");
    AVDictionary* options = NULL;
    av_dict_set(&options, "timeout", "500000", 0);  // timeout=0.5s
    av_dict_set(&options, "overrun_nonfatal", "1", 0);
    av_dict_set(&options, "fifo_size", "278876", 0);  //50MB

    AVFormatContext *ffmpeg_source = avformat_alloc_context();
    while (running) {
        if (avformat_open_input(&ffmpeg_source, udp_url, NULL, &options) != 0) {
            continue;
        } else {
            break;
        }
    }
    // Some code fill codec type and alloc context here

    av_format_inject_global_side_data(ffmpeg_source);
    AVPacket *packet = av_packet_alloc();
    while (running) {
        ret = av_read_frame(ffmpeg_source, packet);
        if (ret < 0) {
            char errbuf[AV_ERROR_MAX_STRING_SIZE];
            av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE);
            usleep(10000);
            log("av_read_frame failed, Exit, %s, %d", errbuf, ret);
            continue;
        }
        putPkt2Q(packet);  
    }
    av_packet_free(&packet);
    avformat_close_input(&ffmpeg_source);
    av_dict_free(&options);
    return nullptr;
}


    


    Then the packets will be sent to Q and other thread will process them. but when I run the program, the av_read_frame will return -5(I/O error) from time to time. and once it returned -5, it can not recover unless I restart this thread.

    


    since this is a real time source, so lost some frames are acceptable, I just want to know how to avoid this kind of issue or how to recover without restart the whole thread. I tried to increase the fifo_size in options, but it does not work.

    


  • avcodec_open2 returns -22 "Invalid argument" trying to encode AV_CODEC_ID_H264

    26 mai 2023, par Fries of Doom

    I'm trying to use libavcodec to encode h264 video but avcodec_open2 returns -22 "Invalid argument" and I can't figure out why. Here is my code, which is mostly a copy from the encode example from libavcodec.

    


        /* find the mpeg1video encoder */
    const AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);
    if (!codec) {
        fprintf(stderr, "Codec '%s' not found\n", "h.264");
        exit(1);
    }

    AVCodecContext* codecContext = avcodec_alloc_context3(codec);
    if (!codecContext) {
        fprintf(stderr, "Could not allocate video codec context\n");
        exit(1);
    }

    AVPacket* pkt = av_packet_alloc();
    if (!pkt)
        exit(1);

    /* put sample parameters */
    codecContext->bit_rate = 400000;
    /* resolution must be a multiple of two */
    codecContext->width = 1920;
    codecContext->height = 1080;
    /* frames per second */
    codecContext->time_base = { 1, 25 };
    codecContext->framerate = { 25, 1 };

    /* emit one intra frame every ten frames
     * check frame pict_type before passing frame
     * to encoder, if frame->pict_type is AV_PICTURE_TYPE_I
     * then gop_size is ignored and the output of encoder
     * will always be I frame irrespective to gop_size
     */
    codecContext->gop_size = 10;
    codecContext->max_b_frames = 1;
    codecContext->codec_type = AVMEDIA_TYPE_VIDEO;
    codecContext->pix_fmt = AV_PIX_FMT_YUV420P;

    if (codec->id == AV_CODEC_ID_H264)
        av_opt_set(codecContext->priv_data, "profile", "baseline", 0);

    /* open it */
    int ret = avcodec_open2(codecContext, codec, nullptr);
    if (ret < 0) {
        char eb[AV_ERROR_MAX_STRING_SIZE];
        fprintf(stderr, "Could not open codec: %s\n", av_make_error_string(eb, AV_ERROR_MAX_STRING_SIZE, ret));
        exit(1);
    }


    


    Does anyone know what I'm doing wrong ?