Search code examples
webrtckurento

Custom Module is not installed on the kurento media server but appears on the kurento-media-server --list


I am trying to develop a custom module for the Kurento-media-server but i have find two roadblocks,following the instructions on the documentation i have been able to:

create the custom module folder with the command:

kurento-module-scaffold.sh <module_name> <output_directory>

and them generate the files with:

cmake .. -DCMAKE_INSTALL_PREFIX=/usr && make && sudo make install

i have added two lines to the bgRemoverFilterOpenCVImpl on the /src/server/objects/bgRemoverFilterOpenCVImpl.cpp file so the filter adds a hello world text to the image.

void bgRemoverFilterOpenCVImpl::process (cv::Mat &mat)
{
 cv::Point textOrg(50, 50);
 putText( mat, "Hello World", textOrg, 1, 2, cv::Scalar(0, 0, 0) );
}

i them build the .deb file with debuild -us -uc and install it successfully so that when i run the kurento-media-server --list command i see my new custom module on the list:

....
bgRemoverFilter
bgremoverfilter.bgRemoverFilter
....

i them generated the js client code with the command cmake .. -DGENERATE_JS_CLIENT_PROJECT=TRUE and added the js generated folder to my node.js project using npm link for test purposes i am using the Kurento-Chroma project from the Kurento-node-repository so i have modified it to register my module and to create my custom filter instead of the chroma one. for this made changes to the server.js file on lines 28 and 249:

  ...
  //kurento.register('kurento-module-chroma');
  kurento.register('kurento-module-bgremoverfilter');
  ...
  pipeline.create('bgremoverfilter.bgRemoverFilter', options,   function(error, filter) {
        if (error) {
            return callback(error);
        }
        return callback(null, webRtcEndpoint, filter);
    });

the node application runs correctly but when i start the loopback to get my videofeed with the filter applied it sends this error message:

 Error message from server: Exiting with error SyntaxError: Module 'bgRemoverFilter' is not installed in the Kurento Media Server

despite the module being loaded on kurento-media-server --list the app cant create the filter object, i thought this was a naming issue so when i create a one word name custom module like "harel" to avoid camel case naming problems and install it i get on the list:

  ...
  harel
  harel.harel
  ...

and when trying to create and use this filter on the same kurento-chroma example i get a different error:

  SyntaxError: sink param should be a MediaElement, not harel
at ChecktypeError (/home/ubuntu/www/kurento-chroma/node_modules/kurento-client/lib/checkType.js:32:10)
at checkMediaElement (/home/ubuntu/www/kurento-chroma/node_modules/kurento-client-core/lib/abstracts/MediaElement.js:1082:11)
at checkType (/home/ubuntu/www/kurento-chroma/node_modules/kurento-client/lib/checkType.js:84:25)
at WebRtcEndpoint.MediaElement.connect (/home/ubuntu/www/kurento-chroma/node_modules/kurento-client-core/lib/abstracts/MediaElement.js:489:3)
at connectMediaElements (/home/ubuntu/www/kurento-chroma/server.js:260:20)
at /home/ubuntu/www/kurento-chroma/server.js:197:17
at /home/ubuntu/www/kurento-chroma/server.js:254:20
at callback2 (/home/ubuntu/www/kurento-chroma/node_modules/kurento-client/lib/KurentoClient.js:527:7)
at /home/ubuntu/www/kurento-chroma/node_modules/kurento-client/lib/KurentoClient.js:385:7
at Object.dispatchCallback [as callback] (/home/ubuntu/www/kurento-chroma/node_modules/kurento-jsonrpc/lib/index.js:613:9)

so, am i missing something on the installation process? i suspect there is something wrong with the JS generated code in the first case.

on the second case when using a single word name, why does this work? the app is able to create the filter but then fails when trying to connect it to the webrtcEndPoint

i have look at all the questions and threads i could find but did'nt get any answers. here is a repository with my custom filter code including the generated js library

please help, if more clarifications or details are needed request them.

UPDATE i wrote to one of the kurento developers that recommended i use kurento-media-server --version to get the actual list of loaded modules, this is a followup to that:

kurento-media-server --version returns:

Version: 6.7.0~1.g6ebaa27
Found modules:
        Module: 'backgroundremoval' version '0.0.1~3.g045ef96'
        Module: 'bgremoverfilter' version '0.0.1~0.g3a1e793'
        Module: 'chroma' version '6.6.1~3.g6df8f1d'
        Module: 'core' version '6.6.3'
        Module: 'elements' version '6.6.3'
        Module: 'filters' version '6.7.0~1.g0314843'
        Module: 'harel' version '0.0.1~0.gaec7e6d'

so yes backgroundremoval, bgremoverfilter and harel are the custom modules i have created and they are on the list.

i still dont know why when i use a camelcase name as bacgroundRemoverFilter i cant get the module to load in javascript althoug the generated code is loaded on my node.js project when it tries to create the filter the app sends the "module not installed error"

so i started using all minus names, for my module "harel" this gets loaded with no problems and when i try to create the media element with

  pipeline.create('harel.harel')... 

the filter gets created but them fails when a try to connect it to a webrtcEnpoint with

 filter.connect(webRtcEndpoint, function(error) {
                if (error) {
                    return callback(error);
                }

            return callback(null);
        });

it returns the error: SyntaxError: sink param should be a MediaElement, not harel

turns out that error is send by /node_modules/kurento-client-core/lib/abstracts/MediaElement.js:489:3 when calling a function Checktype

  checkType('MediaElement', 'sink', sink, {required: true});

so i added a console.log() after the filter its created to see what was different between the chroma filter and my custom filter, this is the result:

harel {
 domain: null,
 _events:
  { removeListener: [Function],
    newListener: [Function],
_describe: [Function: bound emit],
_rpc: [Function: encodeRpc],
release: { [Function: bound onceWrapper] listener: [Function] } },
 _eventsCount: 5,
 _maxListeners: undefined,
 id: 'ad5e2447-3801-4d96-81b4-c40390b16248_kurento.MediaPipeline/18e8c6b9-df88-4d52-851c-  8c664a26ee3d_harel.harel' }

ChromaFilter {
 domain: null,
 _events:
  { removeListener: [Function],
    newListener: [Function],
    _describe: [Function: bound emit],
    _rpc: [Function: encodeRpc],
    release: { [Function: bound onceWrapper] listener: [Function] } },
     _eventsCount: 5,
     _maxListeners: undefined,
     id: '97f370b5-81ae-45e1-a979-       dab6c1c4cd28_kurento.MediaPipeline/06658282-67bf-47bc-  b006-9f0dbae01767_chroma.ChromaFilter' }

both objects have the same properties excetp for the id. so how come the same function works with ChromaFilter bu not with harel if the object passed is almost the same. This is were i am now. will keep digging.


Solution

  • The problem with my process was that i used npm link to add the generated client-js code to my node.js app. For that to work i had to install the kurento-client package on the client-js folder and when my app ran it will generate the custom plugin with a different kurento-client than the one it was using.

    so even thought the Chroma-filter and my harel module looked the same they were from two different kurento-client classes.

    instead of using npm-link i just copied the generated js-client code inside my node-modules folder and that did the trick.

    hope this is usefull to people that find this error.