platform/core/api/webapi-plugins.git
3 years agoMerge "[ML] Change InvalidValuesError to TypeMismatchError for no args" into tizen accepted/tizen/unified/20210312.142331 submit/tizen/20210312.072248
Piotr Kosko [Fri, 12 Mar 2021 05:32:20 +0000 (05:32 +0000)]
Merge "[ML] Change InvalidValuesError to TypeMismatchError for no args" into tizen

3 years agoMerge "[MediaController] Add guards to map of playlists' handles" into tizen
Piotr Kosko [Fri, 12 Mar 2021 05:25:37 +0000 (05:25 +0000)]
Merge "[MediaController] Add guards to map of playlists' handles" into tizen

3 years ago[ML] Change InvalidValuesError to TypeMismatchError for no args 59/255059/1
Rafal Walczyna [Thu, 11 Mar 2021 14:06:57 +0000 (15:06 +0100)]
[ML] Change InvalidValuesError to TypeMismatchError for no args

When function is called without args, converter throws TypeError.
This commit unifies it.

code_format has been also applied.

[Verification] Builts successful, tested in chrome console

Change-Id: I032fd3f78e06b561ae472cdbbafe3bcf4092a6d9
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[MediaController] Add guards to map of playlists' handles 05/254805/4
Rafal Walczyna [Tue, 9 Mar 2021 11:00:50 +0000 (12:00 +0100)]
[MediaController] Add guards to map of playlists' handles

Previously only mc_server handle were guarded by mutexes.
Playlist also needs one.

[Verification] Tested on TM1, tct-mediacontroller pass 100% x 10, no issue occurred.

Change-Id: I155cc4f2dd87d4b1237537532105b7c251689279
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Pipeline][Single] Fix SVACE issues 11/254911/4
Pawel Wasowski [Wed, 10 Mar 2021 10:31:04 +0000 (11:31 +0100)]
[ML][Pipeline][Single] Fix SVACE issues

This commit fixes the following issues reported on
analysishub.sec.samsung.net (WGIDs):
- 457566
- 457567
- 457568

[Verification] Code compiles. SVACE analysis after
applying the patch
(https://analysishub.sec.samsung.net/service/analyses/394936)
found no errors.

CustomFilter tested in Chrome DevTools with the
snippet below works fine

// Valid CustomFilter callback - the happy scenario
var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenAndSet123 = function(input, output) {
    console.log("Custom filter called");

    var rawOutputData = new Uint8Array(1200);
    for (var i = 0; i < rawOutputData.length; ++i) {
        rawOutputData[i] = 123;
    }

    output.setTensorRawData(0, rawOutputData);
    return 0;
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenAndSet123, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called
// PAUSED

pipeline.start()

// PLAYING
// <CustomFilter and SinkListener callbacks' outputs 3 times>

Change-Id: Id1d35167532c3aeecbd3c73c3546b80e31e8f76c
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years agoMerge "[SPEC][UT] Add conditions to unit test build and run" into tizen
Piotr Kosko [Mon, 8 Mar 2021 05:49:45 +0000 (05:49 +0000)]
Merge "[SPEC][UT] Add conditions to unit test build and run" into tizen

3 years ago[SPEC][UT] Add conditions to unit test build and run 77/254477/3
Rafal Walczyna [Wed, 3 Mar 2021 10:30:09 +0000 (11:30 +0100)]
[SPEC][UT] Add conditions to unit test build and run

Unit tests can be run inside GBS - by setting flag in spec file.

[Verification] Built successful with unified, profile mobile, profile wearable
               both with ut flags on and off.

Change-Id: I2a89562893182cf35cd41f8b396a19c4777fe580
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[systeminfo] Fix armv8l and texture_format on RPI 63/254563/1
Rafal Walczyna [Thu, 4 Mar 2021 13:37:02 +0000 (14:37 +0100)]
[systeminfo] Fix armv8l and texture_format on RPI

[TSDF-257]

- RPI4 has armv8l architecture, which was not supported by webapi.
- RPI4 does not support any opnegles texture_format

[Verification] TM1 6.5 systeminfo TCT 100% pass. Tested in chrome console on RPI4.

Change-Id: Ic479e2860250ebe15033a2cf8a53f827a2bd4bcd
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[version] 2.79 38/254538/1 accepted/tizen/unified/20210305.141713 submit/tizen/20210304.103045
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Thu, 4 Mar 2021 08:53:43 +0000 (09:53 +0100)]
[version] 2.79

Change-Id: I10b8b53727146f2ef80b8e98f1fcb5365ffd3ae8

3 years agoMerge "[ML][Pipeline] Change CustomFilter interface and implementation" into tizen
Piotr Kosko [Wed, 3 Mar 2021 13:12:16 +0000 (13:12 +0000)]
Merge "[ML][Pipeline] Change CustomFilter interface and implementation" into tizen

3 years agoMerge "[ML][Single] Implemented setTimeout and close" into tizen
Piotr Kosko [Wed, 3 Mar 2021 13:11:19 +0000 (13:11 +0000)]
Merge "[ML][Single] Implemented setTimeout and close" into tizen

3 years agoMerge "[GYP] Update build configuration for ML API" into tizen
Piotr Kosko [Tue, 2 Mar 2021 13:38:09 +0000 (13:38 +0000)]
Merge "[GYP] Update build configuration for ML API" into tizen

3 years ago[ML][Single] Implemented setTimeout and close 22/254322/5
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Fri, 26 Feb 2021 06:09:19 +0000 (07:09 +0100)]
[ML][Single] Implemented setTimeout and close

[ACR] https://code.sec.samsung.net/jira/browse/TWDAPI-273

[Verification] Code compiles. Verified in chrome console:

var m = tizen.ml.single.openModel("/opt/usr/home/owner/media/Documents/mobilenet_v1_1.0_224_quant.tflite")   // success
// timeout check
// check if invoke works 'normally'
var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor", "UINT8", [3, 224, 224])
var td = ti.getTensorsData();
var tdout = m.invoke(td)  // success

// check if timeout will change behaviour of invoke, while short timeout is set
m.setTimeout(5)    // success
var tdout = m.invoke(td)  // TimeoutError

// check empty arguments
m.setTimeout()     // InvalidValuesError

// close check
m.close()    // success
// Abort error: "SingleShot object was closed and using it is no longer possible."
// for following calls:
m.close()
m.input
m.output
m.invoke()
m.getValue()
m.setValue()
m.setTimeout()

Change-Id: I3ff7b899fc1527f62aea24387cadf4d0f0db3f05

3 years ago[GYP] Update build configuration for ML API 19/254419/1
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Tue, 2 Mar 2021 12:59:20 +0000 (13:59 +0100)]
[GYP] Update build configuration for ML API

Change-Id: Icb9f4993e8bbeae6e2c12bfca6689d279823d54e

3 years ago[ML][Pipeline] Change CustomFilter interface and implementation 23/254323/9
Pawel Wasowski [Thu, 25 Feb 2021 19:02:20 +0000 (20:02 +0100)]
[ML][Pipeline] Change CustomFilter interface and implementation

ACR: TWDAPI-274

CustomFilter API and implementation are changed to avoid
copying TensorsData.

Change-Id: Id48b774c86b65f5b45f3dd74733c006b6a729b8c
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
[Verification] Code tested with the snippets below works fine

