@@ -36,7 +36,7 @@ extern "C" {
3636#pragma warning(pop)
3737
3838SW_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