int32_t layer;
DNNLayerType layer_type;
- model = av_malloc(sizeof(DNNModel));
- if (!model){
- return NULL;
- }
-
if (avio_open(&model_file_context, model_filename, AVIO_FLAG_READ) < 0){
- av_freep(&model);
return NULL;
}
file_size = avio_size(model_file_context);
+ model = av_mallocz(sizeof(DNNModel));
+ if (!model){
+ goto fail;
+ }
+
/**
* check file header with string and version
*/
size = sizeof(header_expected);
buf = av_malloc(size);
if (!buf) {
- avio_closep(&model_file_context);
- av_freep(&model);
- return NULL;
+ goto fail;
}
// size - 1 to skip the ending '\0' which is not saved in file
dnn_size = size - 1;
if (strncmp(buf, header_expected, size) != 0) {
av_freep(&buf);
- avio_closep(&model_file_context);
- av_freep(&model);
- return NULL;
+ goto fail;
}
av_freep(&buf);
version = (int32_t)avio_rl32(model_file_context);
dnn_size += 4;
if (version != major_version_expected) {
- avio_closep(&model_file_context);
- av_freep(&model);
- return NULL;
+ goto fail;
}
// currently no need to check minor version
network = av_mallocz(sizeof(ConvolutionalNetwork));
if (!network){
- avio_closep(&model_file_context);
- av_freep(&model);
- return NULL;
+ goto fail;
}
model->model = (void *)network;
network->layers = av_mallocz(network->layers_num * sizeof(Layer));
if (!network->layers){
- avio_closep(&model_file_context);
- ff_dnn_free_model_native(&model);
- return NULL;
+ goto fail;
}
network->operands = av_mallocz(network->operands_num * sizeof(DnnOperand));
if (!network->operands){
- avio_closep(&model_file_context);
- ff_dnn_free_model_native(&model);
- return NULL;
+ goto fail;
}
for (layer = 0; layer < network->layers_num; ++layer){
dnn_size += 4;
if (layer_type >= DLT_COUNT) {
- avio_closep(&model_file_context);
- ff_dnn_free_model_native(&model);
- return NULL;
+ goto fail;
}
network->layers[layer].type = layer_type;
parsed_size = layer_funcs[layer_type].pf_load(&network->layers[layer], model_file_context, file_size);
if (!parsed_size) {
- avio_closep(&model_file_context);
- ff_dnn_free_model_native(&model);
- return NULL;
+ goto fail;
}
dnn_size += parsed_size;
}
model->get_input = &get_input_native;
return model;
+
+fail:
+ ff_dnn_free_model_native(&model);
+ avio_closep(&model_file_context);
+ return NULL;
}
DNNReturnType ff_dnn_execute_model_native(const DNNModel *model, DNNData *outputs, uint32_t nb_output)
if (*model)
{
- network = (ConvolutionalNetwork *)(*model)->model;
- for (layer = 0; layer < network->layers_num; ++layer){
- if (network->layers[layer].type == DLT_CONV2D){
- conv_params = (ConvolutionalParams *)network->layers[layer].params;
- av_freep(&conv_params->kernel);
- av_freep(&conv_params->biases);
+ if ((*model)->model) {
+ network = (ConvolutionalNetwork *)(*model)->model;
+ if (network->layers) {
+ for (layer = 0; layer < network->layers_num; ++layer){
+ if (network->layers[layer].type == DLT_CONV2D){
+ conv_params = (ConvolutionalParams *)network->layers[layer].params;
+ av_freep(&conv_params->kernel);
+ av_freep(&conv_params->biases);
+ }
+ av_freep(&network->layers[layer].params);
+ }
+ av_freep(&network->layers);
}
- av_freep(&network->layers[layer].params);
- }
- av_freep(&network->layers);
- for (uint32_t operand = 0; operand < network->operands_num; ++operand)
- av_freep(&network->operands[operand].data);
- av_freep(&network->operands);
+ if (network->operands) {
+ for (uint32_t operand = 0; operand < network->operands_num; ++operand)
+ av_freep(&network->operands[operand].data);
+ av_freep(&network->operands);
+ }
- av_freep(&network->output_indexes);
- av_freep(&network);
+ av_freep(&network->output_indexes);
+ av_freep(&network);
+ }
av_freep(model);
}
}