closest-pixel-format.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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_YUV444P,
  10. AV_PIX_FMT_NONE
  11. };
  12. static const enum AVPixelFormat nv12_formats[] = {
  13. AV_PIX_FMT_NV12,
  14. AV_PIX_FMT_NV21,
  15. AV_PIX_FMT_YUV420P,
  16. AV_PIX_FMT_YUYV422,
  17. AV_PIX_FMT_UYVY422,
  18. AV_PIX_FMT_YUV444P,
  19. AV_PIX_FMT_NONE
  20. };
  21. static const enum AVPixelFormat i444_formats[] = {
  22. AV_PIX_FMT_YUV444P,
  23. AV_PIX_FMT_RGBA,
  24. AV_PIX_FMT_BGRA,
  25. AV_PIX_FMT_YUYV422,
  26. AV_PIX_FMT_UYVY422,
  27. AV_PIX_FMT_NV12,
  28. AV_PIX_FMT_NV21,
  29. AV_PIX_FMT_NONE
  30. };
  31. static const enum AVPixelFormat yuy2_formats[] = {
  32. AV_PIX_FMT_YUYV422,
  33. AV_PIX_FMT_UYVY422,
  34. AV_PIX_FMT_NV12,
  35. AV_PIX_FMT_NV21,
  36. AV_PIX_FMT_YUV420P,
  37. AV_PIX_FMT_YUV444P,
  38. AV_PIX_FMT_NONE
  39. };
  40. static const enum AVPixelFormat uyvy_formats[] = {
  41. AV_PIX_FMT_UYVY422,
  42. AV_PIX_FMT_YUYV422,
  43. AV_PIX_FMT_NV12,
  44. AV_PIX_FMT_NV21,
  45. AV_PIX_FMT_YUV420P,
  46. AV_PIX_FMT_YUV444P,
  47. AV_PIX_FMT_NONE
  48. };
  49. static const enum AVPixelFormat rgba_formats[] = {
  50. AV_PIX_FMT_RGBA,
  51. AV_PIX_FMT_BGRA,
  52. AV_PIX_FMT_YUV444P,
  53. AV_PIX_FMT_YUYV422,
  54. AV_PIX_FMT_UYVY422,
  55. AV_PIX_FMT_NV12,
  56. AV_PIX_FMT_NV21,
  57. AV_PIX_FMT_NONE
  58. };
  59. static const enum AVPixelFormat bgra_formats[] = {
  60. AV_PIX_FMT_BGRA,
  61. AV_PIX_FMT_RGBA,
  62. AV_PIX_FMT_YUV444P,
  63. AV_PIX_FMT_YUYV422,
  64. AV_PIX_FMT_UYVY422,
  65. AV_PIX_FMT_NV12,
  66. AV_PIX_FMT_NV21,
  67. AV_PIX_FMT_NONE
  68. };
  69. static enum AVPixelFormat get_best_format(
  70. const enum AVPixelFormat *best,
  71. const enum AVPixelFormat *formats)
  72. {
  73. while (*best != AV_PIX_FMT_NONE) {
  74. enum AVPixelFormat best_format = *best;
  75. const enum AVPixelFormat *cur_formats = formats;
  76. while (*cur_formats != AV_PIX_FMT_NONE) {
  77. enum AVPixelFormat avail_format = *cur_formats;
  78. if (best_format == avail_format)
  79. return best_format;
  80. cur_formats++;
  81. }
  82. best++;
  83. }
  84. return AV_PIX_FMT_NONE;
  85. }
  86. static inline enum AVPixelFormat get_closest_format(
  87. enum AVPixelFormat format,
  88. const enum AVPixelFormat *formats)
  89. {
  90. enum AVPixelFormat best_format = AV_PIX_FMT_NONE;
  91. if (!formats || formats[0] == AV_PIX_FMT_NONE)
  92. return format;
  93. switch ((int)format) {
  94. case AV_PIX_FMT_YUV444P:
  95. best_format = get_best_format(i444_formats, formats);
  96. break;
  97. case AV_PIX_FMT_YUV420P:
  98. best_format = get_best_format(i420_formats, formats);
  99. break;
  100. case AV_PIX_FMT_NV12:
  101. best_format = get_best_format(nv12_formats, formats);
  102. break;
  103. case AV_PIX_FMT_YUYV422:
  104. best_format = get_best_format(yuy2_formats, formats);
  105. break;
  106. case AV_PIX_FMT_UYVY422:
  107. best_format = get_best_format(uyvy_formats, formats);
  108. break;
  109. case AV_PIX_FMT_RGBA:
  110. best_format = get_best_format(rgba_formats, formats);
  111. break;
  112. case AV_PIX_FMT_BGRA:
  113. best_format = get_best_format(bgra_formats, formats);
  114. break;
  115. }
  116. return (best_format == AV_PIX_FMT_NONE) ? formats[0] : best_format;
  117. }