// Valid CustomFilter callback - the happy scenario
var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenAndSet123 = function(input, output) {
    console.log("Custom filter called");

    var rawOutputData = new Uint8Array(1200);
    for (var i = 0; i < rawOutputData.length; ++i) {
        rawOutputData[i] = 123;
    }

    output.setTensorRawData(0, rawOutputData);
    return 0;
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenAndSet123, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called
// PAUSED

pipeline.start()

// PLAYING
// <CustomFilter and SinkListener callbacks' outputs 3 times>

////////////////////////////////////////////////////////////

// Valid CustomFilter callback - the happy scenario; ignore the data

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input, output) {
    console.log("Custom filter called");
        return 1; // ignore data
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called
// Custom filter called
// Custom filter called
// PAUSED

pipeline.start()

// PLAYING

////////////////////////////////////////////////////////////

// Valid CustomFilter callback - CustomFilter returns an error

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input, output) {
    console.log("Custom filter called");
        return -1;
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called
// PAUSED

pipeline.start()

// PLAYING

////////////////////////////////////////////////////////////

// Invalid CustomFilterOutput.status
var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input) {
    console.log("Custom filter called");

    return 123;
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// InvalidValuesError,
//  message: "CustomFilterOutput.status === 1 is the only legal positive value"

////////////////////////////////////////////////////////////
// Check if {input, output}.dispose() and input.setTensorRawData()
// have any effect

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenAndSet123 = function(input, output) {
    console.log("Custom filter called");

    // dispose should have no efect
    input.dispose();
    console.log('input count: ' + input.tensorsInfo.count);
    // dispose should have no efect
    input.dispose();
    console.log('output count: ' + output.tensorsInfo.count);

    var rawOutputData = new Uint8Array(1200);
    for (var i = 0; i < rawOutputData.length; ++i) {
        rawOutputData[i] = 123;
    }

    output.setTensorRawData(0, rawOutputData);

    // this call should have no effect
    input.setTensorRawData(0, rawOutputData);

    return 0;
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenAndSet123, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

Change-Id: Id48b774c86b65f5b45f3dd74733c006b6a729b8c
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][single] SingleShot.invoke implementation added 87/254287/4
Rafal Walczyna [Thu, 25 Feb 2021 12:38:46 +0000 (13:38 +0100)]
[ML][single] SingleShot.invoke implementation added

ACR: TWDAPI-273

Test code:
var ti1 = new tizen.ml.TensorsInfo()
ti1.addTensorInfo("three", "FLOAT32", [1, 1, 1, 1])
var td1 = ti1.getTensorsData(0);
td1.setTensorRawData(0, [1]);
var ti3 = new tizen.ml.TensorsInfo()
ti3.addTensorInfo("three", "FLOAT32", [3, 1, 1, 1])
var td3 = ti3.getTensorsData(0);
td3.setTensorRawData(0, [1, 2, 3]);
var ti5 = new tizen.ml.TensorsInfo()
ti5.addTensorInfo("three", "FLOAT32", [5, 1, 1, 1])
var td5 = ti5.getTensorsData(0);
td5.setTensorRawData(0, [1, 2, 3, 4, 5]);

// using model from nnstreamer API
var m = tizen.ml.single.openModel('documents/add.tflite', null, null, "ANY", "ANY")

m.invoke(td1) // ok
m.invoke(td3) // error
m.invoke(td5) // error

var m_dynamic = tizen.ml.single.openModel('documents/add.tflite', null, null, "ANY", "ANY", true)

m_dynamic.invoke(td1) // ok
m_dynamic.invoke(td3) // ok
m_dynamic.invoke(td5) // ok

[Verification] Built successful. Tested in Chrome Dev console.

Change-Id: I25218c122c57d6cb781181388f94a27ee0605ee8
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years agoMerge "[ML][Pipeline] Implement CustomFilter callback" into tizen
Piotr Kosko [Thu, 25 Feb 2021 12:09:10 +0000 (12:09 +0000)]
Merge "[ML][Pipeline] Implement CustomFilter callback" into tizen

3 years agoMerge "[ML][Pipeline] Implement {register, unregister}CustomFilter" into tizen
Piotr Kosko [Thu, 25 Feb 2021 12:08:46 +0000 (12:08 +0000)]
Merge "[ML][Pipeline] Implement {register, unregister}CustomFilter" into tizen

3 years ago[ML][Pipeline] Implement CustomFilter callback 68/253768/15
Pawel Wasowski [Mon, 22 Feb 2021 10:07:11 +0000 (11:07 +0100)]
[ML][Pipeline] Implement CustomFilter callback

ACR: TWDAPI-274

This is the second part of CustomFilter implementation. It adds
transfering the data between JS and C++.

[Verification] Code tested with the snippets below works fine

// Valid CustomFilter callback - the happy scenario
var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input) {
    console.log("Custom filter called");
    var outputTD = outputTI.getTensorsData();
    var rawInputData = input.getTensorRawData(0);
    for (var i = 0; i < rawInputData.data.size; ++i) {
        rawInputData.data[i] = rawInputData.data[i] + 1;
    }
        outputTD.setTensorRawData(0, rawInputData.data);
        return new tizen.ml.CustomFilterOutput(0, outputTD);
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called
// PAUSED

pipeline.start()

// PLAYING
// <CustomFilter and SinkListener callbacks' outputs 3 times>

////////////////////////////////////////////////////////////

// Valid CustomFilter callback - the happy scenario; ignore the data

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input) {
    console.log("Custom filter called");
        return new tizen.ml.CustomFilterOutput(1, null); // ignore data
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called
// Custom filter called
// Custom filter called
// PAUSED

pipeline.start()

// PLAYING

////////////////////////////////////////////////////////////

// Valid CustomFilter callback - CustomFilter returns an error

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input) {
    console.log("Custom filter called");
        return new tizen.ml.CustomFilterOutput(-1, null);
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called
// PAUSED

pipeline.start()

// PLAYING

////////////////////////////////////////////////////////////

// Invalid CustomFilter callback output - status == 0, but no
TensorsData

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input) {
    console.log("Custom filter called");

    return new tizen.ml.CustomFilterOutput(0, null);
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called
// custom filter error:
// {name: "AbortError", message: "CustomFilter has thrown exception:
// {'code':0, 'name':'InvalidValuesError' ..."}

////////////////////////////////////////////////////////////

// Invalid CustomFilter callback output - non-CustomFilterOutput

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input) {
    console.log("Custom filter called");

    return 123;
}

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called
// custom filter error:
// {name: "TypeMismatchError",
// message: "The value returned from CustomFilter is not a
// CustomFilterOutput object"}

////////////////////////////////////////////////////////////
// CustomFilter callback returns TensorsData with dimensions other
// than specified in tizen.ml.pipeline.registerCustomFilter(...) call

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input) {
    console.log("Custom filter called");

    var invalidOutputTI = new tizen.ml.TensorsInfo();
    invalidOutputTI.addTensorInfo('ti1', 'UINT8', [5, 2]);

    var outputTD = invalidOutputTI.getTensorsData();

    outputTD.setTensorRawData(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
    return new tizen.ml.CustomFilterOutput(0, outputTD);
}

// register - the happy scenario
tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called

// custom filter error: {name: "InvalidValuesError",
// message: "Output's TensorsInfo is not equal to expected"}

pipeline.start()

////////////////////////////////////////////////////////////

// CustomFilter callback returns non-TensorsData as output

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input) {
    console.log("Custom filter called");

    return new tizen.ml.CustomFilterOutput(0, "this should be TensorsData");
}

// register - the happy scenario
tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})

pipeline.registerSinkListener('mysink', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

// READY
// Custom filter called
// custom filter error:
// {name: "AbortError", message: "CustomFilter has thrown exception: {
..."}

////////////////////////////////////////////////////////////

// Invalid CustomFilterOutput.status

new tizen.ml.CustomFilterOutput(666, null);
// InvalidValuesError,
//  message: "CustomFilterOutput.status === 1 is the only legal positive value"

Change-Id: Icf2edee853eb97dde54ecd83f00164b302aa29ca
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][Pipeline] Implement {register, unregister}CustomFilter 10/253510/13
Pawel Wasowski [Thu, 18 Feb 2021 10:09:04 +0000 (11:09 +0100)]
[ML][Pipeline] Implement {register, unregister}CustomFilter

ACR: TWDAPI-274

This is the first part of the implementation of nnstreamer's pipeline
CustomFilter Web API. It enables registering and unregistering
CustomFilters, but they don't process the data.

[Verification] Tested with the snippets below, works fine

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var flattenPlusOne = function(input) {
    console.log("Custom filter called with: ");
    var outputTD = outputTI.getTensorsData();
    var rawInputData = input.getTensorRawData(0);
    for (var i = 0; i < rawInputData.data.size; ++i) {
        rawInputData.data[i] = rawInputData.data[i] + 1;
    }
        outputTD.setTensorRawData(0, rawInputData.data);
        return new tizen.ml.CustomFilterOutput(0, outputTD);
}

// register - the happy scenario
tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

var pipeline_def = "videotestsrc num-buffers=3 "
                   + "! video/x-raw,width=20,height=15,format=BGRA "
                   + "! tensor_converter "
                   + "! tensor_filter framework=custom-easy model=testfilter2 "
                   + "! appsink name=mysink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})
// READY
pipeline.start()

// unregister - the happy scenario
tizen.ml.pipeline.unregisterCustomFilter('testfilter2')

// overwrite a previously registered filter - that's ok

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

tizen.ml.pipeline.registerCustomFilter('testfilter2', flattenPlusOne, inputTI,
    outputTI, function errorCallback(error) {
        console.warn('custom filter error:') ; console.warn(error);
    });

// unregister nonexistent filter
tizen.ml.pipeline.unregisterCustomFilter('nonexistentfilter')
// InvalidValuesError: ""nonexistentfilter" CustomFilter not found"

Change-Id: Ib01490e669376149eae654937131116f5ec1a4df
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years agoCheck thread smack label for thread-based app model 65/254065/7 submit/tizen/20210223.072943
Youngsoo Choi [Mon, 22 Feb 2021 23:42:09 +0000 (15:42 -0800)]
Check thread smack label for thread-based app model

Legacy web service app had been launched on a process but
new web service app is launched on a thread to save memory usage.
With the thread-based app model, the thread smack label needs to be checked
from the path |/proc/<tid>/attr/current|.

Also, checking thread smack label is compatible with process-based app model
because main thread utilizes same path of |/proc/<pid>/attr/current| as well.

Change-Id: Ib02237c926a2deedcd91451a36dd2a3d832cfb04
Signed-off-by: Youngsoo Choi <kenshin.choi@samsung.com>
3 years agoMerge "[Mediakey] Conditional support for module" into tizen
Piotr Kosko [Mon, 22 Feb 2021 14:53:57 +0000 (14:53 +0000)]
Merge "[Mediakey] Conditional support for module" into tizen

3 years ago[Mediakey] Conditional support for module 47/254047/5
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Mon, 22 Feb 2021 12:58:05 +0000 (13:58 +0100)]
[Mediakey] Conditional support for module

Tested in chrome and with TCT (capability & mediakey).
With feature disabled:
TCT:
  capability 100% pass
  mediakey - not exectued
Chrome:
  > tizen.mediakey === undefined
  true

With feature enabled:
TCT:
  capability 100% pass
  mediakey 100% pass
Chrome:
  > tizen.mediakey === undefined
  false
  > tizen.mediakey
  MediaKeyManager {}

Change-Id: I1b6a4654c0aabcb2e21defd0d05936d65115263f

3 years agoMerge "[ML][Common] Minor fixes" into tizen
Piotr Kosko [Mon, 22 Feb 2021 12:23:48 +0000 (12:23 +0000)]
Merge "[ML][Common] Minor fixes" into tizen

