Advertisement
cr88192

(Updated) Moderately optimized JPEG encoder.

Jun 13th, 2013
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 32.51 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement