|  |  | @@ -64,6 +64,10 @@ static DNNReturnType set_input_output_native(void *model, DNNInputData *input, c | 
		
	
		
			
			|  |  |  | DNNModel *ff_dnn_load_model_native(const char *model_filename) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | DNNModel *model = NULL; | 
		
	
		
			
			|  |  |  | char header_expected[] = "FFMPEGDNNNATIVE"; | 
		
	
		
			
			|  |  |  | char *buf; | 
		
	
		
			
			|  |  |  | size_t size; | 
		
	
		
			
			|  |  |  | int version, header_size, major_version_expected = 0; | 
		
	
		
			
			|  |  |  | ConvolutionalNetwork *network = NULL; | 
		
	
		
			
			|  |  |  | AVIOContext *model_file_context; | 
		
	
		
			
			|  |  |  | int file_size, dnn_size, kernel_size, i; | 
		
	
	
		
			
				|  |  | @@ -84,6 +88,41 @@ DNNModel *ff_dnn_load_model_native(const char *model_filename) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | file_size = avio_size(model_file_context); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /** | 
		
	
		
			
			|  |  |  | * 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; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // size - 1 to skip the ending '\0' which is not saved in file | 
		
	
		
			
			|  |  |  | avio_get_str(model_file_context, size - 1, buf, size); | 
		
	
		
			
			|  |  |  | dnn_size = size - 1; | 
		
	
		
			
			|  |  |  | if (strncmp(buf, header_expected, size) != 0) { | 
		
	
		
			
			|  |  |  | av_freep(&buf); | 
		
	
		
			
			|  |  |  | avio_closep(&model_file_context); | 
		
	
		
			
			|  |  |  | av_freep(&model); | 
		
	
		
			
			|  |  |  | return NULL; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 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; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // currently no need to check minor version | 
		
	
		
			
			|  |  |  | version = (int32_t)avio_rl32(model_file_context); | 
		
	
		
			
			|  |  |  | dnn_size += 4; | 
		
	
		
			
			|  |  |  | header_size = dnn_size; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | network = av_mallocz(sizeof(ConvolutionalNetwork)); | 
		
	
		
			
			|  |  |  | if (!network){ | 
		
	
		
			
			|  |  |  | avio_closep(&model_file_context); | 
		
	
	
		
			
				|  |  | @@ -95,8 +134,8 @@ DNNModel *ff_dnn_load_model_native(const char *model_filename) | 
		
	
		
			
			|  |  |  | avio_seek(model_file_context, file_size - 8, SEEK_SET); | 
		
	
		
			
			|  |  |  | network->layers_num = (int32_t)avio_rl32(model_file_context); | 
		
	
		
			
			|  |  |  | network->operands_num = (int32_t)avio_rl32(model_file_context); | 
		
	
		
			
			|  |  |  | dnn_size = 8; | 
		
	
		
			
			|  |  |  | avio_seek(model_file_context, 0, SEEK_SET); | 
		
	
		
			
			|  |  |  | dnn_size += 8; | 
		
	
		
			
			|  |  |  | avio_seek(model_file_context, header_size, SEEK_SET); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | network->layers = av_mallocz(network->layers_num * sizeof(Layer)); | 
		
	
		
			
			|  |  |  | if (!network->layers){ | 
		
	
	
		
			
				|  |  | 
 |