3 years ago[ML] Fixed SVACE issue - not initialized size_in_bytes 11/254011/1
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Mon, 22 Feb 2021 06:22:10 +0000 (07:22 +0100)]
[ML] Fixed SVACE issue - not initialized size_in_bytes

[SVACE] Issue 456940

Change-Id: Icc31326b1768939ed82dbd5efde76c156c5f9be9

3 years ago[ML][Common] Minor fixes 42/253942/1
Pawel Wasowski [Fri, 19 Feb 2021 01:29:00 +0000 (02:29 +0100)]
[ML][Common] Minor fixes

ACR: TWDAPI-273/TWDAPI-274

This commit adds 2 missing logs and replaces one variable name with a
proper one.

[Verification] Tested with below snippets, works as expected

// This snippets  triggers the added log:
var pipeline_def = "videotestsrc num-buffers=3 ! videoconvert"
                   + " ! tensor_converter ! tensor_sink name=sinkx";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                      function(state) {console.log(state);});
// READY
// PAUSED

pipeline.registerSinkListener('sinkx', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

pipeline.start()
// registered SinkListener is called 3 times

///////////////////////////////////////////////////////////

// This snippet no longer triggers the changed log:
var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var outputTD = outputTI.getTensorsData();

outputTD.dispose()

///////////////////////////////////////////////////////////

// This snippet triggers the exception which message is now correct:

var outputTI = new tizen.ml.TensorsInfo();
outputTI.addTensorInfo('ti1', 'UINT8', [1200]);
var outputTD = outputTI.getTensorsData();
outputTD.setTensorRawData(0, 'invalid data');

Change-Id: Iec192971882b094cc93679f2104499568dc43777
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years agoMerge "[ML-API] Use capi-ml-inference package instead of capi-nnstreamer" into tizen accepted/tizen/unified/20210218.080629 submit/tizen/20210217.032056
Piotr Kosko [Thu, 18 Feb 2021 05:19:04 +0000 (05:19 +0000)]
Merge "[ML-API] Use capi-ml-inference package instead of capi-nnstreamer" into tizen

3 years ago[ML] Added SingleShot openModelAsync() implementation 08/253508/6
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Fri, 12 Feb 2021 09:36:44 +0000 (10:36 +0100)]
[ML] Added SingleShot openModelAsync() implementation

[ACR] https://code.sec.samsung.net/jira/browse/TWDAPI-273

[Verification] Code compiles without errors.
Checked in chrome console with few calls:
// Success calls:
tizen.ml.single.openModelAsync("documents/mobilenet_v1_1.0_224_quant.tflite", (s) => console.log(s))
tizen.ml.single.openModelAsync("documents/mobilenet_v1_1.0_224_quant.tflite", (s) => console.log(s), null, null, null, "TENSORFLOW_LITE")
tizen.ml.single.openModelAsync("documents/mobilenet_v1_1.0_224_quant.tflite", (s) => console.log(s), null, null, null, "TENSORFLOW_LITE", "ANY", true)

// Fails for invalid or not-existing file:
tizen.ml.single.openModelAsync("documents/fail.tflite", (s) => console.log(s), (e) => console.log(e)) // Abort Error
tizen.ml.single.openModelAsync("documents/notexisting", (s) => console.log(s), (e) => console.log(e)) // NotFound
tizen.ml.single.openModelAsync("notexisting", (s) => console.log(s), (e) => console.log(e)) // NotFound

// ASYNC version verification //
// without storage privilege
tizen.ml.single.openModelAsync("notexistingfile", (s) => console.log(s), (e) => console.log("Async: " + JSON.stringify(e)))   // async NotFoundError
tizen.ml.single.openModelAsync("/dddd/notexistingfile", (s) => console.log(s), (e) => console.log("Async: " + JSON.stringify(e)))   // async NotFoundError
tizen.ml.single.openModelAsync("documents/notexistingfile", (s) => console.log(s), (e) => console.log("Async: " + JSON.stringify(e)))   // throws SecurityError
tizen.ml.single.openModelAsync("documents/mobilenet_v1_1.0_224_quant.tflite", (s) => console.log(s), (e) => console.log("Async: " + JSON.stringify(e)))   // throws SecurityError
// with storage privilege
tizen.ml.single.openModelAsync("notexistingfile", (s) => console.log(s), (e) => console.log("Async: " + JSON.stringify(e)))   // async NotFoundError
tizen.ml.single.openModelAsync("/dddd/notexistingfile", (s) => console.log(s), (e) => console.log("Async: " + JSON.stringify(e)))   // async NotFoundError
tizen.ml.single.openModelAsync("documents/notexistingfile", (s) => console.log(s), (e) => console.log("Async: " + JSON.stringify(e)))   // async NotFoundError
tizen.ml.single.openModelAsync("documents/mobilenet_v1_1.0_224_quant.tflite", (s) => console.log(s), (e) => console.log("Async: " + JSON.stringify(e)))   // success

// SYNC version verification //
// without storage privilege
tizen.ml.single.openModel("notexistingfile")   // throws NotFoundError
tizen.ml.single.openModel("/dddd/notexistingfile")   // throws NotFoundError
tizen.ml.single.openModel("documents/notexistingfile")   // throws SecurityError
tizen.ml.single.openModel("documents/mobilenet_v1_1.0_224_quant.tflite")   // throws SecurityError

// with storage privilege
tizen.ml.single.openModel("notexistingfile")   // throws NotFoundError
tizen.ml.single.openModel("/dddd/notexistingfile")   // throws NotFoundError
tizen.ml.single.openModel("documents/notexistingfile")   // throws NotFoundError
tizen.ml.single.openModel("documents/mobilenet_v1_1.0_224_quant.tflite")   // success

Change-Id: I93e009efec4e1bcbe6d6c3b381b34cada910d8aa

3 years agoMerge "[ML][single] SingleShot.setValue and SingleShot.getValue" into tizen
Piotr Kosko [Wed, 17 Feb 2021 05:50:52 +0000 (05:50 +0000)]
Merge "[ML][single] SingleShot.setValue and SingleShot.getValue" into tizen

3 years ago[ML-API] Use capi-ml-inference package instead of capi-nnstreamer 89/253789/1
Sangjung Woo [Wed, 17 Feb 2021 04:43:31 +0000 (13:43 +0900)]
[ML-API] Use capi-ml-inference package instead of capi-nnstreamer

The name of capi-nnstreamer and its pc file is changed to
capi-ml-inference. To build without any errors, this patch updates its
related information.

Change-Id: I037cc1151461fbaacfd87fcf2175e32b65dd337e
Signed-off-by: Sangjung Woo <sangjung.woo@samsung.com>
3 years ago[ML][single] SingleShot.setValue and SingleShot.getValue 69/253569/4
Rafal Walczyna [Mon, 15 Feb 2021 14:02:14 +0000 (15:02 +0100)]
[ML][single] SingleShot.setValue and SingleShot.getValue

ACR: TWDAPI-273

Test code:
var m = tizen.ml.single.openModel('documents/mobilenet_v1_1.0_224_quant.tflite')
var arr = ["input", "inputtype", "inputlayout", "output", "outputtype", "outputlayout",
           "accelerator", "is-updatable", "inputname", "outputname", "custom" ]

arr.forEach((v) => {
    try {
        console.log(v, ':', m.getValue(v));
    } catch (error) {
        console.log(v, ':', error.message)
    }
});

m.setValue("input", "3:244:244:4");
console.log("input: " + m.getValue("input"))
m.setValue("is-updatable", "true");
console.log("is-updatable: " + m.getValue("is-updatable"))

[Verification] Built successful. Tested in Chrome Dev console.

Change-Id: Id911ed1717fb7b96c7ac75350ea27c78786cc5d9
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][common] Add synchronization of access to tensor info/data maps 87/252987/3
Pawel Wasowski [Tue, 2 Feb 2021 09:58:52 +0000 (10:58 +0100)]
[ML][common] Add synchronization of access to tensor info/data maps

ACR: TWDAPI-273/TWDAPI-274

Pipeline's SinkCallbacks and CustomFilters may be called from threads
other than the main thread. As they access members of
Tensors{Data, Info}Managers, the access to these members should be
synchronized to prevent 2 threads from modifying the same data
concurrently.

[Verification] Tested with code snippets used from other commits
implementing Tensors{Data, Info} or Pipeline - the snippets still work.
The snippets used for tests were found in commit messages of these changes:
https://review.tizen.org/gerrit/c/platform/core/api/webapi-plugins/+/251435
https://review.tizen.org/gerrit/c/platform/core/api/webapi-plugins/+/251699
https://review.tizen.org/gerrit/c/platform/core/api/webapi-plugins/+/251524
https://review.tizen.org/gerrit/c/platform/core/api/webapi-plugins/+/252001
https://review.tizen.org/gerrit/c/platform/core/api/webapi-plugins/+/252002
https://review.tizen.org/gerrit/c/platform/core/api/webapi-plugins/+/252289
https://review.tizen.org/gerrit/c/platform/core/api/webapi-plugins/+/252290
https://review.tizen.org/gerrit/c/platform/core/api/webapi-plugins/+/252482

Change-Id: I32f5df4ba92e86034c78d751e901c77a9d60ca4e
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][pipeline] Implement Pipeline::{register,unregister}SinkListener 00/252700/13
Pawel Wasowski [Mon, 1 Feb 2021 14:01:13 +0000 (15:01 +0100)]
[ML][pipeline] Implement Pipeline::{register,unregister}SinkListener

ACR: TWDAPI-274

[Verification] Tested in Chrome DevTools with the snippets below. Works
fine

