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.

165 lines
4.9KB

  1. /*
  2. * This file is part of FFmpeg.
  3. *
  4. * FFmpeg is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2.1 of the License, or (at your option) any later version.
  8. *
  9. * FFmpeg is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with FFmpeg; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. */
  18. /**
  19. * @file
  20. * misc image utilities
  21. */
  22. #include "imgutils.h"
  23. #include "libavutil/pixdesc.h"
  24. int av_fill_image_linesizes(int linesize[4], enum PixelFormat pix_fmt, int width)
  25. {
  26. int i;
  27. const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt];
  28. int max_step [4]; /* max pixel step for each plane */
  29. int max_step_comp[4]; /* the component for each plane which has the max pixel step */
  30. memset(linesize, 0, 4*sizeof(linesize[0]));
  31. if (desc->flags & PIX_FMT_HWACCEL)
  32. return -1;
  33. if (desc->flags & PIX_FMT_BITSTREAM) {
  34. linesize[0] = (width * (desc->comp[0].step_minus1+1) + 7) >> 3;
  35. return 0;
  36. }
  37. memset(max_step , 0, sizeof(max_step ));
  38. memset(max_step_comp, 0, sizeof(max_step_comp));
  39. for (i = 0; i < 4; i++) {
  40. const AVComponentDescriptor *comp = &(desc->comp[i]);
  41. if ((comp->step_minus1+1) > max_step[comp->plane]) {
  42. max_step [comp->plane] = comp->step_minus1+1;
  43. max_step_comp[comp->plane] = i;
  44. }
  45. }
  46. for (i = 0; i < 4; i++) {
  47. int s = (max_step_comp[i] == 1 || max_step_comp[i] == 2) ? desc->log2_chroma_w : 0;
  48. linesize[i] = max_step[i] * (((width + (1 << s) - 1)) >> s);
  49. }
  50. return 0;
  51. }
  52. int av_fill_image_pointers(uint8_t *data[4], enum PixelFormat pix_fmt, int height,
  53. uint8_t *ptr, const int linesize[4])
  54. {
  55. int size, h2, size2;
  56. const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt];
  57. size = linesize[0] * height;
  58. switch(pix_fmt) {
  59. case PIX_FMT_YUV420P:
  60. case PIX_FMT_YUV422P:
  61. case PIX_FMT_YUV444P:
  62. case PIX_FMT_YUV410P:
  63. case PIX_FMT_YUV411P:
  64. case PIX_FMT_YUV440P:
  65. case PIX_FMT_YUVJ420P:
  66. case PIX_FMT_YUVJ422P:
  67. case PIX_FMT_YUVJ444P:
  68. case PIX_FMT_YUVJ440P:
  69. case PIX_FMT_YUV420P16LE:
  70. case PIX_FMT_YUV422P16LE:
  71. case PIX_FMT_YUV444P16LE:
  72. case PIX_FMT_YUV420P16BE:
  73. case PIX_FMT_YUV422P16BE:
  74. case PIX_FMT_YUV444P16BE:
  75. h2 = (height + (1 << desc->log2_chroma_h) - 1) >> desc->log2_chroma_h;
  76. size2 = linesize[1] * h2;
  77. data[0] = ptr;
  78. data[1] = data[0] + size;
  79. data[2] = data[1] + size2;
  80. data[3] = NULL;
  81. return size + 2 * size2;
  82. case PIX_FMT_YUVA420P:
  83. h2 = (height + (1 << desc->log2_chroma_h) - 1) >> desc->log2_chroma_h;
  84. size2 = linesize[1] * h2;
  85. data[0] = ptr;
  86. data[1] = data[0] + size;
  87. data[2] = data[1] + size2;
  88. data[3] = data[1] + size2 + size2;
  89. return 2 * size + 2 * size2;
  90. case PIX_FMT_NV12:
  91. case PIX_FMT_NV21:
  92. h2 = (height + (1 << desc->log2_chroma_h) - 1) >> desc->log2_chroma_h;
  93. size2 = linesize[1] * h2;
  94. data[0] = ptr;
  95. data[1] = data[0] + size;
  96. data[2] = NULL;
  97. data[3] = NULL;
  98. return size + size2;
  99. case PIX_FMT_RGB24:
  100. case PIX_FMT_BGR24:
  101. case PIX_FMT_ARGB:
  102. case PIX_FMT_ABGR:
  103. case PIX_FMT_RGBA:
  104. case PIX_FMT_BGRA:
  105. case PIX_FMT_RGB48BE:
  106. case PIX_FMT_RGB48LE:
  107. case PIX_FMT_GRAY16BE:
  108. case PIX_FMT_GRAY16LE:
  109. case PIX_FMT_BGR444BE:
  110. case PIX_FMT_BGR444LE:
  111. case PIX_FMT_BGR555BE:
  112. case PIX_FMT_BGR555LE:
  113. case PIX_FMT_BGR565BE:
  114. case PIX_FMT_BGR565LE:
  115. case PIX_FMT_RGB444BE:
  116. case PIX_FMT_RGB444LE:
  117. case PIX_FMT_RGB555BE:
  118. case PIX_FMT_RGB555LE:
  119. case PIX_FMT_RGB565BE:
  120. case PIX_FMT_RGB565LE:
  121. case PIX_FMT_YUYV422:
  122. case PIX_FMT_UYVY422:
  123. case PIX_FMT_UYYVYY411:
  124. case PIX_FMT_RGB4:
  125. case PIX_FMT_BGR4:
  126. case PIX_FMT_MONOWHITE:
  127. case PIX_FMT_MONOBLACK:
  128. case PIX_FMT_Y400A:
  129. data[0] = ptr;
  130. data[1] = NULL;
  131. data[2] = NULL;
  132. data[3] = NULL;
  133. return size;
  134. case PIX_FMT_PAL8:
  135. case PIX_FMT_RGB8:
  136. case PIX_FMT_BGR8:
  137. case PIX_FMT_RGB4_BYTE:
  138. case PIX_FMT_BGR4_BYTE:
  139. case PIX_FMT_GRAY8:
  140. size2 = (size + 3) & ~3;
  141. data[0] = ptr;
  142. data[1] = ptr + size2; /* palette is stored here as 256 32 bit words */
  143. data[2] = NULL;
  144. data[3] = NULL;
  145. return size2 + 256 * 4;
  146. default:
  147. data[0] = NULL;
  148. data[1] = NULL;
  149. data[2] = NULL;
  150. data[3] = NULL;
  151. return -1;
  152. }
  153. }