Libcamera - connect this



  • Hello,

    i use libcamera and all works so far correct, now i will extend my callback methode for each frame, and i will transfer an this pointer from my baseclass

    i start also my camera with :

    
    m_Camera->requestCompleted.connect( this,RequestCompleted);
    
    
    

    And have transmit my this pointer all works so far, but in the callback routine , how i can become back my this ptr ?

    Atm in this version i use an global ptr, but i will install two cams, and cant use an global ptr:

    
    void CCamSrv::RequestCompleted(libcamera::Request* request)//wtf without *userdata
    {
       if (request->status() == libcamera::Request::RequestCancelled || !g_pHost->m_bIsRunning)
       {
          // vcos_semaphore_post(&g_pHost->m_semaframe);
           return;
       }
       //CCamSrv *pCam = (CCamSrv * ) libcamera::BoundMethodMember;
    
       vcos_mutex_lock(&g_pHost->m_FrameLatch);
       const libcamera::Request::BufferMap &buffers = request->buffers();
       for (libcamera::Request::BufferMap::const_iterator it = buffers.begin(); it != buffers.end(); it++)
       {
           libcamera::FrameBuffer* buffer = (*it).second;
           const libcamera::FrameMetadata& metadata = buffer->metadata(); //metadata.sequence;  metadata.timestamp;
           /*
           const libcamera::ControlList& requestMetadata = request->metadata();
           for (const auto& ctrl : requestMetadata) 
           {
               const libcamera::ControlId* id = libcamera::controls::controls.at(ctrl.first);
               const libcamera::ControlValue& value = ctrl.second;
               std::cout << "\t" << id->name() << " = " << value.toString() << std::endl;
           }*/  
           g_pHost->m_Fps   = (metadata.timestamp - g_pHost->m_LstTi) / 1000000.0f;
           g_pHost->m_LstTi = metadata.timestamp; //printf("ti=%0.1f\n", g_pHost->m_Fps);
           unsigned int nplane(0);  //metadata.timestamp
           for (const libcamera::FrameMetadata::Plane &plane : metadata.planes())//after control its calling once only
               memcpy((g_pHost->m_pMem[((g_pHost->m_PicNr + 1) % NUMBUFFS)] + sizeof(BITMAPFILEHEADER)) + sizeof(BITMAPINFOHEADER), g_pHost->m_MapBuffMem.find(buffer)->second, metadata.planes()[nplane++].bytesused);
       }
       g_pHost->m_PicNr++;
       /*
       int idx((g_pHost->m_PicNr) % NUMBUFFS);
       unsigned long sz(g_pHost->m_BmpFileHdr.bfSize);
       g_pHost->JpgDecoder((g_pHost->m_pMem[idx] + sizeof(BITMAPFILEHEADER)) + sizeof(BITMAPINFOHEADER), g_pHost->m_Width, g_pHost->m_Height, g_pHost->m_pMemOut[idx], &sz);//decode to jpg image
       g_pHost->m_SzMem[idx] = sz;
       */
       vcos_mutex_unlock(&g_pHost->m_FrameLatch);
     
       request->reuse(libcamera::Request::ReuseBuffers);
       if (g_pHost->m_bParamChg)
       {
           g_pHost->m_bParamChg = false;
           libcamera::ControlList& controls(request->controls());
           controls.set<float>(libcamera::controls::Saturation, g_pHost->m_fSaturation);
           controls.set<float>(libcamera::controls::Brightness, g_pHost->m_fBrightness);
           controls.set<float>(libcamera::controls::Contrast, g_pHost->m_fContrast);
           controls.set<float>(libcamera::controls::Sharpness, g_pHost->m_fSharpness);
           controls.set<float>(libcamera::controls::ExposureValue, g_pHost->m_fExposureV);
           controls.set<int32_t>(libcamera::controls::ExposureTime, g_pHost->m_ExposureT);
           controls.set<float>(libcamera::controls::AnalogueGain, g_pHost->m_fGain);
           /*
           std::int64_t value_pair[2] = { g_pHost->m_Duration / 2, 0 };
           controls.set(libcamera::controls::FrameDurationLimits, libcamera::Span<const std::int64_t, 2>(value_pair));
           */
           //hmm reduce flashing images on lightsource change
           controls.set(libcamera::controls::AeEnable, 0);
           controls.set(libcamera::controls::AwbEnable, libcamera::controls::AwbModeEnum::AwbFluorescent);
           controls.set<int32_t>(libcamera::controls::AeExposureMode, libcamera::controls::AeExposureModeEnum::ExposureShort);
           controls.set(libcamera::controls::AeMeteringMode, libcamera::controls::AeConstraintModeEnum::ConstraintNormal);
       }
       g_pHost->m_Camera->queueRequest(request);
    }
    
    
    

    have any one an idea to become my this ptr in the callback ?

    Thanks so much for any Help
    regards karsten.



  • Warum schreibst du als Deutscher in einem deutschen Forum englisch?

    Ich verstehe die Frage nicht, an welcher Stelle möchtest du denn welchen Zeiger haben, was ist this?
    Dein Callback ist doch ein Member von CCamSrv, hast du da nicht die Möglichkeit, weiteren Kontext zur Verfügung zu stellen (als zusätzlichen Member von CCamSrv)?
    Und poste bitte minimalen Quelltext, der das Problem zeigt, für deine Frage braucht es keine 69 Zeilen Quelltext.

    Kann das hier eine Lösung sein?

    
    // jeder Kameraproxy behandelt die Callbacks einer Kamera und besitzt kamera-spezifische Informationen (zB. eine ID oÄ)
    struct CamCallbackProxy
    {
       // const verhindert unbeabsichtigtes Kopieren
       CCamSrv* const Server;
       SomeCameraInfo const CameraInfo;
    
      CamCallbackProxy( CCamSrv* server, CameraInfo const& camera_info ) :
          Server( server ),
          CameraInfo( camera_info )
      {
          assert( server );
          Server->requestCompleted.connect( this, request_completed);
      }
    
      ~CamCallbackProxy()
      {
          // to do: disconnect from Publisher
      }
    
       void request_completed( libcamera::Request* request )
       {
          // Aufruf mit weiteren Informationen an zentrale Stelle weiterleiten
          Server->on_request_completed( request, CameraInfo );
       }
    };
    

    und

    class CCamSrv
    {
       // Zeugs   
      // ...
       // Objekte als unique_ptr ablegen, um Destruktoraufrufe zu vermeiden
       std::vector<std::unique_ptr<CamCallbackProxy>> CallbackProxies_;
    };
    
    void CCamSrv::register_proxies()
    {
       unregister_proxies();
       for( std::size_t i = 0; i < camera_count(); ++i )
       {
          CameraCallbacks.push_back( std::make_unique<CamCallbackProxy>( this, SomeCameraInfo( i ) );
       }
    }
    
    void CCamSrv::unregister_proxies()
    {
       // Proxies melden ihre Callbacks in ihrem Destruktor ab
       CallbackProxies_.clear();
    }
    
    void CCamSrv::on_request_completed( libcamera::Request* request, SomeCameraInfo const& camera_info )
    {
       // TO DO
    }
    

  • Mod

    @DocShoe sagte in Libcamera - connect this:

    Warum schreibst du als Deutscher in einem deutschen Forum englisch?

    Effizienteres Cross-Posting:
    https://forums.raspberrypi.com/viewtopic.php?t=380004
    https://forum-raspberrypi.de/forum/thread/63025-frame-callback-with-this/
    😁



  • Leider keine Hinweise auf die Problematik. Aber viel Wirbel um die paar einfachen Worte.
    Man will das Schlechte , und die Derbnis finden, es geht um internale fucking libcamera Interfaces, der größte Integratoren Irrsinn der Neuzeit.

    Schade das der Diskurs ausbrannte, früher vor 45 Jahren haben wir uns Briefe per Post gesendet mit Disketten drin...



  • @Achromat sagte in Libcamera - connect this:

    Leider keine Hinweise auf die Problematik. Aber viel Wirbel um die paar einfachen Worte.
    Man will das Schlechte , und die Derbnis finden, es geht um internale fucking libcamera Interfaces, der größte Integratoren Irrsinn der Neuzeit.

    Schade das der Diskurs ausbrannte, früher vor 45 Jahren haben wir uns Briefe per Post gesendet mit Disketten drin...

    Um 12 Uhr schon Alkohol?

    Ich habe dich drauf hingewiesen, dass dein Eingangspost das Problem nicht klar beschreibt, statt das zu korrigieren verfällst du in Nostalgie. Viel Glück!



  • @DocShoe

    Bist halt zu weit vom Content entfernt, warum also was schreiben wenn man es nicht im Ansatz verstünde.
    Ja Glück ist das Motto der Planlosigkeit. Wie kommst Auf die Niedertracht das nun Drogen im Spiel sein müssen, scheinbar ist dein Verstand in der Neuzeit verfault, mach deinen Kopp wieder runter und starre in dein Handy ^^



  • Lol, das ist ja schnell eskaliert. Im Raspi Forum scheint das auch nicht besser anzukommen




Anmelden zum Antworten