imgconvert.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:68k
源码类别:

Audio

开发平台:

Visual C++

  1. /*  * Misc image convertion routines  * Copyright (c) 2001, 2002, 2003 Fabrice Bellard.  *  * This library is free software; you can redistribute it and/or  * modify it under the terms of the GNU Lesser General Public  * License as published by the Free Software Foundation; either  * version 2 of the License, or (at your option) any later version.  *  * This library is distributed in the hope that it will be useful,  * but WITHOUT ANY WARRANTY; without even the implied warranty of  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  * Lesser General Public License for more details.  *  * You should have received a copy of the GNU Lesser General Public  * License along with this library; if not, write to the Free Software  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  */ /**  * @file imgconvert.c  * Misc image convertion routines.  */ /* TODO:  * - write 'ffimg' program to test all the image related stuff  * - move all api to slice based system  * - integrate deinterlacing, postprocessing and scaling in the conversion process  */ #include "avcodec.h" #include "dsputil.h" #ifdef USE_FASTMEMCPY #include "fastmemcpy.h" #endif #ifdef HAVE_MMX //#include "i386/mmx.h" //Del by ty
  2. #endif #define xglue(x, y) x ## y #define glue(x, y) xglue(x, y) #define FF_COLOR_RGB      0 /* RGB color space */ #define FF_COLOR_GRAY     1 /* gray color space */ #define FF_COLOR_YUV      2 /* YUV color space. 16 <= Y <= 235, 16 <= U, V <= 240 */ #define FF_COLOR_YUV_JPEG 3 /* YUV color space. 0 <= Y <= 255, 0 <= U, V <= 255 */ #define FF_PIXEL_PLANAR   0 /* each channel has one component in AVPicture */ #define FF_PIXEL_PACKED   1 /* only one components containing all the channels */ #define FF_PIXEL_PALETTE  2  /* one components containing indexes for a palette */ typedef struct PixFmtInfo {     const char *name;     uint8_t nb_channels;     /* number of channels (including alpha) */     uint8_t color_type;      /* color type (see FF_COLOR_xxx constants) */     uint8_t pixel_type;      /* pixel storage type (see FF_PIXEL_xxx constants) */     uint8_t is_alpha : 1;    /* true if alpha can be specified */     uint8_t x_chroma_shift;  /* X chroma subsampling factor is 2 ^ shift */     uint8_t y_chroma_shift;  /* Y chroma subsampling factor is 2 ^ shift */     uint8_t depth;           /* bit depth of the color components */ } PixFmtInfo; //CS by ty
  3. /* this table gives more information about formats */ static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = {     /* YUV formats */
  4. {
  5.         "yuv420p",         3,         FF_COLOR_YUV,         FF_PIXEL_PLANAR,         8,         1,
  6. 1,      }, //    PIX_FMT_YUV420P = 
  7. // {
  8. //        .name = "yuv420p",
  9. //        .nb_channels = 3,
  10. //        .color_type = FF_COLOR_YUV,
  11. //        .pixel_type = FF_PIXEL_PLANAR,
  12. //        .depth = 8,
  13. //        .x_chroma_shift = 1, .y_chroma_shift = 1, 
  14. //    },
  15. //    [PIX_FMT_YUV422P] = {
  16. //        .name = "yuv422p",
  17. //        .nb_channels = 3,
  18. //        .color_type = FF_COLOR_YUV,
  19. //        .pixel_type = FF_PIXEL_PLANAR,
  20. //        .depth = 8,
  21. //        .x_chroma_shift = 1, .y_chroma_shift = 0, 
  22. //    },
  23. //    [PIX_FMT_YUV444P] = {
  24. //        .name = "yuv444p",
  25. //        .nb_channels = 3,
  26. //        .color_type = FF_COLOR_YUV,
  27. //        .pixel_type = FF_PIXEL_PLANAR,
  28. //        .depth = 8,
  29. //        .x_chroma_shift = 0, .y_chroma_shift = 0, 
  30. //    },
  31. //    [PIX_FMT_YUV422] = {
  32. //        .name = "yuv422",
  33. //        .nb_channels = 1,
  34. //        .color_type = FF_COLOR_YUV,
  35. //        .pixel_type = FF_PIXEL_PACKED,
  36. //        .depth = 8,
  37. //        .x_chroma_shift = 1, .y_chroma_shift = 0,
  38. //    },
  39. //    [PIX_FMT_YUV410P] = {
  40. //        .name = "yuv410p",
  41. //        .nb_channels = 3,
  42. //        .color_type = FF_COLOR_YUV,
  43. //        .pixel_type = FF_PIXEL_PLANAR,
  44. //        .depth = 8,
  45. //        .x_chroma_shift = 2, .y_chroma_shift = 2,
  46. //    },
  47. //    [PIX_FMT_YUV411P] = {
  48. //        .name = "yuv411p",
  49. //        .nb_channels = 3,
  50. //        .color_type = FF_COLOR_YUV,
  51. //        .pixel_type = FF_PIXEL_PLANAR,
  52. //        .depth = 8,
  53. //        .x_chroma_shift = 2, .y_chroma_shift = 0,
  54. //    },
  55. //    /* JPEG YUV */
  56. //    [PIX_FMT_YUVJ420P] = {
  57. //        .name = "yuvj420p",
  58. //        .nb_channels = 3,
  59. //        .color_type = FF_COLOR_YUV_JPEG,
  60. //        .pixel_type = FF_PIXEL_PLANAR,
  61. //        .depth = 8,
  62. //        .x_chroma_shift = 1, .y_chroma_shift = 1, 
  63. //    },
  64. //    [PIX_FMT_YUVJ422P] = {
  65. //        .name = "yuvj422p",
  66. //        .nb_channels = 3,
  67. //        .color_type = FF_COLOR_YUV_JPEG,
  68. //        .pixel_type = FF_PIXEL_PLANAR,
  69. //        .depth = 8,
  70. //        .x_chroma_shift = 1, .y_chroma_shift = 0, 
  71. //    },
  72. //    [PIX_FMT_YUVJ444P] = {
  73. //        .name = "yuvj444p",
  74. //        .nb_channels = 3,
  75. //        .color_type = FF_COLOR_YUV_JPEG,
  76. //        .pixel_type = FF_PIXEL_PLANAR,
  77. //        .depth = 8,
  78. //        .x_chroma_shift = 0, .y_chroma_shift = 0, 
  79. //    },
  80. //    /* RGB formats */
  81. //    [PIX_FMT_RGB24] = {
  82. //        .name = "rgb24",
  83. //        .nb_channels = 3,
  84. //        .color_type = FF_COLOR_RGB,
  85. //        .pixel_type = FF_PIXEL_PACKED,
  86. //        .depth = 8,
  87. //        .x_chroma_shift = 0, .y_chroma_shift = 0,
  88. //    },
  89. //    [PIX_FMT_BGR24] = {
  90. //        .name = "bgr24",
  91. //        .nb_channels = 3,
  92. //        .color_type = FF_COLOR_RGB,
  93. //        .pixel_type = FF_PIXEL_PACKED,
  94. //        .depth = 8,
  95. //        .x_chroma_shift = 0, .y_chroma_shift = 0,
  96. //    },
  97. //    [PIX_FMT_RGBA32] = {
  98. //        .name = "rgba32",
  99. //        .nb_channels = 4, .is_alpha = 1,
  100. //        .color_type = FF_COLOR_RGB,
  101. //        .pixel_type = FF_PIXEL_PACKED,
  102. //        .depth = 8,
  103. //        .x_chroma_shift = 0, .y_chroma_shift = 0,
  104. //    },
  105. //    [PIX_FMT_RGB565] = {
  106. //        .name = "rgb565",
  107. //        .nb_channels = 3,
  108. //        .color_type = FF_COLOR_RGB,
  109. //        .pixel_type = FF_PIXEL_PACKED,
  110. //        .depth = 5,
  111. //        .x_chroma_shift = 0, .y_chroma_shift = 0,
  112. //    },
  113. //    [PIX_FMT_RGB555] = {
  114. //        .name = "rgb555",
  115. //        .nb_channels = 4, .is_alpha = 1,
  116. //        .color_type = FF_COLOR_RGB,
  117. //        .pixel_type = FF_PIXEL_PACKED,
  118. //        .depth = 5,
  119. //        .x_chroma_shift = 0, .y_chroma_shift = 0,
  120. //    },
  121. //    /* gray / mono formats */
  122. //    [PIX_FMT_GRAY8] = {
  123. //        .name = "gray",
  124. //        .nb_channels = 1,
  125. //        .color_type = FF_COLOR_GRAY,
  126. //        .pixel_type = FF_PIXEL_PLANAR,
  127. //        .depth = 8,
  128. //    },
  129. //    [PIX_FMT_MONOWHITE] = {
  130. //        .name = "monow",
  131. //        .nb_channels = 1,
  132. //        .color_type = FF_COLOR_GRAY,
  133. //        .pixel_type = FF_PIXEL_PLANAR,
  134. //        .depth = 1,
  135. //    },
  136. //    [PIX_FMT_MONOBLACK] = {
  137. //        .name = "monob",
  138. //        .nb_channels = 1,
  139. //        .color_type = FF_COLOR_GRAY,
  140. //        .pixel_type = FF_PIXEL_PLANAR,
  141. //        .depth = 1,
  142. //    },
  143. //    /* paletted formats */
  144. //    [PIX_FMT_PAL8] = {
  145. //        .name = "pal8",
  146. //        .nb_channels = 4, .is_alpha = 1,
  147. //        .color_type = FF_COLOR_RGB,
  148. //        .pixel_type = FF_PIXEL_PALETTE,
  149. //        .depth = 8,
  150. //    },
  151. }; //static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = {
  152. //    /* YUV formats */
  153. ////CS by ty
  154. ////    [PIX_FMT_YUV420P] = {
  155. ////    [0] = {
  156. // {
  157. //        "yuv420p",
  158. //        3,
  159. //        FF_COLOR_YUV,
  160. //        FF_PIXEL_PLANAR,
  161. //        8,
  162. //        1,
  163. // 1, 
  164. //    },
  165. ////    PIX_FMT_YUV420P = 
  166. //// {
  167. ////        .name = "yuv420p",
  168. ////        .nb_channels = 3,
  169. ////        .color_type = FF_COLOR_YUV,
  170. ////        .pixel_type = FF_PIXEL_PLANAR,
  171. ////        .depth = 8,
  172. ////        .x_chroma_shift = 1, .y_chroma_shift = 1, 
  173. ////    },
  174. ////CE by ty
  175. //    [PIX_FMT_YUV422P] = {
  176. //        .name = "yuv422p",
  177. //        .nb_channels = 3,
  178. //        .color_type = FF_COLOR_YUV,
  179. //        .pixel_type = FF_PIXEL_PLANAR,
  180. //        .depth = 8,
  181. //        .x_chroma_shift = 1, .y_chroma_shift = 0, 
  182. //    },
  183. //    [PIX_FMT_YUV444P] = {
  184. //        .name = "yuv444p",
  185. //        .nb_channels = 3,
  186. //        .color_type = FF_COLOR_YUV,
  187. //        .pixel_type = FF_PIXEL_PLANAR,
  188. //        .depth = 8,
  189. //        .x_chroma_shift = 0, .y_chroma_shift = 0, 
  190. //    },
  191. //    [PIX_FMT_YUV422] = {
  192. //        .name = "yuv422",
  193. //        .nb_channels = 1,
  194. //        .color_type = FF_COLOR_YUV,
  195. //        .pixel_type = FF_PIXEL_PACKED,
  196. //        .depth = 8,
  197. //        .x_chroma_shift = 1, .y_chroma_shift = 0,
  198. //    },
  199. //    [PIX_FMT_YUV410P] = {
  200. //        .name = "yuv410p",
  201. //        .nb_channels = 3,
  202. //        .color_type = FF_COLOR_YUV,
  203. //        .pixel_type = FF_PIXEL_PLANAR,
  204. //        .depth = 8,
  205. //        .x_chroma_shift = 2, .y_chroma_shift = 2,
  206. //    },
  207. //    [PIX_FMT_YUV411P] = {
  208. //        .name = "yuv411p",
  209. //        .nb_channels = 3,
  210. //        .color_type = FF_COLOR_YUV,
  211. //        .pixel_type = FF_PIXEL_PLANAR,
  212. //        .depth = 8,
  213. //        .x_chroma_shift = 2, .y_chroma_shift = 0,
  214. //    },
  215. //
  216. //    /* JPEG YUV */
  217. //    [PIX_FMT_YUVJ420P] = {
  218. //        .name = "yuvj420p",
  219. //        .nb_channels = 3,
  220. //        .color_type = FF_COLOR_YUV_JPEG,
  221. //        .pixel_type = FF_PIXEL_PLANAR,
  222. //        .depth = 8,
  223. //        .x_chroma_shift = 1, .y_chroma_shift = 1, 
  224. //    },
  225. //    [PIX_FMT_YUVJ422P] = {
  226. //        .name = "yuvj422p",
  227. //        .nb_channels = 3,
  228. //        .color_type = FF_COLOR_YUV_JPEG,
  229. //        .pixel_type = FF_PIXEL_PLANAR,
  230. //        .depth = 8,
  231. //        .x_chroma_shift = 1, .y_chroma_shift = 0, 
  232. //    },
  233. //    [PIX_FMT_YUVJ444P] = {
  234. //        .name = "yuvj444p",
  235. //        .nb_channels = 3,
  236. //        .color_type = FF_COLOR_YUV_JPEG,
  237. //        .pixel_type = FF_PIXEL_PLANAR,
  238. //        .depth = 8,
  239. //        .x_chroma_shift = 0, .y_chroma_shift = 0, 
  240. //    },
  241. //
  242. //    /* RGB formats */
  243. //    [PIX_FMT_RGB24] = {
  244. //        .name = "rgb24",
  245. //        .nb_channels = 3,
  246. //        .color_type = FF_COLOR_RGB,
  247. //        .pixel_type = FF_PIXEL_PACKED,
  248. //        .depth = 8,
  249. //        .x_chroma_shift = 0, .y_chroma_shift = 0,
  250. //    },
  251. //    [PIX_FMT_BGR24] = {
  252. //        .name = "bgr24",
  253. //        .nb_channels = 3,
  254. //        .color_type = FF_COLOR_RGB,
  255. //        .pixel_type = FF_PIXEL_PACKED,
  256. //        .depth = 8,
  257. //        .x_chroma_shift = 0, .y_chroma_shift = 0,
  258. //    },
  259. //    [PIX_FMT_RGBA32] = {
  260. //        .name = "rgba32",
  261. //        .nb_channels = 4, .is_alpha = 1,
  262. //        .color_type = FF_COLOR_RGB,
  263. //        .pixel_type = FF_PIXEL_PACKED,
  264. //        .depth = 8,
  265. //        .x_chroma_shift = 0, .y_chroma_shift = 0,
  266. //    },
  267. //    [PIX_FMT_RGB565] = {
  268. //        .name = "rgb565",
  269. //        .nb_channels = 3,
  270. //        .color_type = FF_COLOR_RGB,
  271. //        .pixel_type = FF_PIXEL_PACKED,
  272. //        .depth = 5,
  273. //        .x_chroma_shift = 0, .y_chroma_shift = 0,
  274. //    },
  275. //    [PIX_FMT_RGB555] = {
  276. //        .name = "rgb555",
  277. //        .nb_channels = 4, .is_alpha = 1,
  278. //        .color_type = FF_COLOR_RGB,
  279. //        .pixel_type = FF_PIXEL_PACKED,
  280. //        .depth = 5,
  281. //        .x_chroma_shift = 0, .y_chroma_shift = 0,
  282. //    },
  283. //
  284. //    /* gray / mono formats */
  285. //    [PIX_FMT_GRAY8] = {
  286. //        .name = "gray",
  287. //        .nb_channels = 1,
  288. //        .color_type = FF_COLOR_GRAY,
  289. //        .pixel_type = FF_PIXEL_PLANAR,
  290. //        .depth = 8,
  291. //    },
  292. //    [PIX_FMT_MONOWHITE] = {
  293. //        .name = "monow",
  294. //        .nb_channels = 1,
  295. //        .color_type = FF_COLOR_GRAY,
  296. //        .pixel_type = FF_PIXEL_PLANAR,
  297. //        .depth = 1,
  298. //    },
  299. //    [PIX_FMT_MONOBLACK] = {
  300. //        .name = "monob",
  301. //        .nb_channels = 1,
  302. //        .color_type = FF_COLOR_GRAY,
  303. //        .pixel_type = FF_PIXEL_PLANAR,
  304. //        .depth = 1,
  305. //    },
  306. //
  307. //    /* paletted formats */
  308. //    [PIX_FMT_PAL8] = {
  309. //        .name = "pal8",
  310. //        .nb_channels = 4, .is_alpha = 1,
  311. //        .color_type = FF_COLOR_RGB,
  312. //        .pixel_type = FF_PIXEL_PALETTE,
  313. //        .depth = 8,
  314. //    },
  315. //};
  316. //CE by ty
  317. void avcodec_get_chroma_sub_sample(int pix_fmt, int *h_shift, int *v_shift) {     *h_shift = pix_fmt_info[pix_fmt].x_chroma_shift;     *v_shift = pix_fmt_info[pix_fmt].y_chroma_shift; } const char *avcodec_get_pix_fmt_name(int pix_fmt)
  318. {
  319.     if (pix_fmt < 0 || pix_fmt >= PIX_FMT_NB)
  320.         return "???";
  321.     else
  322.         return pix_fmt_info[pix_fmt].name;
  323. }
  324. enum PixelFormat avcodec_get_pix_fmt(const char* name)
  325. {
  326.     int i; 
  327.     
  328.     for (i=0; i < PIX_FMT_NB; i++)
  329.          if (!strcmp(pix_fmt_info[i].name, name))
  330.      break;
  331.     return i;
  332. }
  333. /* Picture field are filled with 'ptr' addresses. Also return size */
  334. int avpicture_fill(AVPicture *picture, uint8_t *ptr,
  335.    int pix_fmt, int width, int height)
  336. {
  337.     int size, w2, h2, size2;
  338.     PixFmtInfo *pinfo;
  339.     
  340.     pinfo = &pix_fmt_info[pix_fmt];
  341.     size = width * height;
  342.     switch(pix_fmt) {
  343.     case PIX_FMT_YUV420P:
  344.     case PIX_FMT_YUV422P:
  345.     case PIX_FMT_YUV444P:
  346.     case PIX_FMT_YUV410P:
  347.     case PIX_FMT_YUV411P:
  348.     case PIX_FMT_YUVJ420P:
  349.     case PIX_FMT_YUVJ422P:
  350.     case PIX_FMT_YUVJ444P:
  351.         w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift;
  352.         h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift;
  353.         size2 = w2 * h2;
  354.         picture->data[0] = ptr;
  355.         picture->data[1] = picture->data[0] + size;
  356.         picture->data[2] = picture->data[1] + size2;
  357.         picture->linesize[0] = width;
  358.         picture->linesize[1] = w2;
  359.         picture->linesize[2] = w2;
  360.         return size + 2 * size2;
  361.     case PIX_FMT_RGB24:
  362.     case PIX_FMT_BGR24:
  363.         picture->data[0] = ptr;
  364.         picture->data[1] = NULL;
  365.         picture->data[2] = NULL;
  366.         picture->linesize[0] = width * 3;
  367.         return size * 3;
  368.     case PIX_FMT_RGBA32:
  369.         picture->data[0] = ptr;
  370.         picture->data[1] = NULL;
  371.         picture->data[2] = NULL;
  372.         picture->linesize[0] = width * 4;
  373.         return size * 4;
  374.     case PIX_FMT_RGB555:
  375.     case PIX_FMT_RGB565:
  376.     case PIX_FMT_YUV422:
  377.         picture->data[0] = ptr;
  378.         picture->data[1] = NULL;
  379.         picture->data[2] = NULL;
  380.         picture->linesize[0] = width * 2;
  381.         return size * 2;
  382.     case PIX_FMT_GRAY8:
  383.         picture->data[0] = ptr;
  384.         picture->data[1] = NULL;
  385.         picture->data[2] = NULL;
  386.         picture->linesize[0] = width;
  387.         return size;
  388.     case PIX_FMT_MONOWHITE:
  389.     case PIX_FMT_MONOBLACK:
  390.         picture->data[0] = ptr;
  391.         picture->data[1] = NULL;
  392.         picture->data[2] = NULL;
  393.         picture->linesize[0] = (width + 7) >> 3;
  394.         return picture->linesize[0] * height;
  395.     case PIX_FMT_PAL8:
  396.         size2 = (size + 3) & ~3;
  397.         picture->data[0] = ptr;
  398.         picture->data[1] = ptr + size2; /* palette is stored here as 256 32 bit words */
  399.         picture->data[2] = NULL;
  400.         picture->linesize[0] = width;
  401.         picture->linesize[1] = 4;
  402.         return size2 + 256 * 4;
  403.     default:
  404.         picture->data[0] = NULL;
  405.         picture->data[1] = NULL;
  406.         picture->data[2] = NULL;
  407.         picture->data[3] = NULL;
  408.         return -1;
  409.     }
  410. }
  411. //int avpicture_layout(const AVPicture* src, int pix_fmt, int width, int height,
  412. //                     unsigned char *dest, int dest_size)
  413. //{
  414. //    PixFmtInfo* pf = &pix_fmt_info[pix_fmt];
  415. //    int i, j, w, h, data_planes;
  416. //    const unsigned char* s; 
  417. //    int size = avpicture_get_size(pix_fmt, width, height);
  418. //    if (size > dest_size)
  419. //        return -1;
  420. //    if (pf->pixel_type == FF_PIXEL_PACKED || pf->pixel_type == FF_PIXEL_PALETTE) {
  421. //        if (pix_fmt == PIX_FMT_YUV422 || pix_fmt == PIX_FMT_RGB565 ||
  422. //     pix_fmt == PIX_FMT_RGB555)
  423. //   w = width * 2;
  424. // else if (pix_fmt == PIX_FMT_PAL8)
  425. //   w = width;
  426. // else
  427. //   w = width * (pf->depth * pf->nb_channels / 8);
  428. //   
  429. // data_planes = 1;
  430. // h = height;
  431. //    } else {
  432. //        data_planes = pf->nb_channels;
  433. // w = width;
  434. // h = height;
  435. //    }
  436. //    
  437. //    for (i=0; i<data_planes; i++) {
  438. //         if (i == 1) {
  439. //      w = width >> pf->x_chroma_shift;
  440. //      h = height >> pf->y_chroma_shift;
  441. //  }
  442. //         s = src->data[i];
  443. //  for(j=0; j<h; j++) {
  444. //      memcpy(dest, s, w);
  445. //      dest += w;
  446. //      s += src->linesize[i];
  447. //  }
  448. //    }
  449. //    
  450. //    if (pf->pixel_type == FF_PIXEL_PALETTE)
  451. // memcpy((unsigned char *)(((size_t)dest + 3) & ~3), src->data[1], 256 * 4);
  452. //    
  453. //    return size;
  454. //}
  455. //int avpicture_get_size(int pix_fmt, int width, int height)
  456. //{
  457. //    AVPicture dummy_pict;
  458. //    return avpicture_fill(&dummy_pict, NULL, pix_fmt, width, height);
  459. //}
  460. ///**
  461. // * compute the loss when converting from a pixel format to another 
  462. // */
  463. //int avcodec_get_pix_fmt_loss(int dst_pix_fmt, int src_pix_fmt,
  464. //                             int has_alpha)
  465. //{
  466. //    const PixFmtInfo *pf, *ps;
  467. //    int loss;
  468. //    ps = &pix_fmt_info[src_pix_fmt];
  469. //    pf = &pix_fmt_info[dst_pix_fmt];
  470. //    /* compute loss */
  471. //    loss = 0;
  472. //    pf = &pix_fmt_info[dst_pix_fmt];
  473. //    if (pf->depth < ps->depth ||
  474. //        (dst_pix_fmt == PIX_FMT_RGB555 && src_pix_fmt == PIX_FMT_RGB565))
  475. //        loss |= FF_LOSS_DEPTH;
  476. //    if (pf->x_chroma_shift > ps->x_chroma_shift ||
  477. //        pf->y_chroma_shift > ps->y_chroma_shift)
  478. //        loss |= FF_LOSS_RESOLUTION;
  479. //    switch(pf->color_type) {
  480. //    case FF_COLOR_RGB:
  481. //        if (ps->color_type != FF_COLOR_RGB &&
  482. //            ps->color_type != FF_COLOR_GRAY)
  483. //            loss |= FF_LOSS_COLORSPACE;
  484. //        break;
  485. //    case FF_COLOR_GRAY:
  486. //        if (ps->color_type != FF_COLOR_GRAY)
  487. //            loss |= FF_LOSS_COLORSPACE;
  488. //        break;
  489. //    case FF_COLOR_YUV:
  490. //        if (ps->color_type != FF_COLOR_YUV)
  491. //            loss |= FF_LOSS_COLORSPACE;
  492. //        break;
  493. //    case FF_COLOR_YUV_JPEG:
  494. //        if (ps->color_type != FF_COLOR_YUV_JPEG &&
  495. //            ps->color_type != FF_COLOR_YUV && 
  496. //            ps->color_type != FF_COLOR_GRAY)
  497. //            loss |= FF_LOSS_COLORSPACE;
  498. //        break;
  499. //    default:
  500. //        /* fail safe test */
  501. //        if (ps->color_type != pf->color_type)
  502. //            loss |= FF_LOSS_COLORSPACE;
  503. //        break;
  504. //    }
  505. //    if (pf->color_type == FF_COLOR_GRAY &&
  506. //        ps->color_type != FF_COLOR_GRAY)
  507. //        loss |= FF_LOSS_CHROMA;
  508. //    if (!pf->is_alpha && (ps->is_alpha && has_alpha))
  509. //        loss |= FF_LOSS_ALPHA;
  510. //    if (pf->pixel_type == FF_PIXEL_PALETTE && 
  511. //        (ps->pixel_type != FF_PIXEL_PALETTE && ps->color_type != FF_COLOR_GRAY))
  512. //        loss |= FF_LOSS_COLORQUANT;
  513. //    return loss;
  514. //}
  515. //static int avg_bits_per_pixel(int pix_fmt)
  516. //{
  517. //    int bits;
  518. //    const PixFmtInfo *pf;
  519. //    pf = &pix_fmt_info[pix_fmt];
  520. //    switch(pf->pixel_type) {
  521. //    case FF_PIXEL_PACKED:
  522. //        switch(pix_fmt) {
  523. //        case PIX_FMT_YUV422:
  524. //        case PIX_FMT_RGB565:
  525. //        case PIX_FMT_RGB555:
  526. //            bits = 16;
  527. //            break;
  528. //        default:
  529. //            bits = pf->depth * pf->nb_channels;
  530. //            break;
  531. //        }
  532. //        break;
  533. //    case FF_PIXEL_PLANAR:
  534. //        if (pf->x_chroma_shift == 0 && pf->y_chroma_shift == 0) {
  535. //            bits = pf->depth * pf->nb_channels;
  536. //        } else {
  537. //            bits = pf->depth + ((2 * pf->depth) >> 
  538. //                                (pf->x_chroma_shift + pf->y_chroma_shift));
  539. //        }
  540. //        break;
  541. //    case FF_PIXEL_PALETTE:
  542. //        bits = 8;
  543. //        break;
  544. //    default:
  545. //        bits = -1;
  546. //        break;
  547. //    }
  548. //    return bits;
  549. //}
  550. //static int avcodec_find_best_pix_fmt1(int pix_fmt_mask, 
  551. //                                      int src_pix_fmt,
  552. //                                      int has_alpha,
  553. //                                      int loss_mask)
  554. //{
  555. //    int dist, i, loss, min_dist, dst_pix_fmt;
  556. //    /* find exact color match with smallest size */
  557. //    dst_pix_fmt = -1;
  558. //    min_dist = 0x7fffffff;
  559. //    for(i = 0;i < PIX_FMT_NB; i++) {
  560. //        if (pix_fmt_mask & (1 << i)) {
  561. //            loss = avcodec_get_pix_fmt_loss(i, src_pix_fmt, has_alpha) & loss_mask;
  562. //            if (loss == 0) {
  563. //                dist = avg_bits_per_pixel(i);
  564. //                if (dist < min_dist) {
  565. //                    min_dist = dist;
  566. //                    dst_pix_fmt = i;
  567. //                }
  568. //            }
  569. //        }
  570. //    }
  571. //    return dst_pix_fmt;
  572. //}
  573. ///** 
  574. // * find best pixel format to convert to. Return -1 if none found 
  575. // */
  576. //int avcodec_find_best_pix_fmt(int pix_fmt_mask, int src_pix_fmt,
  577. //                              int has_alpha, int *loss_ptr)
  578. //{
  579. //    int dst_pix_fmt, loss_mask, i;
  580. //    static const int loss_mask_order[] = {
  581. //        ~0, /* no loss first */
  582. //        ~FF_LOSS_ALPHA,
  583. //        ~FF_LOSS_RESOLUTION,
  584. //        ~(FF_LOSS_COLORSPACE | FF_LOSS_RESOLUTION),
  585. //        ~FF_LOSS_COLORQUANT,
  586. //        ~FF_LOSS_DEPTH,
  587. //        0,
  588. //    };
  589. //    /* try with successive loss */
  590. //    i = 0;
  591. //    for(;;) {
  592. //        loss_mask = loss_mask_order[i++];
  593. //        dst_pix_fmt = avcodec_find_best_pix_fmt1(pix_fmt_mask, src_pix_fmt, 
  594. //                                                 has_alpha, loss_mask);
  595. //        if (dst_pix_fmt >= 0)
  596. //            goto found;
  597. //        if (loss_mask == 0)
  598. //            break;
  599. //    }
  600. //    return -1;
  601. // found:
  602. //    if (loss_ptr)
  603. //        *loss_ptr = avcodec_get_pix_fmt_loss(dst_pix_fmt, src_pix_fmt, has_alpha);
  604. //    return dst_pix_fmt;
  605. //}
  606. static void img_copy_plane(uint8_t *dst, int dst_wrap, 
  607.                            const uint8_t *src, int src_wrap,
  608.                            int width, int height)
  609. {
  610.     for(;height > 0; height--) {
  611.         memcpy(dst, src, width);
  612.         dst += dst_wrap;
  613.         src += src_wrap;
  614.     }
  615. }
  616. /**
  617.  * Copy image 'src' to 'dst'.
  618.  */
  619. void img_copy(AVPicture *dst, const AVPicture *src,
  620.               int pix_fmt, int width, int height)
  621. {
  622.     int bwidth, bits, i;
  623.     PixFmtInfo *pf = &pix_fmt_info[pix_fmt];
  624.     
  625.     pf = &pix_fmt_info[pix_fmt];
  626.     switch(pf->pixel_type) {
  627.     case FF_PIXEL_PACKED:
  628.         switch(pix_fmt) {
  629.         case PIX_FMT_YUV422:
  630.         case PIX_FMT_RGB565:
  631.         case PIX_FMT_RGB555:
  632.             bits = 16;
  633.             break;
  634.         default:
  635.             bits = pf->depth * pf->nb_channels;
  636.             break;
  637.         }
  638.         bwidth = (width * bits + 7) >> 3;
  639.         img_copy_plane(dst->data[0], dst->linesize[0],
  640.                        src->data[0], src->linesize[0],
  641.                        bwidth, height);
  642.         break;
  643.     case FF_PIXEL_PLANAR:
  644.         for(i = 0; i < pf->nb_channels; i++) {
  645.             int w, h;
  646.             w = width;
  647.             h = height;
  648.             if (i == 1 || i == 2) {
  649.                 w >>= pf->x_chroma_shift;
  650.                 h >>= pf->y_chroma_shift;
  651.             }
  652.             bwidth = (w * pf->depth + 7) >> 3;
  653.             img_copy_plane(dst->data[i], dst->linesize[i],
  654.                            src->data[i], src->linesize[i],
  655.                            bwidth, h);
  656.         }
  657.         break;
  658.     case FF_PIXEL_PALETTE:
  659.         img_copy_plane(dst->data[0], dst->linesize[0],
  660.                        src->data[0], src->linesize[0],
  661.                        width, height);
  662.         /* copy the palette */
  663.         img_copy_plane(dst->data[1], dst->linesize[1],
  664.                        src->data[1], src->linesize[1],
  665.                        4, 256);
  666.         break;
  667.     }
  668. }
  669. ///* XXX: totally non optimized */
  670. //static void yuv422_to_yuv420p(AVPicture *dst, const AVPicture *src,
  671. //                              int width, int height)
  672. //{
  673. //    const uint8_t *p, *p1;
  674. //    uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1;
  675. //    int w;
  676. // 
  677. //    p1 = src->data[0];
  678. //    lum1 = dst->data[0];
  679. //    cb1 = dst->data[1];
  680. //    cr1 = dst->data[2];
  681. //    for(;height >= 1; height -= 2) {
  682. //        p = p1;
  683. //        lum = lum1;
  684. //        cb = cb1;
  685. //        cr = cr1;
  686. //        for(w = width; w >= 2; w -= 2) {
  687. //            lum[0] = p[0];
  688. //            cb[0] = p[1];
  689. //            lum[1] = p[2];
  690. //            cr[0] = p[3];
  691. //            p += 4;
  692. //            lum += 2;
  693. //            cb++;
  694. //            cr++;
  695. //        }
  696. //        if (w) {
  697. //            lum[0] = p[0];
  698. //            cb[0] = p[1];
  699. //            cr[0] = p[3];
  700. //            cb++;
  701. //            cr++;
  702. //        }
  703. //        p1 += src->linesize[0];
  704. //        lum1 += dst->linesize[0];
  705. //        if (height>1) {
  706. //            p = p1;
  707. //            lum = lum1;
  708. //            for(w = width; w >= 2; w -= 2) {
  709. //                lum[0] = p[0];
  710. //                lum[1] = p[2];
  711. //                p += 4;
  712. //                lum += 2;
  713. //            }
  714. //            if (w) {
  715. //                lum[0] = p[0];
  716. //            }
  717. //            p1 += src->linesize[0];
  718. //            lum1 += dst->linesize[0];
  719. //        }
  720. //        cb1 += dst->linesize[1];
  721. //        cr1 += dst->linesize[2];
  722. //    }
  723. //}
  724. //static void yuv422_to_yuv422p(AVPicture *dst, const AVPicture *src,
  725. //                              int width, int height)
  726. //{
  727. //    const uint8_t *p, *p1;
  728. //    uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1;
  729. //    int w;
  730. //    p1 = src->data[0];
  731. //    lum1 = dst->data[0];
  732. //    cb1 = dst->data[1];
  733. //    cr1 = dst->data[2];
  734. //    for(;height > 0; height--) {
  735. //        p = p1;
  736. //        lum = lum1;
  737. //        cb = cb1;
  738. //        cr = cr1;
  739. //        for(w = width; w >= 2; w -= 2) {
  740. //            lum[0] = p[0];
  741. //            cb[0] = p[1];
  742. //            lum[1] = p[2];
  743. //            cr[0] = p[3];
  744. //            p += 4;
  745. //            lum += 2;
  746. //            cb++;
  747. //            cr++;
  748. //        }
  749. //        p1 += src->linesize[0];
  750. //        lum1 += dst->linesize[0];
  751. //        cb1 += dst->linesize[1];
  752. //        cr1 += dst->linesize[2];
  753. //    }
  754. //}
  755. //static void yuv422p_to_yuv422(AVPicture *dst, const AVPicture *src,
  756. //                              int width, int height)
  757. //{
  758. //    uint8_t *p, *p1;
  759. //    const uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1;
  760. //    int w;
  761. //    p1 = dst->data[0];
  762. //    lum1 = src->data[0];
  763. //    cb1 = src->data[1];
  764. //    cr1 = src->data[2];
  765. //    for(;height > 0; height--) {
  766. //        p = p1;
  767. //        lum = lum1;
  768. //        cb = cb1;
  769. //        cr = cr1;
  770. //        for(w = width; w >= 2; w -= 2) {
  771. //            p[0] = lum[0];
  772. //            p[1] = cb[0];
  773. //            p[2] = lum[1];
  774. //            p[3] = cr[0];
  775. //            p += 4;
  776. //            lum += 2;
  777. //            cb++;
  778. //            cr++;
  779. //        }
  780. //        p1 += dst->linesize[0];
  781. //        lum1 += src->linesize[0];
  782. //        cb1 += src->linesize[1];
  783. //        cr1 += src->linesize[2];
  784. //    }
  785. //}
  786. //#define SCALEBITS 10
  787. //#define ONE_HALF  (1 << (SCALEBITS - 1))
  788. //#define FIX(x)   ((int) ((x) * (1<<SCALEBITS) + 0.5))
  789. //#define YUV_TO_RGB1_CCIR(cb1, cr1)
  790. //{
  791. //    cb = (cb1) - 128;
  792. //    cr = (cr1) - 128;
  793. //    r_add = FIX(1.40200*255.0/224.0) * cr + ONE_HALF;
  794. //    g_add = - FIX(0.34414*255.0/224.0) * cb - FIX(0.71414*255.0/224.0) * cr + 
  795. //            ONE_HALF;
  796. //    b_add = FIX(1.77200*255.0/224.0) * cb + ONE_HALF;
  797. //}
  798. //#define YUV_TO_RGB2_CCIR(r, g, b, y1)
  799. //{
  800. //    y = ((y1) - 16) * FIX(255.0/219.0);
  801. //    r = cm[(y + r_add) >> SCALEBITS];
  802. //    g = cm[(y + g_add) >> SCALEBITS];
  803. //    b = cm[(y + b_add) >> SCALEBITS];
  804. //}
  805. //#define YUV_TO_RGB1(cb1, cr1)
  806. //{
  807. //    cb = (cb1) - 128;
  808. //    cr = (cr1) - 128;
  809. //    r_add = FIX(1.40200) * cr + ONE_HALF;
  810. //    g_add = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF;
  811. //    b_add = FIX(1.77200) * cb + ONE_HALF;
  812. //}
  813. //#define YUV_TO_RGB2(r, g, b, y1)
  814. //{
  815. //    y = (y1) << SCALEBITS;
  816. //    r = cm[(y + r_add) >> SCALEBITS];
  817. //    g = cm[(y + g_add) >> SCALEBITS];
  818. //    b = cm[(y + b_add) >> SCALEBITS];
  819. //}
  820. //#define Y_CCIR_TO_JPEG(y)
  821. // cm[((y) * FIX(255.0/219.0) + (ONE_HALF - 16 * FIX(255.0/219.0))) >> SCALEBITS]
  822. //#define Y_JPEG_TO_CCIR(y)
  823. // (((y) * FIX(219.0/255.0) + (ONE_HALF + (16 << SCALEBITS))) >> SCALEBITS)
  824. //#define C_CCIR_TO_JPEG(y)
  825. // cm[(((y) - 128) * FIX(127.0/112.0) + (ONE_HALF + (128 << SCALEBITS))) >> SCALEBITS]
  826. ///* NOTE: the clamp is really necessary! */
  827. //static inline int C_JPEG_TO_CCIR(int y) {
  828. //    y = (((y - 128) * FIX(112.0/127.0) + (ONE_HALF + (128 << SCALEBITS))) >> SCALEBITS);
  829. //    if (y < 16)
  830. // y = 16;
  831. //    return y;
  832. //}
  833. //#define RGB_TO_Y(r, g, b) 
  834. //((FIX(0.29900) * (r) + FIX(0.58700) * (g) + 
  835. //  FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
  836. //#define RGB_TO_U(r1, g1, b1, shift)
  837. //(((- FIX(0.16874) * r1 - FIX(0.33126) * g1 +         
  838. //     FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
  839. //#define RGB_TO_V(r1, g1, b1, shift)
  840. //(((FIX(0.50000) * r1 - FIX(0.41869) * g1 -           
  841. //   FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
  842. //#define RGB_TO_Y_CCIR(r, g, b) 
  843. //((FIX(0.29900*219.0/255.0) * (r) + FIX(0.58700*219.0/255.0) * (g) + 
  844. //  FIX(0.11400*219.0/255.0) * (b) + (ONE_HALF + (16 << SCALEBITS))) >> SCALEBITS)
  845. //#define RGB_TO_U_CCIR(r1, g1, b1, shift)
  846. //(((- FIX(0.16874*224.0/255.0) * r1 - FIX(0.33126*224.0/255.0) * g1 +         
  847. //     FIX(0.50000*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
  848. //#define RGB_TO_V_CCIR(r1, g1, b1, shift)
  849. //(((FIX(0.50000*224.0/255.0) * r1 - FIX(0.41869*224.0/255.0) * g1 -           
  850. //   FIX(0.08131*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
  851. //static uint8_t y_ccir_to_jpeg[256];
  852. //static uint8_t y_jpeg_to_ccir[256];
  853. //static uint8_t c_ccir_to_jpeg[256];
  854. //static uint8_t c_jpeg_to_ccir[256];
  855. ///* init various conversion tables */
  856. //static void img_convert_init(void)
  857. //{
  858. //    int i;
  859. //    uint8_t *cm = cropTbl + MAX_NEG_CROP;
  860. //    for(i = 0;i < 256; i++) {
  861. //        y_ccir_to_jpeg[i] = Y_CCIR_TO_JPEG(i);
  862. //        y_jpeg_to_ccir[i] = Y_JPEG_TO_CCIR(i);
  863. //        c_ccir_to_jpeg[i] = C_CCIR_TO_JPEG(i);
  864. //        c_jpeg_to_ccir[i] = C_JPEG_TO_CCIR(i);
  865. //    }
  866. //}
  867. ///* apply to each pixel the given table */
  868. //static void img_apply_table(uint8_t *dst, int dst_wrap, 
  869. //                            const uint8_t *src, int src_wrap,
  870. //                            int width, int height, const uint8_t *table1)
  871. //{
  872. //    int n;
  873. //    const uint8_t *s;
  874. //    uint8_t *d;
  875. //    const uint8_t *table;
  876. //    table = table1;
  877. //    for(;height > 0; height--) {
  878. //        s = src;
  879. //        d = dst;
  880. //        n = width;
  881. //        while (n >= 4) {
  882. //            d[0] = table[s[0]];
  883. //            d[1] = table[s[1]];
  884. //            d[2] = table[s[2]];
  885. //            d[3] = table[s[3]];
  886. //            d += 4;
  887. //            s += 4;
  888. //            n -= 4;
  889. //        }
  890. //        while (n > 0) {
  891. //            d[0] = table[s[0]];
  892. //            d++;
  893. //            s++;
  894. //            n--;
  895. //        }
  896. //        dst += dst_wrap;
  897. //        src += src_wrap;
  898. //    }
  899. //}
  900. ///* XXX: use generic filter ? */
  901. ///* XXX: in most cases, the sampling position is incorrect */
  902. ///* 4x1 -> 1x1 */
  903. //static void shrink41(uint8_t *dst, int dst_wrap, 
  904. //                     const uint8_t *src, int src_wrap,
  905. //                     int width, int height)
  906. //{
  907. //    int w;
  908. //    const uint8_t *s;
  909. //    uint8_t *d;
  910. //    for(;height > 0; height--) {
  911. //        s = src;
  912. //        d = dst;
  913. //        for(w = width;w > 0; w--) {
  914. //            d[0] = (s[0] + s[1] + s[2] + s[3] + 2) >> 2;
  915. //            s += 4;
  916. //            d++;
  917. //        }
  918. //        src += src_wrap;
  919. //        dst += dst_wrap;
  920. //    }
  921. //}
  922. ///* 2x1 -> 1x1 */
  923. //static void shrink21(uint8_t *dst, int dst_wrap, 
  924. //                     const uint8_t *src, int src_wrap,
  925. //                     int width, int height)
  926. //{
  927. //    int w;
  928. //    const uint8_t *s;
  929. //    uint8_t *d;
  930. //    for(;height > 0; height--) {
  931. //        s = src;
  932. //        d = dst;
  933. //        for(w = width;w > 0; w--) {
  934. //            d[0] = (s[0] + s[1]) >> 1;
  935. //            s += 2;
  936. //            d++;
  937. //        }
  938. //        src += src_wrap;
  939. //        dst += dst_wrap;
  940. //    }
  941. //}
  942. ///* 1x2 -> 1x1 */
  943. //static void shrink12(uint8_t *dst, int dst_wrap, 
  944. //                     const uint8_t *src, int src_wrap,
  945. //                     int width, int height)
  946. //{
  947. //    int w;
  948. //    uint8_t *d;
  949. //    const uint8_t *s1, *s2;
  950. //    for(;height > 0; height--) {
  951. //        s1 = src;
  952. //        s2 = s1 + src_wrap;
  953. //        d = dst;
  954. //        for(w = width;w >= 4; w-=4) {
  955. //            d[0] = (s1[0] + s2[0]) >> 1;
  956. //            d[1] = (s1[1] + s2[1]) >> 1;
  957. //            d[2] = (s1[2] + s2[2]) >> 1;
  958. //            d[3] = (s1[3] + s2[3]) >> 1;
  959. //            s1 += 4;
  960. //            s2 += 4;
  961. //            d += 4;
  962. //        }
  963. //        for(;w > 0; w--) {
  964. //            d[0] = (s1[0] + s2[0]) >> 1;
  965. //            s1++;
  966. //            s2++;
  967. //            d++;
  968. //        }
  969. //        src += 2 * src_wrap;
  970. //        dst += dst_wrap;
  971. //    }
  972. //}
  973. ///* 2x2 -> 1x1 */
  974. //static void shrink22(uint8_t *dst, int dst_wrap, 
  975. //                     const uint8_t *src, int src_wrap,
  976. //                     int width, int height)
  977. //{
  978. //    int w;
  979. //    const uint8_t *s1, *s2;
  980. //    uint8_t *d;
  981. //    for(;height > 0; height--) {
  982. //        s1 = src;
  983. //        s2 = s1 + src_wrap;
  984. //        d = dst;
  985. //        for(w = width;w >= 4; w-=4) {
  986. //            d[0] = (s1[0] + s1[1] + s2[0] + s2[1] + 2) >> 2;
  987. //            d[1] = (s1[2] + s1[3] + s2[2] + s2[3] + 2) >> 2;
  988. //            d[2] = (s1[4] + s1[5] + s2[4] + s2[5] + 2) >> 2;
  989. //            d[3] = (s1[6] + s1[7] + s2[6] + s2[7] + 2) >> 2;
  990. //            s1 += 8;
  991. //            s2 += 8;
  992. //            d += 4;
  993. //        }
  994. //        for(;w > 0; w--) {
  995. //            d[0] = (s1[0] + s1[1] + s2[0] + s2[1] + 2) >> 2;
  996. //            s1 += 2;
  997. //            s2 += 2;
  998. //            d++;
  999. //        }
  1000. //        src += 2 * src_wrap;
  1001. //        dst += dst_wrap;
  1002. //    }
  1003. //}
  1004. ///* 4x4 -> 1x1 */
  1005. //static void shrink44(uint8_t *dst, int dst_wrap, 
  1006. //                     const uint8_t *src, int src_wrap,
  1007. //                     int width, int height)
  1008. //{
  1009. //    int w;
  1010. //    const uint8_t *s1, *s2, *s3, *s4;
  1011. //    uint8_t *d;
  1012. //    for(;height > 0; height--) {
  1013. //        s1 = src;
  1014. //        s2 = s1 + src_wrap;
  1015. //        s3 = s2 + src_wrap;
  1016. //        s4 = s3 + src_wrap;
  1017. //        d = dst;
  1018. //        for(w = width;w > 0; w--) {
  1019. //            d[0] = (s1[0] + s1[1] + s1[2] + s1[3] +
  1020. //                    s2[0] + s2[1] + s2[2] + s2[3] +
  1021. //                    s3[0] + s3[1] + s3[2] + s3[3] +
  1022. //                    s4[0] + s4[1] + s4[2] + s4[3] + 8) >> 4;
  1023. //            s1 += 4;
  1024. //            s2 += 4;
  1025. //            s3 += 4;
  1026. //            s4 += 4;
  1027. //            d++;
  1028. //        }
  1029. //        src += 4 * src_wrap;
  1030. //        dst += dst_wrap;
  1031. //    }
  1032. //}
  1033. //static void grow21_line(uint8_t *dst, const uint8_t *src,
  1034. //                        int width)
  1035. //{
  1036. //    int w;
  1037. //    const uint8_t *s1;
  1038. //    uint8_t *d;
  1039. //    s1 = src;
  1040. //    d = dst;
  1041. //    for(w = width;w >= 4; w-=4) {
  1042. //        d[1] = d[0] = s1[0];
  1043. //        d[3] = d[2] = s1[1];
  1044. //        s1 += 2;
  1045. //        d += 4;
  1046. //    }
  1047. //    for(;w >= 2; w -= 2) {
  1048. //        d[1] = d[0] = s1[0];
  1049. //        s1 ++;
  1050. //        d += 2;
  1051. //    }
  1052. //    /* only needed if width is not a multiple of two */
  1053. //    /* XXX: veryfy that */
  1054. //    if (w) {
  1055. //        d[0] = s1[0];
  1056. //    }
  1057. //}
  1058. //static void grow41_line(uint8_t *dst, const uint8_t *src,
  1059. //                        int width)
  1060. //{
  1061. //    int w, v;
  1062. //    const uint8_t *s1;
  1063. //    uint8_t *d;
  1064. //    s1 = src;
  1065. //    d = dst;
  1066. //    for(w = width;w >= 4; w-=4) {
  1067. //        v = s1[0];
  1068. //        d[0] = v;
  1069. //        d[1] = v;
  1070. //        d[2] = v;
  1071. //        d[3] = v;
  1072. //        s1 ++;
  1073. //        d += 4;
  1074. //    }
  1075. //}
  1076. ///* 1x1 -> 2x1 */
  1077. //static void grow21(uint8_t *dst, int dst_wrap,
  1078. //                   const uint8_t *src, int src_wrap,
  1079. //                   int width, int height)
  1080. //{
  1081. //    for(;height > 0; height--) {
  1082. //        grow21_line(dst, src, width);
  1083. //        src += src_wrap;
  1084. //        dst += dst_wrap;
  1085. //    }
  1086. //}
  1087. ///* 1x1 -> 2x2 */
  1088. //static void grow22(uint8_t *dst, int dst_wrap,
  1089. //                   const uint8_t *src, int src_wrap,
  1090. //                   int width, int height)
  1091. //{
  1092. //    for(;height > 0; height--) {
  1093. //        grow21_line(dst, src, width);
  1094. //        if (height%2)
  1095. //            src += src_wrap;
  1096. //        dst += dst_wrap;
  1097. //    }
  1098. //}
  1099. ///* 1x1 -> 4x1 */
  1100. //static void grow41(uint8_t *dst, int dst_wrap,
  1101. //                   const uint8_t *src, int src_wrap,
  1102. //                   int width, int height)
  1103. //{
  1104. //    for(;height > 0; height--) {
  1105. //        grow41_line(dst, src, width);
  1106. //        src += src_wrap;
  1107. //        dst += dst_wrap;
  1108. //    }
  1109. //}
  1110. ///* 1x1 -> 4x4 */
  1111. //static void grow44(uint8_t *dst, int dst_wrap,
  1112. //                   const uint8_t *src, int src_wrap,
  1113. //                   int width, int height)
  1114. //{
  1115. //    for(;height > 0; height--) {
  1116. //        grow41_line(dst, src, width);
  1117. //        if ((height & 3) == 1)
  1118. //            src += src_wrap;
  1119. //        dst += dst_wrap;
  1120. //    }
  1121. //}
  1122. ///* 1x2 -> 2x1 */
  1123. //static void conv411(uint8_t *dst, int dst_wrap, 
  1124. //                    const uint8_t *src, int src_wrap,
  1125. //                    int width, int height)
  1126. //{
  1127. //    int w, c;
  1128. //    const uint8_t *s1, *s2;
  1129. //    uint8_t *d;
  1130. //    width>>=1;
  1131. //    for(;height > 0; height--) {
  1132. //        s1 = src;
  1133. //        s2 = src + src_wrap;
  1134. //        d = dst;
  1135. //        for(w = width;w > 0; w--) {
  1136. //            c = (s1[0] + s2[0]) >> 1;
  1137. //            d[0] = c;
  1138. //            d[1] = c;
  1139. //            s1++;
  1140. //            s2++;
  1141. //            d += 2;
  1142. //        }
  1143. //        src += src_wrap * 2;
  1144. //        dst += dst_wrap;
  1145. //    }
  1146. //}
  1147. ///* XXX: add jpeg quantize code */
  1148. //#define TRANSP_INDEX (6*6*6)
  1149. ///* this is maybe slow, but allows for extensions */
  1150. //static inline unsigned char gif_clut_index(uint8_t r, uint8_t g, uint8_t b)
  1151. //{
  1152. //    return ((((r)/47)%6)*6*6+(((g)/47)%6)*6+(((b)/47)%6));
  1153. //}
  1154. //static void build_rgb_palette(uint8_t *palette, int has_alpha)
  1155. //{
  1156. //    uint32_t *pal;
  1157. //    static const uint8_t pal_value[6] = { 0x00, 0x33, 0x66, 0x99, 0xcc, 0xff };
  1158. //    int i, r, g, b;
  1159. //    pal = (uint32_t *)palette;
  1160. //    i = 0;
  1161. //    for(r = 0; r < 6; r++) {
  1162. //        for(g = 0; g < 6; g++) {
  1163. //            for(b = 0; b < 6; b++) {
  1164. //                pal[i++] = (0xff << 24) | (pal_value[r] << 16) | 
  1165. //                    (pal_value[g] << 8) | pal_value[b];
  1166. //            }
  1167. //        }
  1168. //    }
  1169. //    if (has_alpha)
  1170. //        pal[i++] = 0;
  1171. //    while (i < 256)
  1172. //        pal[i++] = 0xff000000;
  1173. //}
  1174. ///* copy bit n to bits 0 ... n - 1 */
  1175. //static inline unsigned int bitcopy_n(unsigned int a, int n)
  1176. //{
  1177. //    int mask;
  1178. //    mask = (1 << n) - 1;
  1179. //    return (a & (0xff & ~mask)) | ((-((a >> n) & 1)) & mask);
  1180. //}
  1181. ///* rgb555 handling */
  1182. //#define RGB_NAME rgb555
  1183. //#define RGB_IN(r, g, b, s)
  1184. //{
  1185. //    unsigned int v = ((const uint16_t *)(s))[0];
  1186. //    r = bitcopy_n(v >> (10 - 3), 3);
  1187. //    g = bitcopy_n(v >> (5 - 3), 3);
  1188. //    b = bitcopy_n(v << 3, 3);
  1189. //}
  1190. //#define RGBA_IN(r, g, b, a, s)
  1191. //{
  1192. //    unsigned int v = ((const uint16_t *)(s))[0];
  1193. //    r = bitcopy_n(v >> (10 - 3), 3);
  1194. //    g = bitcopy_n(v >> (5 - 3), 3);
  1195. //    b = bitcopy_n(v << 3, 3);
  1196. //    a = (-(v >> 15)) & 0xff;
  1197. //}
  1198. //#define RGBA_OUT(d, r, g, b, a)
  1199. //{
  1200. //    ((uint16_t *)(d))[0] = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3) | 
  1201. //                           ((a << 8) & 0x8000);
  1202. //}
  1203. //#define BPP 2
  1204. //#include "imgconvert_template.h"
  1205. ///* rgb565 handling */
  1206. //#define RGB_NAME rgb565
  1207. //#define RGB_IN(r, g, b, s)
  1208. //{
  1209. //    unsigned int v = ((const uint16_t *)(s))[0];
  1210. //    r = bitcopy_n(v >> (11 - 3), 3);
  1211. //    g = bitcopy_n(v >> (5 - 2), 2);
  1212. //    b = bitcopy_n(v << 3, 3);
  1213. //}
  1214. //#define RGB_OUT(d, r, g, b)
  1215. //{
  1216. //    ((uint16_t *)(d))[0] = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
  1217. //}
  1218. //#define BPP 2
  1219. //#include "imgconvert_template.h"
  1220. ///* bgr24 handling */
  1221. //#define RGB_NAME bgr24
  1222. //#define RGB_IN(r, g, b, s)
  1223. //{
  1224. //    b = (s)[0];
  1225. //    g = (s)[1];
  1226. //    r = (s)[2];
  1227. //}
  1228. //#define RGB_OUT(d, r, g, b)
  1229. //{
  1230. //    (d)[0] = b;
  1231. //    (d)[1] = g;
  1232. //    (d)[2] = r;
  1233. //}
  1234. //#define BPP 3
  1235. //#include "imgconvert_template.h"
  1236. //#undef RGB_IN
  1237. //#undef RGB_OUT
  1238. //#undef BPP
  1239. ///* rgb24 handling */
  1240. //#define RGB_NAME rgb24
  1241. //#define FMT_RGB24
  1242. //#define RGB_IN(r, g, b, s)
  1243. //{
  1244. //    r = (s)[0];
  1245. //    g = (s)[1];
  1246. //    b = (s)[2];
  1247. //}
  1248. //#define RGB_OUT(d, r, g, b)
  1249. //{
  1250. //    (d)[0] = r;
  1251. //    (d)[1] = g;
  1252. //    (d)[2] = b;
  1253. //}
  1254. //#define BPP 3
  1255. //#include "imgconvert_template.h"
  1256. ///* rgba32 handling */
  1257. //#define RGB_NAME rgba32
  1258. //#define FMT_RGBA32
  1259. //#define RGB_IN(r, g, b, s)
  1260. //{
  1261. //    unsigned int v = ((const uint32_t *)(s))[0];
  1262. //    r = (v >> 16) & 0xff;
  1263. //    g = (v >> 8) & 0xff;
  1264. //    b = v & 0xff;
  1265. //}
  1266. //#define RGBA_IN(r, g, b, a, s)
  1267. //{
  1268. //    unsigned int v = ((const uint32_t *)(s))[0];
  1269. //    a = (v >> 24) & 0xff;
  1270. //    r = (v >> 16) & 0xff;
  1271. //    g = (v >> 8) & 0xff;
  1272. //    b = v & 0xff;
  1273. //}
  1274. //#define RGBA_OUT(d, r, g, b, a)
  1275. //{
  1276. //    ((uint32_t *)(d))[0] = (a << 24) | (r << 16) | (g << 8) | b;
  1277. //}
  1278. //#define BPP 4
  1279. //#include "imgconvert_template.h"
  1280. //static void mono_to_gray(AVPicture *dst, const AVPicture *src,
  1281. //                         int width, int height, int xor_mask)
  1282. //{
  1283. //    const unsigned char *p;
  1284. //    unsigned char *q;
  1285. //    int v, dst_wrap, src_wrap;
  1286. //    int y, w;
  1287. //    p = src->data[0];
  1288. //    src_wrap = src->linesize[0] - ((width + 7) >> 3);
  1289. //    q = dst->data[0];
  1290. //    dst_wrap = dst->linesize[0] - width;
  1291. //    for(y=0;y<height;y++) {
  1292. //        w = width; 
  1293. //        while (w >= 8) {
  1294. //            v = *p++ ^ xor_mask;
  1295. //            q[0] = -(v >> 7);
  1296. //            q[1] = -((v >> 6) & 1);
  1297. //            q[2] = -((v >> 5) & 1);
  1298. //            q[3] = -((v >> 4) & 1);
  1299. //            q[4] = -((v >> 3) & 1);
  1300. //            q[5] = -((v >> 2) & 1);
  1301. //            q[6] = -((v >> 1) & 1);
  1302. //            q[7] = -((v >> 0) & 1);
  1303. //            w -= 8;
  1304. //            q += 8;
  1305. //        }
  1306. //        if (w > 0) {
  1307. //            v = *p++ ^ xor_mask;
  1308. //            do {
  1309. //                q[0] = -((v >> 7) & 1);
  1310. //                q++;
  1311. //                v <<= 1;
  1312. //            } while (--w);
  1313. //        }
  1314. //        p += src_wrap;
  1315. //        q += dst_wrap;
  1316. //    }
  1317. //}
  1318. //static void monowhite_to_gray(AVPicture *dst, const AVPicture *src,
  1319. //                               int width, int height)
  1320. //{
  1321. //    mono_to_gray(dst, src, width, height, 0xff);
  1322. //}
  1323. //static void monoblack_to_gray(AVPicture *dst, const AVPicture *src,
  1324. //                               int width, int height)
  1325. //{
  1326. //    mono_to_gray(dst, src, width, height, 0x00);
  1327. //}
  1328. //static void gray_to_mono(AVPicture *dst, const AVPicture *src,
  1329. //                         int width, int height, int xor_mask)
  1330. //{
  1331. //    int n;
  1332. //    const uint8_t *s;
  1333. //    uint8_t *d;
  1334. //    int j, b, v, n1, src_wrap, dst_wrap, y;
  1335. //    s = src->data[0];
  1336. //    src_wrap = src->linesize[0] - width;
  1337. //    d = dst->data[0];
  1338. //    dst_wrap = dst->linesize[0] - ((width + 7) >> 3);
  1339. //    for(y=0;y<height;y++) {
  1340. //        n = width;
  1341. //        while (n >= 8) {
  1342. //            v = 0;
  1343. //            for(j=0;j<8;j++) {
  1344. //                b = s[0];
  1345. //                s++;
  1346. //                v = (v << 1) | (b >> 7);
  1347. //            }
  1348. //            d[0] = v ^ xor_mask;
  1349. //            d++;
  1350. //            n -= 8;
  1351. //        }
  1352. //        if (n > 0) {
  1353. //            n1 = n;
  1354. //            v = 0;
  1355. //            while (n > 0) {
  1356. //                b = s[0];
  1357. //                s++;
  1358. //                v = (v << 1) | (b >> 7);
  1359. //                n--;
  1360. //            }
  1361. //            d[0] = (v << (8 - (n1 & 7))) ^ xor_mask;
  1362. //            d++;
  1363. //        }
  1364. //        s += src_wrap;
  1365. //        d += dst_wrap;
  1366. //    }
  1367. //}
  1368. //static void gray_to_monowhite(AVPicture *dst, const AVPicture *src,
  1369. //                              int width, int height)
  1370. //{
  1371. //    gray_to_mono(dst, src, width, height, 0xff);
  1372. //}
  1373. //static void gray_to_monoblack(AVPicture *dst, const AVPicture *src,
  1374. //                              int width, int height)
  1375. //{
  1376. //    gray_to_mono(dst, src, width, height, 0x00);
  1377. //}
  1378. //typedef struct ConvertEntry {
  1379. //    void (*convert)(AVPicture *dst,
  1380. //     const AVPicture *src, int width, int height);
  1381. //} ConvertEntry;
  1382. ///* Add each new convertion function in this table. In order to be able
  1383. //   to convert from any format to any format, the following constraints
  1384. //   must be satisfied:
  1385. //   - all FF_COLOR_RGB formats must convert to and from PIX_FMT_RGB24 
  1386. //   - all FF_COLOR_GRAY formats must convert to and from PIX_FMT_GRAY8
  1387. //   - all FF_COLOR_RGB formats with alpha must convert to and from PIX_FMT_RGBA32
  1388. //   - PIX_FMT_YUV444P and PIX_FMT_YUVJ444P must convert to and from
  1389. //     PIX_FMT_RGB24.
  1390. //   - PIX_FMT_422 must convert to and from PIX_FMT_422P.
  1391. //   The other conversion functions are just optimisations for common cases.
  1392. //*/
  1393. //static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = {
  1394. //    [PIX_FMT_YUV420P] = {
  1395. //        [PIX_FMT_RGB555] = { 
  1396. //            .convert = yuv420p_to_rgb555
  1397. //        },
  1398. //        [PIX_FMT_RGB565] = { 
  1399. //            .convert = yuv420p_to_rgb565
  1400. //        },
  1401. //        [PIX_FMT_BGR24] = { 
  1402. //            .convert = yuv420p_to_bgr24
  1403. //        },
  1404. //        [PIX_FMT_RGB24] = { 
  1405. //            .convert = yuv420p_to_rgb24
  1406. //        },
  1407. //        [PIX_FMT_RGBA32] = { 
  1408. //            .convert = yuv420p_to_rgba32
  1409. //        },
  1410. //    },
  1411. //    [PIX_FMT_YUV422P] = { 
  1412. //        [PIX_FMT_YUV422] = { 
  1413. //            .convert = yuv422p_to_yuv422,
  1414. //        },
  1415. //    },
  1416. //    [PIX_FMT_YUV444P] = { 
  1417. //        [PIX_FMT_RGB24] = { 
  1418. //            .convert = yuv444p_to_rgb24
  1419. //        },
  1420. //    },
  1421. //    [PIX_FMT_YUVJ420P] = {
  1422. //        [PIX_FMT_RGB555] = { 
  1423. //            .convert = yuvj420p_to_rgb555
  1424. //        },
  1425. //        [PIX_FMT_RGB565] = { 
  1426. //            .convert = yuvj420p_to_rgb565
  1427. //        },
  1428. //        [PIX_FMT_BGR24] = { 
  1429. //            .convert = yuvj420p_to_bgr24
  1430. //        },
  1431. //        [PIX_FMT_RGB24] = { 
  1432. //            .convert = yuvj420p_to_rgb24
  1433. //        },
  1434. //        [PIX_FMT_RGBA32] = { 
  1435. //            .convert = yuvj420p_to_rgba32
  1436. //        },
  1437. //    },
  1438. //    [PIX_FMT_YUVJ444P] = { 
  1439. //        [PIX_FMT_RGB24] = { 
  1440. //            .convert = yuvj444p_to_rgb24
  1441. //        },
  1442. //    },
  1443. //    [PIX_FMT_YUV422] = { 
  1444. //        [PIX_FMT_YUV420P] = { 
  1445. //            .convert = yuv422_to_yuv420p,
  1446. //        },
  1447. //        [PIX_FMT_YUV422P] = { 
  1448. //            .convert = yuv422_to_yuv422p,
  1449. //        },
  1450. //    },
  1451. //    [PIX_FMT_RGB24] = {
  1452. //        [PIX_FMT_YUV420P] = { 
  1453. //            .convert = rgb24_to_yuv420p
  1454. //        },
  1455. //        [PIX_FMT_RGB565] = { 
  1456. //            .convert = rgb24_to_rgb565
  1457. //        },
  1458. //        [PIX_FMT_RGB555] = { 
  1459. //            .convert = rgb24_to_rgb555
  1460. //        },
  1461. //        [PIX_FMT_RGBA32] = { 
  1462. //            .convert = rgb24_to_rgba32
  1463. //        },
  1464. //        [PIX_FMT_BGR24] = { 
  1465. //            .convert = rgb24_to_bgr24
  1466. //        },
  1467. //        [PIX_FMT_GRAY8] = { 
  1468. //            .convert = rgb24_to_gray
  1469. //        },
  1470. //        [PIX_FMT_PAL8] = {
  1471. //            .convert = rgb24_to_pal8
  1472. //        },
  1473. //        [PIX_FMT_YUV444P] = { 
  1474. //            .convert = rgb24_to_yuv444p
  1475. //        },
  1476. //        [PIX_FMT_YUVJ420P] = { 
  1477. //            .convert = rgb24_to_yuvj420p
  1478. //        },
  1479. //        [PIX_FMT_YUVJ444P] = { 
  1480. //            .convert = rgb24_to_yuvj444p
  1481. //        },
  1482. //    },
  1483. //    [PIX_FMT_RGBA32] = {
  1484. //        [PIX_FMT_RGB24] = { 
  1485. //            .convert = rgba32_to_rgb24
  1486. //        },
  1487. //        [PIX_FMT_RGB555] = { 
  1488. //            .convert = rgba32_to_rgb555
  1489. //        },
  1490. //        [PIX_FMT_PAL8] = { 
  1491. //            .convert = rgba32_to_pal8
  1492. //        },
  1493. //        [PIX_FMT_YUV420P] = { 
  1494. //            .convert = rgba32_to_yuv420p
  1495. //        },
  1496. //        [PIX_FMT_GRAY8] = { 
  1497. //            .convert = rgba32_to_gray
  1498. //        },
  1499. //    },
  1500. //    [PIX_FMT_BGR24] = {
  1501. //        [PIX_FMT_RGB24] = { 
  1502. //            .convert = bgr24_to_rgb24
  1503. //        },
  1504. //        [PIX_FMT_YUV420P] = { 
  1505. //            .convert = bgr24_to_yuv420p
  1506. //        },
  1507. //        [PIX_FMT_GRAY8] = { 
  1508. //            .convert = bgr24_to_gray
  1509. //        },
  1510. //    },
  1511. //    [PIX_FMT_RGB555] = {
  1512. //        [PIX_FMT_RGB24] = { 
  1513. //            .convert = rgb555_to_rgb24
  1514. //        },
  1515. //        [PIX_FMT_RGBA32] = { 
  1516. //            .convert = rgb555_to_rgba32
  1517. //        },
  1518. //        [PIX_FMT_YUV420P] = { 
  1519. //            .convert = rgb555_to_yuv420p
  1520. //        },
  1521. //        [PIX_FMT_GRAY8] = { 
  1522. //            .convert = rgb555_to_gray
  1523. //        },
  1524. //    },
  1525. //    [PIX_FMT_RGB565] = {
  1526. //        [PIX_FMT_RGB24] = { 
  1527. //            .convert = rgb565_to_rgb24
  1528. //        },
  1529. //        [PIX_FMT_YUV420P] = { 
  1530. //            .convert = rgb565_to_yuv420p
  1531. //        },
  1532. //        [PIX_FMT_GRAY8] = { 
  1533. //            .convert = rgb565_to_gray
  1534. //        },
  1535. //    },
  1536. //    [PIX_FMT_GRAY8] = {
  1537. //        [PIX_FMT_RGB555] = { 
  1538. //            .convert = gray_to_rgb555
  1539. //        },
  1540. //        [PIX_FMT_RGB565] = { 
  1541. //            .convert = gray_to_rgb565
  1542. //        },
  1543. //        [PIX_FMT_RGB24] = { 
  1544. //            .convert = gray_to_rgb24
  1545. //        },
  1546. //        [PIX_FMT_BGR24] = { 
  1547. //            .convert = gray_to_bgr24
  1548. //        },
  1549. //        [PIX_FMT_RGBA32] = { 
  1550. //            .convert = gray_to_rgba32
  1551. //        },
  1552. //        [PIX_FMT_MONOWHITE] = { 
  1553. //            .convert = gray_to_monowhite
  1554. //        },
  1555. //        [PIX_FMT_MONOBLACK] = { 
  1556. //            .convert = gray_to_monoblack
  1557. //        },
  1558. //    },
  1559. //    [PIX_FMT_MONOWHITE] = {
  1560. //        [PIX_FMT_GRAY8] = { 
  1561. //            .convert = monowhite_to_gray
  1562. //        },
  1563. //    },
  1564. //    [PIX_FMT_MONOBLACK] = {
  1565. //        [PIX_FMT_GRAY8] = { 
  1566. //            .convert = monoblack_to_gray
  1567. //        },
  1568. //    },
  1569. //    [PIX_FMT_PAL8] = {
  1570. //        [PIX_FMT_RGB555] = { 
  1571. //            .convert = pal8_to_rgb555
  1572. //        },
  1573. //        [PIX_FMT_RGB565] = { 
  1574. //            .convert = pal8_to_rgb565
  1575. //        },
  1576. //        [PIX_FMT_BGR24] = { 
  1577. //            .convert = pal8_to_bgr24
  1578. //        },
  1579. //        [PIX_FMT_RGB24] = { 
  1580. //            .convert = pal8_to_rgb24
  1581. //        },
  1582. //        [PIX_FMT_RGBA32] = { 
  1583. //            .convert = pal8_to_rgba32
  1584. //        },
  1585. //    },
  1586. //};
  1587. //int avpicture_alloc(AVPicture *picture,
  1588. //                           int pix_fmt, int width, int height)
  1589. //{
  1590. //    unsigned int size;
  1591. //    void *ptr;
  1592. //    size = avpicture_get_size(pix_fmt, width, height);
  1593. //    ptr = av_malloc(size);
  1594. //    if (!ptr)
  1595. //        goto fail;
  1596. //    avpicture_fill(picture, ptr, pix_fmt, width, height);
  1597. //    return 0;
  1598. // fail:
  1599. //    memset(picture, 0, sizeof(AVPicture));
  1600. //    return -1;
  1601. //}
  1602. //void avpicture_free(AVPicture *picture)
  1603. //{
  1604. //    av_free(picture->data[0]);
  1605. //}
  1606. ///* return true if yuv planar */
  1607. //static inline int is_yuv_planar(PixFmtInfo *ps)
  1608. //{
  1609. //    return (ps->color_type == FF_COLOR_YUV ||
  1610. //            ps->color_type == FF_COLOR_YUV_JPEG) && 
  1611. //        ps->pixel_type == FF_PIXEL_PLANAR;
  1612. //}
  1613. ///* XXX: always use linesize. Return -1 if not supported */
  1614. //int img_convert(AVPicture *dst, int dst_pix_fmt,
  1615. //                const AVPicture *src, int src_pix_fmt, 
  1616. //                int src_width, int src_height)
  1617. //{
  1618. //    static int inited;
  1619. //    int i, ret, dst_width, dst_height, int_pix_fmt;
  1620. //    PixFmtInfo *src_pix, *dst_pix;
  1621. //    ConvertEntry *ce;
  1622. //    AVPicture tmp1, *tmp = &tmp1;
  1623. //    if (src_pix_fmt < 0 || src_pix_fmt >= PIX_FMT_NB ||
  1624. //        dst_pix_fmt < 0 || dst_pix_fmt >= PIX_FMT_NB)
  1625. //        return -1;
  1626. //    if (src_width <= 0 || src_height <= 0)
  1627. //        return 0;
  1628. //    if (!inited) {
  1629. //        inited = 1;
  1630. //        img_convert_init();
  1631. //    }
  1632. //    dst_width = src_width;
  1633. //    dst_height = src_height;
  1634. //    dst_pix = &pix_fmt_info[dst_pix_fmt];
  1635. //    src_pix = &pix_fmt_info[src_pix_fmt];
  1636. //    if (src_pix_fmt == dst_pix_fmt) {
  1637. //        /* no conversion needed: just copy */
  1638. //        img_copy(dst, src, dst_pix_fmt, dst_width, dst_height);
  1639. //        return 0;
  1640. //    }
  1641. //    ce = &convert_table[src_pix_fmt][dst_pix_fmt];
  1642. //    if (ce->convert) {
  1643. //        /* specific convertion routine */
  1644. //        ce->convert(dst, src, dst_width, dst_height);
  1645. //        return 0;
  1646. //    }
  1647. //    /* gray to YUV */
  1648. //    if (is_yuv_planar(dst_pix) &&
  1649. //        src_pix_fmt == PIX_FMT_GRAY8) {
  1650. //        int w, h, y;
  1651. //        uint8_t *d;
  1652. //        if (dst_pix->color_type == FF_COLOR_YUV_JPEG) {
  1653. //            img_copy_plane(dst->data[0], dst->linesize[0],
  1654. //                     src->data[0], src->linesize[0],
  1655. //                     dst_width, dst_height);
  1656. //        } else {
  1657. //            img_apply_table(dst->data[0], dst->linesize[0],
  1658. //                            src->data[0], src->linesize[0],
  1659. //                            dst_width, dst_height,
  1660. //                            y_jpeg_to_ccir);
  1661. //        }
  1662. //        /* fill U and V with 128 */
  1663. //        w = dst_width;
  1664. //        h = dst_height;
  1665. //        w >>= dst_pix->x_chroma_shift;
  1666. //        h >>= dst_pix->y_chroma_shift;
  1667. //        for(i = 1; i <= 2; i++) {
  1668. //            d = dst->data[i];
  1669. //            for(y = 0; y< h; y++) {
  1670. //                memset(d, 128, w);
  1671. //                d += dst->linesize[i];
  1672. //            }
  1673. //        }
  1674. //        return 0;
  1675. //    }
  1676. //    /* YUV to gray */
  1677. //    if (is_yuv_planar(src_pix) && 
  1678. //        dst_pix_fmt == PIX_FMT_GRAY8) {
  1679. //        if (src_pix->color_type == FF_COLOR_YUV_JPEG) {
  1680. //            img_copy_plane(dst->data[0], dst->linesize[0],
  1681. //                     src->data[0], src->linesize[0],
  1682. //                     dst_width, dst_height);
  1683. //        } else {
  1684. //            img_apply_table(dst->data[0], dst->linesize[0],
  1685. //                            src->data[0], src->linesize[0],
  1686. //                            dst_width, dst_height,
  1687. //                            y_ccir_to_jpeg);
  1688. //        }
  1689. //        return 0;
  1690. //    }
  1691. //    /* YUV to YUV planar */
  1692. //    if (is_yuv_planar(dst_pix) && is_yuv_planar(src_pix)) {
  1693. //        int x_shift, y_shift, w, h, xy_shift;
  1694. //        void (*resize_func)(uint8_t *dst, int dst_wrap, 
  1695. //                            const uint8_t *src, int src_wrap,
  1696. //                            int width, int height);
  1697. //        /* compute chroma size of the smallest dimensions */
  1698. //        w = dst_width;
  1699. //        h = dst_height;
  1700. //        if (dst_pix->x_chroma_shift >= src_pix->x_chroma_shift)
  1701. //            w >>= dst_pix->x_chroma_shift;
  1702. //        else
  1703. //            w >>= src_pix->x_chroma_shift;
  1704. //        if (dst_pix->y_chroma_shift >= src_pix->y_chroma_shift)
  1705. //            h >>= dst_pix->y_chroma_shift;
  1706. //        else
  1707. //            h >>= src_pix->y_chroma_shift;
  1708. //        x_shift = (dst_pix->x_chroma_shift - src_pix->x_chroma_shift);
  1709. //        y_shift = (dst_pix->y_chroma_shift - src_pix->y_chroma_shift);
  1710. //        xy_shift = ((x_shift & 0xf) << 4) | (y_shift & 0xf);
  1711. //        /* there must be filters for conversion at least from and to
  1712. //           YUV444 format */
  1713. //        switch(xy_shift) {
  1714. //        case 0x00:
  1715. //            resize_func = img_copy_plane;
  1716. //            break;
  1717. //        case 0x10:
  1718. //            resize_func = shrink21;
  1719. //            break;
  1720. //        case 0x20:
  1721. //            resize_func = shrink41;
  1722. //            break;
  1723. //        case 0x01:
  1724. //            resize_func = shrink12;
  1725. //            break;
  1726. //        case 0x11:
  1727. //            resize_func = shrink22;
  1728. //            break;
  1729. //        case 0x22:
  1730. //            resize_func = shrink44;
  1731. //            break;
  1732. //        case 0xf0:
  1733. //            resize_func = grow21;
  1734. //            break;
  1735. //        case 0xe0:
  1736. //            resize_func = grow41;
  1737. //            break;
  1738. //        case 0xff:
  1739. //            resize_func = grow22;
  1740. //            break;
  1741. //        case 0xee:
  1742. //            resize_func = grow44;
  1743. //            break;
  1744. //        case 0xf1:
  1745. //            resize_func = conv411;
  1746. //            break;
  1747. //        default:
  1748. //            /* currently not handled */
  1749. //            goto no_chroma_filter;
  1750. //        }
  1751. //        img_copy_plane(dst->data[0], dst->linesize[0],
  1752. //                       src->data[0], src->linesize[0],
  1753. //                       dst_width, dst_height);
  1754. //        for(i = 1;i <= 2; i++)
  1755. //            resize_func(dst->data[i], dst->linesize[i],
  1756. //                        src->data[i], src->linesize[i],
  1757. //                        dst_width>>dst_pix->x_chroma_shift, dst_height>>dst_pix->y_chroma_shift);
  1758. //        /* if yuv color space conversion is needed, we do it here on
  1759. //           the destination image */
  1760. //        if (dst_pix->color_type != src_pix->color_type) {
  1761. //            const uint8_t *y_table, *c_table;
  1762. //            if (dst_pix->color_type == FF_COLOR_YUV) {
  1763. //                y_table = y_jpeg_to_ccir;
  1764. //                c_table = c_jpeg_to_ccir;
  1765. //            } else {
  1766. //                y_table = y_ccir_to_jpeg;
  1767. //                c_table = c_ccir_to_jpeg;
  1768. //            }
  1769. //            img_apply_table(dst->data[0], dst->linesize[0],
  1770. //                            dst->data[0], dst->linesize[0],
  1771. //                            dst_width, dst_height,
  1772. //                            y_table);
  1773. //            for(i = 1;i <= 2; i++)
  1774. //                img_apply_table(dst->data[i], dst->linesize[i],
  1775. //                                dst->data[i], dst->linesize[i],
  1776. //                                dst_width>>dst_pix->x_chroma_shift, 
  1777. //                                dst_height>>dst_pix->y_chroma_shift,
  1778. //                                c_table);
  1779. //        }
  1780. //        return 0;
  1781. //    }
  1782. // no_chroma_filter:
  1783. //    /* try to use an intermediate format */
  1784. //    if (src_pix_fmt == PIX_FMT_YUV422 ||
  1785. //        dst_pix_fmt == PIX_FMT_YUV422) {
  1786. //        /* specific case: convert to YUV422P first */
  1787. //        int_pix_fmt = PIX_FMT_YUV422P;
  1788. //    } else if ((src_pix->color_type == FF_COLOR_GRAY &&
  1789. //                src_pix_fmt != PIX_FMT_GRAY8) || 
  1790. //               (dst_pix->color_type == FF_COLOR_GRAY &&
  1791. //                dst_pix_fmt != PIX_FMT_GRAY8)) {
  1792. //        /* gray8 is the normalized format */
  1793. //        int_pix_fmt = PIX_FMT_GRAY8;
  1794. //    } else if ((is_yuv_planar(src_pix) && 
  1795. //                src_pix_fmt != PIX_FMT_YUV444P &&
  1796. //                src_pix_fmt != PIX_FMT_YUVJ444P)) {
  1797. //        /* yuv444 is the normalized format */
  1798. //        if (src_pix->color_type == FF_COLOR_YUV_JPEG)
  1799. //            int_pix_fmt = PIX_FMT_YUVJ444P;
  1800. //        else
  1801. //            int_pix_fmt = PIX_FMT_YUV444P;
  1802. //    } else if ((is_yuv_planar(dst_pix) && 
  1803. //                dst_pix_fmt != PIX_FMT_YUV444P &&
  1804. //                dst_pix_fmt != PIX_FMT_YUVJ444P)) {
  1805. //        /* yuv444 is the normalized format */
  1806. //        if (dst_pix->color_type == FF_COLOR_YUV_JPEG)
  1807. //            int_pix_fmt = PIX_FMT_YUVJ444P;
  1808. //        else
  1809. //            int_pix_fmt = PIX_FMT_YUV444P;
  1810. //    } else {
  1811. //        /* the two formats are rgb or gray8 or yuv[j]444p */
  1812. //        if (src_pix->is_alpha && dst_pix->is_alpha)
  1813. //            int_pix_fmt = PIX_FMT_RGBA32;
  1814. //        else
  1815. //            int_pix_fmt = PIX_FMT_RGB24;
  1816. //    }
  1817. //    if (avpicture_alloc(tmp, int_pix_fmt, dst_width, dst_height) < 0)
  1818. //        return -1;
  1819. //    ret = -1;
  1820. //    if (img_convert(tmp, int_pix_fmt,
  1821. //                    src, src_pix_fmt, src_width, src_height) < 0)
  1822. //        goto fail1;
  1823. //    if (img_convert(dst, dst_pix_fmt,
  1824. //                    tmp, int_pix_fmt, dst_width, dst_height) < 0)
  1825. //        goto fail1;
  1826. //    ret = 0;
  1827. // fail1:
  1828. //    avpicture_free(tmp);
  1829. //    return ret;
  1830. //}
  1831. ///* NOTE: we scan all the pixels to have an exact information */
  1832. //static int get_alpha_info_pal8(const AVPicture *src, int width, int height)
  1833. //{
  1834. //    const unsigned char *p;
  1835. //    int src_wrap, ret, x, y;
  1836. //    unsigned int a;
  1837. //    uint32_t *palette = (uint32_t *)src->data[1];
  1838. //    
  1839. //    p = src->data[0];
  1840. //    src_wrap = src->linesize[0] - width;
  1841. //    ret = 0;
  1842. //    for(y=0;y<height;y++) {
  1843. //        for(x=0;x<width;x++) {
  1844. //            a = palette[p[0]] >> 24;
  1845. //            if (a == 0x00) {
  1846. //                ret |= FF_ALPHA_TRANSP;
  1847. //            } else if (a != 0xff) {
  1848. //                ret |= FF_ALPHA_SEMI_TRANSP;
  1849. //            }
  1850. //            p++;
  1851. //        }
  1852. //        p += src_wrap;
  1853. //    }
  1854. //    return ret;
  1855. //}
  1856. ///**
  1857. // * Tell if an image really has transparent alpha values.
  1858. // * @return ored mask of FF_ALPHA_xxx constants
  1859. // */
  1860. //int img_get_alpha_info(const AVPicture *src,
  1861. //        int pix_fmt, int width, int height)
  1862. //{
  1863. //    PixFmtInfo *pf = &pix_fmt_info[pix_fmt];
  1864. //    int ret;
  1865. //    pf = &pix_fmt_info[pix_fmt];
  1866. //    /* no alpha can be represented in format */
  1867. //    if (!pf->is_alpha)
  1868. //        return 0;
  1869. //    switch(pix_fmt) {
  1870. //    case PIX_FMT_RGBA32:
  1871. //        ret = get_alpha_info_rgba32(src, width, height);
  1872. //        break;
  1873. //    case PIX_FMT_RGB555:
  1874. //        ret = get_alpha_info_rgb555(src, width, height);
  1875. //        break;
  1876. //    case PIX_FMT_PAL8:
  1877. //        ret = get_alpha_info_pal8(src, width, height);
  1878. //        break;
  1879. //    default:
  1880. //        /* we do not know, so everything is indicated */
  1881. //        ret = FF_ALPHA_TRANSP | FF_ALPHA_SEMI_TRANSP;
  1882. //        break;
  1883. //    }
  1884. //    return ret;
  1885. //}
  1886. //#ifdef HAVE_MMX
  1887. //#define DEINT_INPLACE_LINE_LUM 
  1888. //                    movd_m2r(lum_m4[0],mm0);
  1889. //                    movd_m2r(lum_m3[0],mm1);
  1890. //                    movd_m2r(lum_m2[0],mm2);
  1891. //                    movd_m2r(lum_m1[0],mm3);
  1892. //                    movd_m2r(lum[0],mm4);
  1893. //                    punpcklbw_r2r(mm7,mm0);
  1894. //                    movd_r2m(mm2,lum_m4[0]);
  1895. //                    punpcklbw_r2r(mm7,mm1);
  1896. //                    punpcklbw_r2r(mm7,mm2);
  1897. //                    punpcklbw_r2r(mm7,mm3);
  1898. //                    punpcklbw_r2r(mm7,mm4);
  1899. //                    paddw_r2r(mm3,mm1);
  1900. //                    psllw_i2r(1,mm2);
  1901. //                    paddw_r2r(mm4,mm0);
  1902. //                    psllw_i2r(2,mm1);
  1903. //                    paddw_r2r(mm6,mm2);
  1904. //                    paddw_r2r(mm2,mm1);
  1905. //                    psubusw_r2r(mm0,mm1);
  1906. //                    psrlw_i2r(3,mm1);
  1907. //                    packuswb_r2r(mm7,mm1);
  1908. //                    movd_r2m(mm1,lum_m2[0]);
  1909. //#define DEINT_LINE_LUM 
  1910. //                    movd_m2r(lum_m4[0],mm0);
  1911. //                    movd_m2r(lum_m3[0],mm1);
  1912. //                    movd_m2r(lum_m2[0],mm2);
  1913. //                    movd_m2r(lum_m1[0],mm3);
  1914. //                    movd_m2r(lum[0],mm4);
  1915. //                    punpcklbw_r2r(mm7,mm0);
  1916. //                    punpcklbw_r2r(mm7,mm1);
  1917. //                    punpcklbw_r2r(mm7,mm2);
  1918. //                    punpcklbw_r2r(mm7,mm3);
  1919. //                    punpcklbw_r2r(mm7,mm4);
  1920. //                    paddw_r2r(mm3,mm1);
  1921. //                    psllw_i2r(1,mm2);
  1922. //                    paddw_r2r(mm4,mm0);
  1923. //                    psllw_i2r(2,mm1);
  1924. //                    paddw_r2r(mm6,mm2);
  1925. //                    paddw_r2r(mm2,mm1);
  1926. //                    psubusw_r2r(mm0,mm1);
  1927. //                    psrlw_i2r(3,mm1);
  1928. //                    packuswb_r2r(mm7,mm1);
  1929. //                    movd_r2m(mm1,dst[0]);
  1930. //#endif
  1931. ///* filter parameters: [-1 4 2 4 -1] // 8 */
  1932. //static void deinterlace_line(uint8_t *dst, 
  1933. //      const uint8_t *lum_m4, const uint8_t *lum_m3, 
  1934. //      const uint8_t *lum_m2, const uint8_t *lum_m1, 
  1935. //      const uint8_t *lum,
  1936. //      int size)
  1937. //{
  1938. //#ifndef HAVE_MMX
  1939. //    uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1940. //    int sum;
  1941. //    for(;size > 0;size--) {
  1942. //        sum = -lum_m4[0];
  1943. //        sum += lum_m3[0] << 2;
  1944. //        sum += lum_m2[0] << 1;
  1945. //        sum += lum_m1[0] << 2;
  1946. //        sum += -lum[0];
  1947. //        dst[0] = cm[(sum + 4) >> 3];
  1948. //        lum_m4++;
  1949. //        lum_m3++;
  1950. //        lum_m2++;
  1951. //        lum_m1++;
  1952. //        lum++;
  1953. //        dst++;
  1954. //    }
  1955. //#else
  1956. //    {
  1957. //        mmx_t rounder;
  1958. //        rounder.uw[0]=4;
  1959. //        rounder.uw[1]=4;
  1960. //        rounder.uw[2]=4;
  1961. //        rounder.uw[3]=4;
  1962. //        pxor_r2r(mm7,mm7);
  1963. //        movq_m2r(rounder,mm6);
  1964. //    }
  1965. //    for (;size > 3; size-=4) {
  1966. //        DEINT_LINE_LUM
  1967. //        lum_m4+=4;
  1968. //        lum_m3+=4;
  1969. //        lum_m2+=4;
  1970. //        lum_m1+=4;
  1971. //        lum+=4;
  1972. //        dst+=4;
  1973. //    }
  1974. //#endif
  1975. //}
  1976. //static void deinterlace_line_inplace(uint8_t *lum_m4, uint8_t *lum_m3, uint8_t *lum_m2, uint8_t *lum_m1, uint8_t *lum,
  1977. //                             int size)
  1978. //{
  1979. //#ifndef HAVE_MMX
  1980. //    uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1981. //    int sum;
  1982. //    for(;size > 0;size--) {
  1983. //        sum = -lum_m4[0];
  1984. //        sum += lum_m3[0] << 2;
  1985. //        sum += lum_m2[0] << 1;
  1986. //        lum_m4[0]=lum_m2[0];
  1987. //        sum += lum_m1[0] << 2;
  1988. //        sum += -lum[0];
  1989. //        lum_m2[0] = cm[(sum + 4) >> 3];
  1990. //        lum_m4++;
  1991. //        lum_m3++;
  1992. //        lum_m2++;
  1993. //        lum_m1++;
  1994. //        lum++;
  1995. //    }
  1996. //#else
  1997. //    {
  1998. //        mmx_t rounder;
  1999. //        rounder.uw[0]=4;
  2000. //        rounder.uw[1]=4;
  2001. //        rounder.uw[2]=4;
  2002. //        rounder.uw[3]=4;
  2003. //        pxor_r2r(mm7,mm7);
  2004. //        movq_m2r(rounder,mm6);
  2005. //    }
  2006. //    for (;size > 3; size-=4) {
  2007. //        DEINT_INPLACE_LINE_LUM
  2008. //        lum_m4+=4;
  2009. //        lum_m3+=4;
  2010. //        lum_m2+=4;
  2011. //        lum_m1+=4;
  2012. //        lum+=4;
  2013. //    }
  2014. //#endif
  2015. //}
  2016. ///* deinterlacing : 2 temporal taps, 3 spatial taps linear filter. The
  2017. //   top field is copied as is, but the bottom field is deinterlaced
  2018. //   against the top field. */
  2019. //static void deinterlace_bottom_field(uint8_t *dst, int dst_wrap,
  2020. //                                    const uint8_t *src1, int src_wrap,
  2021. //                                    int width, int height)
  2022. //{
  2023. //    const uint8_t *src_m2, *src_m1, *src_0, *src_p1, *src_p2;
  2024. //    int y;
  2025. //    src_m2 = src1;
  2026. //    src_m1 = src1;
  2027. //    src_0=&src_m1[src_wrap];
  2028. //    src_p1=&src_0[src_wrap];
  2029. //    src_p2=&src_p1[src_wrap];
  2030. //    for(y=0;y<(height-2);y+=2) {
  2031. //        memcpy(dst,src_m1,width);
  2032. //        dst += dst_wrap;
  2033. //        deinterlace_line(dst,src_m2,src_m1,src_0,src_p1,src_p2,width);
  2034. //        src_m2 = src_0;
  2035. //        src_m1 = src_p1;
  2036. //        src_0 = src_p2;
  2037. //        src_p1 += 2*src_wrap;
  2038. //        src_p2 += 2*src_wrap;
  2039. //        dst += dst_wrap;
  2040. //    }
  2041. //    memcpy(dst,src_m1,width);
  2042. //    dst += dst_wrap;
  2043. //    /* do last line */
  2044. //    deinterlace_line(dst,src_m2,src_m1,src_0,src_0,src_0,width);
  2045. //}
  2046. //static void deinterlace_bottom_field_inplace(uint8_t *src1, int src_wrap,
  2047. //      int width, int height)
  2048. //{
  2049. //    uint8_t *src_m1, *src_0, *src_p1, *src_p2;
  2050. //    int y;
  2051. //    uint8_t *buf;
  2052. //    buf = (uint8_t*)av_malloc(width);
  2053. //    src_m1 = src1;
  2054. //    memcpy(buf,src_m1,width);
  2055. //    src_0=&src_m1[src_wrap];
  2056. //    src_p1=&src_0[src_wrap];
  2057. //    src_p2=&src_p1[src_wrap];
  2058. //    for(y=0;y<(height-2);y+=2) {
  2059. //        deinterlace_line_inplace(buf,src_m1,src_0,src_p1,src_p2,width);
  2060. //        src_m1 = src_p1;
  2061. //        src_0 = src_p2;
  2062. //        src_p1 += 2*src_wrap;
  2063. //        src_p2 += 2*src_wrap;
  2064. //    }
  2065. //    /* do last line */
  2066. //    deinterlace_line_inplace(buf,src_m1,src_0,src_0,src_0,width);
  2067. //    av_free(buf);
  2068. //}
  2069. ///* deinterlace - if not supported return -1 */
  2070. //int avpicture_deinterlace(AVPicture *dst, const AVPicture *src,
  2071. //                          int pix_fmt, int width, int height)
  2072. //{
  2073. //    int i;
  2074. //    if (pix_fmt != PIX_FMT_YUV420P &&
  2075. //        pix_fmt != PIX_FMT_YUV422P &&
  2076. //        pix_fmt != PIX_FMT_YUV444P &&
  2077. // pix_fmt != PIX_FMT_YUV411P)
  2078. //        return -1;
  2079. //    if ((width & 3) != 0 || (height & 3) != 0)
  2080. //        return -1;
  2081. //    for(i=0;i<3;i++) {
  2082. //        if (i == 1) {
  2083. //            switch(pix_fmt) {
  2084. //            case PIX_FMT_YUV420P:
  2085. //                width >>= 1;
  2086. //                height >>= 1;
  2087. //                break;
  2088. //            case PIX_FMT_YUV422P:
  2089. //                width >>= 1;
  2090. //                break;
  2091. //            case PIX_FMT_YUV411P:
  2092. //                width >>= 2;
  2093. //                break;
  2094. //            default:
  2095. //                break;
  2096. //            }
  2097. //        }
  2098. //        if (src == dst) {
  2099. //            deinterlace_bottom_field_inplace(dst->data[i], dst->linesize[i],
  2100. //                                 width, height);
  2101. //        } else {
  2102. //            deinterlace_bottom_field(dst->data[i],dst->linesize[i],
  2103. //                                        src->data[i], src->linesize[i],
  2104. //                                        width, height);
  2105. //        }
  2106. //    }
  2107. //#ifdef HAVE_MMX
  2108. //    emms();
  2109. //#endif
  2110. //    return 0;
  2111. //}
  2112. //#undef FIX