Skip to content

Commit 4cbfa35

Browse files
committed
MPCVideoDec: Доработка SetConvertFunc.
1 parent 801bd5e commit 4cbfa35

1 file changed

Lines changed: 113 additions & 92 deletions

File tree

src/filters/transform/MPCVideoDec/FormatConverter.cpp

Lines changed: 113 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ extern "C" {
3636
#pragma warning(pop)
3737

3838
SW_OUT_FMT s_sw_formats[] = {
39-
//name biCompression subtype av_pix_fmt chroma_w chroma_h actual_bpp luma_bits
39+
//name biCompression subtype bpp av_pix_fmt chroma_w chroma_h actual_bpp luma_bits
4040
// YUV 8 bit
4141
{L"NV12", FCC('NV12'), &MEDIASUBTYPE_NV12, 12, 1, 2, {1,2}, {1,1}, AV_PIX_FMT_NV12, 1, 1, 12, 8}, // PixFmt_NV12
4242
{L"YV12", FCC('YV12'), &MEDIASUBTYPE_YV12, 12, 1, 3, {1,2,2}, {1,2,2}, AV_PIX_FMT_YUV420P, 1, 1, 12, 8}, // PixFmt_YV12
@@ -280,104 +280,125 @@ void CFormatConverter::SetConvertFunc()
280280
m_RequiredAlignment = 16;
281281

282282
switch (m_out_pixfmt) {
283-
case PixFmt_AYUV:
284-
if (m_FProps.pftype == PFType_YUV444Px) {
285-
m_pConvertFn = &CFormatConverter::convert_yuv444_ayuv_dither_le;
286-
}
287-
break;
288-
case PixFmt_P010:
289-
case PixFmt_P016:
290-
if (m_FProps.pftype == PFType_YUV420Px) {
291-
m_pConvertFn = &CFormatConverter::convert_yuv420_px1x_le;
292-
}
293-
break;
294-
case PixFmt_Y410:
295-
if (m_FProps.pftype == PFType_YUV444Px && m_FProps.lumabits <= 10) {
296-
m_pConvertFn = &CFormatConverter::convert_yuv444_y410;
297-
}
298-
break;
299-
case PixFmt_P210:
300-
case PixFmt_P216:
301-
if (m_FProps.pftype == PFType_YUV422Px) {
302-
m_pConvertFn = &CFormatConverter::convert_yuv420_px1x_le;
303-
}
304-
break;
305-
case PixFmt_YUY2:
306-
if (m_FProps.pftype == PFType_YUV422Px) {
307-
m_pConvertFn = &CFormatConverter::convert_yuv422_yuy2_uyvy_dither_le;
308-
m_RequiredAlignment = 8;
309-
}
310-
else if (m_FProps.pftype == PFType_YUV420
311-
|| (m_FProps.pftype == PFType_YUV420Px && m_FProps.lumabits <= 14)
312-
|| m_FProps.pftype == PFType_NV12) {
313-
m_pConvertFn = &CFormatConverter::convert_yuv420_yuy2;
314-
m_RequiredAlignment = 8;
315-
}
283+
case PixFmt_NV12:
284+
if (m_FProps.pftype == PFType_NV12) {
285+
m_pConvertFn = &CFormatConverter::plane_copy_sse2;
316286
break;
317-
case PixFmt_NV12:
318-
if (m_FProps.pftype == PFType_NV12) {
319-
m_pConvertFn = &CFormatConverter::plane_copy_sse2;
320-
break;
321-
}
322-
else if (m_FProps.pftype == PFType_YUV420) {
323-
m_pConvertFn = &CFormatConverter::convert_yuv420_nv12;
324-
m_RequiredAlignment = 32;
325-
}
326-
else if (m_FProps.pftype == PFType_P01x) {
327-
m_pConvertFn = &CFormatConverter::convert_p010_nv12_sse2;
328-
}
329-
case PixFmt_YV12:
330-
if (m_FProps.pftype == PFType_YUV420Px) {
331-
m_pConvertFn = &CFormatConverter::convert_yuv_yv_nv12_dither_le;
332-
m_RequiredAlignment = 32;
333-
}
334-
else if (m_FProps.pftype == PFType_NV12) {
335-
m_pConvertFn = &CFormatConverter::convert_nv12_yv12;
336-
m_RequiredAlignment = 32;
337-
}
287+
}
288+
else if (m_FProps.pftype == PFType_YUV420) {
289+
m_pConvertFn = &CFormatConverter::convert_yuv420_nv12;
290+
m_RequiredAlignment = 32;
291+
}
292+
else if (m_FProps.pftype == PFType_P01x) {
293+
m_pConvertFn = &CFormatConverter::convert_p010_nv12_sse2;
294+
}
295+
case PixFmt_YV12:
296+
if (m_FProps.pftype == PFType_YUV420Px) {
297+
m_pConvertFn = &CFormatConverter::convert_yuv_yv_nv12_dither_le;
298+
m_RequiredAlignment = 32;
299+
}
300+
else if (m_FProps.pftype == PFType_NV12) {
301+
m_pConvertFn = &CFormatConverter::convert_nv12_yv12;
302+
m_RequiredAlignment = 32;
303+
}
338304
#if (0) // disabled because not increase performance
339-
else if (m_FProps.pftype == PFType_YUV420) {
340-
pConvertFn = &CFormatConverter::convert_yuv_yv;
341-
}
305+
else if (m_FProps.pftype == PFType_YUV420) {
306+
pConvertFn = &CFormatConverter::convert_yuv_yv;
307+
}
342308
#endif
343-
break;
344-
case PixFmt_YV16:
345-
if (m_FProps.pftype == PFType_YUV422Px) {
346-
m_pConvertFn = &CFormatConverter::convert_yuv_yv_nv12_dither_le;
347-
m_RequiredAlignment = 32;
348-
}
309+
break;
310+
case PixFmt_YUY2:
311+
if (m_FProps.avpixfmt == AV_PIX_FMT_YUYV422) {
312+
m_pConvertFn = &CFormatConverter::plane_copy_sse2;
313+
}
314+
else if (m_FProps.pftype == PFType_YUV422Px) {
315+
m_pConvertFn = &CFormatConverter::convert_yuv422_yuy2_uyvy_dither_le;
316+
m_RequiredAlignment = 8;
317+
}
318+
else if (m_FProps.pftype == PFType_YUV420
319+
|| (m_FProps.pftype == PFType_YUV420Px && m_FProps.lumabits <= 14)
320+
|| m_FProps.pftype == PFType_NV12) {
321+
m_pConvertFn = &CFormatConverter::convert_yuv420_yuy2;
322+
m_RequiredAlignment = 8;
323+
}
324+
break;
325+
case PixFmt_YV16:
326+
if (m_FProps.pftype == PFType_YUV422Px) {
327+
m_pConvertFn = &CFormatConverter::convert_yuv_yv_nv12_dither_le;
328+
m_RequiredAlignment = 32;
329+
}
349330
#if (0) // disabled because not increase performance
350-
else if (m_FProps.pftype == PFType_YUV422) {
351-
pConvertFn = &CFormatConverter::convert_yuv_yv;
352-
}
331+
else if (m_FProps.pftype == PFType_YUV422) {
332+
pConvertFn = &CFormatConverter::convert_yuv_yv;
333+
}
353334
#endif
354-
break;
355-
case PixFmt_YV24:
356-
if (m_FProps.pftype == PFType_YUV444Px) {
357-
m_pConvertFn = &CFormatConverter::convert_yuv_yv_nv12_dither_le;
358-
m_RequiredAlignment = 32;
359-
}
360-
else if (m_FProps.pftype == PFType_YUV444) {
361-
m_pConvertFn = &CFormatConverter::convert_yuv_yv;
362-
m_RequiredAlignment = 0;
363-
}
364-
break;
365-
case PixFmt_RGB32:
366-
switch (m_FProps.pftype) {
367-
case PFType_YUV420:
368-
case PFType_YUV420Px:
369-
case PFType_YUV422:
370-
case PFType_YUV422Px:
371-
case PFType_YUV444:
372-
case PFType_YUV444Px:
373-
case PFType_NV12:
374-
case PFType_P01x:
375-
m_pConvertFn = &CFormatConverter::convert_yuv_rgb;
376-
m_RequiredAlignment = 4;
377-
}
378-
break;
335+
break;
336+
case PixFmt_AYUV:
337+
if (m_FProps.avpixfmt == AV_PIX_FMT_VUYX) {
338+
m_pConvertFn = &CFormatConverter::plane_copy_sse2;
339+
}
340+
else if (m_FProps.pftype == PFType_YUV444Px) {
341+
m_pConvertFn = &CFormatConverter::convert_yuv444_ayuv_dither_le;
342+
}
343+
break;
344+
case PixFmt_YV24:
345+
if (m_FProps.pftype == PFType_YUV444Px) {
346+
m_pConvertFn = &CFormatConverter::convert_yuv_yv_nv12_dither_le;
347+
m_RequiredAlignment = 32;
348+
}
349+
else if (m_FProps.pftype == PFType_YUV444) {
350+
m_pConvertFn = &CFormatConverter::convert_yuv_yv;
351+
m_RequiredAlignment = 0;
352+
}
353+
break;
354+
case PixFmt_P010:
355+
case PixFmt_P016:
356+
if (m_FProps.pftype == PFType_P01x) {
357+
m_pConvertFn = &CFormatConverter::plane_copy_sse2;
358+
}
359+
else if (m_FProps.pftype == PFType_YUV420Px) {
360+
m_pConvertFn = &CFormatConverter::convert_yuv420_px1x_le;
361+
}
362+
break;
363+
case PixFmt_P210:
364+
case PixFmt_P216:
365+
if (m_FProps.pftype == PFType_Y21x && CPUInfo::HaveSSE4()) {
366+
m_pConvertFn = &CFormatConverter::convert_y210_p210_sse4;
367+
}
368+
else if (m_FProps.pftype == PFType_YUV422Px) {
369+
m_pConvertFn = &CFormatConverter::convert_yuv420_px1x_le;
370+
}
371+
break;
372+
case PixFmt_Y410:
373+
if (m_FProps.avpixfmt == AV_PIX_FMT_XV30) {
374+
m_pConvertFn = &CFormatConverter::plane_copy_sse2;
375+
}
376+
else if (m_FProps.pftype == PFType_YUV444Px && m_FProps.lumabits <= 10) {
377+
m_pConvertFn = &CFormatConverter::convert_yuv444_y410;
378+
}
379+
break;
380+
case PixFmt_Y416:
381+
if (m_FProps.avpixfmt == AV_PIX_FMT_XV36) {
382+
m_pConvertFn = &CFormatConverter::plane_copy_sse2;
383+
}
384+
break;
385+
case PixFmt_RGB32:
386+
switch (m_FProps.pftype) {
387+
case PFType_YUV420:
388+
case PFType_YUV420Px:
389+
case PFType_YUV422:
390+
case PFType_YUV422Px:
391+
case PFType_YUV444:
392+
case PFType_YUV444Px:
393+
case PFType_NV12:
394+
case PFType_P01x:
395+
m_pConvertFn = &CFormatConverter::convert_yuv_rgb;
396+
m_RequiredAlignment = 4;
397+
}
398+
break;
379399
}
380400

401+
// direct copy/convert
381402
if (CPUInfo::HaveSSE4()) {
382403
if (m_FProps.pftype == PFType_NV12) {
383404
if (m_out_pixfmt == PixFmt_NV12) {

0 commit comments

Comments
 (0)