Skip to content

Commit d6767ed

Browse files
authored
Merge pull request #3863 from fintermobilityas:issue-array-initialization-braces
cudacodec: Split 4D function pointer array into per-surface-format arrays for GCC 8 compatibility
2 parents 89529d7 + 57e0e44 commit d6767ed

File tree

1 file changed

+108
-23
lines changed

1 file changed

+108
-23
lines changed

modules/cudacodec/src/nvidia_surface_format_to_color_converter.cpp

+108-23
Original file line numberDiff line numberDiff line change
@@ -142,36 +142,101 @@ class NVSurfaceToColorConverterImpl : public NVSurfaceToColorConverter {
142142
const bool yuv420 = surfaceFormat == SurfaceFormat::SF_NV12 || surfaceFormat == SurfaceFormat::SF_P016;
143143
CV_Assert(yuv.cols() % 2 == 0);
144144

145-
typedef void (*func_t)(uint8_t* yuv, int yuvPitch, uint8_t* color, int colorPitch, int width, int height, bool videoFullRangeFlag, cudaStream_t stream);
146-
static const func_t funcs[4][5][2][2] =
145+
using func_t = void (*)(uint8_t* yuv, int yuvPitch, uint8_t* color, int colorPitch, int width, int height, bool videoFullRangeFlag, cudaStream_t stream);
146+
147+
static const func_t funcsNV12[5][2][2] =
148+
{
149+
{
150+
{ Nv12ToColor24<BGR24>, Nv12ToColorPlanar24<BGR24> },
151+
{ Nv12ToColor48<BGR48>, Nv12ToColorPlanar48<BGR48> }
152+
},
153+
{
154+
{ Nv12ToColor24<RGB24>, Nv12ToColorPlanar24<RGB24> },
155+
{ Nv12ToColor48<RGB48>, Nv12ToColorPlanar48<RGB48> }
156+
},
157+
{
158+
{ Nv12ToColor32<BGRA32>, Nv12ToColorPlanar32<BGRA32> },
159+
{ Nv12ToColor64<BGRA64>, Nv12ToColorPlanar64<BGRA64> }
160+
},
161+
{
162+
{ Nv12ToColor32<RGBA32>, Nv12ToColorPlanar32<RGBA32> },
163+
{ Nv12ToColor64<RGBA64>, Nv12ToColorPlanar64<RGBA64> }
164+
},
165+
{
166+
{ Y8ToGray8, Y8ToGray8 },
167+
{ Y8ToGray16, Y8ToGray16 }
168+
}
169+
};
170+
171+
static const func_t funcsP016[5][2][2] =
172+
{
173+
{
174+
{ P016ToColor24<BGR24>, P016ToColorPlanar24<BGR24> },
175+
{ P016ToColor48<BGR48>, P016ToColorPlanar48<BGR48> }
176+
},
177+
{
178+
{ P016ToColor24<RGB24>, P016ToColorPlanar24<RGB24> },
179+
{ P016ToColor48<RGB48>, P016ToColorPlanar48<RGB48> }
180+
},
181+
{
182+
{ P016ToColor32<BGRA32>, P016ToColorPlanar32<BGRA32> },
183+
{ P016ToColor64<BGRA64>, P016ToColorPlanar64<BGRA64> }
184+
},
185+
{
186+
{ P016ToColor32<RGBA32>, P016ToColorPlanar32<RGBA32> },
187+
{ P016ToColor64<RGBA64>, P016ToColorPlanar64<RGBA64> }
188+
},
189+
{
190+
{ Y16ToGray8, Y16ToGray8 },
191+
{ Y16ToGray16, Y16ToGray16 }
192+
}
193+
};
194+
195+
static const func_t funcsYUV444[5][2][2] =
147196
{
148197
{
149-
{{{Nv12ToColor24<BGR24>},{Nv12ToColorPlanar24<BGR24>}},{{Nv12ToColor48<BGR48>},{Nv12ToColorPlanar48<BGR48>}}},
150-
{{{Nv12ToColor24<RGB24>},{Nv12ToColorPlanar24<RGB24>}},{{Nv12ToColor48<RGB48>},{Nv12ToColorPlanar48<RGB48>}}},
151-
{{{Nv12ToColor32<BGRA32>},{Nv12ToColorPlanar32<BGRA32>}},{{Nv12ToColor64<BGRA64>},{Nv12ToColorPlanar64<BGRA64>}}},
152-
{{{Nv12ToColor32<RGBA32>},{Nv12ToColorPlanar32<RGBA32>}},{{Nv12ToColor64<RGBA64>},{Nv12ToColorPlanar64<RGBA64>}}},
153-
{{{Y8ToGray8},{Y8ToGray8}},{{Y8ToGray16},{Y8ToGray16}}}
198+
{ YUV444ToColor24<BGR24>, YUV444ToColorPlanar24<BGR24> },
199+
{ YUV444ToColor48<BGR48>, YUV444ToColorPlanar48<BGR48> }
200+
},
201+
{
202+
{ YUV444ToColor24<RGB24>, YUV444ToColorPlanar24<RGB24> },
203+
{ YUV444ToColor48<RGB48>, YUV444ToColorPlanar48<RGB48> }
154204
},
155205
{
156-
{{{P016ToColor24<BGR24>},{P016ToColorPlanar24<BGR24>}},{{P016ToColor48<BGR48>},{P016ToColorPlanar48<BGR48>}}},
157-
{{{P016ToColor24<RGB24>},{P016ToColorPlanar24<RGB24>}},{{P016ToColor48<RGB48>},{P016ToColorPlanar48<RGB48>}}},
158-
{{{P016ToColor32<BGRA32>},{P016ToColorPlanar32<BGRA32>}},{{P016ToColor64<BGRA64>},{P016ToColorPlanar64<BGRA64>}}},
159-
{{{P016ToColor32<RGBA32>},{P016ToColorPlanar32<RGBA32>}},{{P016ToColor64<RGBA64>},{P016ToColorPlanar64<RGBA64>}}},
160-
{{{Y16ToGray8},{Y16ToGray8}},{{Y16ToGray16},{Y16ToGray16}}}
206+
{ YUV444ToColor32<BGRA32>, YUV444ToColorPlanar32<BGRA32> },
207+
{ YUV444ToColor64<BGRA64>, YUV444ToColorPlanar64<BGRA64> }
161208
},
162209
{
163-
{{{YUV444ToColor24<BGR24>},{YUV444ToColorPlanar24<BGR24>}},{{YUV444ToColor48<BGR48>},{YUV444ToColorPlanar48<BGR48>}}},
164-
{{{YUV444ToColor24<RGB24>},{YUV444ToColorPlanar24<RGB24>}},{{YUV444ToColor48<RGB48>},{YUV444ToColorPlanar48<RGB48>}}},
165-
{{{YUV444ToColor32<BGRA32>},{YUV444ToColorPlanar32<BGRA32>}},{{YUV444ToColor64<BGRA64>},{YUV444ToColorPlanar64<BGRA64>}}},
166-
{{{YUV444ToColor32<RGBA32>},{YUV444ToColorPlanar32<RGBA32>}},{{YUV444ToColor64<RGBA64>},{YUV444ToColorPlanar64<RGBA64>}}},
167-
{{{Y8ToGray8},{Y8ToGray8}},{{Y8ToGray16},{Y8ToGray16}}}
210+
{ YUV444ToColor32<RGBA32>, YUV444ToColorPlanar32<RGBA32> },
211+
{ YUV444ToColor64<RGBA64>, YUV444ToColorPlanar64<RGBA64> }
168212
},
169213
{
170-
{{{YUV444P16ToColor24<BGR24>},{YUV444P16ToColorPlanar24<BGR24>}},{{YUV444P16ToColor48<BGR48>},{YUV444P16ToColorPlanar48<BGR48>}}},
171-
{{{YUV444P16ToColor24<RGB24>},{YUV444P16ToColorPlanar24<RGB24>}},{{YUV444P16ToColor48<RGB48>},{YUV444P16ToColorPlanar48<RGB48>}}},
172-
{{{YUV444P16ToColor32<BGRA32>},{YUV444P16ToColorPlanar32<BGRA32>}},{{YUV444P16ToColor64<BGRA64>},{YUV444P16ToColorPlanar64<BGRA64>}}},
173-
{{{YUV444P16ToColor32<RGBA32>},{YUV444P16ToColorPlanar32<RGBA32>}},{{YUV444P16ToColor64<RGBA64>},{YUV444P16ToColorPlanar64<RGBA64>}}},
174-
{{{Y16ToGray8},{Y16ToGray8}},{{Y16ToGray16},{Y16ToGray16}}}
214+
{ Y8ToGray8, Y8ToGray8 },
215+
{ Y8ToGray16, Y8ToGray16 }
216+
}
217+
};
218+
219+
static const func_t funcsYUV444P16[5][2][2] =
220+
{
221+
{
222+
{ YUV444P16ToColor24<BGR24>, YUV444P16ToColorPlanar24<BGR24> },
223+
{ YUV444P16ToColor48<BGR48>, YUV444P16ToColorPlanar48<BGR48> }
224+
},
225+
{
226+
{ YUV444P16ToColor24<RGB24>, YUV444P16ToColorPlanar24<RGB24> },
227+
{ YUV444P16ToColor48<RGB48>, YUV444P16ToColorPlanar48<RGB48> }
228+
},
229+
{
230+
{ YUV444P16ToColor32<BGRA32>, YUV444P16ToColorPlanar32<BGRA32> },
231+
{ YUV444P16ToColor64<BGRA64>, YUV444P16ToColorPlanar64<BGRA64> }
232+
},
233+
{
234+
{ YUV444P16ToColor32<RGBA32>, YUV444P16ToColorPlanar32<RGBA32> },
235+
{ YUV444P16ToColor64<RGBA64>, YUV444P16ToColorPlanar64<RGBA64> }
236+
},
237+
{
238+
{ Y16ToGray8, Y16ToGray8 },
239+
{ Y16ToGray16, Y16ToGray16 }
175240
}
176241
};
177242

@@ -183,11 +248,31 @@ class NVSurfaceToColorConverterImpl : public NVSurfaceToColorConverter {
183248
const int nChannels = NumChannels(outputFormat);
184249
const int nRowsOut = nRows * (planar ? nChannels : 1);
185250
const BitDepth bitDepth_ = GetBitDepthOut(bitDepth, yuv.depth());
251+
const int iBitDepth = bitDepth_ == BitDepth::EIGHT ? 0 : 1;
186252
const int typeOut = CV_MAKE_TYPE(bitDepth_ == BitDepth::EIGHT ? CV_8U : CV_16U, planar ? 1 : nChannels);
187253
GpuMat out_ = getOutputMat(out, nRowsOut, yuv.cols(), typeOut, stream);
188254

255+
const int iSurfaceFormat = static_cast<int>(surfaceFormat);
256+
const int iPlanar = planar ? 1 : 0;
189257
const int iOutputFormat = OutputColorFormatIdx(outputFormat);
190-
const func_t func = funcs[static_cast<int>(surfaceFormat)][iOutputFormat][static_cast<int>(bitDepth_)][planar];
258+
func_t func = nullptr;
259+
260+
switch (iSurfaceFormat)
261+
{
262+
case 0:
263+
func = funcsNV12[iOutputFormat][iBitDepth][iPlanar];
264+
break;
265+
case 1:
266+
func = funcsP016[iOutputFormat][iBitDepth][iPlanar];
267+
break;
268+
case 2:
269+
func = funcsYUV444[iOutputFormat][iBitDepth][iPlanar];
270+
break;
271+
case 3:
272+
func = funcsYUV444P16[iOutputFormat][iBitDepth][iPlanar];
273+
break;
274+
}
275+
191276
if (!func)
192277
CV_Error(Error::StsUnsupportedFormat, "Unsupported combination of source and destination types");
193278

0 commit comments

Comments
 (0)