closest-pixel-format.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #pragma once
  2. static const enum AVPixelFormat i420_formats[] = {
  3. AV_PIX_FMT_YUV420P,
  4. AV_PIX_FMT_NV12,
  5. AV_PIX_FMT_NV21,
  6. AV_PIX_FMT_YUYV422,
  7. AV_PIX_FMT_UYVY422,
  8. AV_PIX_FMT_YUV422P,
  9. AV_PIX_FMT_NONE
  10. };
  11. static const enum AVPixelFormat nv12_formats[] = {
  12. AV_PIX_FMT_NV12,
  13. AV_PIX_FMT_NV21,
  14. AV_PIX_FMT_YUV420P,
  15. AV_PIX_FMT_YUYV422,
  16. AV_PIX_FMT_UYVY422,
  17. AV_PIX_FMT_NONE
  18. };
  19. static const enum AVPixelFormat yuy2_formats[] = {
  20. AV_PIX_FMT_YUYV422,
  21. AV_PIX_FMT_UYVY422,
  22. AV_PIX_FMT_NV12,
  23. AV_PIX_FMT_NV21,
  24. AV_PIX_FMT_YUV420P,
  25. AV_PIX_FMT_NONE
  26. };
  27. static const enum AVPixelFormat uyvy_formats[] = {
  28. AV_PIX_FMT_UYVY422,
  29. AV_PIX_FMT_YUYV422,
  30. AV_PIX_FMT_NV12,
  31. AV_PIX_FMT_NV21,
  32. AV_PIX_FMT_YUV420P,
  33. AV_PIX_FMT_NONE
  34. };
  35. static const enum AVPixelFormat rgba_formats[] = {
  36. AV_PIX_FMT_RGBA,
  37. AV_PIX_FMT_BGRA,
  38. AV_PIX_FMT_YUYV422,
  39. AV_PIX_FMT_UYVY422,
  40. AV_PIX_FMT_NV12,
  41. AV_PIX_FMT_NV21,
  42. AV_PIX_FMT_NONE
  43. };
  44. static const enum AVPixelFormat bgra_formats[] = {
  45. AV_PIX_FMT_BGRA,
  46. AV_PIX_FMT_RGBA,
  47. AV_PIX_FMT_YUYV422,
  48. AV_PIX_FMT_UYVY422,
  49. AV_PIX_FMT_NV12,
  50. AV_PIX_FMT_NV21,
  51. AV_PIX_FMT_NONE
  52. };
  53. static enum AVPixelFormat get_best_format(
  54. const enum AVPixelFormat *best,
  55. const enum AVPixelFormat *formats)
  56. {
  57. while (*best != AV_PIX_FMT_NONE) {
  58. enum AVPixelFormat best_format = *best;
  59. const enum AVPixelFormat *cur_formats = formats;
  60. while (*cur_formats != AV_PIX_FMT_NONE) {
  61. enum AVPixelFormat avail_format = *cur_formats;
  62. if (best_format == avail_format)
  63. return best_format;
  64. cur_formats++;
  65. }
  66. best++;
  67. }
  68. return AV_PIX_FMT_NONE;
  69. }
  70. static inline enum AVPixelFormat get_closest_format(
  71. enum AVPixelFormat format,
  72. const enum AVPixelFormat *formats)
  73. {
  74. enum AVPixelFormat best_format = AV_PIX_FMT_NONE;
  75. if (!formats || formats[0] == AV_PIX_FMT_NONE)
  76. return format;
  77. switch ((int)format) {
  78. case AV_PIX_FMT_YUV420P:
  79. best_format = get_best_format(i420_formats, formats);
  80. break;
  81. case AV_PIX_FMT_NV12:
  82. best_format = get_best_format(nv12_formats, formats);
  83. break;
  84. case AV_PIX_FMT_YUYV422:
  85. best_format = get_best_format(yuy2_formats, formats);
  86. break;
  87. case AV_PIX_FMT_UYVY422:
  88. best_format = get_best_format(uyvy_formats, formats);
  89. break;
  90. case AV_PIX_FMT_RGBA:
  91. best_format = get_best_format(rgba_formats, formats);
  92. break;
  93. case AV_PIX_FMT_BGRA:
  94. best_format = get_best_format(bgra_formats, formats);
  95. break;
  96. }
  97. return (best_format == AV_PIX_FMT_NONE) ? formats[0] : best_format;
  98. }