diff options
author | Guo, Yejun <yejun.guo@intel.com> | 2019-10-09 22:08:18 +0800 |
---|---|---|
committer | Pedro Arthur <bygrandao@gmail.com> | 2019-10-15 18:56:54 -0300 |
commit | 2558e62713ebc5f3ea22c1a28d8e9cf3249badaf (patch) | |
tree | c8b4dfe51ec30faa41f7327f15000d49c3f05c72 /libavfilter/dnn/dnn_backend_native_layer_conv2d.c | |
parent | 3fd5ac7e92049b4f31026acdb53a762289f71448 (diff) | |
download | ffmpeg-streaming-2558e62713ebc5f3ea22c1a28d8e9cf3249badaf.zip ffmpeg-streaming-2558e62713ebc5f3ea22c1a28d8e9cf3249badaf.tar.gz |
avfilter/dnn: unify the layer load function in native mode
Signed-off-by: Guo, Yejun <yejun.guo@intel.com>
Signed-off-by: Pedro Arthur <bygrandao@gmail.com>
Diffstat (limited to 'libavfilter/dnn/dnn_backend_native_layer_conv2d.c')
-rw-r--r-- | libavfilter/dnn/dnn_backend_native_layer_conv2d.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/libavfilter/dnn/dnn_backend_native_layer_conv2d.c b/libavfilter/dnn/dnn_backend_native_layer_conv2d.c index 594187f..0de8902 100644 --- a/libavfilter/dnn/dnn_backend_native_layer_conv2d.c +++ b/libavfilter/dnn/dnn_backend_native_layer_conv2d.c @@ -23,6 +23,52 @@ #define CLAMP_TO_EDGE(x, w) ((x) < 0 ? 0 : ((x) >= (w) ? (w - 1) : (x))) +int dnn_load_layer_conv2d(Layer *layer, AVIOContext *model_file_context, int file_size) +{ + ConvolutionalParams *conv_params; + int kernel_size; + int dnn_size = 0; + conv_params = av_malloc(sizeof(*conv_params)); + if (!conv_params) + return 0; + + conv_params->dilation = (int32_t)avio_rl32(model_file_context); + conv_params->padding_method = (int32_t)avio_rl32(model_file_context); + conv_params->activation = (int32_t)avio_rl32(model_file_context); + conv_params->input_num = (int32_t)avio_rl32(model_file_context); + conv_params->output_num = (int32_t)avio_rl32(model_file_context); + conv_params->kernel_size = (int32_t)avio_rl32(model_file_context); + kernel_size = conv_params->input_num * conv_params->output_num * + conv_params->kernel_size * conv_params->kernel_size; + dnn_size += 24 + (kernel_size + conv_params->output_num << 2); + if (dnn_size > file_size || conv_params->input_num <= 0 || + conv_params->output_num <= 0 || conv_params->kernel_size <= 0){ + av_freep(&conv_params); + return 0; + } + conv_params->kernel = av_malloc(kernel_size * sizeof(float)); + conv_params->biases = av_malloc(conv_params->output_num * sizeof(float)); + if (!conv_params->kernel || !conv_params->biases){ + av_freep(&conv_params->kernel); + av_freep(&conv_params->biases); + av_freep(&conv_params); + return 0; + } + for (int i = 0; i < kernel_size; ++i){ + conv_params->kernel[i] = av_int2float(avio_rl32(model_file_context)); + } + for (int i = 0; i < conv_params->output_num; ++i){ + conv_params->biases[i] = av_int2float(avio_rl32(model_file_context)); + } + + layer->params = conv_params; + + layer->input_operand_indexes[0] = (int32_t)avio_rl32(model_file_context); + layer->output_operand_index = (int32_t)avio_rl32(model_file_context); + dnn_size += 8; + return dnn_size; +} + int dnn_execute_layer_conv2d(DnnOperand *operands, const int32_t *input_operand_indexes, int32_t output_operand_index, const void *parameters) { |