Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

(Updated) Moderately optimized JPEG encoder.

By: cr88192 on Jun 13th, 2013  |  syntax: C  |  size: 32.51 KB  |  views: 27  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. /*
  2. Copyright (C) 2013 by Brendan G Bohannon
  3. Email: cr88192@gmail.com
  4. Copying: http://pastebin.com/iJxtZHm6
  5.  */
  6.  
  7. /*
  8. From the header:
  9. #define BGBBTJ_JPG_RGBA                 0
  10. #define BGBBTJ_JPG_RGB                  1
  11. #define BGBBTJ_JPG_BGRA                 3
  12. #define BGBBTJ_JPG_BGR                  4
  13. #define BGBBTJ_JPG_YUVA                 5
  14. #define BGBBTJ_JPG_YUV                  6
  15. #define BGBBTJ_JPG_Y                    7
  16. #define BGBBTJ_JPG_YA                   8
  17. #define BGBBTJ_JPG_YUV422               9       //YYUV
  18. #define BGBBTJ_JPG_YUV420               10      //YYU/YYV
  19.  
  20. #define BGBBTJ_JPG_YYYA                 11
  21. #define BGBBTJ_JPG_ARGB                 12
  22. #define BGBBTJ_JPG_ABGR                 13
  23.  
  24. struct BGBBTJ_JFE_Context_s
  25. {
  26. // byte *cs;    //current pos in bitstream (input)
  27. byte *ct;       //current pos in bitstream (output)
  28. uint win;       //bitstream window
  29. int pos;        //bitstream offset
  30.  
  31. byte qt[4][64];
  32. int qtfp[4][64];
  33.  
  34. short *ydb, *udb, *vdb;
  35. int lxs, lys, lqf;
  36. };
  37.  
  38. */
  39.  
  40. #include <bgbbtj.h>
  41. #include <math.h>
  42.  
  43. #define DCTSZ   8
  44. #define DCTSZ2  64
  45.  
  46. #define JPG_SOF0        0xC0
  47. #define JPG_SOF1        0xC1
  48. #define JPG_SOF2        0xC2
  49. #define JPG_SOF3        0xC3
  50. #define JPG_DHT         0xC4
  51. #define JPG_SOF5        0xC5
  52. #define JPG_SOF6        0xC6
  53. #define JPG_SOF7        0xC7
  54. #define JPG_JPG         0xC8
  55. #define JPG_SOF9        0xC9
  56. #define JPG_SOF10       0xCA
  57. #define JPG_SOF11       0xCB
  58. #define JPG_DAC         0xCC
  59. #define JPG_SOF13       0xCD
  60. #define JPG_SOF14       0xCE
  61. #define JPG_SOF15       0xCF
  62.  
  63. #define JPG_RST0        0xD0
  64. #define JPG_RST1        0xD1
  65. #define JPG_RST2        0xD2
  66. #define JPG_RST3        0xD3
  67. #define JPG_RST4        0xD4
  68. #define JPG_RST5        0xD5
  69. #define JPG_RST6        0xD6
  70. #define JPG_RST7        0xD7
  71.  
  72. #define JPG_SOI         0xD8
  73. #define JPG_EOI         0xD9
  74. #define JPG_SOS         0xDA
  75. #define JPG_DQT         0xDB
  76. #define JPG_DNL         0xDC
  77. #define JPG_DRI         0xDD
  78. #define JPG_DHP         0xDE
  79. #define JPG_EXP         0xDF
  80.  
  81. #define JPG_APP0        0xE0
  82. #define JPG_APP1        0xE1
  83. #define JPG_APP2        0xE2
  84. #define JPG_APP3        0xE3
  85. #define JPG_APP4        0xE4
  86. #define JPG_APP5        0xE5
  87. #define JPG_APP6        0xE6
  88. #define JPG_APP7        0xE7
  89. #define JPG_APP8        0xE8
  90. #define JPG_APP9        0xE9
  91. #define JPG_APP10       0xEA
  92. #define JPG_APP11       0xEB
  93. #define JPG_APP12       0xEC
  94. #define JPG_APP13       0xED
  95. #define JPG_APP14       0xEE
  96. #define JPG_APP15       0xEF
  97.  
  98. #define JPG_JPG0        0xF0
  99. #define JPG_JPG1        0xF1
  100. #define JPG_JPG2        0xF2
  101. #define JPG_JPG3        0xF3
  102. #define JPG_JPG4        0xF4
  103. #define JPG_JPG5        0xF5
  104. #define JPG_JPG6        0xF6
  105. #define JPG_JPG7        0xF7
  106. #define JPG_JPG8        0xF8
  107. #define JPG_JPG9        0xF9
  108. #define JPG_JPG10       0xFA
  109. #define JPG_JPG11       0xFB
  110. #define JPG_JPG12       0xFC
  111. #define JPG_JPG13       0xFD
  112. #define JPG_COM         0xFE
  113.  
  114. char *btj_jfe_marker[]={
  115. "SOF0", "SOF1", "SOF2", "SOF3", "DHT", "SOF5", "SOF6", "SOF7",
  116. "JPG", "SOF9", "SOF10", "SOF11", "DAC", "SOF13", "SOF14", "SOF15",
  117. "RST0", "RST1", "RST2", "RST3", "RST4", "RST5", "RST6", "RST7",
  118. "SOI", "EOI", "SOS", "DQT", "DNL", "DRI", "DHP", "EXP",
  119. "APP0", "APP1", "APP2", "APP3", "APP4", "APP5", "APP6", "APP7",
  120. "APP8", "APP9", "APP10", "APP11", "APP12", "APP13", "APP14", "APP15",
  121. "JPG0", "JPG1", "JPG2", "JPG3", "JPG4", "JPG5", "JPG6", "JPG7",
  122. "JPG8", "JPG9", "JPG10", "JPG11", "JPG12", "JPG13", "COM", ""
  123. };
  124.  
  125. static const byte btj_jfe_zigzag[64]={
  126.  0,  1,  5,  6, 14, 15, 27, 28,
  127.  2,  4,  7, 13, 16, 26, 29, 42,
  128.  3,  8, 12, 17, 25, 30, 41, 43,
  129.  9, 11, 18, 24, 31, 40, 44, 53,
  130. 10, 19, 23, 32, 39, 45, 52, 54,
  131. 20, 22, 33, 38, 46, 51, 55, 60,
  132. 21, 34, 37, 47, 50, 56, 59, 61,
  133. 35, 36, 48, 49, 57, 58, 62, 63
  134. };
  135.  
  136. static const byte btj_jfe_zigzag2[64]={
  137.  0,  1,  8, 16,  9,  2,  3, 10,
  138. 17, 24, 32, 25, 18, 11,  4,  5,
  139. 12, 19, 26, 33, 40, 48, 41, 34,
  140. 27, 20, 13,  6,  7, 14, 21, 28,
  141. 35, 42, 49, 56, 57, 50, 43, 36,
  142. 29, 22, 15, 23, 30, 37, 44, 51,
  143. 58, 59, 52, 45, 38, 31, 39, 46,
  144. 53, 60, 61, 54, 47, 55, 62, 63
  145. };
  146.  
  147. ushort btj_jfeh_code[4][256];
  148.  
  149. static const byte btj_jfeh_len[4][256]={
  150. {  6,  4,  3,  3,  2,  2,  3,  5,  7,  9, 10, 10, 10, 10, 10, 11,
  151.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  152.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  153.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  154.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  155.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  156.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  157.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  158.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  159.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  160.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  161.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  162.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  163.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  164.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  165.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  166. },
  167. {  4,  2,  4,  3,  4,  5,  6,  7,  8, 13, 14, 16, 16, 15, 15, 15,
  168. 15,  3,  5,  7,  9, 12, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  169. 15,  5,  7, 10, 13, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16,
  170. 16,  5,  8, 11, 13, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  171. 11,  6, 10, 12, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
  172. 11,  6, 10, 15, 14, 15, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11,
  173. 11,  7, 10, 13, 15, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
  174. 11,  7, 10, 15, 16, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
  175. 11,  7, 11, 14, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
  176. 11,  5, 13, 15, 15, 11, 11, 11, 11, 11, 11, 11, 11, 16, 16, 16,
  177. 16,  8, 12, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  178. 16,  9, 12, 13, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  179. 16,  9, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  180. 16, 10, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  181. 16, 11, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15,
  182. 10, 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16,
  183. },
  184. {  2,  2,  2,  3,  4,  5,  8,  8,  9,  9,  8,  8,  8,  8,  9, 10,
  185.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  186.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  187.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  188.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  189.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  190.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  191.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  192.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  193.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  194.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  195.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  196.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  197.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  198.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  199.  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  200. },
  201. {  3,  2,  3,  3,  5,  7, 11, 14, 15, 16, 16, 16, 16, 16, 16, 16,
  202. 16,  3,  5,  8, 11, 12, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15,
  203. 15,  4,  7, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  204. 15,  5,  9, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  205. 15,  6, 10, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  206. 15,  6, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  207. 15,  7, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  208. 15,  7, 12, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  209. 15,  8, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  210. 15,  8, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  211. 15,  9, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  212. 15,  9, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  213. 15, 10, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  214. 15, 10, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  215. 15, 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  216. 11, 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16,
  217. }
  218. };
  219.  
  220. #if 1
  221. void BTJ_JFE_TransDCT_Horiz(short *iblk, int *oblk)
  222. {
  223.         int ib0, ib1, ib2, ib3, ib4, ib5, ib6, ib7;
  224.         int ib0p7, ib1p6, ib2p5, ib3p4;
  225.         int ib0n7, ib1n6, ib2n5, ib3n4;
  226.         int ib0p7n3n4, ib1p6n2n5;
  227.  
  228.         ib0=iblk[0]-128;        ib1=iblk[1]-128;
  229.         ib2=iblk[2]-128;        ib3=iblk[3]-128;
  230.         ib4=iblk[4]-128;        ib5=iblk[5]-128;
  231.         ib6=iblk[6]-128;        ib7=iblk[7]-128;
  232.  
  233.         ib0p7=ib0+ib7;  ib1p6=ib1+ib6;
  234.         ib2p5=ib2+ib5;  ib3p4=ib3+ib4;
  235.         ib0n7=ib0-ib7;  ib1n6=ib1-ib6;
  236.         ib2n5=ib2-ib5;  ib3n4=ib3-ib4;
  237.  
  238.         oblk[0]=(ib0p7+ib1p6+ib2p5+ib3p4)*91;
  239.         oblk[4]=(ib0p7-ib1p6-ib2p5+ib3p4)*91;
  240.  
  241.         ib0p7n3n4=ib0p7-ib3p4;
  242.         ib1p6n2n5=ib1p6-ib2p5;
  243.         oblk[2]=ib0p7n3n4*118 +ib1p6n2n5* 49;
  244.         oblk[6]=ib0p7n3n4* 49 -ib1p6n2n5*118;
  245.  
  246.         oblk[1]=ib0n7*126 +ib1n6*106 +ib2n5* 71 +ib3n4* 25;
  247.         oblk[3]=ib0n7*106 -ib1n6* 25 -ib2n5*126 -ib3n4* 71;
  248.         oblk[5]=ib0n7* 71 -ib1n6*126 +ib2n5* 25 +ib3n4*106;
  249.         oblk[7]=ib0n7* 25 -ib1n6* 71 +ib2n5*106 -ib3n4*126;
  250. }
  251.  
  252. void BTJ_JFE_TransDCT_Vert2(int *iblk, short *oblk)
  253. {
  254.         int ib0, ib1, ib2, ib3, ib4, ib5, ib6, ib7;
  255.         int ob0, ob1, ob2, ob3, ob4, ob5, ob6, ob7;
  256.         int ib0p7, ib1p6, ib2p5, ib3p4;
  257.         int ib0n7, ib1n6, ib2n5, ib3n4;
  258.         int ib0p7n3n4, ib1p6n2n5;
  259.  
  260.         ib0=iblk[ 0];   ib1=iblk[ 8];
  261.         ib2=iblk[16];   ib3=iblk[24];
  262.         ib4=iblk[32];   ib5=iblk[40];
  263.         ib6=iblk[48];   ib7=iblk[56];
  264.  
  265.         ib0p7=ib0+ib7;  ib1p6=ib1+ib6;
  266.         ib2p5=ib2+ib5;  ib3p4=ib3+ib4;
  267.         ib0n7=ib0-ib7;  ib1n6=ib1-ib6;
  268.         ib2n5=ib2-ib5;  ib3n4=ib3-ib4;
  269.  
  270.         ob0=(ib0p7+ib1p6+ib2p5+ib3p4)*91;
  271.         ob4=(ib0p7-ib1p6-ib2p5+ib3p4)*91;
  272.  
  273.         ib0p7n3n4=ib0p7-ib3p4;
  274.         ib1p6n2n5=ib1p6-ib2p5;
  275.         ob2=ib0p7n3n4*118 +ib1p6n2n5* 49;
  276.         ob6=ib0p7n3n4* 49 -ib1p6n2n5*118;
  277.  
  278.         ob1=ib0n7*126 +ib1n6*106 +ib2n5* 71 +ib3n4* 25;
  279.         ob3=ib0n7*106 -ib1n6* 25 -ib2n5*126 -ib3n4* 71;
  280.         ob5=ib0n7* 71 -ib1n6*126 +ib2n5* 25 +ib3n4*106;
  281.         ob7=ib0n7* 25 -ib1n6* 71 +ib2n5*106 -ib3n4*126;
  282.  
  283.         oblk[ 0]=(ob0+32768)>>16;       oblk[ 8]=(ob1+32768)>>16;
  284.         oblk[16]=(ob2+32768)>>16;       oblk[24]=(ob3+32768)>>16;
  285.         oblk[32]=(ob4+32768)>>16;       oblk[40]=(ob5+32768)>>16;
  286.         oblk[48]=(ob6+32768)>>16;       oblk[56]=(ob7+32768)>>16;
  287. }
  288.  
  289. void BTJ_JFE_TransDCT(short *iblk, short *oblk)
  290. {
  291.         int s[DCTSZ2];
  292.         int i, j;
  293.  
  294.         BTJ_JFE_TransDCT_Horiz(iblk+ 0, s+ 0);
  295.         BTJ_JFE_TransDCT_Horiz(iblk+ 8, s+ 8);
  296.         BTJ_JFE_TransDCT_Horiz(iblk+16, s+16);
  297.         BTJ_JFE_TransDCT_Horiz(iblk+24, s+24);
  298.         BTJ_JFE_TransDCT_Horiz(iblk+32, s+32);
  299.         BTJ_JFE_TransDCT_Horiz(iblk+40, s+40);
  300.         BTJ_JFE_TransDCT_Horiz(iblk+48, s+48);
  301.         BTJ_JFE_TransDCT_Horiz(iblk+56, s+56);
  302.  
  303.         BTJ_JFE_TransDCT_Vert2(s+0, oblk+0);
  304.         BTJ_JFE_TransDCT_Vert2(s+1, oblk+1);
  305.         BTJ_JFE_TransDCT_Vert2(s+2, oblk+2);
  306.         BTJ_JFE_TransDCT_Vert2(s+3, oblk+3);
  307.         BTJ_JFE_TransDCT_Vert2(s+4, oblk+4);
  308.         BTJ_JFE_TransDCT_Vert2(s+5, oblk+5);
  309.         BTJ_JFE_TransDCT_Vert2(s+6, oblk+6);
  310.         BTJ_JFE_TransDCT_Vert2(s+7, oblk+7);
  311. }
  312. #endif
  313.  
  314. #if 1
  315. void BTJ_JFEH_QuantBlock(BGBBTJ_JFE_Context *ctx,
  316.         short *ibuf, short *obuf, int qid)
  317. {
  318.         short tbuf[64];
  319.         short *cs, *ct;
  320.         int *qt;
  321.         byte *zt;
  322.         int i, j;
  323.  
  324. #if 1
  325.         qt=ctx->qtfp[qid];
  326.  
  327. //      0,  1,  5,  6, 14, 15, 27, 28,
  328.         tbuf[ 0]=((ibuf[ 0]*qt[ 0])+2048)>>12;
  329.         tbuf[ 1]=((ibuf[ 1]*qt[ 1])+2048)>>12;
  330.         tbuf[ 5]=((ibuf[ 2]*qt[ 2])+2048)>>12;
  331.         tbuf[ 6]=((ibuf[ 3]*qt[ 3])+2048)>>12;
  332.         tbuf[14]=((ibuf[ 4]*qt[ 4])+2048)>>12;
  333.         tbuf[15]=((ibuf[ 5]*qt[ 5])+2048)>>12;
  334.         tbuf[27]=((ibuf[ 6]*qt[ 6])+2048)>>12;
  335.         tbuf[28]=((ibuf[ 7]*qt[ 7])+2048)>>12;
  336.  
  337. //      2,  4,  7, 13, 16, 26, 29, 42,
  338.         tbuf[ 2]=((ibuf[ 8]*qt[ 8])+2048)>>12;
  339.         tbuf[ 4]=((ibuf[ 9]*qt[ 9])+2048)>>12;
  340.         tbuf[ 7]=((ibuf[10]*qt[10])+2048)>>12;
  341.         tbuf[13]=((ibuf[11]*qt[11])+2048)>>12;
  342.         tbuf[16]=((ibuf[12]*qt[12])+2048)>>12;
  343.         tbuf[26]=((ibuf[13]*qt[13])+2048)>>12;
  344.         tbuf[29]=((ibuf[14]*qt[14])+2048)>>12;
  345.         tbuf[42]=((ibuf[15]*qt[15])+2048)>>12;
  346.  
  347. //      3,  8, 12, 17, 25, 30, 41, 43,
  348.         tbuf[ 3]=((ibuf[16]*qt[16])+2048)>>12;
  349.         tbuf[ 8]=((ibuf[17]*qt[17])+2048)>>12;
  350.         tbuf[12]=((ibuf[18]*qt[18])+2048)>>12;
  351.         tbuf[17]=((ibuf[19]*qt[19])+2048)>>12;
  352.         tbuf[25]=((ibuf[20]*qt[20])+2048)>>12;
  353.         tbuf[30]=((ibuf[21]*qt[21])+2048)>>12;
  354.         tbuf[41]=((ibuf[22]*qt[22])+2048)>>12;
  355.         tbuf[43]=((ibuf[23]*qt[23])+2048)>>12;
  356.  
  357. //      9, 11, 18, 24, 31, 40, 44, 53,
  358.         tbuf[ 9]=((ibuf[24]*qt[24])+2048)>>12;
  359.         tbuf[11]=((ibuf[25]*qt[25])+2048)>>12;
  360.         tbuf[18]=((ibuf[26]*qt[26])+2048)>>12;
  361.         tbuf[24]=((ibuf[27]*qt[27])+2048)>>12;
  362.         tbuf[31]=((ibuf[28]*qt[28])+2048)>>12;
  363.         tbuf[40]=((ibuf[29]*qt[29])+2048)>>12;
  364.         tbuf[44]=((ibuf[30]*qt[30])+2048)>>12;
  365.         tbuf[53]=((ibuf[31]*qt[31])+2048)>>12;
  366.  
  367. //      10, 19, 23, 32, 39, 45, 52, 54,
  368.         tbuf[10]=((ibuf[32]*qt[32])+2048)>>12;
  369.         tbuf[19]=((ibuf[33]*qt[33])+2048)>>12;
  370.         tbuf[23]=((ibuf[34]*qt[34])+2048)>>12;
  371.         tbuf[32]=((ibuf[35]*qt[35])+2048)>>12;
  372.         tbuf[39]=((ibuf[36]*qt[36])+2048)>>12;
  373.         tbuf[45]=((ibuf[37]*qt[37])+2048)>>12;
  374.         tbuf[52]=((ibuf[38]*qt[38])+2048)>>12;
  375.         tbuf[54]=((ibuf[39]*qt[39])+2048)>>12;
  376.  
  377. //      20, 22, 33, 38, 46, 51, 55, 60,
  378.         tbuf[20]=((ibuf[40]*qt[40])+2048)>>12;
  379.         tbuf[22]=((ibuf[41]*qt[41])+2048)>>12;
  380.         tbuf[33]=((ibuf[42]*qt[42])+2048)>>12;
  381.         tbuf[38]=((ibuf[43]*qt[43])+2048)>>12;
  382.         tbuf[46]=((ibuf[44]*qt[44])+2048)>>12;
  383.         tbuf[51]=((ibuf[45]*qt[45])+2048)>>12;
  384.         tbuf[55]=((ibuf[46]*qt[46])+2048)>>12;
  385.         tbuf[60]=((ibuf[47]*qt[47])+2048)>>12;
  386.  
  387. //      21, 34, 37, 47, 50, 56, 59, 61,
  388.         tbuf[21]=((ibuf[48]*qt[48])+2048)>>12;
  389.         tbuf[34]=((ibuf[49]*qt[49])+2048)>>12;
  390.         tbuf[37]=((ibuf[50]*qt[50])+2048)>>12;
  391.         tbuf[47]=((ibuf[51]*qt[51])+2048)>>12;
  392.         tbuf[50]=((ibuf[52]*qt[52])+2048)>>12;
  393.         tbuf[56]=((ibuf[53]*qt[53])+2048)>>12;
  394.         tbuf[59]=((ibuf[54]*qt[54])+2048)>>12;
  395.         tbuf[61]=((ibuf[55]*qt[55])+2048)>>12;
  396.  
  397. //      35, 36, 48, 49, 57, 58, 62, 63
  398.         tbuf[35]=((ibuf[56]*qt[56])+2048)>>12;
  399.         tbuf[36]=((ibuf[57]*qt[57])+2048)>>12;
  400.         tbuf[48]=((ibuf[58]*qt[58])+2048)>>12;
  401.         tbuf[49]=((ibuf[59]*qt[59])+2048)>>12;
  402.         tbuf[57]=((ibuf[60]*qt[60])+2048)>>12;
  403.         tbuf[58]=((ibuf[61]*qt[61])+2048)>>12;
  404.         tbuf[62]=((ibuf[62]*qt[62])+2048)>>12;
  405.         tbuf[63]=((ibuf[63]*qt[63])+2048)>>12;
  406.  
  407.         memcpy(obuf, tbuf, 64*sizeof(short));
  408. #endif
  409.  
  410. #if 0
  411.         cs=ibuf; qt=ctx->qtfp[qid]; zt=btj_jfe_zigzag;
  412.         for(i=0; i<8; i++)
  413.         {
  414.                 tbuf[zt[0]]=((cs[0]*qt[0])+2048)>>12;
  415.                 tbuf[zt[1]]=((cs[1]*qt[1])+2048)>>12;
  416.                 tbuf[zt[2]]=((cs[2]*qt[2])+2048)>>12;
  417.                 tbuf[zt[3]]=((cs[3]*qt[3])+2048)>>12;
  418.                 tbuf[zt[4]]=((cs[4]*qt[4])+2048)>>12;
  419.                 tbuf[zt[5]]=((cs[5]*qt[5])+2048)>>12;
  420.                 tbuf[zt[6]]=((cs[6]*qt[6])+2048)>>12;
  421.                 tbuf[zt[7]]=((cs[7]*qt[7])+2048)>>12;
  422.                 cs+=8; qt+=8; zt+=8;
  423.         }
  424.         memcpy(obuf, tbuf, 64*sizeof(short));
  425. #endif
  426. }
  427. #endif
  428.  
  429. void BTJ_JFEH_SetupQuantTabDivFP(BGBBTJ_JFE_Context *ctx, int qid)
  430. {
  431.         int i;
  432.        
  433.         for(i=0; i<64; i++)
  434.                 ctx->qtfp[qid][i]=4096.0/ctx->qt[qid][i]+0.5;
  435. }
  436.  
  437. //Encoder
  438. #if 1
  439. void BTJ_JFEH_WriteBit(BGBBTJ_JFE_Context *ctx, int i)
  440. {
  441.         ctx->pos--;
  442.         ctx->win|=i<<ctx->pos;
  443.         if(ctx->pos<=24)
  444.         {
  445.                 i=(ctx->win>>24)&0xFF;
  446.                 *ctx->ct++=i;
  447.                 if(i==0xFF)*ctx->ct++=0x00;
  448.                 ctx->win<<=8;
  449.                 ctx->pos+=8;
  450.         }
  451. }
  452.  
  453. void BTJ_JFEH_WriteNBits(BGBBTJ_JFE_Context *ctx, int i, int n)
  454. {
  455. //      i&=(1<<n)-1;
  456.  
  457.         ctx->pos-=n;
  458.         ctx->win|=i<<ctx->pos;
  459.         while(ctx->pos<=24)
  460.         {
  461.                 i=(ctx->win>>24)&0xFF;
  462.                 *ctx->ct++=i;
  463.                 if(i==0xFF)*ctx->ct++=0x00;
  464.                 ctx->win<<=8;
  465.                 ctx->pos+=8;
  466.         }
  467. }
  468.  
  469. void BTJ_JFEH_FlushBits(BGBBTJ_JFE_Context *ctx)
  470. {
  471.         int i;
  472.         while(ctx->pos<32)
  473.         {
  474.                 i=(ctx->win>>24)&0xFF;
  475.                 *ctx->ct++=i;
  476.                 if(i==0xFF)*ctx->ct++=0x00;
  477.                 ctx->win<<=8;
  478.                 ctx->pos+=8;
  479.         }
  480. }
  481. #endif
  482.  
  483. void BTJ_JFEH_EncodeSymbol(BGBBTJ_JFE_Context *ctx, int tab, int v)
  484. {
  485.         BTJ_JFEH_WriteNBits(ctx, btj_jfeh_code[tab][v], btj_jfeh_len[tab][v]);
  486. }
  487.  
  488. void BTJ_JFEH_EncodeVal(BGBBTJ_JFE_Context *ctx, int tab, int z, int v)
  489. {
  490.         int i, j, k;
  491.  
  492.         if(!v) { BTJ_JFEH_EncodeSymbol(ctx, tab, z<<4); return; }
  493.  
  494.         if(v>0)
  495.         {
  496.                 i=1;
  497.                 while(v>=(1<<i))i++;
  498.                 BTJ_JFEH_EncodeSymbol(ctx, tab, (z<<4)|i);
  499.                 BTJ_JFEH_WriteNBits(ctx, v, i);
  500.                 return;
  501.         }
  502.  
  503.         i=1; j=-v; while(j>=(1<<i))i++;
  504.         BTJ_JFEH_EncodeSymbol(ctx, tab, (z<<4)|i);
  505.  
  506.         k=(1<<i)-(j+1);
  507.         BTJ_JFEH_WriteNBits(ctx, k, i);
  508.         return;
  509. }
  510.  
  511. void BTJ_JFEH_EncodeBlock(BGBBTJ_JFE_Context *ctx, short *buf, int dctab, int actab)
  512. {
  513.         int i, j, k;
  514.  
  515.         BTJ_JFEH_EncodeVal(ctx, dctab, 0, buf[0]);
  516.  
  517.         i=1;
  518.         while(i<64)
  519.         {
  520.                 j=buf[i];
  521.                 if(j)
  522.                 {
  523.                         BTJ_JFEH_EncodeVal(ctx, actab, 0, j);
  524.                         i++;
  525.                         continue;
  526.                 }
  527.  
  528.                 j=i+1;
  529.                 while(1)
  530.                 {
  531.                         if(j>=64)
  532.                         {
  533.                                 BTJ_JFEH_EncodeSymbol(ctx, actab, 0);
  534.                                 return;
  535.                         }
  536.                         if(buf[j])break;
  537.                         j++;
  538.                 }
  539.  
  540.                 k=j-i;
  541. //              while((j-i)>15)
  542.                 while(k>15)
  543.                 {
  544.                         BTJ_JFEH_EncodeSymbol(ctx, actab, 15<<4);
  545.                         i+=16; k=j-i;
  546.                 }
  547.  
  548. //              k=j-i;
  549.                 BTJ_JFEH_EncodeVal(ctx, actab, k, buf[j]);
  550.                 i=j+1;
  551.         }
  552. }
  553.  
  554. void BTJ_JFE_GetImgBlk2Y(short *blk, int xo, int yo,
  555.         byte *img, int xs, int ys, int xs2, int ys2, int ssz)
  556. {
  557.         byte *ib;
  558.         short *ob;
  559.         int sx0, sx1, sx2, sx3, sx4, sx5, sx6, sx7;
  560.         int i, j, k;
  561.  
  562.         if(((xo+8)>xs) || ((ys-yo-8)<0))
  563.         {
  564.                 //goes off edge of image
  565.                 for(i=0; i<8; i++)
  566.                         for(j=0; j<8; j++)
  567.                 {
  568.                         k=(ys-(yo+i)-1);
  569.                         if(((xo+j)>=xs) || (k<0))
  570.                                 { blk[i*8+j]=0; continue; }
  571.                         ib=img+((k*xs)+xo+j)*ssz;
  572.                         blk[i*8+j]=(19595*ib[0] + 38470*ib[1] +
  573.                                 7471*ib[2] + 32768)>>16;
  574.                 }
  575.  
  576.                 return;
  577.         }
  578.  
  579.         if(ssz==4)
  580.         {
  581.                 for(i=0; i<8; i++)
  582.                 {
  583.                         ib=img+(((ys-(yo+i)-1)*xs)+xo)*ssz;
  584.                         ob=blk+(i*8);
  585.                         ob[0]=(19595*ib[ 0] + 38470*ib[ 1] + 7471*ib[ 2] + 32768)>>16;
  586.                         ob[1]=(19595*ib[ 4] + 38470*ib[ 5] + 7471*ib[ 6] + 32768)>>16;
  587.                         ob[2]=(19595*ib[ 8] + 38470*ib[ 9] + 7471*ib[10] + 32768)>>16;
  588.                         ob[3]=(19595*ib[12] + 38470*ib[13] + 7471*ib[14] + 32768)>>16;
  589.                         ob[4]=(19595*ib[16] + 38470*ib[17] + 7471*ib[18] + 32768)>>16;
  590.                         ob[5]=(19595*ib[20] + 38470*ib[21] + 7471*ib[22] + 32768)>>16;
  591.                         ob[6]=(19595*ib[24] + 38470*ib[25] + 7471*ib[26] + 32768)>>16;
  592.                         ob[7]=(19595*ib[28] + 38470*ib[29] + 7471*ib[30] + 32768)>>16;
  593.                 }
  594.         }else
  595.         {
  596.                 sx0=0;     sx1=ssz;   sx2=2*ssz; sx3=3*ssz;
  597.                 sx4=4*ssz; sx5=5*ssz; sx6=6*ssz; sx7=7*ssz;
  598.                 for(i=0; i<8; i++)
  599.                 {
  600.                         ib=img+(((ys-(yo+i)-1)*xs)+xo)*ssz;
  601.                         ob=blk+(i*8);
  602.                         ob[0]=(19595*ib[sx0+0] + 38470*ib[sx0+1] + 7471*ib[sx0+2] + 32768)>>16;
  603.                         ob[1]=(19595*ib[sx1+0] + 38470*ib[sx1+1] + 7471*ib[sx1+2] + 32768)>>16;
  604.                         ob[2]=(19595*ib[sx2+0] + 38470*ib[sx2+1] + 7471*ib[sx2+2] + 32768)>>16;
  605.                         ob[3]=(19595*ib[sx3+0] + 38470*ib[sx3+1] + 7471*ib[sx3+2] + 32768)>>16;
  606.                         ob[4]=(19595*ib[sx4+0] + 38470*ib[sx4+1] + 7471*ib[sx4+2] + 32768)>>16;
  607.                         ob[5]=(19595*ib[sx5+0] + 38470*ib[sx5+1] + 7471*ib[sx5+2] + 32768)>>16;
  608.                         ob[6]=(19595*ib[sx6+0] + 38470*ib[sx6+1] + 7471*ib[sx6+2] + 32768)>>16;
  609.                         ob[7]=(19595*ib[sx7+0] + 38470*ib[sx7+1] + 7471*ib[sx7+2] + 32768)>>16;
  610.                 }
  611.         }
  612. }
  613.  
  614. void BTJ_JFE_GetImgBlk2UV_RGB(
  615.         short *ublk, short *vblk, int xo, int yo,
  616.         byte *img, int xs, int ys, int xs2, int ys2, int ssz)
  617. {
  618.         byte *ib0, *ib1;
  619.         short *obu, *obv;
  620.         int cr, cg, cb, cu, cv;
  621.         int i, j, k;
  622.  
  623. //      if(((xo+16)>xs) || ((2*ys2-yo-1)>ys))
  624.         if(((xo+16)>xs) || ((ys-yo-16)<0))
  625.         {
  626.                 //goes off edge of image
  627.                 for(i=0; i<8; i++)
  628.                         for(j=0; j<8; j++)
  629.                 {
  630.                         if((xo+2*j+1)>=xs)
  631.                                 { ublk[i*8+j]=0; vblk[i*8+j]=0; continue; }
  632.                         k=(ys-(yo+i*2+1)-1);
  633. //                      if(k>=ys)
  634.                         if(k<0)
  635.                                 { ublk[i*8+j]=0; vblk[i*8+j]=0; continue; }
  636.  
  637.                         ib0=img+(((ys-(yo+i*2+0)-1)*xs)+xo+j*2)*ssz;
  638.                         ib1=img+(((ys-(yo+i*2+1)-1)*xs)+xo+j*2)*ssz;
  639.                         obu=ublk+(i*8)+j; obv=vblk+(i*8)+j;
  640.  
  641.                         cr=(ib0[0]+ib0[ssz+0]+ib1[0]+ib1[ssz+0])>>2;
  642.                         cg=(ib0[1]+ib0[ssz+1]+ib1[1]+ib1[ssz+1])>>2;
  643.                         cb=(ib0[2]+ib0[ssz+2]+ib1[2]+ib1[ssz+2])>>2;
  644.                         cu=-11056*cr -21712*cg +32768*cb;
  645.                         cv= 32768*cr -27440*cg - 5328*cb;
  646.                         obu[0]=((cu+32768)>>16)+128;
  647.                         obv[0]=((cv+32768)>>16)+128;
  648.                 }
  649.  
  650.                 return;
  651.         }
  652.  
  653.         if(ssz==4)
  654.         {
  655.                 for(i=0; i<8; i++)
  656.                 {
  657.                         ib0=img+(((ys-(yo+i*2+0)-1)*xs)+xo)*ssz;
  658.                         ib1=img+(((ys-(yo+i*2+1)-1)*xs)+xo)*ssz;
  659.                         obu=ublk+(i*8); obv=vblk+(i*8);
  660.  
  661.                         for(j=0; j<2; j++)
  662.                         {
  663.                                 cr=(ib0[0]+ib0[4]+ib1[0]+ib1[4])>>2;
  664.                                 cg=(ib0[1]+ib0[5]+ib1[1]+ib1[5])>>2;
  665.                                 cb=(ib0[2]+ib0[6]+ib1[2]+ib1[6])>>2;
  666.                                 cu=-11056*cr -21712*cg +32768*cb;
  667.                                 cv= 32768*cr -27440*cg - 5328*cb;
  668.                                 obu[0]=((cu+32768)>>16)+128;
  669.                                 obv[0]=((cv+32768)>>16)+128;
  670.  
  671.                                 cr=(ib0[ 8]+ib0[12]+ib1[ 8]+ib1[12])>>2;
  672.                                 cg=(ib0[ 9]+ib0[13]+ib1[ 9]+ib1[13])>>2;
  673.                                 cb=(ib0[10]+ib0[14]+ib1[10]+ib1[14])>>2;
  674.                                 cu=-11056*cr -21712*cg +32768*cb;
  675.                                 cv= 32768*cr -27440*cg - 5328*cb;
  676.                                 obu[1]=((cu+32768)>>16)+128;
  677.                                 obv[1]=((cv+32768)>>16)+128;
  678.  
  679.                                 cr=(ib0[16]+ib0[20]+ib1[16]+ib1[20])>>2;
  680.                                 cg=(ib0[17]+ib0[21]+ib1[17]+ib1[21])>>2;
  681.                                 cb=(ib0[18]+ib0[22]+ib1[18]+ib1[22])>>2;
  682.                                 cu=-11056*cr -21712*cg +32768*cb;
  683.                                 cv= 32768*cr -27440*cg - 5328*cb;
  684.                                 obu[2]=((cu+32768)>>16)+128;
  685.                                 obv[2]=((cv+32768)>>16)+128;
  686.  
  687.                                 cr=(ib0[24]+ib0[28]+ib1[24]+ib1[28])>>2;
  688.                                 cg=(ib0[25]+ib0[29]+ib1[25]+ib1[29])>>2;
  689.                                 cb=(ib0[26]+ib0[30]+ib1[26]+ib1[30])>>2;
  690.                                 cu=-11056*cr -21712*cg +32768*cb;
  691.                                 cv= 32768*cr -27440*cg - 5328*cb;
  692.                                 obu[3]=((cu+32768)>>16)+128;
  693.                                 obv[3]=((cv+32768)>>16)+128;
  694.  
  695.                                 ib0+=32; ib1+=32; obu+=4; obv+=4;
  696.                         }
  697.                 }
  698.         }else
  699.         {
  700.                 for(i=0; i<8; i++)
  701.                 {
  702.                         ib0=img+(((ys-(yo+i*2+0)-1)*xs)+xo)*ssz;
  703.                         ib1=img+(((ys-(yo+i*2+1)-1)*xs)+xo)*ssz;
  704.                         obu=ublk+(i*8); obv=vblk+(i*8);
  705.  
  706.                         for(j=0; j<8; j++)
  707.                         {
  708.                                 cr=(ib0[0]+ib0[ssz+0]+ib1[0]+ib1[ssz+0])>>2;
  709.                                 cg=(ib0[1]+ib0[ssz+1]+ib1[1]+ib1[ssz+1])>>2;
  710.                                 cb=(ib0[2]+ib0[ssz+2]+ib1[2]+ib1[ssz+2])>>2;
  711.                                 cu=-11056*cr -21712*cg +32768*cb;
  712.                                 cv= 32768*cr -27440*cg - 5328*cb;
  713.                                 obu[0]=((cu+32768)>>16)+128;
  714.                                 obv[0]=((cv+32768)>>16)+128;
  715.                                 ib0+=2*ssz; ib1+=2*ssz; obu++; obv++;
  716.                         }
  717.                 }
  718.         }
  719. }
  720.  
  721. void BTJ_JFE_GetImgBlk2UV_BGR(
  722.         short *ublk, short *vblk, int xo, int yo,
  723.         byte *img, int xs, int ys, int xs2, int ys2, int ssz)
  724. {
  725.         byte *ib0, *ib1;
  726.         short *obu, *obv;
  727.         int cr, cg, cb, cu, cv;
  728.         int i, j, k;
  729.  
  730. //      if(((xo+16)>xs) || ((2*ys2-yo-1)>ys))
  731.         if(((xo+16)>xs) || ((ys-yo-16)<0))
  732.         {
  733.                 //goes off edge of image
  734.                 for(i=0; i<8; i++)
  735.                         for(j=0; j<8; j++)
  736.                 {
  737.                         k=(ys-(yo+i*2+1)-1);
  738.                         if(((xo+2*j+1)>=xs) || (k<0))
  739.                                 { ublk[i*8+j]=0; vblk[i*8+j]=0; continue; }
  740.  
  741.                         ib0=img+(((ys-(yo+i*2+0)-1)*xs)+xo+j*2)*ssz;
  742.                         ib1=img+(((ys-(yo+i*2+1)-1)*xs)+xo+j*2)*ssz;
  743.                         obu=ublk+(i*8)+j; obv=vblk+(i*8)+j;
  744.  
  745.                         cb=(ib0[0]+ib0[ssz+0]+ib1[0]+ib1[ssz+0])>>2;
  746.                         cg=(ib0[1]+ib0[ssz+1]+ib1[1]+ib1[ssz+1])>>2;
  747.                         cr=(ib0[2]+ib0[ssz+2]+ib1[2]+ib1[ssz+2])>>2;
  748.                         cu=-11056*cr -21712*cg +32768*cb;
  749.                         cv= 32768*cr -27440*cg - 5328*cb;
  750.                         obu[0]=((cu+32768)>>16)+128;
  751.                         obv[0]=((cv+32768)>>16)+128;
  752.                 }
  753.  
  754.                 return;
  755.         }
  756.  
  757.         if(ssz==4)
  758.         {
  759.                 for(i=0; i<8; i++)
  760.                 {
  761.                         ib0=img+(((ys-(yo+i*2+0)-1)*xs)+xo)*ssz;
  762.                         ib1=img+(((ys-(yo+i*2+1)-1)*xs)+xo)*ssz;
  763.                         obu=ublk+(i*8); obv=vblk+(i*8);
  764.  
  765.                         for(j=0; j<2; j++)
  766.                         {
  767.                                 cb=(ib0[0]+ib0[4]+ib1[0]+ib1[4])>>2;
  768.                                 cg=(ib0[1]+ib0[5]+ib1[1]+ib1[5])>>2;
  769.                                 cr=(ib0[2]+ib0[6]+ib1[2]+ib1[6])>>2;
  770.                                 cu=-11056*cr -21712*cg +32768*cb;
  771.                                 cv= 32768*cr -27440*cg - 5328*cb;
  772.                                 obu[0]=((cu+32768)>>16)+128;
  773.                                 obv[0]=((cv+32768)>>16)+128;
  774.  
  775.                                 cb=(ib0[ 8]+ib0[12]+ib1[ 8]+ib1[12])>>2;
  776.                                 cg=(ib0[ 9]+ib0[13]+ib1[ 9]+ib1[13])>>2;
  777.                                 cr=(ib0[10]+ib0[14]+ib1[10]+ib1[14])>>2;
  778.                                 cu=-11056*cr -21712*cg +32768*cb;
  779.                                 cv= 32768*cr -27440*cg - 5328*cb;
  780.                                 obu[1]=((cu+32768)>>16)+128;
  781.                                 obv[1]=((cv+32768)>>16)+128;
  782.  
  783.                                 cb=(ib0[16]+ib0[20]+ib1[16]+ib1[20])>>2;
  784.                                 cg=(ib0[17]+ib0[21]+ib1[17]+ib1[21])>>2;
  785.                                 cr=(ib0[18]+ib0[22]+ib1[18]+ib1[22])>>2;
  786.                                 cu=-11056*cr -21712*cg +32768*cb;
  787.                                 cv= 32768*cr -27440*cg - 5328*cb;
  788.                                 obu[2]=((cu+32768)>>16)+128;
  789.                                 obv[2]=((cv+32768)>>16)+128;
  790.  
  791.                                 cb=(ib0[24]+ib0[28]+ib1[24]+ib1[28])>>2;
  792.                                 cg=(ib0[25]+ib0[29]+ib1[25]+ib1[29])>>2;
  793.                                 cr=(ib0[26]+ib0[30]+ib1[26]+ib1[30])>>2;
  794.                                 cu=-11056*cr -21712*cg +32768*cb;
  795.                                 cv= 32768*cr -27440*cg - 5328*cb;
  796.                                 obu[3]=((cu+32768)>>16)+128;
  797.                                 obv[3]=((cv+32768)>>16)+128;
  798.  
  799.                                 ib0+=32; ib1+=32; obu+=4; obv+=4;
  800.                         }
  801.                 }
  802.         }else
  803.         {
  804.                 for(i=0; i<8; i++)
  805.                 {
  806.                         ib0=img+(((ys-(yo+i*2+0)-1)*xs)+xo)*ssz;
  807.                         ib1=img+(((ys-(yo+i*2+1)-1)*xs)+xo)*ssz;
  808.                         obu=ublk+(i*8); obv=vblk+(i*8);
  809.  
  810.                         for(j=0; j<8; j++)
  811.                         {
  812.                                 cb=(ib0[0]+ib0[ssz+0]+ib1[0]+ib1[ssz+0])>>2;
  813.                                 cg=(ib0[1]+ib0[ssz+1]+ib1[1]+ib1[ssz+1])>>2;
  814.                                 cr=(ib0[2]+ib0[ssz+2]+ib1[2]+ib1[ssz+2])>>2;
  815.                                 cu=-11056*cr -21712*cg +32768*cb;
  816.                                 cv= 32768*cr -27440*cg - 5328*cb;
  817.                                 obu[0]=((cu+32768)>>16)+128;
  818.                                 obv[0]=((cv+32768)>>16)+128;
  819.                                 ib0+=2*ssz; ib1+=2*ssz; obu++; obv++;
  820.                         }
  821.                 }
  822.         }
  823. }
  824.  
  825. void BTJ_JFE_FilterImageDCT2(byte *ibuf,
  826.         short *ybuf, short *ubuf, short *vbuf, int xs, int ys,
  827.         int qf, int pf)
  828. {
  829.         short ublk[DCTSZ2], vblk[DCTSZ2];
  830.         short blk[DCTSZ2];
  831.         int xs2, ys2, xs3, ys3, ssz;
  832.         int i, j, k, l;
  833.  
  834.         xs2=((xs+7)/8)*8;
  835.         ys2=((ys+7)/8)*8;
  836.         xs3=((xs+15)/16)*8;
  837.         ys3=((ys+15)/16)*8;
  838.  
  839.         if((pf==BGBBTJ_JPG_RGBA) || (pf==BGBBTJ_JPG_BGRA) ||
  840.                 (pf==BGBBTJ_JPG_RGB) || (pf==BGBBTJ_JPG_BGR))
  841.         {
  842.                 ssz=4;
  843.                 if((pf==BGBBTJ_JPG_RGB) || (pf==BGBBTJ_JPG_BGR))ssz=3;
  844.        
  845.                 k=0;
  846.                 for(i=0; i<(ys2/DCTSZ); i++)
  847.                         for(j=0; j<(xs2/DCTSZ); j++)
  848.                 {
  849.                         BTJ_JFE_GetImgBlk2Y(blk, j*DCTSZ, i*DCTSZ,
  850.                                 ibuf, xs, ys, xs2, ys2, ssz);
  851.                         BTJ_JFE_TransDCT(blk, ybuf+k*DCTSZ2);
  852.                         k++;
  853.                 }
  854.         }else if((pf==BGBBTJ_JPG_ARGB) || (pf==BGBBTJ_JPG_ABGR))
  855.         {
  856.                 ssz=4;
  857.                 k=0;
  858.                 for(i=0; i<(ys2/DCTSZ); i++)
  859.                         for(j=0; j<(xs2/DCTSZ); j++)
  860.                 {
  861.                         BTJ_JFE_GetImgBlk2Y(blk, j*DCTSZ, i*DCTSZ,
  862.                                 ibuf+1, xs, ys, xs2, ys2, ssz);
  863.                         BTJ_JFE_TransDCT(blk, ybuf+k*DCTSZ2);
  864.                         k++;
  865.                 }
  866.         }
  867.  
  868.         if((pf==BGBBTJ_JPG_RGBA) || (pf==BGBBTJ_JPG_RGB))
  869.         {
  870.                 ssz=4;
  871.                 if(pf==BGBBTJ_JPG_RGB)ssz=3;
  872.  
  873.                 k=0;
  874.                 for(i=0; i<(ys3/DCTSZ); i++)
  875.                         for(j=0; j<(xs3/DCTSZ); j++)
  876.                 {
  877.                         BTJ_JFE_GetImgBlk2UV_RGB(ublk, vblk,
  878.                                 2*j*DCTSZ, 2*i*DCTSZ, ibuf, xs, ys, xs3, ys3, ssz);
  879.                         BTJ_JFE_TransDCT(ublk, ubuf+k*DCTSZ2);
  880.                         BTJ_JFE_TransDCT(vblk, vbuf+k*DCTSZ2);
  881.                         k++;
  882.                 }
  883.         }else if((pf==BGBBTJ_JPG_BGRA) || (pf==BGBBTJ_JPG_BGR))
  884.         {
  885.                 ssz=4;
  886.                 if(pf==BGBBTJ_JPG_BGR)ssz=3;
  887.  
  888.                 k=0;
  889.                 for(i=0; i<(ys3/DCTSZ); i++)
  890.                         for(j=0; j<(xs3/DCTSZ); j++)
  891.                 {
  892.                         BTJ_JFE_GetImgBlk2UV_BGR(ublk, vblk,
  893.                                 2*j*DCTSZ, 2*i*DCTSZ, ibuf, xs, ys, xs3, ys3, ssz);
  894.                         BTJ_JFE_TransDCT(ublk, ubuf+k*DCTSZ2);
  895.                         BTJ_JFE_TransDCT(vblk, vbuf+k*DCTSZ2);
  896.                         k++;
  897.                 }
  898.         }else if(pf==BGBBTJ_JPG_ARGB)
  899.         {
  900.                 ssz=4; k=0;
  901.                 for(i=0; i<(ys3/DCTSZ); i++)
  902.                         for(j=0; j<(xs3/DCTSZ); j++)
  903.                 {
  904.                         BTJ_JFE_GetImgBlk2UV_RGB(ublk, vblk,
  905.                                 2*j*DCTSZ, 2*i*DCTSZ, ibuf+1, xs, ys, xs3, ys3, ssz);
  906.                         BTJ_JFE_TransDCT(ublk, ubuf+k*DCTSZ2);
  907.                         BTJ_JFE_TransDCT(vblk, vbuf+k*DCTSZ2);
  908.                         k++;
  909.                 }
  910.         }else if(pf==BGBBTJ_JPG_ABGR)
  911.         {
  912.                 ssz=4; k=0;
  913.                 for(i=0; i<(ys3/DCTSZ); i++)
  914.                         for(j=0; j<(xs3/DCTSZ); j++)
  915.                 {
  916.                         BTJ_JFE_GetImgBlk2UV_BGR(ublk, vblk,
  917.                                 2*j*DCTSZ, 2*i*DCTSZ, ibuf+1, xs, ys, xs3, ys3, ssz);
  918.                         BTJ_JFE_TransDCT(ublk, ubuf+k*DCTSZ2);
  919.                         BTJ_JFE_TransDCT(vblk, vbuf+k*DCTSZ2);
  920.                         k++;
  921.                 }
  922.         }
  923. }
  924.  
  925.  
  926. void BTJ_JFE_EmitDQT(BGBBTJ_JFE_Context *ctx, int n)
  927. {
  928.         int i;
  929.  
  930.         *ctx->ct++=0xFF;
  931.         *ctx->ct++=JPG_DQT;
  932.  
  933.         i=64+3;
  934.         *ctx->ct++=i>>8;
  935.         *ctx->ct++=i&0xFF;
  936.  
  937.         *ctx->ct++=n;
  938.         for(i=0; i<64; i++)
  939.                 *ctx->ct++=ctx->qt[n][btj_jfe_zigzag2[i]];
  940. }
  941.  
  942. void BTJ_JFE_EmitSOF(BGBBTJ_JFE_Context *ctx, int xs, int ys)
  943. {
  944.         int i;
  945.  
  946.         *ctx->ct++=0xFF;
  947.         *ctx->ct++=JPG_SOF0;
  948.  
  949.         i=8+3*3;
  950.         *ctx->ct++=i>>8;        //Lf
  951.         *ctx->ct++=i&0xFF;
  952.  
  953.         *ctx->ct++=8;   //P
  954.  
  955.         *ctx->ct++=ys>>8;       //Y
  956.         *ctx->ct++=ys&0xFF;     //Y
  957.         *ctx->ct++=xs>>8;       //X
  958.         *ctx->ct++=xs&0xFF;     //X
  959.  
  960.         *ctx->ct++=3;   //Nf
  961.  
  962.         *ctx->ct++=1;   //Ci
  963.         *ctx->ct++=0x22;        //Hi Vi
  964.         *ctx->ct++=0;   //Tqi
  965.         *ctx->ct++=2;   //Ci
  966.         *ctx->ct++=0x11;        //Hi Vi
  967.         *ctx->ct++=1;   //Tqi
  968.         *ctx->ct++=3;   //Ci
  969.         *ctx->ct++=0x11;        //Hi Vi
  970.         *ctx->ct++=1;   //Tqi
  971. }
  972.  
  973. void BTJ_JFE_EmitSOS(BGBBTJ_JFE_Context *ctx)
  974. {
  975.         int i;
  976.  
  977.         *ctx->ct++=0xFF;
  978.         *ctx->ct++=JPG_SOS;
  979.  
  980.         i=6+3*2;
  981.         *ctx->ct++=i>>8;        //Lf
  982.         *ctx->ct++=i&0xFF;
  983.  
  984.         *ctx->ct++=3;   //Ns
  985.  
  986.         *ctx->ct++=1;   //Csi
  987.         *ctx->ct++=0x00;        //Tdi Tai
  988.         *ctx->ct++=2;   //Csi
  989.         *ctx->ct++=0x11;        //Tdi Tai
  990.         *ctx->ct++=3;   //Csi
  991.         *ctx->ct++=0x11;        //Tdi Tai
  992.  
  993.         *ctx->ct++=0;   //Ss
  994.         *ctx->ct++=63;  //Se
  995.         *ctx->ct++=0x00;        //Ah Al
  996. }
  997.  
  998. void BTJ_JFE_EmitDHT(BGBBTJ_JFE_Context *ctx, int tab)
  999. {
  1000.         byte *p;
  1001.         int i, j, k;
  1002.  
  1003.         *ctx->ct++=0xFF;
  1004.         *ctx->ct++=JPG_DHT;
  1005.  
  1006.         p=ctx->ct;
  1007.         *ctx->ct++=0;   //Lf
  1008.         *ctx->ct++=0;
  1009.  
  1010.         i=(tab/2)|((tab&1)<<4);
  1011.         *ctx->ct++=i;   //Tc Th
  1012.  
  1013. //      tab<<=8;
  1014.         for(i=1; i<=16; i++)
  1015.         {
  1016.                 k=0;
  1017.                 for(j=0; j<256; j++)
  1018.                         if(btj_jfeh_len[tab][j]==i)
  1019.                                 k++;
  1020.                 *ctx->ct++=k;   //Li
  1021.         }
  1022.  
  1023.         k=0;
  1024.         for(i=1; i<=16; i++)
  1025.         {
  1026.                 k<<=1;
  1027.                 for(j=0; j<256; j++)
  1028.                         if(btj_jfeh_len[tab][j]==i)
  1029.                 {
  1030.                         *ctx->ct++=j;   //Vi
  1031.                         btj_jfeh_code[tab][j]=k++;
  1032.                 }
  1033.         }
  1034.  
  1035. //      printf("DHT %04X\n", k);
  1036.  
  1037.         i=ctx->ct-p;
  1038.         p[0]=i>>8;      //Lf
  1039.         p[1]=i&0xFF;
  1040. }
  1041.  
  1042. void BTJ_JFE_EmitDHT2(BGBBTJ_JFE_Context *ctx)
  1043. {
  1044.         static int init=0;
  1045.         static byte *tab=NULL;
  1046.         static int tabsz;
  1047.         byte *ct0;
  1048.         int i;
  1049.        
  1050.         if(!init)
  1051.         {
  1052.                 ct0=ctx->ct;
  1053.                 BTJ_JFE_EmitDHT(ctx, 0);
  1054.                 BTJ_JFE_EmitDHT(ctx, 1);
  1055.                 BTJ_JFE_EmitDHT(ctx, 2);
  1056.                 BTJ_JFE_EmitDHT(ctx, 3);
  1057.                 i=ctx->ct-ct0;
  1058.                 tab=malloc(i);
  1059.                 tabsz=i;
  1060.                 memcpy(tab, ct0, i);
  1061.                 init=1;
  1062.                 return;
  1063.         }
  1064.        
  1065.         memcpy(ctx->ct, tab, tabsz);
  1066.         ctx->ct+=tabsz;
  1067. }
  1068.  
  1069. static const int pdjpg_ijg_qtab_y[64] = {
  1070. 16, 11, 10, 16,  24,  40,  51,  61,
  1071. 12, 12, 14, 19,  26,  58,  60,  55,
  1072. 14, 13, 16, 24,  40,  57,  69,  56,
  1073. 14, 17, 22, 29,  51,  87,  80,  62,
  1074. 18, 22, 37, 56,  68, 109, 103,  77,
  1075. 24, 35, 55, 64,  81, 104, 113,  92,
  1076. 49, 64, 78, 87, 103, 121, 120, 101,
  1077. 72, 92, 95, 98, 112, 100, 103,  99};
  1078.  
  1079. static const int pdjpg_ijg_qtab_uv[64] = {
  1080. 99, 99, 99, 99, 99, 99, 99, 99,
  1081. 99, 99, 99, 99, 99, 99, 99, 99,
  1082. 99, 99, 99, 99, 99, 99, 99, 99,
  1083. 99, 99, 99, 99, 99, 99, 99, 99,
  1084. 47, 66, 99, 99, 99, 99, 99, 99,
  1085. 24, 26, 56, 99, 99, 99, 99, 99,
  1086. 18, 21, 26, 66, 99, 99, 99, 99,
  1087. 17, 18, 24, 47, 99, 99, 99, 99};
  1088.  
  1089. void BTJ_JFE_MakeQuantTabFastIJG_Y(byte *tab, float qf)
  1090. {
  1091.         double s, q;
  1092.         int i, j;
  1093.  
  1094.         q=(qf*100);
  1095.         s=(q<50)?5000/q:(200-2*q);
  1096.         for(i=0; i<64; i++)
  1097.         {
  1098.                 j=(int)((s * pdjpg_ijg_qtab_y[i]+50)/100);
  1099.                 j=(j<1)?1:((j<256)?j:255);
  1100.                 tab[i]=j;
  1101.         }
  1102. }
  1103.  
  1104. void BTJ_JFE_MakeQuantTabFastIJG_UV(byte *tab, float qf)
  1105. {
  1106.         double s, q;
  1107.         int i, j;
  1108.  
  1109.         q=(qf*100);
  1110.         s=(q<50)?5000/q:(200-2*q);
  1111.         for(i=0; i<64; i++)
  1112.         {
  1113.                 j=(int)((s*pdjpg_ijg_qtab_uv[i]+50)/100);
  1114.                 j=(j<1)?1:((j<256)?j:255);
  1115.                 tab[i]=j;
  1116.         }
  1117. }
  1118.  
  1119.  
  1120. BGBBTJ_API BGBBTJ_JFE_Context *BTJ_JFE_AllocContext(void)
  1121. {
  1122.         BGBBTJ_JFE_Context *ctx;
  1123.        
  1124.         ctx=gcalloc(sizeof(BGBBTJ_JFE_Context));
  1125.         return(ctx);
  1126. }
  1127.  
  1128. BGBBTJ_API void BTJ_JFE_FreeContext(
  1129.         BGBBTJ_JFE_Context *ctx)
  1130. {
  1131.         gcfree(ctx);
  1132. }
  1133.  
  1134. BGBBTJ_API void BTJ_JFE_FlushEncodeFast(
  1135.         BGBBTJ_JFE_Context *ctx)
  1136. {
  1137. }
  1138.  
  1139. BGBBTJ_API int BTJ_JFE_EncodeFast(byte *ibuf, byte *obuf,
  1140.         int xs, int ys, int qf, int pf)
  1141. {
  1142.         static BGBBTJ_JFE_Context cctx;
  1143.         return(BTJ_JFE_EncodeFastCtx(&cctx, ibuf, obuf,
  1144.                 xs, ys, qf, pf));
  1145. }
  1146.  
  1147. BGBBTJ_API int BTJ_JFE_EncodeFastCtx(
  1148.         BGBBTJ_JFE_Context *ctx,
  1149.         byte *ibuf, byte *obuf,
  1150.         int xs, int ys, int qf, int pf)
  1151. {
  1152.         short *tp;
  1153.         int xs2, ys2, xs3, ys3;
  1154.         int xs2b, ys2b, xs3b, ys3b;
  1155.         int i, j, k, l, n;
  1156.  
  1157.         xs2=((xs+7)/8)*8;
  1158.         ys2=((ys+7)/8)*8;
  1159.         xs3=((xs+15)/16)*8;
  1160.         ys3=((ys+15)/16)*8;
  1161.  
  1162.         if(!ctx->ydb || (xs!=ctx->lxs) || (ys!=ctx->lys))
  1163.         {
  1164.                 if(ctx->ydb)
  1165.                 {
  1166.                         free(ctx->ydb);
  1167.                         free(ctx->udb);
  1168.                         free(ctx->vdb);
  1169.                 }
  1170.  
  1171.                 ctx->ydb=malloc((xs2+8)*(ys2+16)*sizeof(short));
  1172.                 ctx->udb=malloc((xs3+8)*(ys3+8)*sizeof(short));
  1173.                 ctx->vdb=malloc((xs3+8)*(ys3+8)*sizeof(short));
  1174.  
  1175.                 ctx->lxs=xs;
  1176.                 ctx->lys=ys;
  1177.         }
  1178.  
  1179.         BTJ_JFE_FilterImageDCT2(ibuf,
  1180.                 ctx->ydb, ctx->udb, ctx->vdb, xs, ys, qf, pf);
  1181.  
  1182.         if(qf!=ctx->lqf)
  1183.         {
  1184.                 BTJ_JFE_MakeQuantTabFastIJG_Y(ctx->qt[0], (qf&255)/100.0);
  1185.                 BTJ_JFE_MakeQuantTabFastIJG_UV(ctx->qt[1], (qf&255)/100.0);
  1186.                 BTJ_JFEH_SetupQuantTabDivFP(ctx, 0);
  1187.                 BTJ_JFEH_SetupQuantTabDivFP(ctx, 1);
  1188.                 ctx->lqf=qf;
  1189.         }
  1190.  
  1191.         xs2b=xs2/8; ys2b=ys2/8;
  1192.         xs3b=xs3/8; ys3b=ys3/8;
  1193.  
  1194.         l=0;
  1195.         for(i=0; i<ys3b; i++)
  1196.                 for(j=0; j<xs3b; j++)
  1197.         {
  1198.                 tp=ctx->ydb+((i*2+0)*xs2b+j*2+0)*64;
  1199.                 BTJ_JFEH_QuantBlock(ctx, tp, tp, 0);
  1200.                 tp[0]-=l; l=tp[0]+l;
  1201.  
  1202.                 tp=ctx->ydb+((i*2+0)*xs2b+j*2+1)*64;
  1203.                 BTJ_JFEH_QuantBlock(ctx, tp, tp, 0);
  1204.                 tp[0]-=l; l=tp[0]+l;
  1205.  
  1206.                 tp=ctx->ydb+((i*2+1)*xs2b+j*2+0)*64;
  1207.                 BTJ_JFEH_QuantBlock(ctx, tp, tp, 0);
  1208.                 tp[0]-=l; l=tp[0]+l;
  1209.  
  1210.                 tp=ctx->ydb+((i*2+1)*xs2b+j*2+1)*64;
  1211.                 BTJ_JFEH_QuantBlock(ctx, tp, tp, 0);
  1212.                 tp[0]-=l; l=tp[0]+l;
  1213.         }
  1214.  
  1215.         j=xs3b*ys3b; k=0; l=0;
  1216.         for(i=0; i<j; i++)
  1217.         {
  1218.                 BTJ_JFEH_QuantBlock(ctx, ctx->udb+i*64, ctx->udb+i*64, 1);
  1219.                 BTJ_JFEH_QuantBlock(ctx, ctx->vdb+i*64, ctx->vdb+i*64, 1);
  1220.                 ctx->udb[i*64+0]-=k; k=ctx->udb[i*64+0]+k;
  1221.                 ctx->vdb[i*64+0]-=l; l=ctx->vdb[i*64+0]+l;
  1222.         }
  1223.  
  1224.         ctx->ct=obuf;
  1225.         ctx->win=0;
  1226.         ctx->pos=32;
  1227.  
  1228.         *ctx->ct++=0xFF;
  1229.         *ctx->ct++=JPG_SOI;
  1230.  
  1231.         BTJ_JFE_EmitDQT(ctx, 0);
  1232.         BTJ_JFE_EmitDQT(ctx, 1);
  1233.  
  1234.         BTJ_JFE_EmitSOF(ctx, xs, ys);
  1235.  
  1236.         BTJ_JFE_EmitDHT2(ctx);
  1237.  
  1238. //      BTJ_JFE_EmitDHT(ctx, 0);
  1239. //      BTJ_JFE_EmitDHT(ctx, 1);
  1240. //      BTJ_JFE_EmitDHT(ctx, 2);
  1241. //      BTJ_JFE_EmitDHT(ctx, 3);
  1242.  
  1243.         BTJ_JFE_EmitSOS(ctx);
  1244.  
  1245.         for(i=0; i<ys3b; i++)
  1246.                 for(j=0; j<xs3b; j++)
  1247.         {
  1248.                 BTJ_JFEH_EncodeBlock(ctx, ctx->ydb+((i*2+0)*xs2b+j*2+0)*64, 0, 1);
  1249.                 BTJ_JFEH_EncodeBlock(ctx, ctx->ydb+((i*2+0)*xs2b+j*2+1)*64, 0, 1);
  1250.                 BTJ_JFEH_EncodeBlock(ctx, ctx->ydb+((i*2+1)*xs2b+j*2+0)*64, 0, 1);
  1251.                 BTJ_JFEH_EncodeBlock(ctx, ctx->ydb+((i*2+1)*xs2b+j*2+1)*64, 0, 1);
  1252.  
  1253.                 k=i*xs3b+j;
  1254.                 BTJ_JFEH_EncodeBlock(ctx, ctx->udb+k*64, 2, 3);
  1255.                 BTJ_JFEH_EncodeBlock(ctx, ctx->vdb+k*64, 2, 3);
  1256.         }
  1257.  
  1258.         BTJ_JFEH_FlushBits(ctx);
  1259.  
  1260.         *ctx->ct++=0xFF;
  1261.         *ctx->ct++=JPG_EOI;
  1262.  
  1263.         i=ctx->ct-obuf;
  1264.  
  1265.         return(i);
  1266. }