var pipeline_def = "videotestsrc num-buffers=3 ! videoconvert"
                   + " ! tensor_converter ! tensor_sink name=sinkx";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                      function(state) {console.log(state);});
// READY
// PAUSED

pipeline.registerSinkListener('sinkx', function(sinkName, data) {
    console.log('SinkListener for "' + sinkName + '" sink called');
    console.log(data);
})

pipeline.start()
// registered SinkListener is called 3 times

Change-Id: I8790327d070e54d27fd9cc028882773487a48d7a
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years agoMerge "[ML][Common] Add unit tests to TensorsData::GetTensorRawData" into tizen
Piotr Kosko [Fri, 12 Feb 2021 07:19:38 +0000 (07:19 +0000)]
Merge "[ML][Common] Add unit tests to TensorsData::GetTensorRawData" into tizen

3 years agoMerge "[ML][Common] Add TensorsData.getTensorRawData location/size support" into...
Piotr Kosko [Fri, 12 Feb 2021 07:19:33 +0000 (07:19 +0000)]
Merge "[ML][Common] Add TensorsData.getTensorRawData location/size support" into tizen

3 years agoMerge "[ML][Common] Add unit tests to TensorsData::SetTensorRawData" into tizen
Piotr Kosko [Fri, 12 Feb 2021 07:19:29 +0000 (07:19 +0000)]
Merge "[ML][Common] Add unit tests to TensorsData::SetTensorRawData" into tizen

3 years agoMerge "[ML][Common] Add TensorsData.setTensorRawData location/size support" into...
Piotr Kosko [Fri, 12 Feb 2021 07:19:23 +0000 (07:19 +0000)]
Merge "[ML][Common] Add TensorsData.setTensorRawData location/size support" into tizen

3 years ago[ML][Common] Add unit tests to TensorsData::GetTensorRawData 86/252986/4
Rafal Walczyna [Wed, 3 Feb 2021 14:48:06 +0000 (15:48 +0100)]
[ML][Common] Add unit tests to TensorsData::GetTensorRawData

[==========] 17 tests from 2 test suites ran. (120 ms total)
[  PASSED  ] 17 tests.

[Verification] Built successful. Tested on TM1

Change-Id: Ia73add4cab4500de078ce45933ca68f952975e4e
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Common] Add TensorsData.getTensorRawData location/size support 02/252702/5
Rafal Walczyna [Mon, 1 Feb 2021 14:55:36 +0000 (15:55 +0100)]
[ML][Common] Add TensorsData.getTensorRawData location/size support

ACR: TWDAPI-273

Test code:
var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor", "INT16", [3, 3])
var td = ti.getTensorsData();
td.setTensorRawData(0, [1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 0], [3, 3])
var data = td.getTensorRawData(0, [1, 1], [])
console.log(data)
console.log(data.data)
// Int16Array(4) [5, 6, 8, 9]
// 5, 6
// 8, 9
data = td.getTensorRawData(0, [0, 0], [3, 1])
console.log(data)
console.log(data.data)
// Int16Array(3) [1, 2, 3]
// 1, 2, 3
data = td.getTensorRawData(0, [2, 0], [1, 2])
console.log(data)
console.log(data.data)
// Int16Array(2) [3, 6]
// 3
// 6
data = td.getTensorRawData(0, [], [1, 1])
console.log(data)
console.log(data.data)
// Int16Array(1) [1]
data = td.getTensorRawData(0, [0, 1], [-1,1])
console.log(data)
console.log(data.data)
// Int16Array(1) [3] (4, 5, 6)

[Verification] Built successful. Tested in Chrome Dev console.

Change-Id: Ife781390e8806309bc72963f43a5d001bcd2f5c2
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML] Fix issues found by SVACE 65/253465/5
Pawel Wasowski [Wed, 10 Feb 2021 09:20:12 +0000 (10:20 +0100)]
[ML] Fix issues found by SVACE

This commit fixes the following SVACE problems (WGIDs) in ML:
456856, 456857, 456858

[Verification] Code compiles. The changed code was tested with the
snippets below

// Source
var pipeline_input = tizen.ml.pipeline.createPipeline("appsrc name=srcx ! "
+ "other/tensor,dimension=(string)1:1:1:1,type=(string)int8,"
+"framerate=(fraction)0/1 ! tensor_sink name=sinkx")

var source_input = pipeline_input.getSource("srcx")

// Valve
var pipeline_def = "videotestsrc is-live=true ! videoconvert ! videoscale"
     + " ! video/x-raw,format=RGBx,width=16,height=16,framerate=10/1"
     + " ! tensor_converter ! valve name=valve1 ! fakesink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                      function(state) {console.log(state);});
// READY
// PAUSED

var v = pipeline.getValve('valve1')
// Valve {name: "valve1", _pipeline_id: 1}

// Switch
var pipeline_def = "videotestsrc is-live=true"
                   + " ! videoconvert"
                   + " ! tensor_converter"
                   + " ! output-selector name=outs outs.src_0"
                   + " ! tensor_sink name=sink0 async=false outs.src_1"
                   + " ! tensor_sink name=sink1 async=false"

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def, function(state) {console.log(state);})

pipeline.getSwitch('outs')
// Switch {name: "outs", type: "OUTPUT_SELECTOR", _pipeline_id: 3}

Change-Id: I9316f6a9f6f225aaa741e25458b53109f7c17c16
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][Common] Add unit tests to TensorsData::SetTensorRawData 27/252827/6
Rafal Walczyna [Tue, 2 Feb 2021 14:38:14 +0000 (15:38 +0100)]
[ML][Common] Add unit tests to TensorsData::SetTensorRawData

[==========] 10 tests from 1 test suite ran. (60 ms total)
[  PASSED  ] 10 tests.

[Verification] Built successful. Tested on TM1.

Change-Id: I1b89508d28973e3b4ed7ae4a39eee88fb8685fbe
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Common] Add TensorsData.setTensorRawData location/size support 84/252484/8
Rafal Walczyna [Tue, 26 Jan 2021 12:46:17 +0000 (13:46 +0100)]
[ML][Common] Add TensorsData.setTensorRawData location/size support

ACR: TWDAPI-273

Test code:
var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor", "INT16", [3, 3])
var td = ti.getTensorsData();
console.log(td.getTensorRawData(0).data)
// Int16Array(9) [0, 0, 0, 0, 0, 0, 0, 0, 0]
// 0 0 0
// 0 0 0
// 0 0 0
td.setTensorRawData(0, [1, 2, 3], [0, 2], [3, 1])
console.log(td.getTensorRawData(0).data)
// Int16Array(9) [0, 0, 0, 0, 0, 0, 1, 2, 3]
// 0 0 0
// 0 0 0
// 1 2 3
td.setTensorRawData(0, [4, 5, 6], [2, 0], [1, 3])
console.log(td.getTensorRawData(0).data)
// Int16Array(9) [0, 0, 4, 0, 0, 5, 1, 2, 6]
// 0 0 4
// 0 0 5
// 1 2 6
td.setTensorRawData(0, [9], [1, 1], [1, 1])
console.log(td.getTensorRawData(0).data)
// Int16Array(9) [0, 0, 4, 0, 9, 5, 1, 2, 6]
// 0 0 4
// 0 9 5
// 1 2 6
td.setTensorRawData(0, [-4,3,-7], [0, 2], [-1, 1])
console.log(td.getTensorRawData(0).data)
// Int16Array(9) [0, 0, 4, 0, 9, 5, -4, 3, -7]
//  0  0  4
//  0  9  5
// -4  3 -7

[Verification] Built successful. Tested in Chrome Dev console.

Change-Id: Ibc4ae4ddef35941678a765acd5a300cefa6671b0
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[Notification] Fix SVACE issue 64/253464/2
Pawel Wasowski [Wed, 10 Feb 2021 09:18:19 +0000 (10:18 +0100)]
[Notification] Fix SVACE issue

This commit fixes SVACE issue with WGID: 449860

[Verification] tct-notification-tizen-tests (auto): 100% pass rate
(The CommonNotification::SetAppControlInfoFrmJson function that was
changed, was called several times during tests)

Change-Id: If1caa5d141edb6c776a49ee9c2bfa5abc575efab

3 years agoMerge "[ML][Pipeline] Input data" into tizen
Piotr Kosko [Wed, 3 Feb 2021 09:14:15 +0000 (09:14 +0000)]
Merge "[ML][Pipeline] Input data" into tizen

3 years ago[ML][Pipeline] Input data 39/252639/2
Lukasz Bardeli [Fri, 29 Jan 2021 11:43:15 +0000 (12:43 +0100)]
[ML][Pipeline] Input data

ACR: TWDAPI-274

[Verification] Code compiles without error. Tested in chrome console.

var pipeline_input = tizen.ml.pipeline.createPipeline("appsrc name=srcx ! other/tensor,dimension=(string)1:1:1:1,type=(string)int8,framerate=(fraction)0/1 ! tensor_sink name=sinkx")

var source_input = pipeline_input.getSource("srcx")

var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor1", "UINT8", [1, 1])
var td = ti.getTensorsData();
console.log(td.count)

source_input.inputData(td)

tensor_input = source_input.inputTensorsInfo
td_input = tensor_input.getTensorsData()

tt = td_input.tensorsInfo
console.log(tt.getTensorName(0))

Change-Id: I4dd4c3cec5d77d36598551a5d3aa8d8a9fbc9b5a
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
3 years ago[ML][common] Add a method for cloning native tensors 99/252699/9
Pawel Wasowski [Mon, 1 Feb 2021 14:01:02 +0000 (15:01 +0100)]
[ML][common] Add a method for cloning native tensors

