35 for (
int i = 0;
i < 4; ++
i) {
51 return (2 * paddings - 1 - given);
53 return (2 * paddings - given);
63 int offset = given - border;
64 return (border - 1 - offset);
66 int offset = given - border;
67 return (border - 2 - offset);
75 int32_t output_operand_index,
const void *parameters)
83 int32_t input_operand_index = input_operand_indexes[0];
84 int number = operands[input_operand_index].
dims[0];
85 int height = operands[input_operand_index].
dims[1];
86 int width = operands[input_operand_index].
dims[2];
87 int channel = operands[input_operand_index].
dims[3];
88 const float *input = operands[input_operand_index].
data;
96 int wc_stride = c_stride *
width;
97 int hwc_stride = wc_stride *
height;
99 int new_c_stride = new_channel;
100 int new_wc_stride = new_c_stride * new_width;
101 int new_hwc_stride = new_wc_stride * new_height;
103 DnnOperand *output_operand = &operands[output_operand_index];
104 output_operand->
dims[0] = new_number;
105 output_operand->
dims[1] = new_height;
106 output_operand->
dims[2] = new_width;
107 output_operand->
dims[3] = new_channel;
111 if (!output_operand->
data)
113 output = output_operand->
data;
116 for (
int n = 0; n < number; n++) {
119 const float *
src = input + n * hwc_stride +
h * wc_stride +
w * c_stride;
120 float *dst = output + (n + params->
paddings[0][0]) * new_hwc_stride
121 + (
h + params->
paddings[1][0]) * new_wc_stride
122 + (
w + params->
paddings[2][0]) * new_c_stride
124 memcpy(dst, src, channel *
sizeof(
float));
130 before_paddings = params->
paddings[0][0];
131 after_paddings = params->
paddings[0][1];
132 for (
int n = 0; n < before_paddings; n++) {
133 float *dst = output + n * new_hwc_stride;
135 for (
int i = 0;
i < new_hwc_stride;
i++) {
141 float *
src = output + buddy * new_hwc_stride;
142 memcpy(dst, src, new_hwc_stride *
sizeof(
float));
145 for (
int n = 0; n < after_paddings; n++) {
146 int given = number + before_paddings + n;
147 float *dst = output + given * new_hwc_stride;
149 for (
int i = 0;
i < new_hwc_stride;
i++) {
154 float *
src = output + buddy * new_hwc_stride;
155 memcpy(dst, src, new_hwc_stride *
sizeof(
float));
160 before_paddings = params->
paddings[1][0];
161 after_paddings = params->
paddings[1][1];
162 for (
int n = 0; n < new_number; n++) {
163 float *start = output + n * new_hwc_stride;
164 for (
int h = 0;
h < before_paddings;
h++) {
165 float *dst = start +
h * new_wc_stride;
167 for (
int i = 0;
i < new_wc_stride;
i++) {
172 float *
src = start + buddy * new_wc_stride;
173 memcpy(dst, src, new_wc_stride *
sizeof(
float));
176 for (
int h = 0;
h < after_paddings;
h++) {
177 int given = height + before_paddings +
h;
178 float *dst = start + given * new_wc_stride;
180 for (
int i = 0;
i < new_wc_stride;
i++) {
185 float *
src = start + buddy * new_wc_stride;
186 memcpy(dst, src, new_wc_stride *
sizeof(
float));
192 before_paddings = params->
paddings[2][0];
193 after_paddings = params->
paddings[2][1];
194 for (
int n = 0; n < new_number; n++) {
195 for (
int h = 0;
h < new_height;
h++) {
196 float *start = output + n * new_hwc_stride +
h * new_wc_stride;
197 for (
int w = 0;
w < before_paddings;
w++) {
198 float *dst = start +
w * new_c_stride;
200 for (
int i = 0;
i < new_c_stride;
i++) {
205 float *
src = start + buddy * new_c_stride;
206 memcpy(dst, src, new_c_stride *
sizeof(
float));
209 for (
int w = 0;
w < after_paddings;
w++) {
210 int given = width + before_paddings +
w;
211 float *dst = start + given * new_c_stride;
213 for (
int i = 0;
i < new_c_stride;
i++) {
218 float *
src = start + buddy * new_c_stride;
219 memcpy(dst, src, new_c_stride *
sizeof(
float));
226 before_paddings = params->
paddings[3][0];
227 after_paddings = params->
paddings[3][1];
228 for (
int n = 0; n < new_number; n++) {
229 for (
int h = 0;
h < new_height;
h++) {
230 for (
int w = 0;
w < new_width;
w++) {
231 float *start = output + n * new_hwc_stride +
h * new_wc_stride +
w * new_c_stride;
232 for (
int c = 0;
c < before_paddings;
c++) {
233 float *dst = start +
c;
238 float *
src = start + buddy;
242 for (
int c = 0;
c < after_paddings;
c++) {
243 int given = channel + before_paddings +
c;
244 float *dst = start + given;
249 float *
src = start + buddy;
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
int32_t input_operand_indexes[4]
a layer can have multiple inputs and one output.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
DNNDataType data_type
support different kinds of data type such as float, half float, int8 etc, first support float now...
#define i(width, name, range_min, range_max)
unsigned int avio_rl32(AVIOContext *s)
void * data
data pointer with data length in bytes.
simple assert() macros that are a bit more flexible than ISO C assert().
int32_t dims[4]
there are two memory layouts, NHWC or NCHW, so we use dims, dims[0] is Number.
static const uint8_t offset[127][2]
static int after_get_buddy(int given, int border, LayerPadModeParam mode)
int dnn_execute_layer_pad(DnnOperand *operands, const int32_t *input_operand_indexes, int32_t output_operand_index, const void *parameters)
static int before_get_buddy(int given, int paddings, LayerPadModeParam mode)
layer pad (equivalent to tf.pad) for native backend.
int dnn_load_layer_pad(Layer *layer, AVIOContext *model_file_context, int file_size)
channel
Use these values when setting the channel map with ebur128_set_channel().
int32_t calculate_operand_data_length(const DnnOperand *oprd)
mode
Use these values in ebur128_init (or'ed).
int32_t output_operand_index