You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
5.0KB

  1. /*
  2. * Copyright (c) 2013 Guillaume Martres <smarter@ubuntu.com>
  3. *
  4. * This file is part of FFmpeg.
  5. *
  6. * FFmpeg is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * FFmpeg is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with FFmpeg; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include <vpx/vpx_codec.h>
  21. #include "libvpx.h"
  22. #include "config.h"
  23. #if CONFIG_LIBVPX_VP9_ENCODER
  24. #include <vpx/vpx_encoder.h>
  25. #include <vpx/vp8cx.h>
  26. #endif
  27. static const enum AVPixelFormat vp9_pix_fmts_def[] = {
  28. AV_PIX_FMT_YUV420P,
  29. AV_PIX_FMT_NONE
  30. };
  31. #if CONFIG_LIBVPX_VP9_ENCODER
  32. static const enum AVPixelFormat vp9_pix_fmts_highcol[] = {
  33. AV_PIX_FMT_YUV420P,
  34. AV_PIX_FMT_YUV422P,
  35. AV_PIX_FMT_YUV440P,
  36. AV_PIX_FMT_YUV444P,
  37. AV_PIX_FMT_NONE
  38. };
  39. static const enum AVPixelFormat vp9_pix_fmts_highbd[] = {
  40. AV_PIX_FMT_YUV420P,
  41. AV_PIX_FMT_YUV422P,
  42. AV_PIX_FMT_YUV440P,
  43. AV_PIX_FMT_YUV444P,
  44. AV_PIX_FMT_YUV420P10LE,
  45. AV_PIX_FMT_YUV422P10LE,
  46. AV_PIX_FMT_YUV440P10LE,
  47. AV_PIX_FMT_YUV444P10LE,
  48. AV_PIX_FMT_YUV420P12LE,
  49. AV_PIX_FMT_YUV422P12LE,
  50. AV_PIX_FMT_YUV440P12LE,
  51. AV_PIX_FMT_YUV444P12LE,
  52. AV_PIX_FMT_NONE
  53. };
  54. #endif
  55. av_cold void ff_vp9_init_static(AVCodec *codec)
  56. {
  57. if ( vpx_codec_version_major() < 1
  58. || (vpx_codec_version_major() == 1 && vpx_codec_version_minor() < 3))
  59. codec->capabilities |= CODEC_CAP_EXPERIMENTAL;
  60. codec->pix_fmts = vp9_pix_fmts_def;
  61. #if CONFIG_LIBVPX_VP9_ENCODER
  62. if ( vpx_codec_version_major() > 1
  63. || (vpx_codec_version_major() == 1 && vpx_codec_version_minor() >= 4)) {
  64. #ifdef VPX_CODEC_CAP_HIGHBITDEPTH
  65. vpx_codec_caps_t codec_caps = vpx_codec_get_caps(vpx_codec_vp9_cx());
  66. if (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH)
  67. codec->pix_fmts = vp9_pix_fmts_highbd;
  68. else
  69. #endif
  70. codec->pix_fmts = vp9_pix_fmts_highcol;
  71. }
  72. #endif
  73. }
  74. #if 0
  75. enum AVPixelFormat ff_vpx_imgfmt_to_pixfmt(vpx_img_fmt_t img)
  76. {
  77. switch (img) {
  78. case VPX_IMG_FMT_RGB24: return AV_PIX_FMT_RGB24;
  79. case VPX_IMG_FMT_RGB565: return AV_PIX_FMT_RGB565BE;
  80. case VPX_IMG_FMT_RGB555: return AV_PIX_FMT_RGB555BE;
  81. case VPX_IMG_FMT_UYVY: return AV_PIX_FMT_UYVY422;
  82. case VPX_IMG_FMT_YUY2: return AV_PIX_FMT_YUYV422;
  83. case VPX_IMG_FMT_YVYU: return AV_PIX_FMT_YVYU422;
  84. case VPX_IMG_FMT_BGR24: return AV_PIX_FMT_BGR24;
  85. case VPX_IMG_FMT_ARGB: return AV_PIX_FMT_ARGB;
  86. case VPX_IMG_FMT_ARGB_LE: return AV_PIX_FMT_BGRA;
  87. case VPX_IMG_FMT_RGB565_LE: return AV_PIX_FMT_RGB565LE;
  88. case VPX_IMG_FMT_RGB555_LE: return AV_PIX_FMT_RGB555LE;
  89. case VPX_IMG_FMT_I420: return AV_PIX_FMT_YUV420P;
  90. case VPX_IMG_FMT_I422: return AV_PIX_FMT_YUV422P;
  91. case VPX_IMG_FMT_I444: return AV_PIX_FMT_YUV444P;
  92. case VPX_IMG_FMT_444A: return AV_PIX_FMT_YUVA444P;
  93. #ifdef VPX_IMAGE_ABI_VERSION >= 3
  94. case VPX_IMG_FMT_I440: return AV_PIX_FMT_YUV440P;
  95. case VPX_IMG_FMT_I42016: return AV_PIX_FMT_YUV420P16BE;
  96. case VPX_IMG_FMT_I42216: return AV_PIX_FMT_YUV422P16BE;
  97. case VPX_IMG_FMT_I44416: return AV_PIX_FMT_YUV444P16BE;
  98. #endif
  99. default: return AV_PIX_FMT_NONE;
  100. }
  101. }
  102. vpx_img_fmt_t ff_vpx_pixfmt_to_imgfmt(enum AVPixelFormat pix)
  103. {
  104. switch (pix) {
  105. case AV_PIX_FMT_RGB24: return VPX_IMG_FMT_RGB24;
  106. case AV_PIX_FMT_RGB565BE: return VPX_IMG_FMT_RGB565;
  107. case AV_PIX_FMT_RGB555BE: return VPX_IMG_FMT_RGB555;
  108. case AV_PIX_FMT_UYVY422: return VPX_IMG_FMT_UYVY;
  109. case AV_PIX_FMT_YUYV422: return VPX_IMG_FMT_YUY2;
  110. case AV_PIX_FMT_YVYU422: return VPX_IMG_FMT_YVYU;
  111. case AV_PIX_FMT_BGR24: return VPX_IMG_FMT_BGR24;
  112. case AV_PIX_FMT_ARGB: return VPX_IMG_FMT_ARGB;
  113. case AV_PIX_FMT_BGRA: return VPX_IMG_FMT_ARGB_LE;
  114. case AV_PIX_FMT_RGB565LE: return VPX_IMG_FMT_RGB565_LE;
  115. case AV_PIX_FMT_RGB555LE: return VPX_IMG_FMT_RGB555_LE;
  116. case AV_PIX_FMT_YUV420P: return VPX_IMG_FMT_I420;
  117. case AV_PIX_FMT_YUV422P: return VPX_IMG_FMT_I422;
  118. case AV_PIX_FMT_YUV444P: return VPX_IMG_FMT_I444;
  119. case AV_PIX_FMT_YUVA444P: return VPX_IMG_FMT_444A;
  120. #ifdef VPX_IMAGE_ABI_VERSION >= 3
  121. case AV_PIX_FMT_YUV440P: return VPX_IMG_FMT_I440;
  122. case AV_PIX_FMT_YUV420P16BE: return VPX_IMG_FMT_I42016;
  123. case AV_PIX_FMT_YUV422P16BE: return VPX_IMG_FMT_I42216;
  124. case AV_PIX_FMT_YUV444P16BE: return VPX_IMG_FMT_I44416;
  125. #endif
  126. default: return VPX_IMG_FMT_NONE;
  127. }
  128. }
  129. #endif