ACR: TWDAPI-273/TWDAPI-274

This commit adds a method for cloning data and info from
ml_tensors_data_h and ml_tensors_info_h to TensorsData and related
TensorsInfo objects.

[Verification] Code compiles. Operation is verified in the next commit.

Change-Id: I0268e4d902b7f9a25b5ae531471cdf2028acd77b
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML] Fixed logger type with macro 85/252785/1 accepted/tizen/unified/20210208.134816 submit/tizen/20210202.085424
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Tue, 2 Feb 2021 07:43:47 +0000 (08:43 +0100)]
[ML] Fixed logger type with macro

For some architectures int64_t is not casted to lld, for partablitiy
stackoverflow suggests using macro.

[Verification] Code compiles for aarch64 architecture

Change-Id: I7aaa3dabeacae6ea7b212c09c5070ff011c64ab1

3 years agoMerge "[systeminfo] Prevent possible crash when failure initialization" into tizen submit/tizen/20210202.064821
Piotr Kosko [Mon, 1 Feb 2021 07:33:51 +0000 (07:33 +0000)]
Merge "[systeminfo] Prevent possible crash when failure initialization" into tizen

3 years ago[systeminfo] Prevent possible crash when failure initialization 58/252658/1
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Mon, 1 Feb 2021 06:48:15 +0000 (07:48 +0100)]
[systeminfo] Prevent possible crash when failure initialization

SVACE: 456450

[verification] Code compiles without errors

Change-Id: I0b2f0c0c8d27ff0cc6edf3099f7ec77a2d825c7c

3 years ago[ML][Common] Add TensorRawData and size/location validation on JS side 82/252482/2
Rafal Walczyna [Thu, 28 Jan 2021 16:35:08 +0000 (17:35 +0100)]
[ML][Common] Add TensorRawData and size/location validation on JS side

C++ validation will be added in future commit

Test code:
var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor1", "UINT8", [1, 1])
ti.addTensorInfo("tensor2", "INT16", [2, 4])
ti.addTensorInfo("tensor3", "FLOAT32", [2, 2])
var td = ti.getTensorsData();
console.log(td.getTensorRawData(0))
console.log(td.getTensorRawData(1))
console.log(td.getTensorRawData(2))

[Verification] Built successful. Tested in Chrome Dev console.

Change-Id: I14caa9a91b04ed2664cca241da54977a711b1abd
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Common] Add TensorsData.setTensorRawData method 90/252290/5
Rafal Walczyna [Mon, 25 Jan 2021 14:31:38 +0000 (15:31 +0100)]
[ML][Common] Add TensorsData.setTensorRawData method

ACR: TWDAPI-273

Test code:
var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor1", "UINT8", [1, 1])
var td = ti.getTensorsData();
console.log(td.getTensorRawData(0));
td.setTensorRawData(0, [13]);
console.log(td.getTensorRawData(0));

[Verification] Built successful. Tested in Chrome Dev console.

Change-Id: I522112df9a69f1a5ec7bbcbc12094296a11ec1c9
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Common] Add TensorsData.getTensorRawData method 89/252289/5
Rafal Walczyna [Mon, 25 Jan 2021 14:51:40 +0000 (15:51 +0100)]
[ML][Common] Add TensorsData.getTensorRawData method

ACR: TWDAPI-273

Test code:
var ti = new tizen.ml.TensorsInfo();
var types = ["INT8", "INT16", "INT32", "INT64", "UINT8", "UINT16",
             "UINT32", "UINT64", "FLOAT32", "FLOAT64" ]
types.forEach((t) => {
    ti.addTensorInfo("", t, [3, 3, 2]);
})
var td = ti.getTensorsData();
for(var i = 0; i < 10; i++) {
    console.log(td.getTensorRawData(i));
}

[Verification] Built successful. Tested in Chrome Dev console.

Change-Id: Ia3772b7488d48a593f03dcd158ee66092633d886
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][pipeline] implement Valve::{setOpen, isOpen} 95/251995/7
Pawel Wasowski [Thu, 21 Jan 2021 09:19:14 +0000 (10:19 +0100)]
[ML][pipeline] implement Valve::{setOpen, isOpen}

ACR: TWDAPI-274

[Verification] Tested in Chrome DevTools with the snippets below, works
fine.

var pipeline_def = "videotestsrc is-live=true ! videoconvert ! videoscale"
                   + " ! video/x-raw,format=RGBx,width=16,height=16,framerate=10/1"
                   + " ! tensor_converter ! valve name=valve1 ! fakesink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                      function(state) {console.log(state);});
// READY
// PAUSED

var v = pipeline.getValve('valve1')
// Valve {name: "valve1", _pipeline_id: 1}

v.isOpen
// true

pipeline.isOpen = false
v.isOpen
// true

v.setOpen(false)
v.isOpen
// false

Change-Id: Ibdeaba23082356b5143c2a1796bbd181b4d5d027
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years agoMerge "[ML][Pipeline] GetSource implementation" into tizen
Piotr Kosko [Fri, 29 Jan 2021 07:42:50 +0000 (07:42 +0000)]
Merge "[ML][Pipeline] GetSource implementation" into tizen

3 years ago[Common] Fixed invalid parsing of decimal values 62/252462/1 submit/tizen/20210128.113801
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Thu, 28 Jan 2021 09:57:03 +0000 (10:57 +0100)]
[Common] Fixed invalid parsing of decimal values

[Bug] Decimal values fails to parse properly when locale of device
was e.g. Deutsch

[Verification]
//Below code works well for locales: English, Deutsch, Francais
// sound values are changing and show aproximately same values
// (depending on platform adjustments)

tizen.sound.setVolume("MEDIA", 0.1);
console.log(tizen.sound.getVolume("MEDIA"))
>> 0.13

Change-Id: Icde211bcfcc66cf0d66852816d2a00907adf4571

3 years ago[ML][Pipeline] GetSource implementation 39/252339/3
Lukasz Bardeli [Tue, 26 Jan 2021 12:56:06 +0000 (13:56 +0100)]
[ML][Pipeline] GetSource implementation

ACR: TWDAPI-274

[Verification] Code compiles without error. Tested in chrome console.

var pipeline = tizen.ml.pipeline.createPipeline("appsrc name=appsrc ! other/tensor,dimension=(string)4:1:1:1, type=(string)uint8,framerate=(fraction)0/1 ! tensor_if name=tif compared-value=CUSTOM compared-value-option=tif_custom_cb_name ")
var source = pipeline.getSource("appsrc")
var tensor = source.inputTensorsInfo

Change-Id: I3c09d2f91758c19e82ade9e6e5237ddc0a8ef76e
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
3 years ago[ML][Single] Implemented SingleShot.input member - set 85/252085/5
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Mon, 25 Jan 2021 13:14:43 +0000 (14:14 +0100)]
[ML][Single] Implemented SingleShot.input member - set

* added set feature for SingleShot.input
* added single gathering of SingleShot.input and output (wihout checking native layer every time)

[ACR] https://code.sec.samsung.net/jira/browse/TWDAPI-273

[Verification] Code compiles without errors.
Checked in Chrome console:
var model = tizen.ml.single.openModel("documents/mobilenet_v1_1.0_224_quant.tflite")
model.input
> TensorsInfo {_previouslyConstructed: true, _id: 1}

var newTI = new tizen.ml.TensorsInfo()
newTI.addTensorInfo("input", "UINT8", [3,224,224,1])
model.input = newTI;
model.input
> TensorsInfo {_previouslyConstructed: true, _id: 2}

/// calling getter multiple times return always the same TensorsInfo

Change-Id: I16c33a0ba515aba1efe2f5d93d0d3225b410aced

3 years agoMerge "[ML][Single] Implemented SingleShot.output member - get" into tizen
Piotr Kosko [Tue, 26 Jan 2021 12:40:15 +0000 (12:40 +0000)]
Merge "[ML][Single] Implemented SingleShot.output member - get" into tizen

3 years agoMerge changes I9997467b,Id480d20c into tizen
Piotr Kosko [Tue, 26 Jan 2021 08:12:03 +0000 (08:12 +0000)]
Merge changes I9997467b,Id480d20c into tizen

* changes:
  [ML][Common] Add TensorsData.dispose method
  [ML][Common] Add TensorsInfo.getTensorsData and TensorsData

3 years ago[ML][Common] Add TensorsData.dispose method 02/252002/4
Rafal Walczyna [Wed, 20 Jan 2021 13:19:15 +0000 (14:19 +0100)]
[ML][Common] Add TensorsData.dispose method

ACR: TWDAPI-273

Test code:
var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor1", "UINT8", [1, 1])
ti.addTensorInfo("tensor2", "UINT8", [2, 4])
var td = ti.getTensorsData();
console.log(td.count)
td.dispose();
console.log(td.count)

[Verification] Built successful. Tested in Chrome Dev console.

Change-Id: I9997467b36908d6e031473e58e2b3defbf253e00
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Common] Add TensorsInfo.getTensorsData and TensorsData 01/252001/3
Rafal Walczyna [Wed, 20 Jan 2021 10:28:50 +0000 (11:28 +0100)]
[ML][Common] Add TensorsInfo.getTensorsData and TensorsData

ACR: TWDAPI-273

Test code:
var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor1", "UINT8", [1, 1])
ti.addTensorInfo("tensor2", "UINT8", [2, 4])
var td = ti.getTensorsData();
console.log(td.count)

Verification: Built successful. Tested in Chrome Dev console.

