platform/core/api/webapi-plugins.git
3 years ago[ML][Pipeline] Remove InvalidValuesError from createPipeline 80/255380/1
Pawel Wasowski [Wed, 17 Mar 2021 17:26:29 +0000 (18:26 +0100)]
[ML][Pipeline] Remove InvalidValuesError from createPipeline

ACR: TWDAPI-274

This commit removes InvalidValuesError from the list of valid
tizen.ml.pipeline.createPipeline() exceptions, because we cannot
reliably detect, when a pipeline description is invalid.
Instead, AbortError with custom message, suggesting that the
description may be invalid, will be used.

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

// Invalid pipeline definition
var pipeline_def = "invalid";

var pipeline = tizen.ml.pipeline.createPipeline(pipeline_def,
                                                state => {console.log(state);})
// WebAPIException {name: "AbortError", message: "Could not create pipeline:
// invalid pipeline description or an internal error"}

//////////////////////////////////////////////////////////////////////
// Valid pipeline definition

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);
})

// pipeline starts properly

Change-Id: If8d08160cb98b3acc34812f47b2741c2cce83cd8
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[version] 2.80 94/255194/1 accepted/tizen/unified/20210316.151300 submit/tizen/20210315.104011
Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics [Mon, 15 Mar 2021 06:12:25 +0000 (07:12 +0100)]
[version] 2.80

Change-Id: I70978ba74a8a100745631723bdccd66239b7224e

3 years agoMerge "[ML][Pipeline] Fix issues reported by TCT team" into tizen
Piotr Kosko [Mon, 15 Mar 2021 06:05:05 +0000 (06:05 +0000)]
Merge "[ML][Pipeline] Fix issues reported by TCT team" into tizen

3 years ago[ML][Pipeline] Fix issues reported by TCT team 47/255147/3
Pawel Wasowski [Fri, 12 Mar 2021 14:32:18 +0000 (15:32 +0100)]
[ML][Pipeline] Fix issues reported by TCT team

Fixed problems:
- Pipeline::{getNodeInfo, getSwitch, getValve}: throw TypeMismatchError
when no argument is passed
- NodeInfo::setProperty: throw TypeMismatchError, instead of AbortError
when value type is other than expected
- Pipeline::unregisterSinkListener: throw InvalidValuesError when sink
has not been registered

[Verification] Code was tested with the snippets below and worked fine

///// checking problems with getNodeInfo, getSwitch, getValve,
///// and unregisterSinkListener
var pipelineDefinition = "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 pipeline = tizen.ml.pipeline.createPipeline(pipelineDefinition);

pipeline.getNodeInfo();
// TypeMismatchError

pipeline.getSwitch();
// TypeMismatchError

pipeline.getValve();
// TypeMismatchError

pipeline.unregisterSinkListener('test')
// InvalidValuesError

///// checking problem with setProperty
pipelineDefinition = "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";
pipeline = tizen.ml.pipeline.createPipeline(pipelineDefinition);
nodeInfo = pipeline.getNodeInfo("vsrc");
nodeInfo.setProperty("is-live", "DOUBLE", NaN);
// TypeMismatchError

Change-Id: I25438b037e0a2dd2f91f8d9b398cffcaf457386b
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][Single] Fix issues that came out after TCT tests 59/255159/1
Rafal Walczyna [Fri, 12 Mar 2021 12:23:06 +0000 (13:23 +0100)]
[ML][Single] Fix issues that came out after TCT tests

- SingleShot.openModel should throw TypeError when no arguments provided

[Verification] Tested in chrome-dev console

Change-Id: I13b7946aa90f86ff4becccb9834b76d4f6bf6d22
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
3 years agoMerge "[ML][Pipeline] Invalidate CustomFilter arguments after return" into tizen
Piotr Kosko [Fri, 12 Mar 2021 10:17:40 +0000 (10:17 +0000)]
Merge "[ML][Pipeline] Invalidate CustomFilter arguments after return" into tizen

3 years ago[ML][Pipeline] Invalidate CustomFilter arguments after return 24/254924/4
Pawel Wasowski [Wed, 10 Mar 2021 12:38:22 +0000 (13:38 +0100)]
[ML][Pipeline] Invalidate CustomFilter arguments after return

ACR: TWDAPI-274

This commit makes input and output of a JS CustomFilter act as if they
were disposed after the callback's return.

[Verification] Change was tested in Chrome DevTools with the snippets
below. It 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 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);

    console.log(input);

    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
// TensorsData {_id: 0, _tensorsInfo: TensorsInfo, _disposable: false}
// PAUSED

pipeline.start()

// CustomFilter is called 3 times

inputFromCustomFilter.getTensorRawData(0)
inputFromCustomFilter.tensorsInfo
outputFromCustomFilter.getTensorRawData(0)
outputFromCustomFilter.tensorsInfo
// The 4 lines above result in the following exception
// WebAPIException {name: "AbortError", message: "TensorsData is disposed"}
// as expected

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

var inputTI = new tizen.ml.TensorsInfo();
inputTI.addTensorInfo('ti1', 'UINT8', [4, 20, 15, 1]);
var inputTD = inputTI.getTensorsData()

inputTD.dispose()

inputTD.tensorsInfo
inputTD.getTensorRawData(0)
// The 2 lines above result in the following exception
// WebAPIException {name: "AbortError", message: "TensorsData is disposed"}
// as expected - the behavior of TensorsData.dispose() did not change

Change-Id: Ib6c6afc4bb09ad2ce04bb85650b79868e9923b7b
Signed-off-by: Pawel Wasowski <p.wasowski2@samsung.com>
3 years ago[ML][Common] Fix issues that came out after TCT tests 31/255131/1
Rafal Walczyna [Fri, 12 Mar 2021 07:55:42 +0000 (08:55 +0100)]
[ML][Common] Fix issues that came out after TCT tests

- tizen.ml.single and tizen.ml.prototype should be not writable
- TensorsInfo.addTensorsInfo should return newly added tensors info id
- ValidateBufferForTensorsData issue

[Verification] Tested in chromium console

Change-Id: I9ba7e074c79ffc7acb4de32a87a42db6c5f22beb
Signed-off-by: Rafal Walczyna <r.walczyna@samsung.com>
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>