mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
dnn_backend_native: check operand index
it fixed the issue in https://trac.ffmpeg.org/ticket/8716 (cherry-pick from 0b3bd001ac1745d9d008a2d195817df57d7d1d14) Signed-off-by: Guo, Yejun <yejun.guo@intel.com>
This commit is contained in:
parent
5530748bfd
commit
dd273d359e
@ -196,7 +196,7 @@ DNNModel *ff_dnn_load_model_native(const char *model_filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
network->layers[layer].type = layer_type;
|
network->layers[layer].type = layer_type;
|
||||||
parsed_size = layer_funcs[layer_type].pf_load(&network->layers[layer], model_file_context, file_size);
|
parsed_size = layer_funcs[layer_type].pf_load(&network->layers[layer], model_file_context, file_size, network->operands_num);
|
||||||
if (!parsed_size) {
|
if (!parsed_size) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
@ -209,6 +209,10 @@ DNNModel *ff_dnn_load_model_native(const char *model_filename)
|
|||||||
int32_t operand_index = (int32_t)avio_rl32(model_file_context);
|
int32_t operand_index = (int32_t)avio_rl32(model_file_context);
|
||||||
dnn_size += 4;
|
dnn_size += 4;
|
||||||
|
|
||||||
|
if (operand_index >= network->operands_num) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
oprd = &network->operands[operand_index];
|
oprd = &network->operands[operand_index];
|
||||||
name_len = (int32_t)avio_rl32(model_file_context);
|
name_len = (int32_t)avio_rl32(model_file_context);
|
||||||
dnn_size += 4;
|
dnn_size += 4;
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#define CLAMP_TO_EDGE(x, w) ((x) < 0 ? 0 : ((x) >= (w) ? (w - 1) : (x)))
|
#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)
|
int dnn_load_layer_conv2d(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num)
|
||||||
{
|
{
|
||||||
ConvolutionalParams *conv_params;
|
ConvolutionalParams *conv_params;
|
||||||
int kernel_size;
|
int kernel_size;
|
||||||
@ -80,6 +80,11 @@ int dnn_load_layer_conv2d(Layer *layer, AVIOContext *model_file_context, int fil
|
|||||||
layer->input_operand_indexes[0] = (int32_t)avio_rl32(model_file_context);
|
layer->input_operand_indexes[0] = (int32_t)avio_rl32(model_file_context);
|
||||||
layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
|
layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
|
||||||
dnn_size += 8;
|
dnn_size += 8;
|
||||||
|
|
||||||
|
if (layer->input_operand_indexes[0] >= operands_num || layer->output_operand_index >= operands_num) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return dnn_size;
|
return dnn_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ typedef struct ConvolutionalParams{
|
|||||||
float *biases;
|
float *biases;
|
||||||
} ConvolutionalParams;
|
} ConvolutionalParams;
|
||||||
|
|
||||||
int dnn_load_layer_conv2d(Layer *layer, AVIOContext *model_file_context, int file_size);
|
int dnn_load_layer_conv2d(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num);
|
||||||
int dnn_execute_layer_conv2d(DnnOperand *operands, const int32_t *input_operand_indexes,
|
int dnn_execute_layer_conv2d(DnnOperand *operands, const int32_t *input_operand_indexes,
|
||||||
int32_t output_operand_index, const void *parameters);
|
int32_t output_operand_index, const void *parameters);
|
||||||
#endif
|
#endif
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "dnn_backend_native_layer_depth2space.h"
|
#include "dnn_backend_native_layer_depth2space.h"
|
||||||
|
|
||||||
int dnn_load_layer_depth2space(Layer *layer, AVIOContext *model_file_context, int file_size)
|
int dnn_load_layer_depth2space(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num)
|
||||||
{
|
{
|
||||||
DepthToSpaceParams *params;
|
DepthToSpaceParams *params;
|
||||||
int dnn_size = 0;
|
int dnn_size = 0;
|
||||||
@ -42,6 +42,10 @@ int dnn_load_layer_depth2space(Layer *layer, AVIOContext *model_file_context, in
|
|||||||
dnn_size += 8;
|
dnn_size += 8;
|
||||||
layer->params = params;
|
layer->params = params;
|
||||||
|
|
||||||
|
if (layer->input_operand_indexes[0] >= operands_num || layer->output_operand_index >= operands_num) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return dnn_size;
|
return dnn_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ typedef struct DepthToSpaceParams{
|
|||||||
int block_size;
|
int block_size;
|
||||||
} DepthToSpaceParams;
|
} DepthToSpaceParams;
|
||||||
|
|
||||||
int dnn_load_layer_depth2space(Layer *layer, AVIOContext *model_file_context, int file_size);
|
int dnn_load_layer_depth2space(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num);
|
||||||
int dnn_execute_layer_depth2space(DnnOperand *operands, const int32_t *input_operand_indexes,
|
int dnn_execute_layer_depth2space(DnnOperand *operands, const int32_t *input_operand_indexes,
|
||||||
int32_t output_operand_index, const void *parameters);
|
int32_t output_operand_index, const void *parameters);
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "dnn_backend_native_layer_mathbinary.h"
|
#include "dnn_backend_native_layer_mathbinary.h"
|
||||||
|
|
||||||
int dnn_load_layer_math_binary(Layer *layer, AVIOContext *model_file_context, int file_size)
|
int dnn_load_layer_math_binary(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num)
|
||||||
{
|
{
|
||||||
DnnLayerMathBinaryParams *params;
|
DnnLayerMathBinaryParams *params;
|
||||||
int dnn_size = 0;
|
int dnn_size = 0;
|
||||||
@ -45,6 +45,9 @@ int dnn_load_layer_math_binary(Layer *layer, AVIOContext *model_file_context, in
|
|||||||
params->v = av_int2float(avio_rl32(model_file_context));
|
params->v = av_int2float(avio_rl32(model_file_context));
|
||||||
} else {
|
} else {
|
||||||
layer->input_operand_indexes[input_index] = (int32_t)avio_rl32(model_file_context);
|
layer->input_operand_indexes[input_index] = (int32_t)avio_rl32(model_file_context);
|
||||||
|
if (layer->input_operand_indexes[input_index] >= operands_num) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
input_index++;
|
input_index++;
|
||||||
}
|
}
|
||||||
dnn_size += 4;
|
dnn_size += 4;
|
||||||
@ -55,6 +58,9 @@ int dnn_load_layer_math_binary(Layer *layer, AVIOContext *model_file_context, in
|
|||||||
params->v = av_int2float(avio_rl32(model_file_context));
|
params->v = av_int2float(avio_rl32(model_file_context));
|
||||||
} else {
|
} else {
|
||||||
layer->input_operand_indexes[input_index] = (int32_t)avio_rl32(model_file_context);
|
layer->input_operand_indexes[input_index] = (int32_t)avio_rl32(model_file_context);
|
||||||
|
if (layer->input_operand_indexes[input_index] >= operands_num) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
input_index++;
|
input_index++;
|
||||||
}
|
}
|
||||||
dnn_size += 4;
|
dnn_size += 4;
|
||||||
@ -63,6 +69,10 @@ int dnn_load_layer_math_binary(Layer *layer, AVIOContext *model_file_context, in
|
|||||||
dnn_size += 4;
|
dnn_size += 4;
|
||||||
layer->params = params;
|
layer->params = params;
|
||||||
|
|
||||||
|
if (layer->output_operand_index >= operands_num) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return dnn_size;
|
return dnn_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ typedef struct DnnLayerMathBinaryParams{
|
|||||||
float v;
|
float v;
|
||||||
} DnnLayerMathBinaryParams;
|
} DnnLayerMathBinaryParams;
|
||||||
|
|
||||||
int dnn_load_layer_math_binary(Layer *layer, AVIOContext *model_file_context, int file_size);
|
int dnn_load_layer_math_binary(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num);
|
||||||
int dnn_execute_layer_math_binary(DnnOperand *operands, const int32_t *input_operand_indexes,
|
int dnn_execute_layer_math_binary(DnnOperand *operands, const int32_t *input_operand_indexes,
|
||||||
int32_t output_operand_index, const void *parameters);
|
int32_t output_operand_index, const void *parameters);
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "dnn_backend_native_layer_mathunary.h"
|
#include "dnn_backend_native_layer_mathunary.h"
|
||||||
|
|
||||||
int dnn_load_layer_math_unary(Layer *layer, AVIOContext *model_file_context, int file_size)
|
int dnn_load_layer_math_unary(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num)
|
||||||
{
|
{
|
||||||
DnnLayerMathUnaryParams *params;
|
DnnLayerMathUnaryParams *params;
|
||||||
int dnn_size = 0;
|
int dnn_size = 0;
|
||||||
@ -42,6 +42,10 @@ int dnn_load_layer_math_unary(Layer *layer, AVIOContext *model_file_context, int
|
|||||||
layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
|
layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
|
||||||
dnn_size += 8;
|
dnn_size += 8;
|
||||||
|
|
||||||
|
if (layer->input_operand_indexes[0] >= operands_num || layer->output_operand_index >= operands_num) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return dnn_size;
|
return dnn_size;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ typedef struct DnnLayerMathUnaryParams{
|
|||||||
DNNMathUnaryOperation un_op;
|
DNNMathUnaryOperation un_op;
|
||||||
} DnnLayerMathUnaryParams;
|
} DnnLayerMathUnaryParams;
|
||||||
|
|
||||||
int dnn_load_layer_math_unary(Layer *layer, AVIOContext *model_file_context, int file_size);
|
int dnn_load_layer_math_unary(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num);
|
||||||
int dnn_execute_layer_math_unary(DnnOperand *operands, const int32_t *input_operand_indexes,
|
int dnn_execute_layer_math_unary(DnnOperand *operands, const int32_t *input_operand_indexes,
|
||||||
int32_t output_operand_index, const void *parameters);
|
int32_t output_operand_index, const void *parameters);
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "dnn_backend_native_layer_maximum.h"
|
#include "dnn_backend_native_layer_maximum.h"
|
||||||
|
|
||||||
int dnn_load_layer_maximum(Layer *layer, AVIOContext *model_file_context, int file_size)
|
int dnn_load_layer_maximum(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num)
|
||||||
{
|
{
|
||||||
DnnLayerMaximumParams *params;
|
DnnLayerMaximumParams *params;
|
||||||
int dnn_size = 0;
|
int dnn_size = 0;
|
||||||
@ -42,6 +42,10 @@ int dnn_load_layer_maximum(Layer *layer, AVIOContext *model_file_context, int fi
|
|||||||
layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
|
layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
|
||||||
dnn_size += 8;
|
dnn_size += 8;
|
||||||
|
|
||||||
|
if (layer->input_operand_indexes[0] >= operands_num || layer->output_operand_index >= operands_num) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return dnn_size;
|
return dnn_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ typedef struct DnnLayerMaximumParams{
|
|||||||
}val;
|
}val;
|
||||||
} DnnLayerMaximumParams;
|
} DnnLayerMaximumParams;
|
||||||
|
|
||||||
int dnn_load_layer_maximum(Layer *layer, AVIOContext *model_file_context, int file_size);
|
int dnn_load_layer_maximum(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num);
|
||||||
int dnn_execute_layer_maximum(DnnOperand *operands, const int32_t *input_operand_indexes,
|
int dnn_execute_layer_maximum(DnnOperand *operands, const int32_t *input_operand_indexes,
|
||||||
int32_t output_operand_index, const void *parameters);
|
int32_t output_operand_index, const void *parameters);
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "dnn_backend_native_layer_pad.h"
|
#include "dnn_backend_native_layer_pad.h"
|
||||||
|
|
||||||
int dnn_load_layer_pad(Layer *layer, AVIOContext *model_file_context, int file_size)
|
int dnn_load_layer_pad(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num)
|
||||||
{
|
{
|
||||||
LayerPadParams *params;
|
LayerPadParams *params;
|
||||||
int dnn_size = 0;
|
int dnn_size = 0;
|
||||||
@ -42,6 +42,10 @@ int dnn_load_layer_pad(Layer *layer, AVIOContext *model_file_context, int file_s
|
|||||||
dnn_size += 8;
|
dnn_size += 8;
|
||||||
layer->params = params;
|
layer->params = params;
|
||||||
|
|
||||||
|
if (layer->input_operand_indexes[0] >= operands_num || layer->output_operand_index >= operands_num) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return dnn_size;
|
return dnn_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ typedef struct LayerPadParams{
|
|||||||
float constant_values;
|
float constant_values;
|
||||||
} LayerPadParams;
|
} LayerPadParams;
|
||||||
|
|
||||||
int dnn_load_layer_pad(Layer *layer, AVIOContext *model_file_context, int file_size);
|
int dnn_load_layer_pad(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num);
|
||||||
int dnn_execute_layer_pad(DnnOperand *operands, const int32_t *input_operand_indexes,
|
int dnn_execute_layer_pad(DnnOperand *operands, const int32_t *input_operand_indexes,
|
||||||
int32_t output_operand_index, const void *parameters);
|
int32_t output_operand_index, const void *parameters);
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
typedef int (*LAYER_EXEC_FUNC)(DnnOperand *operands, const int32_t *input_operand_indexes,
|
typedef int (*LAYER_EXEC_FUNC)(DnnOperand *operands, const int32_t *input_operand_indexes,
|
||||||
int32_t output_operand_index, const void *parameters);
|
int32_t output_operand_index, const void *parameters);
|
||||||
typedef int (*LAYER_LOAD_FUNC)(Layer *layer, AVIOContext *model_file_context, int file_size);
|
typedef int (*LAYER_LOAD_FUNC)(Layer *layer, AVIOContext *model_file_context, int file_size, int operands_num);
|
||||||
|
|
||||||
typedef struct LayerFunc {
|
typedef struct LayerFunc {
|
||||||
LAYER_EXEC_FUNC pf_exec;
|
LAYER_EXEC_FUNC pf_exec;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user