Change-Id: Id480d20c1a32d03113c6dbc73cbd81938a98931f
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Pipeline] Implementation setProperty and getProperty 97/251897/8
Lukasz Bardeli [Wed, 20 Jan 2021 12:48:43 +0000 (13:48 +0100)]
[ML][Pipeline] Implementation setProperty and getProperty

ACR: TWDAPI-274

[Verification] Code compiles without error. Tested in chrome console.

// test code
var pipeline = tizen.ml.pipeline.createPipeline("videotestsrc name=vsrc is-live=true ! videoconvert ! videoscale name=vscale ! video/x-raw,format=RGBx,width=224,height=224,framerate=60/1 ! tensor_converter ! valve name=valvex ! input-selector name=is01 ! tensor_sink name=sinkx")

//BOOLEAN
var nodeinfo_bool = pipeline.getNodeInfo("is01")

nodeinfo_bool.setProperty("sync-streams", "BOOLEAN", true)
nodeinfo_bool.getProperty("sync-streams", "BOOLEAN")
nodeinfo_bool.setProperty("sync-streams", "BOOLEAN", false)
nodeinfo_bool.getProperty("sync-streams", "BOOLEAN")

//DOUBLE
var nodeinfo_double = pipeline.getNodeInfo("vscale")
nodeinfo_double.setProperty("sharpness", "DOUBLE", 0.72)
nodeinfo_double.getProperty("sharpness", "DOUBLE")

//INT32
var nodeinfo_int32 = pipeline.getNodeInfo("vsrc")
nodeinfo_int32.setProperty("kx", "INT32", 10)
nodeinfo_int32.getProperty("kx", "INT32")

//UINT32
var nodeinfo_uint32 = pipeline.getNodeInfo("vsrc")
nodeinfo_uint32.setProperty("foreground-color", "UINT32", 123456)
nodeinfo_uint32.getProperty("foreground-color", "UINT32")

//INT64
var nodeinfo_int64 = pipeline.getNodeInfo("vsrc")
nodeinfo_int64.setProperty("timestamp-offset", "INT64", 10)
nodeinfo_int64.getProperty("timestamp-offset", "INT64")

//UINT64
var pipeline_uint64 = tizen.ml.pipeline.createPipeline("udpsrc name=usrc port=5555 caps=application/x-rtp ! queue ! fakesink")

var nodeinfo_uint64 = pipeline_uint64.getNodeInfo("usrc")
nodeinfo_uint64.setProperty("timeout", "UINT64", 166513216516510)
nodeinfo_uint64.getProperty("timeout", "UINT64")

//STRING
var pipeline_string = tizen.ml.pipeline.createPipeline("videotestsrc ! video/x-raw,format=RGB,width=640,height=480 ! videorate max-rate=1 ! tensor_converter ! tensor_mux ! tensor_demux name=demux ! tensor_sink")

var nodeinfo_string = pipeline_string.getNodeInfo("demux")
nodeinfo_string.setProperty("tensorpick", "STRING", "1,2")
nodeinfo_string.getProperty("tensorpick", "STRING")

// ENUM
var vscale_enum = {
  GST_VIDEO_SCALE_NEAREST:0,
  GST_VIDEO_SCALE_BILINEAR:1,
  GST_VIDEO_SCALE_4TAP:2,
  GST_VIDEO_SCALE_LANCZOS:3
}

var pipeline_enum = tizen.ml.pipeline.createPipeline("videotestsrc name=vsrc is-live=true ! videoconvert ! videoscale name=vscale ! video/x-raw,format=RGBx,width=224,height=224,framerate=60/1 ! tensor_converter ! valve name=valvex ! input-selector name=is01 ! tensor_sink name=sinkx")

var nodeinfo_enum = pipeline_enum.getNodeInfo("vscale")
nodeinfo_enum.setProperty("method", "ENUM", vscale_enum.GST_VIDEO_SCALE_4TAP)
nodeinfo_enum.getProperty("method", "ENUM")

Change-Id: I90f9a3986beeb6a071ce4b265965eec399679c55
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
3 years ago[ML][Single] Implemented SingleShot.output member - get 64/252064/4
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Fri, 22 Jan 2021 07:27:53 +0000 (08:27 +0100)]
[ML][Single] Implemented SingleShot.output member - get

[ACR] https://code.sec.samsung.net/jira/browse/TWDAPI-273

[Verification] Code compiles without errors.
Checked in Chrome console:
// open model
var model = tizen.ml.single.openModel("documents/mobilenet_v1_1.0_224_quant.tflite")
// below works well
model.input.getDimensions(0)
model.output.getDimensions(0)

Change-Id: I43120610873a455eb813bb02db9c3eeff7a02e91

3 years ago[ML][Single] Implemented SingleShot.input member - get 51/252051/2
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Thu, 21 Jan 2021 12:09:41 +0000 (13:09 +0100)]
[ML][Single] Implemented SingleShot.input member - get

[ACR] https://code.sec.samsung.net/jira/browse/TWDAPI-273

[Verification] Code compiles without errors.
Checked in Chrome console:
// open model
var model = tizen.ml.single.openModel("documents/mobilenet_v1_1.0_224_quant.tflite")
// all implemented members of input work
model.input.getDimensions(0)

Change-Id: I132d5e6262f7142c8040c7f40f69f11a1ef63827

3 years agoMerge "[ML][pipeline] Implement Pipeline::getValve()" into tizen
Piotr Kosko [Mon, 25 Jan 2021 10:10:06 +0000 (10:10 +0000)]
Merge "[ML][pipeline] Implement Pipeline::getValve()" into tizen

3 years agoMerge "[ML][Single] Added manager file and implementation for openModel()" into tizen
Piotr Kosko [Mon, 25 Jan 2021 10:05:57 +0000 (10:05 +0000)]
Merge "[ML][Single] Added manager file and implementation for openModel()" into tizen

3 years ago[ML][Single] Added manager file and implementation for openModel() 93/251893/7
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Wed, 20 Jan 2021 10:55:36 +0000 (11:55 +0100)]
[ML][Single] Added manager file and implementation for openModel()

[ACR] https://code.sec.samsung.net/jira/browse/TWDAPI-273

[Verification] Code compiles without errors.
Checked in chrome console with few calls:
Success calls:
tizen.ml.single.openModel("documents/mobilenet_v1_1.0_224_quant.tflite")
tizen.ml.single.openModel("documents/mobilenet_v1_1.0_224_quant.tflite", null, null, "TENSORFLOW_LITE")
tizen.ml.single.openModel("documents/mobilenet_v1_1.0_224_quant.tflite", null, null, "TENSORFLOW_LITE", "ANY", true)

Fail for invalid or not-existing file:
tizen.ml.single.openModel("documents/fail.tflite") // Abort Error
tizen.ml.single.openModel("documents/notexisting") // NotFound
tizen.ml.single.openModel("notexisting") // NotFound

Change-Id: I8b2b89e60d8f265185d3ddcafcc224f4e5c15fa1

3 years agoMerge "[ML][pipeline] Implement Switch::{getPadList, select}" into tizen
Piotr Kosko [Fri, 22 Jan 2021 13:19:01 +0000 (13:19 +0000)]
Merge "[ML][pipeline] Implement Switch::{getPadList, select}" into tizen

3 years ago[ML][pipeline] Implement Pipeline::getValve() 02/251902/5
Pawel Wasowski [Wed, 20 Jan 2021 15:49:03 +0000 (16:49 +0100)]
[ML][pipeline] Implement Pipeline::getValve()

ACR: TWDAPI-274

[Verification] Tested in Chrome DevTools with the below snippets, works
fine.

var pipeline_def = "videotestsrc is-live=true ! videoconvert ! videoscale"
                   + " ! video/x-raw,format=RGBx,width=16,height=16,framerate=10/1"
                   + " ! tensor_converter ! valve name=valve1 ! fakesink";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                      function(state) {console.log(state);});

pipeline.getValve('valve1')
// alve {name: "valve1", _pipeline_id: 1}

pipeline.getValve('valve_XXX')
// WebAPIException {code: 0, name: "InvalidValuesError", ...

pipeline.getValve()
// WebAPIException {code: 0, name: "InvalidValuesError", ...

Change-Id: Id11414f80c42a9879532dfc1c651f766c4f12834
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years agoMerge "[ML][Common] Add support for creating TensorsInfo from native handle" into...
Piotr Kosko [Thu, 21 Jan 2021 09:34:58 +0000 (09:34 +0000)]
Merge "[ML][Common] Add support for creating TensorsInfo from native handle" into tizen

3 years ago[Common] Moved convertUriToPath to common::tools 00/251900/3
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Wed, 20 Jan 2021 13:29:50 +0000 (14:29 +0100)]
[Common] Moved convertUriToPath to common::tools

convertingUriToPath is used in few modules and usage of one version
of this function will be beneficial.

[Verification] TCT exif, package, metadata 100% pass.

Change-Id: Ifbca0fa3a83de0757faa30b214e4b298c4678789

3 years ago[ML][Common] Add support for creating TensorsInfo from native handle 96/251896/2
Rafal Walczyna [Wed, 20 Jan 2021 11:49:15 +0000 (12:49 +0100)]
[ML][Common] Add support for creating TensorsInfo from native handle

ACR: TWDAPI-273

Some of the ml native functions require not initialized handle.
TensorsInfo::CreateTensorsInfo() uses ml_tensors_info_create which allocates
memory for tensors info - but i.e. ml_single_get_input_info allocates memory
again without freeing old handle.

[Verification] Builts successfully, TensorsInfo.count tested in Chrome dev console.

Change-Id: I6b2e9c60dbed23a2d1962e68cc9408a8faecb383
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML] Added placeholders for further development 76/251876/3
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Wed, 20 Jan 2021 07:39:32 +0000 (08:39 +0100)]
[ML] Added placeholders for further development

[Verification] Code compiles without errors

Change-Id: I2b69891c596e31ae87fb519b60aa3811e949c5d5

3 years ago[Datacontrol] Prevent crashes by purging code with undefined behavior 34/251834/3
Pawel Wasowski [Tue, 19 Jan 2021 01:36:44 +0000 (02:36 +0100)]
[Datacontrol] Prevent crashes by purging code with undefined behavior

The following line caused crashes:

IdMap[info->requestId] = info.release();

Argument evaluation order was not strictly defined in C++
before C++17 - behavior of the expression above was undefined.
C++17 introduced more strict rules and their implementation in GCC
caused a crash after setting -std=c++17 - it seems, that info.release()
would be now called before info->requestId.

[Verification] tct-datacontrol-tizen-tests (auto, c++14 and c++17 build):
100% pass rate

The snippet below crashed apps 100% times when webapi-plugins were
compiled with C++17. Now, the snippet works fine

var PROVIDER_ID =
        "http://tizen.org/datacontrol/provider/DictionaryDataControlProvider";
var DATA_ID = "Dictionary";
var TYPE_SQL = "SQL";
var TYPE_MAP = "MAP";

var globalDataControl = tizen.datacontrol.getDataControlConsumer(PROVIDER_ID,
                                                                 DATA_ID,
                                                                 TYPE_MAP);
function successcb(id) {
  console.log("Ok: reqid " + id);
}

function errorcb(id, error) {
  console.log("Error id: " + id + ", error msg: " + error.message);
}

try {
  globalDataControl.addValue(123, "tizen", "Foo", successcb, errorcb);
}
catch (err)
{
  console.log(err.name + ": " + err.message);
}

Change-Id: Ibd80f60d100a616b8a9607c27e9eebf8a64e7a10

3 years ago[mediacontroller] Prevent undefined behavior 25/251825/3
Pawel Wasowski [Mon, 18 Jan 2021 21:11:55 +0000 (22:11 +0100)]
[mediacontroller] Prevent undefined behavior

Constructing a std::string from nullptr is undefined behavior and
caused an exception after setting std=c++17 flag in GCC
(no exception was thrown when compiling with std=c++14).
This commit removes the UB.

The problem caused MediaControllerServerInfo_iconURI_attribute test
from tct-mediacontroller-tizen-tests failures.

[Verification] auto tct-mediacontroller-tizen-tests
1. with std=c++14: 100% pass rate
2. with std=c++17: 100% pass rate

Change-Id: I4857e3d9f8ba2940b50223e89ff952625ba37b3c
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[common] Add std::exception handler to ParsedInstance 19/251819/3
Pawel Wasowski [Mon, 18 Jan 2021 19:35:14 +0000 (20:35 +0100)]
[common] Add std::exception handler to ParsedInstance

When an exception derived from std::exception and not PlatformException
is thrown in webapi-plugins code, only the following error message was
logged:

HandleException(393) > Exception: Unknown exception

As std::exception inheritance is a very common practice, especially in
standard library, we add logging std::exception::what() message to make
debugging easier.

[Verification] An exception thrown from std::string is caught and its
what() message is logged properly.

Change-Id: I879ebe80b609cf26a7e68be822a783aa9ef145eb
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][Common] Add TensorsInfo.getTensorSize 99/251699/2
Rafal Walczyna [Mon, 18 Jan 2021 14:19:54 +0000 (15:19 +0100)]
[ML][Common] Add TensorsInfo.getTensorSize

ACR: TWDAPI-273

Test code:
var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor1", "UINT8", [1, 1])
console.log(ti.getTensorSize(0))
ti.addTensorInfo("tensor2", "UINT8", [2, 3, 4])
console.log(ti.getTensorSize(1))
ti.addTensorInfo("tensor2", "FLOAT32", [2, 3, 4])
console.log(ti.getTensorSize(2))
console.log(ti.getTensorSize(-1))

[Verification] Built successful. Tested in Chrome Dev console.

Change-Id: I841da30d03a0590cea66ec6217130163a87f59ec
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Common] Add TensorsInfo.dispose method 16/251616/3
Rafal Walczyna [Fri, 15 Jan 2021 11:56:20 +0000 (12:56 +0100)]
[ML][Common] Add TensorsInfo.dispose method

ACR: TWDAPI-273

Test code:
var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor1", "UINT8", [1, 1])
ti.getTensorName(0)
ti.dispose()
ti.getTensorName(0)

[Verification] Built successful. Tested in Chrome Dev console.

Change-Id: Icae3447ea266de67404f05e23a5d157e5f899ee9
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Common] Add TensorsInfo.clone and TensorsInfo.equals 24/251524/4
Rafal Walczyna [Thu, 14 Jan 2021 12:13:12 +0000 (13:13 +0100)]
[ML][Common] Add TensorsInfo.clone and TensorsInfo.equals

ACR: TWDAPI-273

Test code:
var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor1", "UINT8", [1, 1])
var ti2 = ti.clone();
console.log(ti.equals(ti2))
ti2.setTensorName(0, "different")
console.log(ti.equals(ti2))
ti2.setTensorType(0, "INT8")
console.log(ti.equals(ti2))

[Verification] Built successful, tested in Chrome Dev console.

Change-Id: I30d9b1b73ab97735b6ecfaf1a408b6561912808d
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Common] Add TensorsInfo getters / setters 35/251435/9
Rafal Walczyna [Wed, 13 Jan 2021 12:52:21 +0000 (13:52 +0100)]
[ML][Common] Add TensorsInfo getters / setters

ACR: TWDAPI-273

Methods added:
TensorsInfo.getTensorName
TensorsInfo.setTensorName
TensorsInfo.getTensorType
TensorsInfo.setTensorType
TensorsInfo.getDimensions
TensorsInfo.setDimensions

Test code:

var ti = new tizen.ml.TensorsInfo();
ti.addTensorInfo("tensor1", "UINT8", [1, 1])
console.log(ti.getTensorName(0));
ti.setTensorName(0, "changedName");
console.log(ti.getTensorName(0));
console.log(ti.getTensorType(0));
ti.setTensorType(0, "INT8");
console.log(ti.getTensorType(0));
console.log(ti.getDimensions(0));
ti.setDimensions(0, [2,4]);
console.log(ti.getDimensions(0));

[Verification] Built successful, tested in Chrome Dev console.

Change-Id: I197072bfbc48812fd44a00cfaceb09ee8928f1a1
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Common] Add TensorsInfo constructor and TensorsInfo::addTensorInfo 58/251158/10
Rafal Walczyna [Fri, 8 Jan 2021 15:40:47 +0000 (16:40 +0100)]
[ML][Common] Add TensorsInfo constructor and TensorsInfo::addTensorInfo

ACR: TWDAPI-273

Added:
- TensorsInfo constructor
- TensorsInfo::addTensorInfo method
- TensorsInfo::count property

Test code:
var ti = new tizen.ml.TensorsInfo();
console.log(ti.count)
ti.addTensorInfo(null, "UINT8", [1, 1])
console.log(ti.count)
console.log(JSON.stringify(ti))

[Verification] Built successful, tested in Chrome Dev console

Change-Id: Ic194d71439e4c4ce30b9722de031e9312c1c8183
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][Common] Add MLTensorsInfoManager 57/251157/8
Rafal Walczyna [Fri, 8 Jan 2021 15:39:37 +0000 (16:39 +0100)]
[ML][Common] Add MLTensorsInfoManager

ACR: TWDAPI-273

[Verification] Built successful

Change-Id: I85a0fdcbcbc42ddcce406d5c6ae5a428536d4ce7
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][pipeline] Implement Switch::{getPadList, select} 12/251612/6
Pawel Wasowski [Tue, 12 Jan 2021 17:03:25 +0000 (18:03 +0100)]
[ML][pipeline] Implement Switch::{getPadList, select}

ACR: TWDAPI-274

[Verification] Tested in Chrome DevTools with the snippets below, works
fine.

var pipeline_def = "videotestsrc is-live=true"
                   + " ! videoconvert"
                   + " ! tensor_converter"
                   + " ! output-selector name=outs outs.src_0"
                   + " ! tensor_sink name=sink0 async=false outs.src_1"
                   + " ! tensor_sink name=sink1 async=false"

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                      function(state) {console.log(state);});

pipeline.getSwitch('outs').getPadList()
// ["src_0", "src_1"]

pipeline.getSwitch('outs').select('src_1')
// dlog: I/nnstreamer( 4274): Switched to [src_1] successfully at switch [outs].

pipeline.getSwitch('outs').select('src_3')
// WebAPIException: InvalidValuesError

pipeline.getSwitch('outs').select()
// WebAPIException: InvalidValuesError

Change-Id: I992e17841a8f8bec19aa60383e9d3ad0baf62975
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][pipeline] Implement Pipeline::getSwitch() 75/251075/11
Pawel Wasowski [Tue, 12 Jan 2021 15:38:43 +0000 (16:38 +0100)]
[ML][pipeline] Implement Pipeline::getSwitch()

ACR: TWDAPI-274

[Verification] Code tested in Chrome DevTools with below snippets works
fine

var pipeline_def = "videotestsrc is-live=true"
                   + " ! videoconvert"
                   + " ! tensor_converter"
                   + " ! output-selector name=outs outs.src_0"
                   + " ! tensor_sink name=sink0 async=false outs.src_1"
                   + " ! tensor_sink name=sink1 async=false"

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def, function(state) {console.log(state);})

pipeline.getSwitch('outs')
// Switch {name: "outs", type: "OUTPUT_SELECTOR", _pipeline_id: 3}

pipeline.getSwitch('non existent switch')
//  VM31:1 Uncaught WebAPIException {code: 0, name: "InvalidValuesError"

Change-Id: Ia7d6838b5e49072c35f0b796151c436d4a3b60e1
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years agoMerge "[ML][common] Add tizen.ml.checkNNFWAvailability method" into tizen
Piotr Kosko [Tue, 19 Jan 2021 06:16:30 +0000 (06:16 +0000)]
Merge "[ML][common] Add tizen.ml.checkNNFWAvailability method" into tizen

3 years ago[ML][Pipeline] Implement getNodeInfo 06/251306/5
Lukasz Bardeli [Tue, 12 Jan 2021 09:24:45 +0000 (10:24 +0100)]
[ML][Pipeline] Implement getNodeInfo

ACR: TWDAPI-274

[Verification] Code compiles without error. Tested in chrome console

var pipeline = tizen.ml.pipeline.createPipeline("videotestsrc ! video/x-raw,format=RGB,width=640,height=480 ! videorate max-rate=1 ! tensor_converter ! tensor_mux ! tensor_demux name=demux ! tensor_sink")
var nodeinfo = pipeline.getNodeInfo("demux")

Change-Id: I503f0a2a52b151ac676a64e2ad888f45abc51170
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
3 years ago[ML][Pipeline] Implement Start and Stop method. 02/250902/10
Lukasz Bardeli [Mon, 11 Jan 2021 07:29:29 +0000 (08:29 +0100)]
[ML][Pipeline] Implement Start and Stop method.

ACR: TWDAPI-274

[Verification] Code compiles without error.

var pipeline = tizen.ml.pipeline.createPipeline("videotestsrc! tizenwlsink");

pipeline.start()

// pipeline.state = "PLAYING"

pipeline.stop()

// pipeline.state = "PAUSED"

Change-Id: I529c47fd349741d3e11b0b57e265d3a9a930f652
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
3 years ago[ML][common] Add tizen.ml.checkNNFWAvailability method 88/250788/10
Rafal Walczyna [Wed, 23 Dec 2020 07:54:06 +0000 (08:54 +0100)]
[ML][common] Add tizen.ml.checkNNFWAvailability method

ACR: TWDAPI-273

Test code:

var HWType = ["ANY", "AUTO", "CPU", "CPU_NEON", "CPU_SIMD", "GPU", "NPU",
    "NPU_EDGE_TPU", "NPU_MOVIDIUS", "NPU_SR", "NPU_VIVANTE"];

var NNFWType = ["ANY", "ARM_NN", "CUSTOM_FILTER", "EDGE_TPU", "MVNC", "NNFW", "OPEN_VINO",
    "SNPE", "TENSORFLOW", "TENSORFLOW_LITE", "VIVANTE"];

HWType.forEach(hw => {
    NNFWType.forEach(nnfw => {
        console.log(nnfw + ", " + hw + ": " + tizen.ml.checkNNFWAvailability(nnfw, hw))
    });
});

[Verificaion] Tested in Google Chrome Dev Console

Change-Id: I2ac7752f410a70e98d8c0cd387ac5dfcabdbef88
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years ago[ML][pipeline] Prepare room for a bugfix 97/251697/2
Pawel Wasowski [Mon, 18 Jan 2021 13:01:19 +0000 (14:01 +0100)]
[ML][pipeline] Prepare room for a bugfix

Native handles to all pipeline elements (switches, node infos, etc.)
have to be released BEFORE Pipeline::pipeline_ handle.
Pipeline::Dispose() will release them in proper order and from now on
will be called from ~Pipeline() to not repeat the error prone release
logic.

[Verification] Code tested with below snippets in Chrome DevTools works
fine.

var pipeline = tizen.ml.pipeline.createPipeline('videotestsrc ! tizenwlsink',
                                                function(state) {console.log(state);})
// test screen appears

pipeline.dispose() // no errors, test screen disappear;
// DLOG message about successful disposal

<press F5> // no crash; DLOG message tells that pipeline_ has been destroyed

Change-Id: Ibe8b1260bc7bf057fed375ac579b87fce59d8caf
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][pipeline] Implement Pipeline::dispose() 70/251070/8
Pawel Wasowski [Tue, 5 Jan 2021 21:47:17 +0000 (22:47 +0100)]
[ML][pipeline] Implement Pipeline::dispose()

ACR: TWDAPI-274

[Verification] Tested in Chrome DevTools with the snippet below, works
fine.

var pipeline = tizen.ml.pipeline.createPipeline('videotestsrc ! tizenwlsink',
                                                function(state) {console.log(state);})
// test screen appears

pipeline.dispose() // no errors, test screen disappears

Change-Id: I5401c3210f73619d5577380abf17139fadc390f1
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][pipeline] Implement Pipeline::state getter 75/250775/12
Pawel Wasowski [Mon, 4 Jan 2021 09:59:39 +0000 (10:59 +0100)]
[ML][pipeline] Implement Pipeline::state getter

ACR: TWDAPI-274

[Verification] Tested in Chrome DevTools with the snippets below. Works fine

 var pipeline = tizen.ml.pipeline.createPipeline('videotestsrc ! tizenwlsink',
                  function(state) {console.log(state);})

<wait a few seconds>

pipeline.state

Change-Id: Iae5e70c63d5c9fd98877defe0949024516c8c41d
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][Pipeline] Add Pipeline and PipelineManager 25/250425/19
Pawel Wasowski [Thu, 24 Dec 2020 10:36:26 +0000 (11:36 +0100)]
[ML][Pipeline] Add Pipeline and PipelineManager

ACR: TWDAPI-274

[Verification] createPipeline() tested in Chrome
DevTools with the snippet below works fine

var pipeline = tizen.ml.pipeline.createPipeline(
                 'videoteststrc ! tizenwlsink',
                  function(state) {
                    console.log(state);
                  })
//a moment later:
// READY
// PAUSED

tizen.ml.createPipeline()
// WebAPIException: InvalidValuesError

Change-Id: I68beaebf7e248b61bba9dc06ce6124c187c45fae
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][pipeline] Add placeholders for implementation 38/251138/4
Pawel Wasowski [Fri, 8 Jan 2021 11:06:03 +0000 (12:06 +0100)]
[ML][pipeline] Add placeholders for implementation

ACR: TWDAPI-274

This commit adds placeholders for implementation of PipelineManager and
Pipeline to avoid merge conflicts of changes done by different
committers.

[Verification] Code compiles

Change-Id: Id4a2b33943e390526929bb5c2dba42cd55d7ad12
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years agoMerge "[Download][TDAF-1353] Exception fix for 'start' function" into tizen
Piotr Kosko [Fri, 8 Jan 2021 10:38:08 +0000 (10:38 +0000)]
Merge "[Download][TDAF-1353] Exception fix for 'start' function" into tizen

3 years ago[Download][TDAF-1353] Exception fix for 'start' function 81/251081/4
Arkadiusz Pietraszek [Thu, 7 Jan 2021 19:32:28 +0000 (20:32 +0100)]
[Download][TDAF-1353] Exception fix for 'start' function

`start` function was returning unknown error exception instead of
unsupported error in case when networkType in DownloadRequest wasn't
supported by the device.

Additionally fix enables null values to be used (in accordance with the documentation).

[Verification] Code builds without errors. TCT suites deprecated, download and systeminfo pass rate: 100%.
Tested in developer console on devices with telephony set to true and false.
Below code was used with all network types, as well as invalid values.
```
var downloadRequest = new tizen.DownloadRequest(
                    "http://download.tizen.org/tct/2_1/webapi-tizen-download-test-image-lq.png",
                    null, null, "CELLULAR", null);

tizen.download.start(downloadRequest);
```

Change-Id: I4f2866a07019f129c852024970783b110ef11abc
Signed-off-by: Arkadiusz Pietraszek <a.pietraszek@samsung.com>
3 years ago[Common] Moved helper functions to decode/encode strings/binary to common 15/250915/2
Rafal Walczyna [Tue, 5 Jan 2021 13:27:05 +0000 (14:27 +0100)]
[Common] Moved helper functions to decode/encode strings/binary to common

[Verification] Built successfully. Metadata and filesystem auto tct 100%.

Change-Id: I751e5cad95f8c7dc907214225f8f27cabbb3e5e7
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years agoMerge "[ML][utils] Add native error to PlatformResult converter" into tizen
Piotr Kosko [Tue, 5 Jan 2021 10:56:42 +0000 (10:56 +0000)]
Merge "[ML][utils] Add native error to PlatformResult converter" into tizen

3 years agoMerge "[ML][pipeline] Add files structure" into tizen
Piotr Kosko [Tue, 5 Jan 2021 10:56:32 +0000 (10:56 +0000)]
Merge "[ML][pipeline] Add files structure" into tizen

3 years agoMerge "[ML] Add files structure" into tizen
Piotr Kosko [Tue, 5 Jan 2021 10:56:07 +0000 (10:56 +0000)]
Merge "[ML] Add files structure" into tizen

3 years agoMerge branch 'tizen_6.0' into tizen 86/250786/2
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Mon, 4 Jan 2021 12:38:53 +0000 (13:38 +0100)]
Merge branch 'tizen_6.0' into tizen

Change-Id: I8134cac10af7ba5439eecba63db59fb6ea97496f