libmpeg2.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:98k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
  3.  * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  4.  *
  5.  * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
  6.  * See http://libmpeg2.sourceforge.net/ for updates.
  7.  *
  8.  * mpeg2dec is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * mpeg2dec is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21.  */
  22. #include "stdafx.h"
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <malloc.h>
  26. #include "libmpeg2.h"
  27. #include "......DSUtilvd.h"
  28. #ifndef NULL
  29. #define NULL 0
  30. #endif
  31. // decode
  32. #define SEQ_EXT 2
  33. #define SEQ_DISPLAY_EXT 4
  34. #define QUANT_MATRIX_EXT 8
  35. #define COPYRIGHT_EXT 0x10
  36. #define PIC_DISPLAY_EXT 0x80
  37. #define PIC_CODING_EXT 0x100
  38. /* default intra quant matrix, in zig-zag order */
  39. static const uint8_t default_intra_quantizer_matrix[64] = {
  40.     8,
  41.     16, 16,
  42.     19, 16, 19,
  43.     22, 22, 22, 22,
  44.     22, 22, 26, 24, 26,
  45.     27, 27, 27, 26, 26, 26,
  46.     26, 27, 27, 27, 29, 29, 29,
  47.     34, 34, 34, 29, 29, 29, 27, 27,
  48.     29, 29, 32, 32, 34, 34, 37,
  49.     38, 37, 35, 35, 34, 35,
  50.     38, 38, 40, 40, 40,
  51.     48, 48, 46, 46,
  52.     56, 56, 58,
  53.     69, 69,
  54.     83
  55. };
  56. static uint8_t mpeg2_scan_norm_2[64] = {
  57.     /* Zig-Zag scan pattern */
  58.      0,  1,  8, 16,  9,  2,  3, 10, 17, 24, 32, 25, 18, 11,  4,  5,
  59.     12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13,  6,  7, 14, 21, 28,
  60.     35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
  61.     58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
  62. };
  63. static uint8_t mpeg2_scan_alt_2[64] = {
  64.     /* Alternate scan pattern */
  65.      0, 8,  16, 24,  1,  9,  2, 10, 17, 25, 32, 40, 48, 56, 57, 49,
  66.     41, 33, 26, 18,  3, 11,  4, 12, 19, 27, 34, 42, 50, 58, 35, 43,
  67.     51, 59, 20, 28,  5, 13,  6, 14, 21, 29, 36, 44, 52, 60, 37, 45,
  68.     53, 61, 22, 30,  7, 15, 23, 31, 38, 46, 54, 62, 39, 47, 55, 63
  69. };
  70. // dummy
  71. extern "C" uint8_t mpeg2_scan_norm[64];
  72. extern "C" uint8_t mpeg2_scan_alt[64];
  73. uint8_t mpeg2_scan_norm[64];
  74. uint8_t mpeg2_scan_alt[64];
  75. // idct (c)
  76. #define W1 2841 /* 2048 * sqrt (2) * cos (1 * pi / 16) */
  77. #define W2 2676 /* 2048 * sqrt (2) * cos (2 * pi / 16) */
  78. #define W3 2408 /* 2048 * sqrt (2) * cos (3 * pi / 16) */
  79. #define W5 1609 /* 2048 * sqrt (2) * cos (5 * pi / 16) */
  80. #define W6 1108 /* 2048 * sqrt (2) * cos (6 * pi / 16) */
  81. #define W7 565  /* 2048 * sqrt (2) * cos (7 * pi / 16) */
  82. /*
  83.  * In legal streams, the IDCT output should be between -384 and +384.
  84.  * In corrupted streams, it is possible to force the IDCT output to go
  85.  * to +-3826 - this is the worst case for a column IDCT where the
  86.  * column inputs are 16-bit values.
  87.  */
  88. static uint8_t mpeg2_clip[3840 * 2 + 256];
  89. #define CLIP(i) ((mpeg2_clip + 3840)[i])
  90. #define BUTTERFLY(t0,t1,W0,W1,d0,d1)
  91. {
  92.     int tmp = W0 * (d0 + d1);
  93.     t0 = tmp + (W1 - W0) * d1;
  94.     t1 = tmp - (W1 + W0) * d0;
  95. }
  96. static void __inline idct_row(int16_t* block)
  97. {
  98.     int d0, d1, d2, d3;
  99.     int a0, a1, a2, a3, b0, b1, b2, b3;
  100.     int t0, t1, t2, t3;
  101.     /* shortcut */
  102.     if(!(block[1] | ((int32_t *)block)[1] | ((int32_t *)block)[2] | ((int32_t *)block)[3]))
  103. {
  104. uint32_t tmp = (uint16_t) (block[0] << 3);
  105. tmp |= tmp << 16;
  106. ((int32_t *)block)[0] = tmp;
  107. ((int32_t *)block)[1] = tmp;
  108. ((int32_t *)block)[2] = tmp;
  109. ((int32_t *)block)[3] = tmp;
  110. return;
  111.     }
  112.     d0 = (block[0] << 11) + 128;
  113.     d1 = block[1];
  114.     d2 = block[2] << 11;
  115.     d3 = block[3];
  116.     t0 = d0 + d2;
  117.     t1 = d0 - d2;
  118.     BUTTERFLY(t2, t3, W6, W2, d3, d1);
  119.     a0 = t0 + t2;
  120.     a1 = t1 + t3;
  121.     a2 = t1 - t3;
  122.     a3 = t0 - t2;
  123.     d0 = block[4];
  124.     d1 = block[5];
  125.     d2 = block[6];
  126.     d3 = block[7];
  127.     BUTTERFLY(t0, t1, W7, W1, d3, d0);
  128.     BUTTERFLY(t2, t3, W3, W5, d1, d2);
  129.     b0 = t0 + t2;
  130.     b3 = t1 + t3;
  131.     t0 -= t2;
  132.     t1 -= t3;
  133.     b1 = ((t0 + t1) * 181) >> 8;
  134.     b2 = ((t0 - t1) * 181) >> 8;
  135.     block[0] = (a0 + b0) >> 8;
  136.     block[1] = (a1 + b1) >> 8;
  137.     block[2] = (a2 + b2) >> 8;
  138.     block[3] = (a3 + b3) >> 8;
  139.     block[4] = (a3 - b3) >> 8;
  140.     block[5] = (a2 - b2) >> 8;
  141.     block[6] = (a1 - b1) >> 8;
  142.     block[7] = (a0 - b0) >> 8;
  143. }
  144. static void __inline idct_col(int16_t* block)
  145. {
  146.     int d0, d1, d2, d3;
  147.     int a0, a1, a2, a3, b0, b1, b2, b3;
  148.     int t0, t1, t2, t3;
  149.     d0 = (block[8*0] << 11) + 65536;
  150.     d1 = block[8*1];
  151.     d2 = block[8*2] << 11;
  152.     d3 = block[8*3];
  153.     t0 = d0 + d2;
  154.     t1 = d0 - d2;
  155.     BUTTERFLY(t2, t3, W6, W2, d3, d1);
  156.     a0 = t0 + t2;
  157.     a1 = t1 + t3;
  158.     a2 = t1 - t3;
  159.     a3 = t0 - t2;
  160.     d0 = block[8*4];
  161.     d1 = block[8*5];
  162.     d2 = block[8*6];
  163.     d3 = block[8*7];
  164.     BUTTERFLY(t0, t1, W7, W1, d3, d0);
  165.     BUTTERFLY(t2, t3, W3, W5, d1, d2);
  166.     b0 = t0 + t2;
  167.     b3 = t1 + t3;
  168.     t0 = (t0 - t2) >> 8;
  169.     t1 = (t1 - t3) >> 8;
  170.     b1 = (t0 + t1) * 181;
  171.     b2 = (t0 - t1) * 181;
  172.     block[8*0] = (a0 + b0) >> 17;
  173.     block[8*1] = (a1 + b1) >> 17;
  174.     block[8*2] = (a2 + b2) >> 17;
  175.     block[8*3] = (a3 + b3) >> 17;
  176.     block[8*4] = (a3 - b3) >> 17;
  177.     block[8*5] = (a2 - b2) >> 17;
  178.     block[8*6] = (a1 - b1) >> 17;
  179.     block[8*7] = (a0 - b0) >> 17;
  180. }
  181. static void mpeg2_idct_copy_c(int16_t* block, uint8_t* dest, const int stride)
  182. {
  183. for(int i = 0; i < 8; i++) idct_row(block + 8 * i);
  184. for(int i = 0; i < 8; i++) idct_col(block + i);
  185.     for(int i = 0; i < 8; i++)
  186. {
  187. dest[0] = CLIP(block[0]);
  188. dest[1] = CLIP(block[1]);
  189. dest[2] = CLIP(block[2]);
  190. dest[3] = CLIP(block[3]);
  191. dest[4] = CLIP(block[4]);
  192. dest[5] = CLIP(block[5]);
  193. dest[6] = CLIP(block[6]);
  194. dest[7] = CLIP(block[7]);
  195. block[0] = 0; block[1] = 0; block[2] = 0; block[3] = 0;
  196. block[4] = 0; block[5] = 0; block[6] = 0; block[7] = 0;
  197. dest += stride;
  198. block += 8;
  199.     }
  200. }
  201. static void mpeg2_idct_add_c(const int last, int16_t* block, uint8_t* dest, const int stride)
  202. {
  203.     if(last != 129 || (block[0] & 7) == 4)
  204. {
  205. for(int i = 0; i < 8; i++) idct_row(block + 8 * i);
  206. for(int i = 0; i < 8; i++) idct_col(block + i);
  207. for(int i = 0; i < 8; i++)
  208. {
  209. dest[0] = CLIP(block[0] + dest[0]);
  210. dest[1] = CLIP(block[1] + dest[1]);
  211. dest[2] = CLIP(block[2] + dest[2]);
  212. dest[3] = CLIP(block[3] + dest[3]);
  213. dest[4] = CLIP(block[4] + dest[4]);
  214. dest[5] = CLIP(block[5] + dest[5]);
  215. dest[6] = CLIP(block[6] + dest[6]);
  216. dest[7] = CLIP(block[7] + dest[7]);
  217. block[0] = 0; block[1] = 0; block[2] = 0; block[3] = 0;
  218. block[4] = 0; block[5] = 0; block[6] = 0; block[7] = 0;
  219. dest += stride;
  220. block += 8;
  221. }
  222.     }
  223. else
  224. {
  225. int DC = (block[0] + 4) >> 3;
  226. block[0] = block[63] = 0;
  227. for(int i = 0; i < 8; i++)
  228. {
  229. dest[0] = CLIP(DC + dest[0]);
  230. dest[1] = CLIP(DC + dest[1]);
  231. dest[2] = CLIP(DC + dest[2]);
  232. dest[3] = CLIP(DC + dest[3]);
  233. dest[4] = CLIP(DC + dest[4]);
  234. dest[5] = CLIP(DC + dest[5]);
  235. dest[6] = CLIP(DC + dest[6]);
  236. dest[7] = CLIP(DC + dest[7]);
  237. dest += stride;
  238. }
  239.     }
  240. }
  241. static void mpeg2_idct_init_c()
  242. {
  243. for(int i = -3840; i < 3840 + 256; i++)
  244. {
  245. CLIP(i) = (i < 0) ? 0 : ((i > 255) ? 255 : i);
  246. }
  247. // only needed with idct_c
  248. for(int i = 0; i < 64; i++)
  249. {
  250. mpeg2_scan_norm_2[i] = ((mpeg2_scan_norm_2[i] & 0x36) >> 1) | ((mpeg2_scan_norm_2[i] & 0x09) << 2);
  251. mpeg2_scan_alt_2[i] = ((mpeg2_scan_alt_2[i] & 0x36) >> 1) | ((mpeg2_scan_alt_2[i] & 0x09) << 2);
  252. }
  253. }
  254. // mc (c)
  255. #define avg2(a,b) ((a+b+1)>>1)
  256. #define avg4(a,b,c,d) ((a+b+c+d+2)>>2)
  257. #define predict_o(i) (ref[i])
  258. #define predict_x(i) (avg2(ref[i], ref[i+1]))
  259. #define predict_y(i) (avg2(ref[i], (ref+stride)[i]))
  260. #define predict_xy(i) (avg4(ref[i], ref[i+1], (ref+stride)[i], (ref+stride)[i+1]))
  261. #define put(predictor,i) dest[i] = predictor(i)
  262. #define avg(predictor,i) dest[i] = avg2(predictor(i), dest[i])
  263. /* mc function template */
  264. #define MC_FUNC(op,xy)
  265. static void MC_##op##_##xy##_16_c (uint8_t* dest, const uint8_t* ref, const int stride, int height)
  266. {
  267.     do {
  268. op (predict_##xy, 0);
  269. op (predict_##xy, 1);
  270. op (predict_##xy, 2);
  271. op (predict_##xy, 3);
  272. op (predict_##xy, 4);
  273. op (predict_##xy, 5);
  274. op (predict_##xy, 6);
  275. op (predict_##xy, 7);
  276. op (predict_##xy, 8);
  277. op (predict_##xy, 9);
  278. op (predict_##xy, 10);
  279. op (predict_##xy, 11);
  280. op (predict_##xy, 12);
  281. op (predict_##xy, 13);
  282. op (predict_##xy, 14);
  283. op (predict_##xy, 15);
  284. ref += stride;
  285. dest += stride;
  286.     } while (--height);
  287. }
  288. static void MC_##op##_##xy##_8_c (uint8_t * dest, const uint8_t * ref, const int stride, int height)
  289. {
  290.     do {
  291. op (predict_##xy, 0);
  292. op (predict_##xy, 1);
  293. op (predict_##xy, 2);
  294. op (predict_##xy, 3);
  295. op (predict_##xy, 4);
  296. op (predict_##xy, 5);
  297. op (predict_##xy, 6);
  298. op (predict_##xy, 7);
  299. ref += stride;
  300. dest += stride;
  301.     } while (--height);
  302. }
  303. /* definitions of the actual mc functions */
  304. MC_FUNC(put,o)
  305. MC_FUNC(avg,o)
  306. MC_FUNC(put,x)
  307. MC_FUNC(avg,x)
  308. MC_FUNC(put,y)
  309. MC_FUNC(avg,y)
  310. MC_FUNC(put,xy)
  311. MC_FUNC(avg,xy)
  312. #define MPEG2_MC_EXTERN(x) mpeg2_mc_t mpeg2_mc_##x = {
  313.     {MC_put_o_16_##x, MC_put_x_16_##x, MC_put_y_16_##x, MC_put_xy_16_##x,
  314.      MC_put_o_8_##x,  MC_put_x_8_##x,  MC_put_y_8_##x,  MC_put_xy_8_##x},
  315.     {MC_avg_o_16_##x, MC_avg_x_16_##x, MC_avg_y_16_##x, MC_avg_xy_16_##x,
  316.      MC_avg_o_8_##x,  MC_avg_x_8_##x,  MC_avg_y_8_##x,  MC_avg_xy_8_##x}
  317. };
  318. MPEG2_MC_EXTERN(c)
  319. // idct (mmx)
  320. extern "C" void mpeg2_idct_copy_mmx(int16_t* block, uint8_t* dest, const int stride);
  321. extern "C" void mpeg2_idct_add_mmx(const int last, int16_t* block, uint8_t* dest, const int stride);
  322. static void mpeg2_idct_init_mmx()
  323. {
  324.     for(int i = 0; i < 64; i++)
  325. {
  326. mpeg2_scan_norm_2[i] = (mpeg2_scan_norm_2[i] & 0x38) | ((mpeg2_scan_norm_2[i] & 6) >> 1) | ((mpeg2_scan_norm_2[i] & 1) << 2);
  327. mpeg2_scan_alt_2[i] = (mpeg2_scan_alt_2[i] & 0x38) | ((mpeg2_scan_alt_2[i] & 6) >> 1) | ((mpeg2_scan_alt_2[i] & 1) << 2);
  328.     }
  329. }
  330. // mc (mmx)
  331. extern "C" mpeg2_mc_t mpeg2_mc_mmx;
  332. // idct (sse2)
  333. extern void mpeg2_idct_init_sse2();
  334. extern void mpeg2_idct_copy_sse2(int16_t* block, uint8_t* dest, const int stride);
  335. extern void mpeg2_idct_add_sse2(const int last, int16_t* block, uint8_t* dest, const int stride);
  336. // mc (sse2)
  337. extern mpeg2_mc_t mpeg2_mc_sse2;
  338. // idct (null)
  339. static void mpeg2_idct_init_null() {}
  340. static void mpeg2_idct_copy_null(int16_t* block, uint8_t* dest, const int stride) {}
  341. static void mpeg2_idct_add_null(const int last, int16_t* block, uint8_t* dest, const int stride) {}
  342. // mc (null)
  343. static void MC_null(uint8_t* dest, const uint8_t* ref, const int stride, int height) {}
  344. mpeg2_mc_t mpeg2_mc_null = 
  345. {
  346. {MC_null, MC_null, MC_null, MC_null, MC_null, MC_null, MC_null, MC_null},
  347. {MC_null, MC_null, MC_null, MC_null, MC_null, MC_null, MC_null, MC_null}
  348. };
  349. //
  350. CMpeg2Dec::CMpeg2Dec()
  351. {
  352.     m_shift = 0;
  353.     m_is_display_initialized = 0;
  354. m_action = NULL;
  355.     m_state = STATE_BUFFER;
  356.     m_ext_state = 0;
  357. m_chunk_buffer = m_chunk_start = m_chunk_ptr = NULL;
  358.     m_code = 0;
  359.     m_pts_current = m_pts_previous = 0;
  360.     m_num_pts = m_bytes_since_pts = 0;
  361.     m_first = 0;
  362.     m_alloc_index = 0;
  363.     m_first_decode_slice = m_nb_decode_slices = 0;
  364.     memset(&m_new_sequence, 0, sizeof(m_new_sequence));
  365.     memset(&m_sequence, 0, sizeof(m_sequence));
  366.     memset(&m_gop, 0, sizeof(m_gop));
  367.     memset(&m_pictures, 0, sizeof(m_pictures));
  368. m_picture = NULL;
  369.     memset(&m_fbuf, 0, sizeof(m_fbuf));
  370.     memset(&m_fbuf_alloc, 0, sizeof(m_fbuf_alloc));
  371.     m_buf_start = m_buf_end = NULL;
  372.     m_display_offset_x = m_display_offset_y = 0;
  373.     m_copy_matrix = 0;
  374.     memset(&m_intra_quantizer_matrix, 0, sizeof(m_intra_quantizer_matrix));
  375.     memset(&m_non_intra_quantizer_matrix, 0, sizeof(m_non_intra_quantizer_matrix));
  376. //
  377. mpeg2_init();
  378. }
  379. CMpeg2Dec::~CMpeg2Dec()
  380. {
  381. mpeg2_close();
  382. }
  383. void CMpeg2Dec::mpeg2_init()
  384. {
  385. m_chunk_buffer = (uint8_t*)_aligned_malloc(BUFFER_SIZE + 4, 16);
  386. m_shift = 0xffffff00;
  387. m_code = 0xb4;
  388. m_action = &CMpeg2Dec::mpeg2_seek_sequence;
  389. m_sequence.width = (unsigned)-1;
  390. }
  391. void CMpeg2Dec::mpeg2_close()
  392. {
  393. /* static uint8_t finalizer[] = {0,0,1,0xb4}; */
  394. /* mpeg2_decode_data (mpeg2dec, finalizer, finalizer+4); */
  395. mpeg2_header_state_init();
  396. _aligned_free(m_chunk_buffer);
  397. }
  398. //
  399. int CMpeg2Dec::skip_chunk(int bytes)
  400. {
  401. if(!bytes)
  402. return 0;
  403. int len = 0;
  404. uint8_t* current = m_buf_start;
  405. uint8_t* limit = current + bytes;
  406. while(current < limit)
  407. {
  408. if(m_shift == 0x00000100)
  409. {
  410. m_shift = 0xffffff00;
  411. len = ++current - m_buf_start;
  412. break;
  413. }
  414. m_shift = (m_shift | *current++) << 8;
  415. }
  416. m_buf_start = current;
  417. return len;
  418. }
  419. int CMpeg2Dec::copy_chunk(int bytes)
  420. {
  421. if(!bytes)
  422. return 0;
  423. int len = 0;
  424. // this assembly gives us a nice speed up
  425. // 36 sec down to 32 sec decoding the ts.stream.tpr test file
  426. // (idtc, mc was set to null)
  427. __asm
  428. {
  429. mov ebx, this
  430. mov esi, [ebx].m_buf_start
  431. mov edi, [ebx].m_chunk_ptr
  432. mov ecx, bytes
  433. mov edx, [ebx].m_shift
  434. copy_chunk_loop:
  435. cmp edx, 0x00000100
  436. jne copy_chunk_continue
  437. mov edx, 0xffffff00
  438. inc edi
  439. mov [ebx].m_chunk_ptr, edi
  440. inc esi
  441. mov eax, esi
  442. sub eax, [ebx].m_buf_start
  443. mov len, eax
  444. jmp copy_chunk_end
  445. copy_chunk_continue:
  446. movzx eax, byte ptr [esi]
  447. or edx, eax
  448. shl edx, 8
  449. mov byte ptr [edi], al
  450. inc esi
  451. inc edi
  452. dec ecx
  453. jnz copy_chunk_loop
  454. copy_chunk_end:
  455. mov [ebx].m_buf_start, esi
  456. mov [ebx].m_shift, edx
  457. }
  458. /*
  459. uint8_t* chunk_ptr = m_chunk_ptr;
  460. uint8_t* current = m_buf_start;
  461. uint8_t* limit = current + bytes;
  462. while(current < limit)
  463. {
  464. if(m_shift == 0x00000100)
  465. {
  466. m_shift = 0xffffff00;
  467. len = ++current - m_buf_start;
  468. m_chunk_ptr = ++chunk_ptr;
  469. break;
  470. }
  471. m_shift = (m_shift | (*chunk_ptr++ = *current++)) << 8;
  472. }
  473. m_buf_start = current;
  474. */
  475. return len;
  476. }
  477. mpeg2_state_t CMpeg2Dec::seek_chunk()
  478. {
  479. int size = m_buf_end - m_buf_start;
  480. if(int skipped = skip_chunk(size))
  481. {
  482. m_bytes_since_pts += skipped;
  483. m_code = m_buf_start[-1];
  484. return (mpeg2_state_t)-1;
  485. }
  486. m_bytes_since_pts += size;
  487. return STATE_BUFFER;
  488. }
  489. mpeg2_state_t CMpeg2Dec::seek_header()
  490. {
  491. while(m_code != 0xb3 && (m_code != 0xb7 && m_code != 0xb8 && m_code || m_sequence.width == (unsigned)-1))
  492. {
  493. if(seek_chunk() == STATE_BUFFER)
  494. return STATE_BUFFER;
  495. }
  496. m_chunk_start = m_chunk_ptr = m_chunk_buffer;
  497. return m_code 
  498. ? mpeg2_parse_header()
  499. : mpeg2_header_picture_start();
  500. }
  501. mpeg2_state_t CMpeg2Dec::seek_sequence()
  502. {
  503. mpeg2_header_state_init();
  504. m_action = &CMpeg2Dec::seek_header;
  505. return seek_header();
  506. }
  507. //
  508. void CMpeg2Dec::mpeg2_buffer(uint8_t* start, uint8_t* end)
  509. {
  510. m_buf_start = start;
  511. m_buf_end = end;
  512. }
  513. int CMpeg2Dec::mpeg2_getpos()
  514. {
  515. return m_buf_end - m_buf_start;
  516. }
  517. //
  518. mpeg2_state_t CMpeg2Dec::mpeg2_parse()
  519. {
  520. if(m_action)
  521. {
  522. mpeg2_state_t state = (this->*m_action)();
  523. if((int)state >= 0)
  524. return state;
  525. }
  526. while(1)
  527. {
  528. while((unsigned)(m_code - m_first_decode_slice) < m_nb_decode_slices)
  529. {
  530. int size_buffer = m_buf_end - m_buf_start;
  531. int size_chunk = (m_chunk_buffer + BUFFER_SIZE - m_chunk_ptr);
  532. int copied;
  533. if(size_buffer <= size_chunk)
  534. {
  535. copied = copy_chunk(size_buffer);
  536. if(!copied)
  537. {
  538. m_bytes_since_pts += size_buffer;
  539. m_chunk_ptr += size_buffer;
  540. return STATE_BUFFER;
  541. }
  542. }
  543. else
  544. {
  545. copied = copy_chunk(size_chunk);
  546. if(!copied)
  547. {
  548. /* filled the chunk buffer without finding a start code */
  549. m_bytes_since_pts += size_chunk;
  550. m_action = &CMpeg2Dec::seek_chunk;
  551. return STATE_INVALID;
  552. }
  553. }
  554. m_bytes_since_pts += copied;
  555. m_decoder.mpeg2_slice(m_code, m_chunk_start);
  556. m_code = m_buf_start[-1];
  557. m_chunk_ptr = m_chunk_start;
  558. }
  559. if((unsigned)(m_code - 1) >= 0xb0 - 1)
  560. break;
  561. if(seek_chunk() == STATE_BUFFER)
  562. return STATE_BUFFER;
  563. }
  564. switch(m_code)
  565. {
  566. case 0x00:
  567. m_action = &CMpeg2Dec::mpeg2_header_picture_start;
  568. return m_state;
  569. case 0xb7:
  570. m_action = &CMpeg2Dec::mpeg2_header_end;
  571. break;
  572. case 0xb3:
  573. case 0xb8:
  574. m_action = &CMpeg2Dec::mpeg2_parse_header;
  575. break;
  576. case 0xbe:
  577. m_action = &CMpeg2Dec::seek_chunk;
  578. return STATE_PADDING;
  579. default:
  580. m_action = &CMpeg2Dec::seek_chunk;
  581. return STATE_INVALID;
  582. }
  583. if(m_state != STATE_SLICE)
  584. m_state = STATE_INVALID;
  585. return m_state;
  586. }
  587. void CMpeg2Dec::mpeg2_skip(int skip)
  588. {
  589. m_first_decode_slice = 1;
  590. m_nb_decode_slices = skip ? 0 : (0xb0 - 1);
  591. }
  592. void CMpeg2Dec::mpeg2_slice_region(int start, int end)
  593. {
  594. start = (start < 1) ? 1 : (start > 0xb0) ? 0xb0 : start;
  595. end = (end < start) ? start : (end > 0xb0) ? 0xb0 : end;
  596. m_first_decode_slice = start;
  597. m_nb_decode_slices = end - start;
  598. }
  599. void CMpeg2Dec::mpeg2_pts(uint32_t pts)
  600. {
  601. m_pts_previous = m_pts_current;
  602. m_pts_current = pts;
  603. m_num_pts++;
  604. m_bytes_since_pts = 0;
  605. }
  606. //
  607. /* decode.c */
  608. #define RECEIVED(code,state) (((state) << 8) + (code))
  609. mpeg2_state_t CMpeg2Dec::mpeg2_seek_sequence()
  610. {
  611. mpeg2_header_state_init();
  612. m_action = &CMpeg2Dec::seek_header;
  613. return seek_header();
  614. }
  615. mpeg2_state_t CMpeg2Dec::mpeg2_parse_header()
  616. {
  617. static int (CMpeg2Dec::* process_header[]) () =
  618. {
  619. &CMpeg2Dec::mpeg2_header_picture, 
  620. &CMpeg2Dec::mpeg2_header_extension, 
  621. &CMpeg2Dec::mpeg2_header_user_data,
  622. &CMpeg2Dec::mpeg2_header_sequence, 
  623. NULL, NULL, NULL, NULL, 
  624. &CMpeg2Dec::mpeg2_header_gop
  625. };
  626. m_action = &CMpeg2Dec::mpeg2_parse_header;
  627. while(1)
  628. {
  629. int size_buffer = m_buf_end - m_buf_start;
  630. int size_chunk = (m_chunk_buffer + BUFFER_SIZE - m_chunk_ptr);
  631. int copied;
  632. if(size_buffer <= size_chunk)
  633. {
  634. copied = copy_chunk(size_buffer);
  635. if(!copied)
  636. {
  637. m_bytes_since_pts += size_buffer;
  638. m_chunk_ptr += size_buffer;
  639. return STATE_BUFFER;
  640. }
  641. }
  642. else
  643. {
  644. copied = copy_chunk(size_chunk);
  645. if(!copied)
  646. {
  647. /* filled the chunk buffer without finding a start code */
  648. m_bytes_since_pts += size_chunk;
  649. m_code = 0xb4;
  650. m_action = &CMpeg2Dec::seek_header;
  651. return STATE_INVALID;
  652. }
  653. }
  654. m_bytes_since_pts += copied;
  655. if((this->*(process_header[m_code & 0x0b]))())
  656. {
  657. m_code = m_buf_start[-1];
  658. m_action = &CMpeg2Dec::seek_header;
  659. return STATE_INVALID;
  660. }
  661. m_code = m_buf_start[-1];
  662. switch(RECEIVED(m_code, m_state))
  663. {
  664. /* state transition after a sequence header */
  665. case RECEIVED(0x00, STATE_SEQUENCE):
  666. m_action = &CMpeg2Dec::mpeg2_header_picture_start;
  667. case RECEIVED(0xb8, STATE_SEQUENCE):
  668. mpeg2_header_sequence_finalize();
  669. break;
  670. /* other legal state transitions */
  671. case RECEIVED (0x00, STATE_GOP):
  672. m_action = &CMpeg2Dec::mpeg2_header_picture_start;
  673. break;
  674. case RECEIVED (0x01, STATE_PICTURE):
  675. case RECEIVED (0x01, STATE_PICTURE_2ND):
  676. mpeg2_header_matrix_finalize();
  677. m_action = &CMpeg2Dec::mpeg2_header_slice_start;
  678. break;
  679. /* legal headers within a given state */
  680. case RECEIVED (0xb2, STATE_SEQUENCE):
  681. case RECEIVED (0xb2, STATE_GOP):
  682. case RECEIVED (0xb2, STATE_PICTURE):
  683. case RECEIVED (0xb2, STATE_PICTURE_2ND):
  684. case RECEIVED (0xb5, STATE_SEQUENCE):
  685. case RECEIVED (0xb5, STATE_PICTURE):
  686. case RECEIVED (0xb5, STATE_PICTURE_2ND):
  687. m_chunk_ptr = m_chunk_start;
  688. continue;
  689. default:
  690. m_action = &CMpeg2Dec::seek_header;
  691. return STATE_INVALID;
  692. }
  693. m_chunk_start = m_chunk_ptr = m_chunk_buffer;
  694. return m_state;
  695. }
  696. }
  697. /* header.c */
  698. void CMpeg2Dec::mpeg2_header_state_init()
  699. {
  700.     if(m_sequence.width != (unsigned)-1)
  701. {
  702. m_sequence.width = (unsigned)-1;
  703. for(int i = 0; i < m_alloc_index; i++)
  704. _aligned_free(m_fbuf_alloc[i].buf[0]);
  705.     }
  706. m_decoder.m_scan = mpeg2_scan_norm_2;
  707. m_picture = m_pictures;
  708. m_fbuf[0] = &m_fbuf_alloc[0];
  709. m_fbuf[1] = &m_fbuf_alloc[1];
  710. m_fbuf[2] = &m_fbuf_alloc[2];
  711. m_first = true;
  712. m_alloc_index = 0;
  713. m_first_decode_slice = 1;
  714. m_nb_decode_slices = 0xb0 - 1;
  715. }
  716. int CMpeg2Dec::mpeg2_header_sequence()
  717. {
  718.     uint8_t* buffer = m_chunk_start;
  719.     mpeg2_sequence_t* sequence = &m_new_sequence;
  720.     static unsigned int frame_period[9] = {0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000};
  721.     if((buffer[6] & 0x20) != 0x20) /* missing marker_bit */
  722. return 1;
  723.     int i = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];
  724.     if(!(sequence->display_width = sequence->picture_width = i >> 12))
  725. return 1;
  726.     if(!(sequence->display_height = sequence->picture_height = i & 0xfff))
  727. return 1;
  728.     sequence->width = (sequence->picture_width + 15) & ~15;
  729.     sequence->height = (sequence->picture_height + 15) & ~15;
  730.     sequence->chroma_width = sequence->width >> 1;
  731.     sequence->chroma_height = sequence->height >> 1;
  732.     sequence->flags = (SEQ_FLAG_PROGRESSIVE_SEQUENCE | SEQ_VIDEO_FORMAT_UNSPECIFIED);
  733.     sequence->pixel_width = buffer[3] >> 4; /* aspect ratio */
  734.     sequence->frame_period = 0;
  735.     if((buffer[3] & 15) < 9) sequence->frame_period = frame_period[buffer[3] & 15];
  736.     sequence->byte_rate = (buffer[4]<<10) | (buffer[5]<<2) | (buffer[6]>>6);
  737.     sequence->vbv_buffer_size = ((buffer[6]<<16)|(buffer[7]<<8))&0x1ff800;
  738.     if(buffer[7] & 4) sequence->flags |= SEQ_FLAG_CONSTRAINED_PARAMETERS;
  739.     m_copy_matrix = 3;
  740.     if(buffer[7] & 2)
  741. {
  742. for(i = 0; i < 64; i++) 
  743. m_intra_quantizer_matrix[mpeg2_scan_norm_2[i]] = (buffer[i+7] << 7) | (buffer[i+8] >> 1);
  744. buffer += 64;
  745.     }
  746. else
  747. {
  748. for (i = 0; i < 64; i++)
  749. m_intra_quantizer_matrix[mpeg2_scan_norm_2[i]] = default_intra_quantizer_matrix[i];
  750. }
  751.     if(buffer[7] & 1)
  752. {
  753. for(i = 0; i < 64; i++)
  754.             m_non_intra_quantizer_matrix[mpeg2_scan_norm_2[i]] = buffer[i+8];
  755. }
  756.     else
  757. {
  758. for(i = 0; i < 64; i++)
  759. m_non_intra_quantizer_matrix[i] = 16;
  760. }
  761.     sequence->profile_level_id = 0x80;
  762.     sequence->colour_primaries = 0;
  763.     sequence->transfer_characteristics = 0;
  764.     sequence->matrix_coefficients = 0;
  765.     m_ext_state = SEQ_EXT;
  766.     m_state = STATE_SEQUENCE;
  767.     m_display_offset_x = m_display_offset_y = 0;
  768.     m_info.Reset();
  769.     m_info.m_gop = NULL;
  770.     return 0;
  771. }
  772. int CMpeg2Dec::mpeg2_header_gop()
  773. {
  774.     uint8_t* buffer = m_chunk_start;
  775. m_info.Reset();
  776.     if(!(buffer[1] & 8)) 
  777. return 1;
  778.     m_info.m_gop = &m_gop;
  779.     m_gop.hours = (buffer[0] >> 2) & 31;
  780.     m_gop.minutes = ((buffer[0] << 4) | (buffer[1] >> 4)) & 63;
  781.     m_gop.seconds = ((buffer[1] << 3) | (buffer[2] >> 5)) & 63;
  782.     m_gop.pictures = ((buffer[2] << 1) | (buffer[3] >> 7)) & 63;
  783.     m_gop.flags = (buffer[0] >> 7) | ((buffer[3] >> 4) & 6);
  784.     m_state = STATE_GOP;
  785.     return 0;
  786. }
  787. mpeg2_state_t CMpeg2Dec::mpeg2_header_picture_start()
  788. {
  789. {
  790. mpeg2_picture_t* picture;
  791. if(m_state != STATE_SLICE_1ST)
  792. {
  793. m_state = STATE_PICTURE;
  794. picture = m_pictures;
  795. if((m_decoder.m_coding_type != PIC_FLAG_CODING_TYPE_B) ^ (m_picture >= m_pictures + 2))
  796. picture += 2;
  797. }
  798. else
  799. {
  800. m_state = STATE_PICTURE_2ND;
  801. picture = m_picture + 1; /* second field picture */
  802. }
  803. m_picture = picture;
  804. }
  805.     m_picture->flags = 0;
  806.     if(m_num_pts)
  807. {
  808. if(m_bytes_since_pts >= 4)
  809. {
  810. m_num_pts = 0;
  811. m_picture->pts = m_pts_current;
  812. m_picture->flags = PIC_FLAG_PTS;
  813. }
  814. else if(m_num_pts > 1)
  815. {
  816.     m_num_pts = 1;
  817. m_picture->pts = m_pts_previous;
  818. m_picture->flags = PIC_FLAG_PTS;
  819. }
  820.     }
  821.     m_picture->display_offset[0].x = 
  822. m_picture->display_offset[1].x =
  823. m_picture->display_offset[2].x = m_display_offset_x;
  824.     m_picture->display_offset[0].y = 
  825. m_picture->display_offset[1].y =
  826. m_picture->display_offset[2].y = m_display_offset_y;
  827.     return mpeg2_parse_header();
  828. }
  829. int CMpeg2Dec::mpeg2_header_picture()
  830. {
  831. uint8_t* buffer = m_chunk_start;
  832. mpeg2_picture_t* picture = m_picture;
  833. int type;
  834. int low_delay;
  835. type = (buffer [1] >> 3) & 7;
  836. low_delay = m_sequence.flags & SEQ_FLAG_LOW_DELAY;
  837. if(m_state == STATE_PICTURE)
  838. {
  839. mpeg2_picture_t* other;
  840. m_decoder.m_second_field = 0;
  841. other = m_pictures;
  842. if(other == picture)
  843. other += 2;
  844. if(m_decoder.m_coding_type != PIC_FLAG_CODING_TYPE_B)
  845. {
  846. m_fbuf[2] = m_fbuf[1];
  847. m_fbuf[1] = m_fbuf[0];
  848. }
  849. m_fbuf[0] = NULL;
  850. m_info.Reset();
  851. m_info.m_current_picture = picture;
  852. m_info.m_display_picture = picture;
  853. if(type != PIC_FLAG_CODING_TYPE_B)
  854. {
  855. if(!low_delay)
  856. {
  857. if(m_first) {
  858. m_info.m_display_picture = NULL;
  859. m_first = false;
  860. }
  861. else
  862. {
  863. m_info.m_display_picture = other;
  864. if(other->nb_fields == 1)
  865. m_info.m_display_picture_2nd = other + 1;
  866. m_info.m_display_fbuf = m_fbuf[1];
  867. }
  868. }
  869. if(!low_delay + !NULL/*m_convert_start*/)
  870. m_info.m_discard_fbuf = m_fbuf[!low_delay + !NULL/*m_convert_start*/];
  871. }
  872. while(m_alloc_index < 3)
  873. {
  874. mpeg2_fbuf_t* fbuf = &m_fbuf_alloc[m_alloc_index++];
  875. fbuf->id = NULL;
  876. int size = m_decoder.m_width * m_decoder.m_height;
  877. fbuf->buf[0] = (uint8_t*)_aligned_malloc(6 * size >> 2, 16);
  878. fbuf->buf[1] = fbuf->buf[0] + size;
  879. fbuf->buf[2] = fbuf->buf[1] + (size >> 2);
  880. memset(fbuf->buf[0], 0x10, size);
  881. memset(fbuf->buf[1], 0x80, size >> 2);
  882. memset(fbuf->buf[2], 0x80, size >> 2);
  883. }
  884. mpeg2_set_fbuf(type);
  885. }
  886. else
  887. {
  888. m_decoder.m_second_field = 1;
  889. m_info.m_current_picture_2nd = picture;
  890. m_info.m_user_data = NULL; m_info.m_user_data_len = 0;
  891. if(low_delay || type == PIC_FLAG_CODING_TYPE_B)
  892. m_info.m_display_picture_2nd = picture;
  893. }
  894. m_ext_state = PIC_CODING_EXT;
  895. picture->temporal_reference = (buffer[0] << 2) | (buffer[1] >> 6);
  896. m_decoder.m_coding_type = type;
  897. picture->flags |= type;
  898. if(type == PIC_FLAG_CODING_TYPE_P || type == PIC_FLAG_CODING_TYPE_B)
  899. {
  900. /* forward_f_code and backward_f_code - used in mpeg1 only */
  901. m_decoder.m_f_motion.f_code[1] = (buffer[3] >> 2) & 1;
  902. m_decoder.m_f_motion.f_code[0] = (((buffer[3] << 1) | (buffer[4] >> 7)) & 7) - 1;
  903. m_decoder.m_b_motion.f_code[1] = (buffer[4] >> 6) & 1;
  904. m_decoder.m_b_motion.f_code[0] = ((buffer[4] >> 3) & 7) - 1;
  905. }
  906. /* XXXXXX decode extra_information_picture as well */
  907. picture->nb_fields = 2;
  908. m_decoder.m_intra_dc_precision = 0;
  909. m_decoder.m_frame_pred_frame_dct = 1;
  910. m_decoder.m_q_scale_type = 0;
  911. m_decoder.m_concealment_motion_vectors = 0;
  912. m_decoder.m_scan = mpeg2_scan_norm_2;
  913. m_decoder.m_picture_structure = FRAME_PICTURE;
  914. m_copy_matrix = 0;
  915. return 0;
  916. }
  917. int CMpeg2Dec::mpeg2_header_extension()
  918. {
  919.     static int (CMpeg2Dec::* parser[]) () =
  920. {
  921. NULL, 
  922. &CMpeg2Dec::sequence_ext, 
  923. &CMpeg2Dec::sequence_display_ext, 
  924. &CMpeg2Dec::quant_matrix_ext,
  925. &CMpeg2Dec::copyright_ext, 
  926. NULL, NULL, 
  927. &CMpeg2Dec::picture_display_ext, 
  928. &CMpeg2Dec::picture_coding_ext
  929.     };
  930.     int ext, ext_bit;
  931.     ext = m_chunk_start[0] >> 4;
  932.     ext_bit = 1 << ext;
  933.     if(!(m_ext_state & ext_bit)) /* ignore illegal extensions */
  934. return 0;
  935.     m_ext_state &= ~ext_bit;
  936.     return (this->*parser[ext])();
  937. }
  938. int CMpeg2Dec::mpeg2_header_user_data()
  939. {
  940.     if(!m_info.m_user_data_len) m_info.m_user_data = m_chunk_start;
  941.     else m_info.m_user_data_len += 3;
  942. m_info.m_user_data_len += (m_chunk_ptr - 4 - m_chunk_start);
  943.     m_chunk_start = m_chunk_ptr - 1;
  944.     return 0;
  945. }
  946. void CMpeg2Dec::mpeg2_header_matrix_finalize()
  947. {
  948.     if(m_copy_matrix & 1)
  949. memcpy(m_decoder.m_intra_quantizer_matrix, m_intra_quantizer_matrix, 64);
  950.     if(m_copy_matrix & 2)
  951. memcpy(m_decoder.m_non_intra_quantizer_matrix, m_non_intra_quantizer_matrix, 64);
  952. }
  953. void mpeg2_sequence_t::finalize()
  954. {
  955.     int w, h;
  956.     byte_rate *= 50;
  957.     if(flags & SEQ_FLAG_MPEG2)
  958. {
  959. switch(pixel_width)
  960. {
  961. case 1: /* square pixels */
  962. pixel_width = pixel_height = 1; return;
  963. case 2: /* 4:3 aspect ratio */
  964. w = 4; h = 3; break;
  965. case 3: /* 16:9 aspect ratio */
  966. w = 16; h = 9; break;
  967. case 4: /* 2.21:1 aspect ratio */
  968. w = 221; h = 100; break;
  969. default: /* illegal */
  970. pixel_width = pixel_height = 0; return;
  971. }
  972. w *= display_height;
  973. h *= display_width;
  974.     }
  975. else 
  976. {
  977. if(byte_rate == 50 * 0x3ffff) 
  978. byte_rate = 0;        /* mpeg-1 VBR */ 
  979. switch(pixel_width)
  980. {
  981. case 0: case 15: /* illegal */
  982. pixel_width = pixel_height = 0; return;
  983. case 1: /* square pixels */
  984. pixel_width = pixel_height = 1; return;
  985. case 3: /* 720x576 16:9 */
  986. pixel_width = 64; pixel_height = 45; return;
  987. case 6: /* 720x480 16:9 */
  988. pixel_width = 32; pixel_height = 27; return;
  989. case 12: /* 720*480 4:3 */
  990. pixel_width = 8; pixel_height = 9; return;
  991. default:
  992. h = 88 * pixel_width + 1171;
  993. w = 2000;
  994. }
  995.     }
  996.     pixel_width = w;
  997.     pixel_height = h;
  998. /* find greatest common divisor */
  999.     while(w) {int tmp = w; w = h % tmp; h = tmp;}
  1000. pixel_width /= h;
  1001.     pixel_height /= h;
  1002. }
  1003. void CMpeg2Dec::mpeg2_header_sequence_finalize()
  1004. {
  1005.     mpeg2_sequence_t* sequence = &m_new_sequence;
  1006.     sequence->finalize();
  1007.     mpeg2_header_matrix_finalize();
  1008.     m_decoder.m_mpeg1 = !(sequence->flags & SEQ_FLAG_MPEG2);
  1009.     m_decoder.m_width = sequence->width;
  1010.     m_decoder.m_height = sequence->height;
  1011.     m_decoder.m_vertical_position_extension = (sequence->picture_height > 2800);
  1012.     /*
  1013.      * according to 6.1.1.6, repeat sequence headers should be
  1014.      * identical to the original. However some DVDs dont respect that
  1015.      * and have different bitrates in the repeat sequence headers. So
  1016.      * we'll ignore that in the comparison and still consider these as
  1017.      * repeat sequence headers.
  1018.      */
  1019. // EDIT: some dvds will work if we allow the last three fields to vary (which aren't needed anyway)
  1020.     m_sequence.byte_rate = sequence->byte_rate;
  1021.     if(!memcmp(&m_sequence, sequence, FIELD_OFFSET(mpeg2_sequence_t, colour_primaries) /*sizeof(mpeg2_sequence_t)*/)) 
  1022. {
  1023. m_state = STATE_SEQUENCE_REPEATED;
  1024. }
  1025.     else if(m_sequence.width != (unsigned)-1)
  1026. {
  1027. m_action = &CMpeg2Dec::mpeg2_seek_sequence;
  1028. m_state = STATE_INVALID; /* XXXX STATE_INVALID_END ? */
  1029. return;
  1030.     }
  1031.     m_sequence = *sequence;
  1032.     m_info.m_sequence = &m_sequence;
  1033. }
  1034. mpeg2_state_t CMpeg2Dec::mpeg2_header_slice_start()
  1035. {
  1036. m_info.m_user_data = NULL; 
  1037. m_info.m_user_data_len = 0;
  1038. m_state = (m_picture->nb_fields > 1 || m_state == STATE_PICTURE_2ND) ? STATE_SLICE : STATE_SLICE_1ST;
  1039. if(!m_nb_decode_slices)
  1040. {
  1041. m_picture->flags |= PIC_FLAG_SKIP;
  1042. }
  1043. else
  1044. {
  1045. int b_type = m_decoder.m_coding_type == B_TYPE;
  1046. m_decoder.mpeg2_init_fbuf(m_fbuf[0]->buf, m_fbuf[b_type + 1]->buf, m_fbuf[b_type]->buf);
  1047. }
  1048. m_action = NULL;
  1049. return (mpeg2_state_t)-1;
  1050. }
  1051. mpeg2_state_t CMpeg2Dec::mpeg2_header_end()
  1052. {
  1053. mpeg2_picture_t* picture = m_pictures;
  1054. int b_type = m_decoder.m_coding_type == B_TYPE;
  1055. if((m_picture >= picture + 2) ^ b_type)
  1056. picture = m_pictures + 2;
  1057. m_state = STATE_END;
  1058. m_info.Reset();
  1059. if(!(m_sequence.flags & SEQ_FLAG_LOW_DELAY))
  1060. {
  1061. m_info.m_display_picture = picture;
  1062. if(picture->nb_fields == 1)
  1063. m_info.m_display_picture_2nd = picture + 1;
  1064. m_info.m_display_fbuf = m_fbuf[b_type];
  1065. m_info.m_discard_fbuf = m_fbuf[b_type + 1];
  1066. }
  1067. else
  1068. {
  1069. m_info.m_discard_fbuf = m_fbuf[b_type];
  1070. }
  1071. m_action = &CMpeg2Dec::mpeg2_seek_sequence;
  1072. m_first = true;
  1073. return STATE_END;
  1074. }
  1075. void CMpeg2Dec::mpeg2_set_fbuf(int coding_type)
  1076. {
  1077.     for(int i = 0; i < 3; i++)
  1078. {
  1079. if(m_fbuf[1] != &m_fbuf_alloc[i] && m_fbuf[2] != &m_fbuf_alloc[i])
  1080. {
  1081. m_fbuf[0] = &m_fbuf_alloc[i];
  1082. m_info.m_current_fbuf = m_fbuf[0];
  1083. if(coding_type == B_TYPE || (m_sequence.flags & SEQ_FLAG_LOW_DELAY))
  1084. {
  1085. if(coding_type == B_TYPE)
  1086. m_info.m_discard_fbuf = m_fbuf[0];
  1087. m_info.m_display_fbuf = m_fbuf[0];
  1088. }
  1089. break;
  1090. }
  1091. }
  1092. }
  1093. //
  1094. int CMpeg2Dec::sequence_ext()
  1095. {
  1096. uint8_t* buffer = m_chunk_start;
  1097. mpeg2_sequence_t* sequence = &m_new_sequence;
  1098. if(!(buffer[3]&1))
  1099. return 1;
  1100. sequence->profile_level_id = (buffer[0] << 4) | (buffer[1] >> 4);
  1101. sequence->display_width = 
  1102. sequence->picture_width += ((buffer[1] << 13) | (buffer[2] << 5)) & 0x3000;
  1103. sequence->display_height = 
  1104. sequence->picture_height += (buffer[2] << 7) & 0x3000;
  1105. sequence->width = (sequence->picture_width + 15) & ~15;
  1106. sequence->height = (sequence->picture_height + 15) & ~15;
  1107. sequence->flags |= SEQ_FLAG_MPEG2;
  1108. if(!(buffer[1] & 8))
  1109. {
  1110. sequence->flags &= ~SEQ_FLAG_PROGRESSIVE_SEQUENCE;
  1111. sequence->height = (sequence->height + 31) & ~31;
  1112. }
  1113. if(buffer[5] & 0x80)
  1114. {
  1115. sequence->flags |= SEQ_FLAG_LOW_DELAY;
  1116. }
  1117. sequence->chroma_width = sequence->width;
  1118. sequence->chroma_height = sequence->height;
  1119. switch(buffer[1] & 6)
  1120. {
  1121. case 0: /* invalid */
  1122. return 1;
  1123. case 2: /* 4:2:0 */
  1124. sequence->chroma_height >>= 1;
  1125. case 4: /* 4:2:2 */
  1126. sequence->chroma_width >>= 1;
  1127. }
  1128. sequence->byte_rate += ((buffer[2]<<25) | (buffer[3]<<17)) & 0x3ffc0000;
  1129. sequence->vbv_buffer_size |= buffer[4] << 21;
  1130. sequence->frame_period = 
  1131. sequence->frame_period * ((buffer[5]&31)+1) / (((buffer[5]>>2)&3)+1);
  1132. m_ext_state = SEQ_DISPLAY_EXT;
  1133. return 0;
  1134. }
  1135. int CMpeg2Dec::sequence_display_ext()
  1136. {
  1137.     uint8_t* buffer = m_chunk_start;
  1138.     mpeg2_sequence_t* sequence = &m_new_sequence;
  1139.     uint32_t flags = (sequence->flags & ~SEQ_MASK_VIDEO_FORMAT) | ((buffer[0]<<4) & SEQ_MASK_VIDEO_FORMAT);
  1140.     if(buffer[0] & 1)
  1141. {
  1142. flags |= SEQ_FLAG_COLOUR_DESCRIPTION;
  1143. sequence->colour_primaries = buffer[1];
  1144. sequence->transfer_characteristics = buffer[2];
  1145. sequence->matrix_coefficients = buffer[3];
  1146. buffer += 3;
  1147.     }
  1148.     if(!(buffer[2] & 2)) /* missing marker_bit */
  1149. return 1;
  1150. // ???
  1151. // sequence->flags = flags;
  1152. sequence->display_width = (buffer[1] << 6) | (buffer[2] >> 2);
  1153.     sequence->display_height = ((buffer[2]& 1 ) << 13) | (buffer[3] << 5) | (buffer[4] >> 3);
  1154.     return 0;
  1155. }
  1156. int CMpeg2Dec::quant_matrix_ext()
  1157. {
  1158.     uint8_t* buffer = m_chunk_start;
  1159.     if(buffer[0] & 8)
  1160. {
  1161. for(int i = 0; i < 64; i++)
  1162. m_intra_quantizer_matrix[mpeg2_scan_norm_2[i]] = (buffer[i] << 5) | (buffer[i+1] >> 3);
  1163. m_copy_matrix |= 1;
  1164. buffer += 64;
  1165.     }
  1166.     if(buffer[0] & 4)
  1167. {
  1168. for(int i = 0; i < 64; i++)
  1169. m_non_intra_quantizer_matrix[mpeg2_scan_norm_2[i]] = (buffer[i] << 6) | (buffer[i+1] >> 2);
  1170. m_copy_matrix |= 2;
  1171.     }
  1172.     return 0;
  1173. }
  1174. int CMpeg2Dec::copyright_ext()
  1175. {
  1176.     return 0;
  1177. }
  1178. int CMpeg2Dec::picture_display_ext()
  1179. {
  1180.     uint8_t* buffer = m_chunk_start;
  1181.     mpeg2_picture_t* picture = m_picture;
  1182.     int nb_pos = picture->nb_fields;
  1183.     if(m_sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)
  1184. nb_pos >>= 1;
  1185. int i = 0;
  1186.     for(; i < nb_pos; i++)
  1187. {
  1188. int x = ((buffer[4*i] << 24) | (buffer[4*i+1] << 16) |
  1189. (buffer[4*i+2] << 8) | buffer[4*i+3]) >> (11-2*i);
  1190. int y = ((buffer[4*i+2] << 24) | (buffer[4*i+3] << 16) |
  1191. (buffer[4*i+4] << 8) | buffer[4*i+5]) >> (10-2*i);
  1192. if(!(x&y&1))
  1193. return 1;
  1194. picture->display_offset[i].x = m_display_offset_x = x >> 1;
  1195. picture->display_offset[i].y = m_display_offset_y = y >> 1;
  1196. }
  1197.     for(; i < 3; i++)
  1198. {
  1199. picture->display_offset[i].x = m_display_offset_x;
  1200. picture->display_offset[i].y = m_display_offset_y;
  1201.     }
  1202.     return 0;
  1203. }
  1204. int CMpeg2Dec::picture_coding_ext()
  1205. {
  1206.     uint8_t* buffer = m_chunk_start;
  1207.     mpeg2_picture_t* picture = m_picture;
  1208.     /* pre subtract 1 for use later in compute_motion_vector */
  1209.     m_decoder.m_f_motion.f_code[0] = (buffer[0] & 15) - 1;
  1210.     m_decoder.m_f_motion.f_code[1] = (buffer[1] >> 4) - 1;
  1211.     m_decoder.m_b_motion.f_code[0] = (buffer[1] & 15) - 1;
  1212.     m_decoder.m_b_motion.f_code[1] = (buffer[2] >> 4) - 1;
  1213.     m_decoder.m_intra_dc_precision = (buffer[2] >> 2) & 3;
  1214.     m_decoder.m_picture_structure = buffer[2] & 3;
  1215.     switch(m_decoder.m_picture_structure)
  1216. {
  1217.     case TOP_FIELD:
  1218. picture->flags |= PIC_FLAG_TOP_FIELD_FIRST;
  1219.     case BOTTOM_FIELD:
  1220. picture->nb_fields = 1;
  1221. break;
  1222.     case FRAME_PICTURE:
  1223. if(!(m_sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE))
  1224. {
  1225. picture->nb_fields = (buffer[3] & 2) ? 3 : 2;
  1226. picture->flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0;
  1227. }
  1228. else
  1229. {
  1230. picture->nb_fields = (buffer[3]&2) ? ((buffer[3]&128) ? 6 : 4) : 2;
  1231. }
  1232. break;
  1233.     default:
  1234. return 1;
  1235.     }
  1236.     m_decoder.m_top_field_first = buffer[3] >> 7;
  1237.     m_decoder.m_frame_pred_frame_dct = (buffer[3] >> 6) & 1;
  1238.     m_decoder.m_concealment_motion_vectors = (buffer[3] >> 5) & 1;
  1239.     m_decoder.m_q_scale_type = (buffer[3] >> 4) & 1;
  1240.     m_decoder.m_intra_vlc_format = (buffer[3] >> 3) & 1;
  1241.     m_decoder.m_scan = (buffer[3] & 4) ? mpeg2_scan_alt_2 : mpeg2_scan_norm_2;
  1242. if(buffer[3] & 2)
  1243. picture->flags |= PIC_FLAG_REPEAT_FIRST_FIELD;
  1244.     picture->flags |= (buffer[4] & 0x80) ? PIC_FLAG_PROGRESSIVE_FRAME : 0;
  1245.     if(buffer[4] & 0x40)
  1246. picture->flags |= (((buffer[4]<<26) | (buffer[5]<<18) | (buffer[6]<<10)) & PIC_MASK_COMPOSITE_DISPLAY) | PIC_FLAG_COMPOSITE_DISPLAY;
  1247.     m_ext_state = PIC_DISPLAY_EXT | COPYRIGHT_EXT | QUANT_MATRIX_EXT;
  1248.     return 0;
  1249. }
  1250. //////////////////////////////////////////////////////////////////////////////////////////////////
  1251. //////////////////////////////////////////////////////////////////////////////////////////////////
  1252. // vlc
  1253. #define GETWORD(bit_buf,shift,bit_ptr)
  1254. do {
  1255.     bit_buf |= ((bit_ptr[0] << 8) | bit_ptr[1]) << (shift);
  1256.     bit_ptr += 2;
  1257. } while (0)
  1258. /*
  1259. void bitstream_init(const uint8_t * start)
  1260. {
  1261.     m_bitstream_buf =
  1262. (start[0] << 24) | (start[1] << 16) | (start[2] << 8) | start[3];
  1263.     m_bitstream_ptr = start + 4;
  1264.     m_bitstream_bits = -16;
  1265. }
  1266. */
  1267. /* make sure that there are at least 16 valid bits in bit_buf */
  1268. #define NEEDBITS
  1269. do {
  1270.     if (bits > 0) {
  1271. GETWORD (bit_buf, bits, bit_ptr);
  1272. bits -= 16;
  1273.     }
  1274. } while (0)
  1275. /* remove num valid bits from bit_buf */
  1276. #define DUMPBITS(num)
  1277. do {
  1278.     bit_buf <<= (num);
  1279.     bits += (num);
  1280. } while (0)
  1281. /* take num bits from the high part of bit_buf and zero extend them */
  1282. #define UBITS(bit_buf,num) (((uint32_t)(bit_buf)) >> (32 - (num)))
  1283. /* take num bits from the high part of bit_buf and sign extend them */
  1284. #define SBITS(bit_buf,num) (((int32_t)(bit_buf)) >> (32 - (num)))
  1285. typedef struct {
  1286.     uint8_t modes;
  1287.     uint8_t len;
  1288. } MBtab;
  1289. typedef struct {
  1290.     uint8_t delta;
  1291.     uint8_t len;
  1292. } MVtab;
  1293. typedef struct {
  1294.     int8_t dmv;
  1295.     uint8_t len;
  1296. } DMVtab;
  1297. typedef struct {
  1298.     uint8_t cbp;
  1299.     uint8_t len;
  1300. } CBPtab;
  1301. typedef struct {
  1302.     uint8_t size;
  1303.     uint8_t len;
  1304. } DCtab;
  1305. typedef struct {
  1306.     uint8_t run;
  1307.     uint8_t level;
  1308.     uint8_t len;
  1309. } DCTtab;
  1310. typedef struct {
  1311.     uint8_t mba;
  1312.     uint8_t len;
  1313. } MBAtab;
  1314. #define INTRA MACROBLOCK_INTRA
  1315. #define QUANT MACROBLOCK_QUANT
  1316. static const MBtab MB_I [] = {
  1317.     {INTRA|QUANT, 2}, {INTRA, 1}
  1318. };
  1319. #define MC MACROBLOCK_MOTION_FORWARD
  1320. #define CODED MACROBLOCK_PATTERN
  1321. static const MBtab MB_P [] = {
  1322.     {INTRA|QUANT, 6}, {CODED|QUANT, 5}, {MC|CODED|QUANT, 5}, {INTRA,    5},
  1323.     {MC,          3}, {MC,          3}, {MC,             3}, {MC,       3},
  1324.     {CODED,       2}, {CODED,       2}, {CODED,          2}, {CODED,    2},
  1325.     {CODED,       2}, {CODED,       2}, {CODED,          2}, {CODED,    2},
  1326.     {MC|CODED,    1}, {MC|CODED,    1}, {MC|CODED,       1}, {MC|CODED, 1},
  1327.     {MC|CODED,    1}, {MC|CODED,    1}, {MC|CODED,       1}, {MC|CODED, 1},
  1328.     {MC|CODED,    1}, {MC|CODED,    1}, {MC|CODED,       1}, {MC|CODED, 1},
  1329.     {MC|CODED,    1}, {MC|CODED,    1}, {MC|CODED,       1}, {MC|CODED, 1}
  1330. };
  1331. #define FWD MACROBLOCK_MOTION_FORWARD
  1332. #define BWD MACROBLOCK_MOTION_BACKWARD
  1333. #define INTER MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD
  1334. static const MBtab MB_B [] = {
  1335.     {0,                 0}, {INTRA|QUANT,       6},
  1336.     {BWD|CODED|QUANT,   6}, {FWD|CODED|QUANT,   6},
  1337.     {INTER|CODED|QUANT, 5}, {INTER|CODED|QUANT, 5},
  1338. {INTRA,       5}, {INTRA,       5},
  1339.     {FWD,         4}, {FWD,         4}, {FWD,         4}, {FWD,         4},
  1340.     {FWD|CODED,   4}, {FWD|CODED,   4}, {FWD|CODED,   4}, {FWD|CODED,   4},
  1341.     {BWD,         3}, {BWD,         3}, {BWD,         3}, {BWD,         3},
  1342.     {BWD,         3}, {BWD,         3}, {BWD,         3}, {BWD,         3},
  1343.     {BWD|CODED,   3}, {BWD|CODED,   3}, {BWD|CODED,   3}, {BWD|CODED,   3},
  1344.     {BWD|CODED,   3}, {BWD|CODED,   3}, {BWD|CODED,   3}, {BWD|CODED,   3},
  1345.     {INTER,       2}, {INTER,       2}, {INTER,       2}, {INTER,       2},
  1346.     {INTER,       2}, {INTER,       2}, {INTER,       2}, {INTER,       2},
  1347.     {INTER,       2}, {INTER,       2}, {INTER,       2}, {INTER,       2},
  1348.     {INTER,       2}, {INTER,       2}, {INTER,       2}, {INTER,       2},
  1349.     {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2},
  1350.     {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2},
  1351.     {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2},
  1352.     {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}
  1353. };
  1354. #undef INTRA
  1355. #undef QUANT
  1356. #undef MC
  1357. #undef CODED
  1358. #undef FWD
  1359. #undef BWD
  1360. #undef INTER
  1361. static const MVtab MV_4 [] = {
  1362.     { 3, 6}, { 2, 4}, { 1, 3}, { 1, 3}, { 0, 2}, { 0, 2}, { 0, 2}, { 0, 2}
  1363. };
  1364. static const MVtab MV_10 [] = {
  1365.     { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10},
  1366.     { 0,10}, { 0,10}, { 0,10}, { 0,10}, {15,10}, {14,10}, {13,10}, {12,10},
  1367.     {11,10}, {10,10}, { 9, 9}, { 9, 9}, { 8, 9}, { 8, 9}, { 7, 9}, { 7, 9},
  1368.     { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7},
  1369.     { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7},
  1370.     { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}
  1371. };
  1372. static const DMVtab DMV_2 [] = {
  1373.     { 0, 1}, { 0, 1}, { 1, 2}, {-1, 2}
  1374. };
  1375. static const CBPtab CBP_7 [] = {
  1376.     {0x22, 7}, {0x12, 7}, {0x0a, 7}, {0x06, 7},
  1377.     {0x21, 7}, {0x11, 7}, {0x09, 7}, {0x05, 7},
  1378.     {0x3f, 6}, {0x3f, 6}, {0x03, 6}, {0x03, 6},
  1379.     {0x24, 6}, {0x24, 6}, {0x18, 6}, {0x18, 6},
  1380.     {0x3e, 5}, {0x3e, 5}, {0x3e, 5}, {0x3e, 5},
  1381.     {0x02, 5}, {0x02, 5}, {0x02, 5}, {0x02, 5},
  1382.     {0x3d, 5}, {0x3d, 5}, {0x3d, 5}, {0x3d, 5},
  1383.     {0x01, 5}, {0x01, 5}, {0x01, 5}, {0x01, 5},
  1384.     {0x38, 5}, {0x38, 5}, {0x38, 5}, {0x38, 5},
  1385.     {0x34, 5}, {0x34, 5}, {0x34, 5}, {0x34, 5},
  1386.     {0x2c, 5}, {0x2c, 5}, {0x2c, 5}, {0x2c, 5},
  1387.     {0x1c, 5}, {0x1c, 5}, {0x1c, 5}, {0x1c, 5},
  1388.     {0x28, 5}, {0x28, 5}, {0x28, 5}, {0x28, 5},
  1389.     {0x14, 5}, {0x14, 5}, {0x14, 5}, {0x14, 5},
  1390.     {0x30, 5}, {0x30, 5}, {0x30, 5}, {0x30, 5},
  1391.     {0x0c, 5}, {0x0c, 5}, {0x0c, 5}, {0x0c, 5},
  1392.     {0x20, 4}, {0x20, 4}, {0x20, 4}, {0x20, 4},
  1393.     {0x20, 4}, {0x20, 4}, {0x20, 4}, {0x20, 4},
  1394.     {0x10, 4}, {0x10, 4}, {0x10, 4}, {0x10, 4},
  1395.     {0x10, 4}, {0x10, 4}, {0x10, 4}, {0x10, 4},
  1396.     {0x08, 4}, {0x08, 4}, {0x08, 4}, {0x08, 4},
  1397.     {0x08, 4}, {0x08, 4}, {0x08, 4}, {0x08, 4},
  1398.     {0x04, 4}, {0x04, 4}, {0x04, 4}, {0x04, 4},
  1399.     {0x04, 4}, {0x04, 4}, {0x04, 4}, {0x04, 4},
  1400.     {0x3c, 3}, {0x3c, 3}, {0x3c, 3}, {0x3c, 3},
  1401.     {0x3c, 3}, {0x3c, 3}, {0x3c, 3}, {0x3c, 3},
  1402.     {0x3c, 3}, {0x3c, 3}, {0x3c, 3}, {0x3c, 3},
  1403.     {0x3c, 3}, {0x3c, 3}, {0x3c, 3}, {0x3c, 3}
  1404. };
  1405. static const CBPtab CBP_9 [] = {
  1406.     {0,    0}, {0x00, 9}, {0x27, 9}, {0x1b, 9},
  1407.     {0x3b, 9}, {0x37, 9}, {0x2f, 9}, {0x1f, 9},
  1408.     {0x3a, 8}, {0x3a, 8}, {0x36, 8}, {0x36, 8},
  1409.     {0x2e, 8}, {0x2e, 8}, {0x1e, 8}, {0x1e, 8},
  1410.     {0x39, 8}, {0x39, 8}, {0x35, 8}, {0x35, 8},
  1411.     {0x2d, 8}, {0x2d, 8}, {0x1d, 8}, {0x1d, 8},
  1412.     {0x26, 8}, {0x26, 8}, {0x1a, 8}, {0x1a, 8},
  1413.     {0x25, 8}, {0x25, 8}, {0x19, 8}, {0x19, 8},
  1414.     {0x2b, 8}, {0x2b, 8}, {0x17, 8}, {0x17, 8},
  1415.     {0x33, 8}, {0x33, 8}, {0x0f, 8}, {0x0f, 8},
  1416.     {0x2a, 8}, {0x2a, 8}, {0x16, 8}, {0x16, 8},
  1417.     {0x32, 8}, {0x32, 8}, {0x0e, 8}, {0x0e, 8},
  1418.     {0x29, 8}, {0x29, 8}, {0x15, 8}, {0x15, 8},
  1419.     {0x31, 8}, {0x31, 8}, {0x0d, 8}, {0x0d, 8},
  1420.     {0x23, 8}, {0x23, 8}, {0x13, 8}, {0x13, 8},
  1421.     {0x0b, 8}, {0x0b, 8}, {0x07, 8}, {0x07, 8}
  1422. };
  1423. static const DCtab DC_lum_5 [] = {
  1424.     {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
  1425.     {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
  1426.     {0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
  1427.     {4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}
  1428. };
  1429. static const DCtab DC_chrom_5 [] = {
  1430.     {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
  1431.     {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
  1432.     {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
  1433.     {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}
  1434. };
  1435. static const DCtab DC_long [] = {
  1436.     {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, { 6, 5}, { 6, 5},
  1437.     {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, { 6, 5}, { 6, 5},
  1438.     {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, { 7, 6}, { 7, 6},
  1439.     {8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10, 9}, {11, 9}
  1440. };
  1441. static const DCTtab DCT_16 [] = {
  1442.     {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
  1443.     {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
  1444.     {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
  1445.     {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
  1446.     {  2,18, 0}, {  2,17, 0}, {  2,16, 0}, {  2,15, 0},
  1447.     {  7, 3, 0}, { 17, 2, 0}, { 16, 2, 0}, { 15, 2, 0},
  1448.     { 14, 2, 0}, { 13, 2, 0}, { 12, 2, 0}, { 32, 1, 0},
  1449.     { 31, 1, 0}, { 30, 1, 0}, { 29, 1, 0}, { 28, 1, 0}
  1450. };
  1451. static const DCTtab DCT_15 [] = {
  1452.     {  1,40,15}, {  1,39,15}, {  1,38,15}, {  1,37,15},
  1453.     {  1,36,15}, {  1,35,15}, {  1,34,15}, {  1,33,15},
  1454.     {  1,32,15}, {  2,14,15}, {  2,13,15}, {  2,12,15},
  1455.     {  2,11,15}, {  2,10,15}, {  2, 9,15}, {  2, 8,15},
  1456.     {  1,31,14}, {  1,31,14}, {  1,30,14}, {  1,30,14},
  1457.     {  1,29,14}, {  1,29,14}, {  1,28,14}, {  1,28,14},
  1458.     {  1,27,14}, {  1,27,14}, {  1,26,14}, {  1,26,14},
  1459.     {  1,25,14}, {  1,25,14}, {  1,24,14}, {  1,24,14},
  1460.     {  1,23,14}, {  1,23,14}, {  1,22,14}, {  1,22,14},
  1461.     {  1,21,14}, {  1,21,14}, {  1,20,14}, {  1,20,14},
  1462.     {  1,19,14}, {  1,19,14}, {  1,18,14}, {  1,18,14},
  1463.     {  1,17,14}, {  1,17,14}, {  1,16,14}, {  1,16,14}
  1464. };
  1465. static const DCTtab DCT_13 [] = {
  1466.     { 11, 2,13}, { 10, 2,13}, {  6, 3,13}, {  4, 4,13},
  1467.     {  3, 5,13}, {  2, 7,13}, {  2, 6,13}, {  1,15,13},
  1468.     {  1,14,13}, {  1,13,13}, {  1,12,13}, { 27, 1,13},
  1469.     { 26, 1,13}, { 25, 1,13}, { 24, 1,13}, { 23, 1,13},
  1470.     {  1,11,12}, {  1,11,12}, {  9, 2,12}, {  9, 2,12},
  1471.     {  5, 3,12}, {  5, 3,12}, {  1,10,12}, {  1,10,12},
  1472.     {  3, 4,12}, {  3, 4,12}, {  8, 2,12}, {  8, 2,12},
  1473.     { 22, 1,12}, { 22, 1,12}, { 21, 1,12}, { 21, 1,12},
  1474.     {  1, 9,12}, {  1, 9,12}, { 20, 1,12}, { 20, 1,12},
  1475.     { 19, 1,12}, { 19, 1,12}, {  2, 5,12}, {  2, 5,12},
  1476.     {  4, 3,12}, {  4, 3,12}, {  1, 8,12}, {  1, 8,12},
  1477.     {  7, 2,12}, {  7, 2,12}, { 18, 1,12}, { 18, 1,12}
  1478. };
  1479. static const DCTtab DCT_B14_10 [] = {
  1480.     { 17, 1,10}, {  6, 2,10}, {  1, 7,10}, {  3, 3,10},
  1481.     {  2, 4,10}, { 16, 1,10}, { 15, 1,10}, {  5, 2,10}
  1482. };
  1483. static const DCTtab DCT_B14_8 [] = {
  1484.     { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6},
  1485.     {  3, 2, 7}, {  3, 2, 7}, { 10, 1, 7}, { 10, 1, 7},
  1486.     {  1, 4, 7}, {  1, 4, 7}, {  9, 1, 7}, {  9, 1, 7},
  1487.     {  8, 1, 6}, {  8, 1, 6}, {  8, 1, 6}, {  8, 1, 6},
  1488.     {  7, 1, 6}, {  7, 1, 6}, {  7, 1, 6}, {  7, 1, 6},
  1489.     {  2, 2, 6}, {  2, 2, 6}, {  2, 2, 6}, {  2, 2, 6},
  1490.     {  6, 1, 6}, {  6, 1, 6}, {  6, 1, 6}, {  6, 1, 6},
  1491.     { 14, 1, 8}, {  1, 6, 8}, { 13, 1, 8}, { 12, 1, 8},
  1492.     {  4, 2, 8}, {  2, 3, 8}, {  1, 5, 8}, { 11, 1, 8}
  1493. };
  1494. static const DCTtab DCT_B14AC_5 [] = {
  1495.  {  1, 3, 5}, {  5, 1, 5}, {  4, 1, 5},
  1496.     {  1, 2, 4}, {  1, 2, 4}, {  3, 1, 4}, {  3, 1, 4},
  1497.     {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
  1498.     {129, 0, 2}, {129, 0, 2}, {129, 0, 2}, {129, 0, 2},
  1499.     {129, 0, 2}, {129, 0, 2}, {129, 0, 2}, {129, 0, 2},
  1500.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1501.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}
  1502. };
  1503. static const DCTtab DCT_B14DC_5 [] = {
  1504.  {  1, 3, 5}, {  5, 1, 5}, {  4, 1, 5},
  1505.     {  1, 2, 4}, {  1, 2, 4}, {  3, 1, 4}, {  3, 1, 4},
  1506.     {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
  1507.     {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1},
  1508.     {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1},
  1509.     {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1},
  1510.     {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1}, {  1, 1, 1}
  1511. };
  1512. static const DCTtab DCT_B15_10 [] = {
  1513.     {  6, 2, 9}, {  6, 2, 9}, { 15, 1, 9}, { 15, 1, 9},
  1514.     {  3, 4,10}, { 17, 1,10}, { 16, 1, 9}, { 16, 1, 9}
  1515. };
  1516. static const DCTtab DCT_B15_8 [] = {
  1517.     { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6}, { 65, 0, 6},
  1518.     {  8, 1, 7}, {  8, 1, 7}, {  9, 1, 7}, {  9, 1, 7},
  1519.     {  7, 1, 7}, {  7, 1, 7}, {  3, 2, 7}, {  3, 2, 7},
  1520.     {  1, 7, 6}, {  1, 7, 6}, {  1, 7, 6}, {  1, 7, 6},
  1521.     {  1, 6, 6}, {  1, 6, 6}, {  1, 6, 6}, {  1, 6, 6},
  1522.     {  5, 1, 6}, {  5, 1, 6}, {  5, 1, 6}, {  5, 1, 6},
  1523.     {  6, 1, 6}, {  6, 1, 6}, {  6, 1, 6}, {  6, 1, 6},
  1524.     {  2, 5, 8}, { 12, 1, 8}, {  1,11, 8}, {  1,10, 8},
  1525.     { 14, 1, 8}, { 13, 1, 8}, {  4, 2, 8}, {  2, 4, 8},
  1526.     {  3, 1, 5}, {  3, 1, 5}, {  3, 1, 5}, {  3, 1, 5},
  1527.     {  3, 1, 5}, {  3, 1, 5}, {  3, 1, 5}, {  3, 1, 5},
  1528.     {  2, 2, 5}, {  2, 2, 5}, {  2, 2, 5}, {  2, 2, 5},
  1529.     {  2, 2, 5}, {  2, 2, 5}, {  2, 2, 5}, {  2, 2, 5},
  1530.     {  4, 1, 5}, {  4, 1, 5}, {  4, 1, 5}, {  4, 1, 5},
  1531.     {  4, 1, 5}, {  4, 1, 5}, {  4, 1, 5}, {  4, 1, 5},
  1532.     {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
  1533.     {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
  1534.     {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
  1535.     {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
  1536.     {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
  1537.     {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
  1538.     {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
  1539.     {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3}, {  2, 1, 3},
  1540.     {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
  1541.     {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
  1542.     {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
  1543.     {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
  1544.     {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4},
  1545.     {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4},
  1546.     {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4},
  1547.     {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4}, {  1, 3, 4},
  1548.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1549.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1550.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1551.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1552.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1553.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1554.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1555.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1556.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1557.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1558.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1559.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1560.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1561.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1562.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1563.     {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2}, {  1, 1, 2},
  1564.     {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
  1565.     {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
  1566.     {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
  1567.     {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
  1568.     {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
  1569.     {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
  1570.     {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
  1571.     {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3}, {  1, 2, 3},
  1572.     {  1, 4, 5}, {  1, 4, 5}, {  1, 4, 5}, {  1, 4, 5},
  1573.     {  1, 4, 5}, {  1, 4, 5}, {  1, 4, 5}, {  1, 4, 5},
  1574.     {  1, 5, 5}, {  1, 5, 5}, {  1, 5, 5}, {  1, 5, 5},
  1575.     {  1, 5, 5}, {  1, 5, 5}, {  1, 5, 5}, {  1, 5, 5},
  1576.     { 10, 1, 7}, { 10, 1, 7}, {  2, 3, 7}, {  2, 3, 7},
  1577.     { 11, 1, 7}, { 11, 1, 7}, {  1, 8, 7}, {  1, 8, 7},
  1578.     {  1, 9, 7}, {  1, 9, 7}, {  1,12, 8}, {  1,13, 8},
  1579.     {  3, 3, 8}, {  5, 2, 8}, {  1,14, 8}, {  1,15, 8}
  1580. };
  1581. static const MBAtab MBA_5 [] = {
  1582.     {6, 5}, {5, 5}, {4, 4}, {4, 4}, {3, 4}, {3, 4},
  1583.     {2, 3}, {2, 3}, {2, 3}, {2, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
  1584.     {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1},
  1585.     {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}
  1586. };
  1587. static const MBAtab MBA_11 [] = {
  1588.     {32, 11}, {31, 11}, {30, 11}, {29, 11},
  1589.     {28, 11}, {27, 11}, {26, 11}, {25, 11},
  1590.     {24, 11}, {23, 11}, {22, 11}, {21, 11},
  1591.     {20, 10}, {20, 10}, {19, 10}, {19, 10},
  1592.     {18, 10}, {18, 10}, {17, 10}, {17, 10},
  1593.     {16, 10}, {16, 10}, {15, 10}, {15, 10},
  1594.     {14,  8}, {14,  8}, {14,  8}, {14,  8},
  1595.     {14,  8}, {14,  8}, {14,  8}, {14,  8},
  1596.     {13,  8}, {13,  8}, {13,  8}, {13,  8},
  1597.     {13,  8}, {13,  8}, {13,  8}, {13,  8},
  1598.     {12,  8}, {12,  8}, {12,  8}, {12,  8},
  1599.     {12,  8}, {12,  8}, {12,  8}, {12,  8},
  1600.     {11,  8}, {11,  8}, {11,  8}, {11,  8},
  1601.     {11,  8}, {11,  8}, {11,  8}, {11,  8},
  1602.     {10,  8}, {10,  8}, {10,  8}, {10,  8},
  1603.     {10,  8}, {10,  8}, {10,  8}, {10,  8},
  1604.     { 9,  8}, { 9,  8}, { 9,  8}, { 9,  8},
  1605.     { 9,  8}, { 9,  8}, { 9,  8}, { 9,  8},
  1606.     { 8,  7}, { 8,  7}, { 8,  7}, { 8,  7},
  1607.     { 8,  7}, { 8,  7}, { 8,  7}, { 8,  7},
  1608.     { 8,  7}, { 8,  7}, { 8,  7}, { 8,  7},
  1609.     { 8,  7}, { 8,  7}, { 8,  7}, { 8,  7},
  1610.     { 7,  7}, { 7,  7}, { 7,  7}, { 7,  7},
  1611.     { 7,  7}, { 7,  7}, { 7,  7}, { 7,  7},
  1612.     { 7,  7}, { 7,  7}, { 7,  7}, { 7,  7},
  1613.     { 7,  7}, { 7,  7}, { 7,  7}, { 7,  7}
  1614. };
  1615. //////////////////////////////////////////////////////////////////////////////////////////////////
  1616. //////////////////////////////////////////////////////////////////////////////////////////////////
  1617. static int non_linear_quantizer_scale [] = {
  1618.      0,  1,  2,  3,  4,  5,   6,   7,
  1619.      8, 10, 12, 14, 16, 18,  20,  22,
  1620.     24, 28, 32, 36, 40, 44,  48,  52,
  1621.     56, 64, 72, 80, 88, 96, 104, 112
  1622. };
  1623. bool CMpeg2Decoder::m_idct_initialized = false;
  1624. CMpeg2Decoder::CMpeg2Decoder()
  1625. {
  1626. memset(&m_b_motion, 0, sizeof(m_b_motion));
  1627. memset(&m_f_motion, 0, sizeof(m_f_motion));
  1628. m_DCTblock = (int16_t*)_aligned_malloc(64*sizeof(int16_t), 16);
  1629. memset(m_DCTblock, 0, 64*sizeof(int16_t));
  1630.     m_bitstream_buf = 0;
  1631.     m_bitstream_bits = 0;
  1632.     m_bitstream_ptr = NULL;
  1633.     
  1634. memset(&m_dest, 0, sizeof(m_dest));
  1635. memset(&m_picture_dest, 0, sizeof(m_picture_dest));
  1636.     m_offset = m_stride = m_uv_stride = 0;
  1637.     m_limit_x = m_limit_y_16 = m_limit_y_8 = m_limit_y = 0;
  1638. memset(&m_dc_dct_pred, 0, sizeof(m_dc_dct_pred));
  1639.     m_quantizer_scale = m_dmv_offset = 0;
  1640.     m_v_offset = 0;
  1641. memset(&m_intra_quantizer_matrix, 0, sizeof(m_intra_quantizer_matrix));
  1642. memset(&m_non_intra_quantizer_matrix, 0, sizeof(m_non_intra_quantizer_matrix));
  1643.     m_width = m_height = 0;
  1644.     m_vertical_position_extension = 0;
  1645.     m_coding_type = 0;
  1646.     m_intra_dc_precision = 0;
  1647.     m_picture_structure = 0;
  1648. m_frame_pred_frame_dct = 0;
  1649.     m_concealment_motion_vectors = 0;
  1650.     m_q_scale_type = 0;
  1651.     m_intra_vlc_format = 0;
  1652.     m_top_field_first = 0;
  1653. m_scan = NULL;
  1654.     m_second_field = 0;
  1655. m_mpeg1 = 0;
  1656. //
  1657. if(g_cpuid.m_flags&CCpuID::sse2)
  1658. {
  1659. m_idct_init = mpeg2_idct_init_sse2;
  1660. m_idct_copy = mpeg2_idct_copy_sse2;
  1661. m_idct_add = mpeg2_idct_add_sse2;
  1662. m_mc = &mpeg2_mc_sse2;
  1663. }
  1664. else if(g_cpuid.m_flags&CCpuID::mmx)
  1665. {
  1666. m_idct_init = mpeg2_idct_init_mmx;
  1667. m_idct_copy = mpeg2_idct_copy_mmx;
  1668. m_idct_add = mpeg2_idct_add_mmx;
  1669. m_mc = &mpeg2_mc_mmx;
  1670. }
  1671. else
  1672. {
  1673. m_idct_init = mpeg2_idct_init_c;
  1674. m_idct_copy = mpeg2_idct_copy_c;
  1675. m_idct_add = mpeg2_idct_add_c;
  1676. m_mc = &mpeg2_mc_c;
  1677. }
  1678. /*
  1679. m_idct_init = mpeg2_idct_init_null;
  1680. m_idct_copy = mpeg2_idct_copy_null;
  1681. m_idct_add = mpeg2_idct_add_null;
  1682. m_mc = &mpeg2_mc_null;
  1683. */
  1684. if(!m_idct_initialized)
  1685. {
  1686. m_idct_init();
  1687. m_idct_initialized = true;
  1688. }
  1689. }
  1690. CMpeg2Decoder::~CMpeg2Decoder()
  1691. {
  1692. if(m_DCTblock) _aligned_free(m_DCTblock);
  1693. }
  1694. #define bit_buf (m_bitstream_buf)
  1695. #define bits (m_bitstream_bits)
  1696. #define bit_ptr (m_bitstream_ptr)
  1697. int CMpeg2Decoder::get_macroblock_modes()
  1698. {
  1699. int macroblock_modes;
  1700.     const MBtab* tab;
  1701.     switch(m_coding_type)
  1702. {
  1703. case P_TYPE:
  1704. tab = MB_P + UBITS(bit_buf, 5);
  1705. DUMPBITS(tab->len);
  1706. macroblock_modes = tab->modes;
  1707. if(m_picture_structure != FRAME_PICTURE)
  1708. {
  1709. if(macroblock_modes & MACROBLOCK_MOTION_FORWARD)
  1710. {
  1711. macroblock_modes |= UBITS(bit_buf, 2) * MOTION_TYPE_BASE;
  1712. DUMPBITS(2);
  1713. }
  1714. return macroblock_modes;
  1715. }
  1716. else if(m_frame_pred_frame_dct)
  1717. {
  1718. if(macroblock_modes & MACROBLOCK_MOTION_FORWARD)
  1719. macroblock_modes |= MC_FRAME;
  1720. return macroblock_modes;
  1721. }
  1722. if(macroblock_modes & MACROBLOCK_MOTION_FORWARD)
  1723. {
  1724. macroblock_modes |= UBITS(bit_buf, 2) * MOTION_TYPE_BASE;
  1725. DUMPBITS(2);
  1726. }
  1727. if(macroblock_modes & (MACROBLOCK_INTRA|MACROBLOCK_PATTERN))
  1728. {
  1729. macroblock_modes |= UBITS(bit_buf, 1) * DCT_TYPE_INTERLACED;
  1730. DUMPBITS(1);
  1731. }
  1732. return macroblock_modes;
  1733. case B_TYPE:
  1734. tab = MB_B + UBITS(bit_buf, 6);
  1735. DUMPBITS(tab->len);
  1736. macroblock_modes = tab->modes;
  1737. if(m_picture_structure != FRAME_PICTURE)
  1738. {
  1739. if(!(macroblock_modes & MACROBLOCK_INTRA))
  1740. {
  1741. macroblock_modes |= UBITS(bit_buf, 2) * MOTION_TYPE_BASE;
  1742. DUMPBITS(2);
  1743. }
  1744. return macroblock_modes;
  1745. }
  1746. else if(m_frame_pred_frame_dct)
  1747. {
  1748. // if(!(macroblock_modes & MACROBLOCK_INTRA))
  1749. macroblock_modes |= MC_FRAME;
  1750. return macroblock_modes;
  1751. }
  1752. /*
  1753. if(macroblock_modes & MACROBLOCK_INTRA)
  1754. goto intra;
  1755. macroblock_modes |= UBITS(bit_buf, 2) * MOTION_TYPE_BASE;
  1756. DUMPBITS(2);
  1757. if(macroblock_modes & (MACROBLOCK_INTRA|MACROBLOCK_PATTERN))
  1758. {
  1759. intra:
  1760. macroblock_modes |= UBITS(bit_buf, 1) * DCT_TYPE_INTERLACED;
  1761. DUMPBITS(1);
  1762. }
  1763. */
  1764. if(!(macroblock_modes & MACROBLOCK_INTRA))
  1765. {
  1766. macroblock_modes |= UBITS(bit_buf, 2) * MOTION_TYPE_BASE;
  1767. DUMPBITS(2);
  1768. }
  1769. if(macroblock_modes & (MACROBLOCK_INTRA|MACROBLOCK_PATTERN))
  1770. {
  1771. macroblock_modes |= UBITS(bit_buf, 1) * DCT_TYPE_INTERLACED;
  1772. DUMPBITS(1);
  1773. }
  1774. return macroblock_modes;
  1775.     case I_TYPE:
  1776. tab = MB_I + UBITS(bit_buf, 1);
  1777. DUMPBITS(tab->len);
  1778. macroblock_modes = tab->modes;
  1779. if(!m_frame_pred_frame_dct && m_picture_structure == FRAME_PICTURE)
  1780. {
  1781. macroblock_modes |= UBITS(bit_buf, 1) * DCT_TYPE_INTERLACED;
  1782. DUMPBITS(1);
  1783. }
  1784. return macroblock_modes;
  1785. case D_TYPE:
  1786. DUMPBITS(1);
  1787. return MACROBLOCK_INTRA;
  1788. }
  1789.     
  1790. return 0;
  1791. }
  1792. int CMpeg2Decoder::get_quantizer_scale()
  1793. {
  1794.     int quantizer_scale_code = UBITS(bit_buf, 5);
  1795.     DUMPBITS(5);
  1796.     return m_q_scale_type 
  1797. ? non_linear_quantizer_scale[quantizer_scale_code]
  1798. : (quantizer_scale_code << 1);
  1799. }
  1800. int CMpeg2Decoder::get_motion_delta(const int f_code)
  1801. {
  1802.     int delta;
  1803.     int sign;
  1804.     const MVtab* tab;
  1805.     if(bit_buf & 0x80000000)
  1806. {
  1807. DUMPBITS(1);
  1808. return 0;
  1809.     }
  1810. else if(bit_buf >= 0x0c000000)
  1811. {
  1812. tab = MV_4 + UBITS(bit_buf, 4);
  1813. delta = (tab->delta << f_code) + 1;
  1814. bits += tab->len + f_code + 1;
  1815. bit_buf <<= tab->len;
  1816. sign = SBITS(bit_buf, 1);
  1817. bit_buf <<= 1;
  1818. if(f_code)
  1819. {
  1820. delta += UBITS(bit_buf, f_code);
  1821. }
  1822. bit_buf <<= f_code;
  1823. return (delta ^ sign) - sign;
  1824.     }
  1825. else
  1826. {
  1827. tab = MV_10 + UBITS(bit_buf, 10);
  1828. delta = (tab->delta << f_code) + 1;
  1829. bits += tab->len + 1;
  1830. bit_buf <<= tab->len;
  1831. sign = SBITS(bit_buf, 1);
  1832. bit_buf <<= 1;
  1833. if(f_code)
  1834. {
  1835.     NEEDBITS;
  1836. delta += UBITS(bit_buf, f_code);
  1837. DUMPBITS(f_code);
  1838. }
  1839. return (delta ^ sign) - sign;
  1840.     }
  1841. }
  1842. int CMpeg2Decoder::bound_motion_vector(const int vector, const int f_code)
  1843. {
  1844.     return ((int32_t)vector << (27 - f_code)) >> (27 - f_code);
  1845. }
  1846. int CMpeg2Decoder::get_dmv()
  1847. {
  1848.     const DMVtab* tab = DMV_2 + UBITS(bit_buf, 2);
  1849.     DUMPBITS(tab->len);
  1850.     return tab->dmv;
  1851. }
  1852. int CMpeg2Decoder::get_coded_block_pattern()
  1853. {
  1854.     const CBPtab* tab;
  1855.     NEEDBITS;
  1856.     if(bit_buf >= 0x20000000)
  1857. {
  1858. tab = CBP_7 + (UBITS(bit_buf, 7) - 16);
  1859. DUMPBITS(tab->len);
  1860. return tab->cbp;
  1861.     }
  1862. else
  1863. {
  1864. tab = CBP_9 + UBITS(bit_buf, 9);
  1865. DUMPBITS(tab->len);
  1866. return tab->cbp;
  1867.     }
  1868. }
  1869. int CMpeg2Decoder::get_luma_dc_dct_diff()
  1870. {
  1871.     const DCtab* tab;
  1872.     int size;
  1873.     int dc_diff;
  1874.     if(bit_buf < 0xf8000000)
  1875. {
  1876. tab = DC_lum_5 + UBITS(bit_buf, 5);
  1877. size = tab->size;
  1878. if(size)
  1879. {
  1880. bits += tab->len + size;
  1881. bit_buf <<= tab->len;
  1882. dc_diff = UBITS(bit_buf, size) - UBITS(SBITS(~bit_buf, 1), size);
  1883. bit_buf <<= size;
  1884. return dc_diff;
  1885. }
  1886. else
  1887. {
  1888. DUMPBITS(3);
  1889. return 0;
  1890. }
  1891. }
  1892. else
  1893. {
  1894. tab = DC_long + (UBITS(bit_buf, 9) - 0x1e0);
  1895. size = tab->size;
  1896. DUMPBITS(tab->len);
  1897. NEEDBITS;
  1898. dc_diff = UBITS(bit_buf, size) - UBITS(SBITS(~bit_buf, 1), size);
  1899. DUMPBITS(size);
  1900. return dc_diff;
  1901. }
  1902. }
  1903. int CMpeg2Decoder::get_chroma_dc_dct_diff()
  1904. {
  1905.     const DCtab* tab;
  1906.     int size;
  1907.     int dc_diff;
  1908.     if(bit_buf < 0xf8000000)
  1909. {
  1910. tab = DC_chrom_5 + UBITS(bit_buf, 5);
  1911. size = tab->size;
  1912. if(size)
  1913. {
  1914. bits += tab->len + size;
  1915. bit_buf <<= tab->len;
  1916. dc_diff = UBITS(bit_buf, size) - UBITS(SBITS(~bit_buf, 1), size);
  1917. bit_buf <<= size;
  1918. return dc_diff;
  1919. }
  1920. else
  1921. {
  1922. DUMPBITS(2);
  1923. return 0;
  1924. }
  1925. }
  1926. else
  1927. {
  1928. tab = DC_long + (UBITS(bit_buf, 10) - 0x3e0);
  1929. size = tab->size;
  1930. DUMPBITS(tab->len + 1);
  1931. NEEDBITS;
  1932. dc_diff = UBITS(bit_buf, size) - UBITS(SBITS(~bit_buf, 1), size);
  1933. DUMPBITS(size);
  1934. return dc_diff;
  1935. }
  1936. }
  1937. #undef bit_buf
  1938. #undef bits
  1939. #undef bit_ptr
  1940. #define SATURATE(val)
  1941. do {
  1942.     if((uint32_t)(val + 2048) > 4095)
  1943. val = SBITS(val, 1) ^ 2047;
  1944. } while (0)
  1945. void CMpeg2Decoder::get_intra_block_B14()
  1946. {
  1947.     int i, j;
  1948.     int val;
  1949.     const uint8_t* scan = m_scan;
  1950.     const uint8_t* quant_matrix = m_intra_quantizer_matrix;
  1951.     int quantizer_scale = m_quantizer_scale;
  1952.     int mismatch;
  1953.     const DCTtab* tab;
  1954.     uint32_t bit_buf;
  1955.     int bits;
  1956.     const uint8_t* bit_ptr;
  1957.     int16_t* dest;
  1958.     dest = m_DCTblock;
  1959.     i = 0;
  1960.     mismatch = ~dest[0];
  1961.     bit_buf = m_bitstream_buf;
  1962.     bits = m_bitstream_bits;
  1963.     bit_ptr = m_bitstream_ptr;
  1964.     NEEDBITS;
  1965.     while(1)
  1966. {
  1967. if(bit_buf >= 0x28000000)
  1968. {
  1969. tab = DCT_B14AC_5 + (UBITS(bit_buf, 5) - 5);
  1970. i += tab->run;
  1971. if(i >= 64)
  1972. break; /* end of block */
  1973. normal_code:
  1974. j = scan[i];
  1975. bit_buf <<= tab->len;
  1976. bits += tab->len + 1;
  1977. val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4;
  1978. // if(bitstream_get (1)) val = -val;
  1979. val = (val ^ SBITS(bit_buf, 1)) - SBITS(bit_buf, 1);
  1980. SATURATE(val);
  1981. dest[j] = val;
  1982. mismatch ^= val;
  1983. bit_buf <<= 1;
  1984. NEEDBITS;
  1985. continue;
  1986. }
  1987. else if(bit_buf >= 0x04000000)
  1988. {
  1989. tab = DCT_B14_8 + (UBITS(bit_buf, 8) - 4);
  1990. i += tab->run;
  1991. if(i < 64)
  1992. goto normal_code;
  1993. /* escape code */
  1994. i += UBITS(bit_buf << 6, 6) - 64;
  1995. if(i >= 64)
  1996. break; /* illegal, check needed to avoid buffer overflow */
  1997. j = scan[i];
  1998. DUMPBITS(12);
  1999. NEEDBITS;
  2000. val = (SBITS(bit_buf, 12) * quantizer_scale * quant_matrix[j]) / 16;
  2001. SATURATE(val);
  2002. dest[j] = val;
  2003. mismatch ^= val;
  2004. DUMPBITS(12);
  2005. NEEDBITS;
  2006. continue;
  2007. }
  2008. else if(bit_buf >= 0x02000000)
  2009. {
  2010. tab = DCT_B14_10 + (UBITS(bit_buf, 10) - 8);
  2011. i += tab->run;
  2012. if(i < 64)
  2013. goto normal_code;
  2014. }
  2015. else if(bit_buf >= 0x00800000)
  2016. {
  2017. tab = DCT_13 + (UBITS(bit_buf, 13) - 16);
  2018. i += tab->run;
  2019. if(i < 64)
  2020. goto normal_code;
  2021. }
  2022. else if(bit_buf >= 0x00200000)
  2023. {
  2024. tab = DCT_15 + (UBITS(bit_buf, 15) - 16);
  2025. i += tab->run;
  2026. if(i < 64)
  2027. goto normal_code;
  2028. }
  2029. else
  2030. {
  2031. tab = DCT_16 + UBITS(bit_buf, 16);
  2032. bit_buf <<= 16;
  2033. GETWORD (bit_buf, bits + 16, bit_ptr);
  2034. i += tab->run;
  2035. if(i < 64)
  2036. goto normal_code;
  2037. }
  2038. break; /* illegal, check needed to avoid buffer overflow */
  2039. }
  2040. dest[63] ^= mismatch & 1;
  2041. DUMPBITS(2); /* dump end of block code */
  2042. m_bitstream_buf = bit_buf;
  2043. m_bitstream_bits = bits;
  2044. m_bitstream_ptr = bit_ptr;
  2045. }
  2046. void CMpeg2Decoder::get_intra_block_B15()
  2047. {
  2048.     int i, j;
  2049.     int val;
  2050.     const uint8_t* scan = m_scan;
  2051.     const uint8_t* quant_matrix = m_intra_quantizer_matrix;
  2052.     int quantizer_scale = m_quantizer_scale;
  2053.     int mismatch;
  2054.     const DCTtab* tab;
  2055.     uint32_t bit_buf;
  2056.     int bits;
  2057.     const uint8_t* bit_ptr;
  2058.     int16_t* dest;
  2059.     dest = m_DCTblock;
  2060.     i = 0;
  2061.     mismatch = ~dest[0];
  2062.     bit_buf = m_bitstream_buf;
  2063.     bits = m_bitstream_bits;
  2064.     bit_ptr = m_bitstream_ptr;
  2065.     NEEDBITS;
  2066. while(1)
  2067. {
  2068. if(bit_buf >= 0x04000000)
  2069. {
  2070. tab = DCT_B15_8 + (UBITS(bit_buf, 8) - 4);
  2071. i += tab->run;
  2072. if(i < 64)
  2073. {
  2074. normal_code:
  2075. j = scan[i];
  2076. bit_buf <<= tab->len;
  2077. bits += tab->len + 1;
  2078. val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4;
  2079. // if(bitstream_get (1)) val = -val;
  2080. val = (val ^ SBITS(bit_buf, 1)) - SBITS(bit_buf, 1);
  2081. SATURATE(val);
  2082. dest[j] = val;
  2083. mismatch ^= val;
  2084. bit_buf <<= 1;
  2085. NEEDBITS;
  2086. continue;
  2087. }
  2088. else
  2089. {
  2090. /* end of block. I commented out this code because if we */
  2091. /* dont exit here we will still exit at the later test :) */
  2092. /* if(i >= 128) break; */ /* end of block */
  2093. /* escape code */
  2094. i += UBITS(bit_buf << 6, 6) - 64;
  2095. if(i >= 64)
  2096. break; /* illegal, check against buffer overflow */
  2097. j = scan[i];
  2098. DUMPBITS(12);
  2099. NEEDBITS;
  2100. val = (SBITS(bit_buf, 12) *
  2101. quantizer_scale * quant_matrix[j]) / 16;
  2102. SATURATE(val);
  2103. dest[j] = val;
  2104. mismatch ^= val;
  2105. DUMPBITS(12);
  2106. NEEDBITS;
  2107. continue;
  2108. }
  2109. }
  2110. else if(bit_buf >= 0x02000000)
  2111. {
  2112. tab = DCT_B15_10 + (UBITS(bit_buf, 10) - 8);
  2113. i += tab->run;
  2114. if(i < 64)
  2115. goto normal_code;
  2116. }
  2117. else if(bit_buf >= 0x00800000)
  2118. {
  2119. tab = DCT_13 + (UBITS(bit_buf, 13) - 16);
  2120. i += tab->run;
  2121. if(i < 64)
  2122. goto normal_code;
  2123. }
  2124. else if(bit_buf >= 0x00200000)
  2125. {
  2126. tab = DCT_15 + (UBITS(bit_buf, 15) - 16);
  2127. i += tab->run;
  2128. if(i < 64)
  2129. goto normal_code;
  2130. }
  2131. else
  2132. {
  2133. tab = DCT_16 + UBITS(bit_buf, 16);
  2134. bit_buf <<= 16;
  2135. GETWORD(bit_buf, bits + 16, bit_ptr);
  2136. i += tab->run;
  2137. if(i < 64)
  2138. goto normal_code;
  2139. }
  2140. break; /* illegal, check needed to avoid buffer overflow */
  2141. }
  2142. dest[63] ^= mismatch & 1;
  2143. DUMPBITS(4); /* dump end of block code */
  2144. m_bitstream_buf = bit_buf;
  2145. m_bitstream_bits = bits;
  2146. m_bitstream_ptr = bit_ptr;
  2147. }
  2148. int CMpeg2Decoder::get_non_intra_block()
  2149. {
  2150.     int i, j;
  2151.     int val;
  2152.     const uint8_t* scan = m_scan;
  2153.     const uint8_t* quant_matrix = m_non_intra_quantizer_matrix;
  2154.     int quantizer_scale = m_quantizer_scale;
  2155.     int mismatch;
  2156.     const DCTtab* tab;
  2157.     uint32_t bit_buf;
  2158.     int bits;
  2159.     const uint8_t* bit_ptr;
  2160.     int16_t* dest;
  2161.     i = -1;
  2162.     mismatch = 1;
  2163.     dest = m_DCTblock;
  2164.     bit_buf = m_bitstream_buf;
  2165.     bits = m_bitstream_bits;
  2166.     bit_ptr = m_bitstream_ptr;
  2167.     NEEDBITS;
  2168.     if(bit_buf >= 0x28000000)
  2169. {
  2170. tab = DCT_B14DC_5 + (UBITS(bit_buf, 5) - 5);
  2171. goto entry_1;
  2172.     }
  2173. else
  2174. {
  2175. goto entry_2;
  2176. }
  2177.     while(1)
  2178. {
  2179. if(bit_buf >= 0x28000000)
  2180. {
  2181. tab = DCT_B14AC_5 + (UBITS(bit_buf, 5) - 5);
  2182. entry_1:
  2183. i += tab->run;
  2184. if(i >= 64)
  2185. break; /* end of block */
  2186. normal_code:
  2187. j = scan[i];
  2188. bit_buf <<= tab->len;
  2189. bits += tab->len + 1;
  2190. val = ((2*tab->level+1) * quantizer_scale * quant_matrix[j]) >> 5;
  2191. /* if(bitstream_get (1)) val = -val; */
  2192. val = (val ^ SBITS(bit_buf, 1)) - SBITS(bit_buf, 1);
  2193. SATURATE(val);
  2194. dest[j] = val;
  2195. mismatch ^= val;
  2196. bit_buf <<= 1;
  2197. NEEDBITS;
  2198. continue;
  2199. }
  2200. entry_2:
  2201. if(bit_buf >= 0x04000000)
  2202. {
  2203. tab = DCT_B14_8 + (UBITS(bit_buf, 8) - 4);
  2204. i += tab->run;
  2205. if(i < 64)
  2206. goto normal_code;
  2207. /* escape code */
  2208. i += UBITS(bit_buf << 6, 6) - 64;
  2209. if(i >= 64)
  2210. break; /* illegal, check needed to avoid buffer overflow */
  2211. j = scan[i];
  2212. DUMPBITS(12);
  2213. NEEDBITS;
  2214. val = 2 * (SBITS(bit_buf, 12) + SBITS(bit_buf, 1)) + 1;
  2215. val = (val * quantizer_scale * quant_matrix[j]) / 32;
  2216. SATURATE(val);
  2217. dest[j] = val;
  2218. mismatch ^= val;
  2219. DUMPBITS(12);
  2220. NEEDBITS;
  2221. continue;
  2222. }
  2223. else if(bit_buf >= 0x02000000)
  2224. {
  2225. tab = DCT_B14_10 + (UBITS(bit_buf, 10) - 8);
  2226. i += tab->run;
  2227. if(i < 64)
  2228. goto normal_code;
  2229. }
  2230. else if(bit_buf >= 0x00800000)
  2231. {
  2232. tab = DCT_13 + (UBITS(bit_buf, 13) - 16);
  2233. i += tab->run;
  2234. if(i < 64)
  2235. goto normal_code;
  2236. }
  2237. else if(bit_buf >= 0x00200000)
  2238. {
  2239. tab = DCT_15 + (UBITS(bit_buf, 15) - 16);
  2240. i += tab->run;
  2241. if(i < 64)
  2242. goto normal_code;
  2243. }
  2244. else
  2245. {
  2246. tab = DCT_16 + UBITS(bit_buf, 16);
  2247. bit_buf <<= 16;
  2248. GETWORD (bit_buf, bits + 16, bit_ptr);
  2249. i += tab->run;
  2250. if(i < 64)
  2251. goto normal_code;
  2252. }
  2253. break; /* illegal, check needed to avoid buffer overflow */
  2254. }
  2255. dest[63] ^= mismatch & 1;
  2256. DUMPBITS(2); /* dump end of block code */
  2257. m_bitstream_buf = bit_buf;
  2258. m_bitstream_bits = bits;
  2259. m_bitstream_ptr = bit_ptr;
  2260. return i;
  2261. }
  2262. void CMpeg2Decoder::get_mpeg1_intra_block()
  2263. {
  2264.     int i, j;
  2265.     int val;
  2266.     const uint8_t* scan = m_scan;
  2267.     const uint8_t* quant_matrix = m_intra_quantizer_matrix;
  2268.     int quantizer_scale = m_quantizer_scale;
  2269.     const DCTtab* tab;
  2270.     uint32_t bit_buf;
  2271.     int bits;
  2272.     const uint8_t* bit_ptr;
  2273.     int16_t* dest;
  2274.     i = 0;
  2275.     dest = m_DCTblock;
  2276.     bit_buf = m_bitstream_buf;
  2277.     bits = m_bitstream_bits;
  2278.     bit_ptr = m_bitstream_ptr;
  2279.     NEEDBITS;
  2280.     while(1)
  2281. {
  2282. if(bit_buf >= 0x28000000)
  2283. {
  2284. tab = DCT_B14AC_5 + (UBITS(bit_buf, 5) - 5);
  2285. i += tab->run;
  2286. if(i >= 64)
  2287. break; /* end of block */
  2288. normal_code:
  2289. j = scan[i];
  2290. bit_buf <<= tab->len;
  2291. bits += tab->len + 1;
  2292. val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4;
  2293. /* oddification */
  2294. val = (val - 1) | 1;
  2295. /* if(bitstream_get (1)) val = -val; */
  2296. val = (val ^ SBITS(bit_buf, 1)) - SBITS(bit_buf, 1);
  2297. SATURATE(val);
  2298. dest[j] = val;
  2299. bit_buf <<= 1;
  2300. NEEDBITS;
  2301. continue;
  2302. }
  2303. else if(bit_buf >= 0x04000000)
  2304. {
  2305. tab = DCT_B14_8 + (UBITS(bit_buf, 8) - 4);
  2306. i += tab->run;
  2307. if(i < 64)
  2308. goto normal_code;
  2309. /* escape code */
  2310. i += UBITS(bit_buf << 6, 6) - 64;
  2311. if(i >= 64)
  2312. break; /* illegal, check needed to avoid buffer overflow */
  2313. j = scan[i];
  2314. DUMPBITS(12);
  2315. NEEDBITS;
  2316. val = SBITS(bit_buf, 8);
  2317. if(!(val & 0x7f))
  2318. {
  2319. DUMPBITS(8);
  2320. val = UBITS(bit_buf, 8) + 2 * val;
  2321. }
  2322. val = (val * quantizer_scale * quant_matrix[j]) / 16;
  2323. /* oddification */
  2324. val = (val + ~SBITS(val, 1)) | 1;
  2325. SATURATE(val);
  2326. dest[j] = val;
  2327. DUMPBITS(8);
  2328. NEEDBITS;
  2329. continue;
  2330. }
  2331. else if(bit_buf >= 0x02000000)
  2332. {
  2333. tab = DCT_B14_10 + (UBITS(bit_buf, 10) - 8);
  2334. i += tab->run;
  2335. if(i < 64)
  2336. goto normal_code;
  2337. }
  2338. else if(bit_buf >= 0x00800000)
  2339. {
  2340. tab = DCT_13 + (UBITS(bit_buf, 13) - 16);
  2341. i += tab->run;
  2342. if(i < 64)
  2343. goto normal_code;
  2344. }
  2345. else if(bit_buf >= 0x00200000)
  2346. {
  2347. tab = DCT_15 + (UBITS(bit_buf, 15) - 16);
  2348. i += tab->run;
  2349. if(i < 64)
  2350. goto normal_code;
  2351. }
  2352. else
  2353. {
  2354. tab = DCT_16 + UBITS(bit_buf, 16);
  2355. bit_buf <<= 16;
  2356. GETWORD(bit_buf, bits + 16, bit_ptr);
  2357. i += tab->run;
  2358. if(i < 64)
  2359. goto normal_code;
  2360. }
  2361. break; /* illegal, check needed to avoid buffer overflow */
  2362. }
  2363. DUMPBITS(2); /* dump end of block code */
  2364. m_bitstream_buf = bit_buf;
  2365. m_bitstream_bits = bits;
  2366. m_bitstream_ptr = bit_ptr;
  2367. }
  2368. int CMpeg2Decoder::get_mpeg1_non_intra_block()
  2369. {
  2370.     int i, j;
  2371.     int val;
  2372.     const uint8_t* scan = m_scan;
  2373.     const uint8_t* quant_matrix = m_non_intra_quantizer_matrix;
  2374.     int quantizer_scale = m_quantizer_scale;
  2375.     const DCTtab* tab;
  2376.     uint32_t bit_buf;
  2377.     int bits;
  2378.     const uint8_t* bit_ptr;
  2379.     int16_t* dest;
  2380.     i = -1;
  2381.     dest = m_DCTblock;
  2382.     bit_buf = m_bitstream_buf;
  2383.     bits = m_bitstream_bits;
  2384.     bit_ptr = m_bitstream_ptr;
  2385.     NEEDBITS;
  2386.     if(bit_buf >= 0x28000000)
  2387. {
  2388. tab = DCT_B14DC_5 + (UBITS(bit_buf, 5) - 5);
  2389. goto entry_1;
  2390. }
  2391. else
  2392. {
  2393. goto entry_2;
  2394. }
  2395. while(1)
  2396. {
  2397. if(bit_buf >= 0x28000000)
  2398. {
  2399. tab = DCT_B14AC_5 + (UBITS(bit_buf, 5) - 5);
  2400. entry_1:
  2401. i += tab->run;
  2402. if(i >= 64)
  2403. break; /* end of block */
  2404. normal_code:
  2405. j = scan[i];
  2406. bit_buf <<= tab->len;
  2407. bits += tab->len + 1;
  2408. val = ((2*tab->level+1) * quantizer_scale * quant_matrix[j]) >> 5;
  2409. /* oddification */
  2410. val = (val - 1) | 1;
  2411. /* if(bitstream_get (1)) val = -val; */
  2412. val = (val ^ SBITS(bit_buf, 1)) - SBITS(bit_buf, 1);
  2413. SATURATE(val);
  2414. dest[j] = val;
  2415. bit_buf <<= 1;
  2416. NEEDBITS;
  2417. continue;
  2418. }
  2419. entry_2:
  2420. if(bit_buf >= 0x04000000)
  2421. {
  2422. tab = DCT_B14_8 + (UBITS(bit_buf, 8) - 4);
  2423. i += tab->run;
  2424. if(i < 64)
  2425. goto normal_code;
  2426. /* escape code */
  2427. i += UBITS(bit_buf << 6, 6) - 64;
  2428. if(i >= 64)
  2429. break; /* illegal, check needed to avoid buffer overflow */
  2430. j = scan[i];
  2431. DUMPBITS(12);
  2432. NEEDBITS;
  2433. val = SBITS(bit_buf, 8);
  2434. if(!(val & 0x7f))
  2435. {
  2436. DUMPBITS(8);
  2437. val = UBITS(bit_buf, 8) + 2 * val;
  2438. }
  2439. val = 2 * (val + SBITS(val, 1)) + 1;
  2440. val = (val * quantizer_scale * quant_matrix[j]) / 32;
  2441. /* oddification */
  2442. val = (val + ~SBITS(val, 1)) | 1;
  2443. SATURATE(val);
  2444. dest[j] = val;
  2445. DUMPBITS(8);
  2446. NEEDBITS;
  2447. continue;
  2448. }
  2449. else if(bit_buf >= 0x02000000)
  2450. {
  2451. tab = DCT_B14_10 + (UBITS(bit_buf, 10) - 8);
  2452. i += tab->run;
  2453. if(i < 64)
  2454. goto normal_code;
  2455. }
  2456. else if(bit_buf >= 0x00800000)
  2457. {
  2458. tab = DCT_13 + (UBITS(bit_buf, 13) - 16);
  2459. i += tab->run;
  2460. if(i < 64)
  2461. goto normal_code;
  2462. }
  2463. else if(bit_buf >= 0x00200000)
  2464. {
  2465. tab = DCT_15 + (UBITS(bit_buf, 15) - 16);
  2466. i += tab->run;
  2467. if(i < 64)
  2468. goto normal_code;
  2469. }
  2470. else
  2471. {
  2472. tab = DCT_16 + UBITS(bit_buf, 16);
  2473. bit_buf <<= 16;
  2474. GETWORD (bit_buf, bits + 16, bit_ptr);
  2475. i += tab->run;
  2476. if(i < 64)
  2477. goto normal_code;
  2478. }
  2479. break; /* illegal, check needed to avoid buffer overflow */
  2480. }
  2481. DUMPBITS(2); /* dump end of block code */
  2482. m_bitstream_buf = bit_buf;
  2483. m_bitstream_bits = bits;
  2484. m_bitstream_ptr = bit_ptr;
  2485. return i;
  2486. }
  2487. #define bit_buf (m_bitstream_buf)
  2488. #define bits (m_bitstream_bits)
  2489. #define bit_ptr (m_bitstream_ptr)
  2490. void CMpeg2Decoder::slice_intra_DCT(const int cc, uint8_t* dest, int stride)
  2491. {
  2492.     NEEDBITS;
  2493.     /* Get the intra DC coefficient and inverse quantize it */
  2494. m_dc_dct_pred[cc] += (cc == 0)
  2495. ? get_luma_dc_dct_diff()
  2496. : get_chroma_dc_dct_diff();
  2497.     
  2498. m_DCTblock[0] = m_dc_dct_pred[cc] << (3 - m_intra_dc_precision);
  2499.     if(m_mpeg1)
  2500. {
  2501. if(m_coding_type != D_TYPE)
  2502. get_mpeg1_intra_block();
  2503.     }
  2504. else if(m_intra_vlc_format)
  2505. {
  2506. get_intra_block_B15();
  2507. }
  2508.     else
  2509. {
  2510. get_intra_block_B14();
  2511. }
  2512.     m_idct_copy(m_DCTblock, dest, stride);
  2513. }
  2514. void CMpeg2Decoder::slice_non_intra_DCT(uint8_t* dest, int stride)
  2515. {
  2516.     int last = m_mpeg1 
  2517. ? get_mpeg1_non_intra_block()
  2518. : get_non_intra_block ();
  2519.     
  2520. m_idct_add(last, m_DCTblock, dest, stride);
  2521. }
  2522. #define MOTION(table,ref,motion_x,motion_y,size,y)       
  2523.     pos_x = 2 * m_offset + motion_x;       
  2524.     pos_y = 2 * m_v_offset + motion_y + 2 * y;       
  2525.     if(pos_x > m_limit_x) {       
  2526. pos_x = ((int)pos_x < 0) ? 0 : m_limit_x;       
  2527. motion_x = pos_x - 2 * m_offset;       
  2528.     }       
  2529.     if(pos_y > m_limit_y_ ## size) {       
  2530. pos_y = ((int)pos_y < 0) ? 0 : m_limit_y_ ## size;       
  2531. motion_y = pos_y - 2 * m_v_offset - 2 * y;       
  2532.     }       
  2533.     xy_half = ((pos_y & 1) << 1) | (pos_x & 1);       
  2534.     table[xy_half] (m_dest[0] + y * m_stride + m_offset, 
  2535.     ref[0] + (pos_x >> 1) + (pos_y >> 1) * m_stride,   
  2536.     m_stride, size);       
  2537.     motion_x /= 2; motion_y /= 2;       
  2538.     xy_half = ((motion_y & 1) << 1) | (motion_x & 1);       
  2539.     offset = (((m_offset + motion_x) >> 1) +       
  2540.       ((((m_v_offset + motion_y) >> 1) + y/2) *       
  2541.        m_uv_stride));       
  2542.     table[4+xy_half] (m_dest[1] + y/2 * m_uv_stride +       
  2543.       (m_offset >> 1), ref[1] + offset,       
  2544.       m_uv_stride, size/2);       
  2545.     table[4+xy_half] (m_dest[2] + y/2 * m_uv_stride +       
  2546.       (m_offset >> 1), ref[2] + offset,       
  2547.       m_uv_stride, size/2)
  2548. #define MOTION_FIELD(table,ref,motion_x,motion_y,dest_field,op,src_field)     
  2549.     pos_x = 2 * m_offset + motion_x;       
  2550.     pos_y = m_v_offset + motion_y;       
  2551.     if(pos_x > m_limit_x) {       
  2552. pos_x = ((int)pos_x < 0) ? 0 : m_limit_x;       
  2553. motion_x = pos_x - 2 * m_offset;       
  2554.     }       
  2555.     if(pos_y > m_limit_y) {       
  2556. pos_y = ((int)pos_y < 0) ? 0 : m_limit_y;       
  2557. motion_y = pos_y - m_v_offset;       
  2558.     }       
  2559.     xy_half = ((pos_y & 1) << 1) | (pos_x & 1);       
  2560.     table[xy_half] (m_dest[0] + dest_field * m_stride +       
  2561.     m_offset,       
  2562.     (ref[0] + (pos_x >> 1) +       
  2563.      ((pos_y op) + src_field) * m_stride),       
  2564.     2 * m_stride, 8);       
  2565.     motion_x /= 2; motion_y /= 2;       
  2566.     xy_half = ((motion_y & 1) << 1) | (motion_x & 1);       
  2567.     offset = (((m_offset + motion_x) >> 1) +       
  2568.       (((m_v_offset >> 1) + (motion_y op) + src_field) *       
  2569.        m_uv_stride));       
  2570.     table[4+xy_half] (m_dest[1] + dest_field * m_uv_stride +    
  2571.       (m_offset >> 1), ref[1] + offset,       
  2572.       2 * m_uv_stride, 4);       
  2573.     table[4+xy_half] (m_dest[2] + dest_field * m_uv_stride +    
  2574.       (m_offset >> 1), ref[2] + offset,       
  2575.       2 * m_uv_stride, 4)
  2576. void CMpeg2Decoder::motion_mp1(motion_t* motion, mpeg2_mc_fct * const * const table)
  2577. {
  2578.     int motion_x, motion_y;
  2579.     unsigned int pos_x, pos_y, xy_half, offset;
  2580.     NEEDBITS;
  2581.     motion_x = motion->pmv[0][0] + (get_motion_delta(motion->f_code[0]) << motion->f_code[1]);
  2582.     motion_x = bound_motion_vector(motion_x, motion->f_code[0] + motion->f_code[1]);
  2583.     motion->pmv[0][0] = motion_x;
  2584.     NEEDBITS;
  2585.     motion_y = motion->pmv[0][1] + (get_motion_delta(motion->f_code[0]) << motion->f_code[1]);
  2586.     motion_y = bound_motion_vector(motion_y, motion->f_code[0] + motion->f_code[1]);
  2587.     motion->pmv[0][1] = motion_y;
  2588.     MOTION(table, motion->ref[0], motion_x, motion_y, 16, 0);
  2589. }
  2590. void CMpeg2Decoder::motion_fr_frame(motion_t* motion, mpeg2_mc_fct * const * const table)
  2591. {
  2592.     int motion_x, motion_y;
  2593.     unsigned int pos_x, pos_y, xy_half, offset;
  2594.     NEEDBITS;
  2595.     motion_x = motion->pmv[0][0] + get_motion_delta(motion->f_code[0]);
  2596.     motion_x = bound_motion_vector(motion_x, motion->f_code[0]);
  2597.     motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
  2598.     NEEDBITS;
  2599.     motion_y = motion->pmv[0][1] + get_motion_delta(motion->f_code[1]);
  2600.     motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
  2601.     motion->pmv[1][1] = motion->pmv[0][1] = motion_y;
  2602.     MOTION(table, motion->ref[0], motion_x, motion_y, 16, 0);
  2603. }
  2604. void CMpeg2Decoder::motion_fr_field(motion_t* motion, mpeg2_mc_fct * const * const table)
  2605. {
  2606.     int motion_x, motion_y, field;
  2607.     unsigned int pos_x, pos_y, xy_half, offset;
  2608.     NEEDBITS;
  2609.     field = UBITS(bit_buf, 1);
  2610.     DUMPBITS(1);
  2611.     motion_x = motion->pmv[0][0] + get_motion_delta(motion->f_code[0]);
  2612.     motion_x = bound_motion_vector(motion_x, motion->f_code[0]);
  2613.     motion->pmv[0][0] = motion_x;
  2614.     NEEDBITS;
  2615.     motion_y = (motion->pmv[0][1] >> 1) + get_motion_delta(motion->f_code[1]);
  2616.     /* motion_y = bound_motion_vector(motion_y, motion->f_code[1]); */
  2617.     motion->pmv[0][1] = motion_y << 1;
  2618.     MOTION_FIELD(table, motion->ref[0], motion_x, motion_y, 0, & ~1, field);
  2619.     NEEDBITS;
  2620.     field = UBITS(bit_buf, 1);
  2621.     DUMPBITS(1);
  2622.     motion_x = motion->pmv[1][0] + get_motion_delta(motion->f_code[0]);
  2623.     motion_x = bound_motion_vector(motion_x, motion->f_code[0]);
  2624.     motion->pmv[1][0] = motion_x;
  2625.     NEEDBITS;
  2626.     motion_y = (motion->pmv[1][1] >> 1) + get_motion_delta(motion->f_code[1]);
  2627.     /* motion_y = bound_motion_vector(motion_y, motion->f_code[1]); */
  2628.     motion->pmv[1][1] = motion_y << 1;
  2629.     MOTION_FIELD(table, motion->ref[0], motion_x, motion_y, 1, & ~1, field);
  2630. }
  2631. void CMpeg2Decoder::motion_fr_dmv(motion_t* motion, mpeg2_mc_fct * const * const table)
  2632. {
  2633.     int motion_x, motion_y, dmv_x, dmv_y, m, other_x, other_y;
  2634.     unsigned int pos_x, pos_y, xy_half, offset;
  2635.     NEEDBITS;
  2636.     motion_x = motion->pmv[0][0] + get_motion_delta(motion->f_code[0]);
  2637.     motion_x = bound_motion_vector(motion_x, motion->f_code[0]);
  2638.     motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
  2639.     NEEDBITS;
  2640.     dmv_x = get_dmv();
  2641.     motion_y = (motion->pmv[0][1] >> 1) + get_motion_delta(motion->f_code[1]);
  2642.     /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */
  2643.     motion->pmv[1][1] = motion->pmv[0][1] = motion_y << 1;
  2644.     dmv_y = get_dmv();
  2645.     m = m_top_field_first ? 1 : 3;
  2646.     other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x;
  2647.     other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y - 1;
  2648.     MOTION_FIELD(m_mc->put, motion->ref[0], other_x, other_y, 0, | 1, 0);
  2649.     m = m_top_field_first ? 3 : 1;
  2650.     other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x;
  2651.     other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y + 1;
  2652.     MOTION_FIELD(m_mc->put, motion->ref[0], other_x, other_y, 1, & ~1, 0);
  2653.     pos_x = 2 * m_offset + motion_x;
  2654.     pos_y = m_v_offset + motion_y;
  2655.     if(pos_x > m_limit_x)
  2656. {
  2657. pos_x = ((int)pos_x < 0) ? 0 : m_limit_x;
  2658. motion_x = pos_x - 2 * m_offset;
  2659.     }
  2660.     if(pos_y > m_limit_y)
  2661. {
  2662. pos_y = ((int)pos_y < 0) ? 0 : m_limit_y;
  2663. motion_y = pos_y - m_v_offset;
  2664.     }
  2665.     xy_half = ((pos_y & 1) << 1) | (pos_x & 1);
  2666.     offset = (pos_x >> 1) + (pos_y & ~1) * m_stride;
  2667.     m_mc->avg[xy_half](m_dest[0] + m_offset, motion->ref[0][0] + offset, 2 * m_stride, 8);
  2668.     m_mc->avg[xy_half](m_dest[0] + m_stride + m_offset, motion->ref[0][0] + m_stride + offset, 2 * m_stride, 8);
  2669.     motion_x /= 2; 
  2670. motion_y /= 2;
  2671.     xy_half = ((motion_y & 1) << 1) | (motion_x & 1);
  2672.     offset = ((m_offset + motion_x) >> 1) + ((m_v_offset >> 1) + (motion_y & ~1)) * m_uv_stride;
  2673.     m_mc->avg[4+xy_half](m_dest[1] + (m_offset >> 1), motion->ref[0][1] + offset, 2 * m_uv_stride, 4);
  2674.     m_mc->avg[4+xy_half](m_dest[1] + m_uv_stride + (m_offset >> 1), motion->ref[0][1] + m_uv_stride + offset, 2 * m_uv_stride, 4);
  2675.     m_mc->avg[4+xy_half](m_dest[2] + (m_offset >> 1), motion->ref[0][2] + offset, 2 * m_uv_stride, 4);
  2676.     m_mc->avg[4+xy_half](m_dest[2] + m_uv_stride + (m_offset >> 1), motion->ref[0][2] + m_uv_stride + offset, 2 * m_uv_stride, 4);
  2677. }
  2678. void CMpeg2Decoder::motion_reuse(motion_t* motion, mpeg2_mc_fct * const * const table)
  2679. {
  2680.     int motion_x, motion_y;
  2681.     unsigned int pos_x, pos_y, xy_half, offset;
  2682.     motion_x = motion->pmv[0][0];
  2683.     motion_y = motion->pmv[0][1];
  2684.     MOTION(table, motion->ref[0], motion_x, motion_y, 16, 0);
  2685. }
  2686. void CMpeg2Decoder::motion_zero(motion_t* motion, mpeg2_mc_fct * const * const table)
  2687. {
  2688.     unsigned int offset;
  2689.     table[0](m_dest[0] + m_offset, motion->ref[0][0] + m_offset + m_v_offset * m_stride, m_stride, 16);
  2690.     offset = (m_offset >> 1) + (m_v_offset >> 1) * m_uv_stride;
  2691.     table[4](m_dest[1] + (m_offset >> 1), motion->ref[0][1] + offset, m_uv_stride, 8);
  2692.     table[4](m_dest[2] + (m_offset >> 1), motion->ref[0][2] + offset, m_uv_stride, 8);
  2693. }
  2694. /* like motion_frame, but parsing without actual motion compensation */
  2695. void CMpeg2Decoder::motion_fr_conceal()
  2696. {
  2697.     int tmp;
  2698.     NEEDBITS;
  2699.     tmp = (m_f_motion.pmv[0][0] + get_motion_delta(m_f_motion.f_code[0]));
  2700.     tmp = bound_motion_vector(tmp, m_f_motion.f_code[0]);
  2701.     m_f_motion.pmv[1][0] = m_f_motion.pmv[0][0] = tmp;
  2702.     NEEDBITS;
  2703.     tmp = m_f_motion.pmv[0][1] + get_motion_delta(m_f_motion.f_code[1]);
  2704.     tmp = bound_motion_vector(tmp, m_f_motion.f_code[1]);
  2705.     m_f_motion.pmv[1][1] = m_f_motion.pmv[0][1] = tmp;
  2706.     DUMPBITS(1); /* remove marker_bit */
  2707. }
  2708. void CMpeg2Decoder::motion_fi_field(motion_t * motion, mpeg2_mc_fct * const * const table)
  2709. {
  2710.     int motion_x, motion_y;
  2711.     uint8_t** ref_field;
  2712.     unsigned int pos_x, pos_y, xy_half, offset;
  2713.     NEEDBITS;
  2714.     ref_field = motion->ref2[UBITS(bit_buf, 1)];
  2715.     DUMPBITS(1);
  2716.     motion_x = motion->pmv[0][0] + get_motion_delta(motion->f_code[0]);
  2717.     motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
  2718.     motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
  2719.     NEEDBITS;
  2720.     motion_y = motion->pmv[0][1] + get_motion_delta(motion->f_code[1]);
  2721.     motion_y = bound_motion_vector(motion_y, motion->f_code[1]);
  2722.     motion->pmv[1][1] = motion->pmv[0][1] = motion_y;
  2723.     MOTION(table, ref_field, motion_x, motion_y, 16, 0);
  2724. }
  2725. void CMpeg2Decoder::motion_fi_16x8(motion_t* motion, mpeg2_mc_fct * const * const table)
  2726. {
  2727.     int motion_x, motion_y;
  2728.     uint8_t** ref_field;
  2729.     unsigned int pos_x, pos_y, xy_half, offset;
  2730.     NEEDBITS;
  2731.     ref_field = motion->ref2[UBITS(bit_buf, 1)];
  2732.     DUMPBITS(1);
  2733.     motion_x = motion->pmv[0][0] + get_motion_delta(motion->f_code[0]);
  2734.     motion_x = bound_motion_vector(motion_x, motion->f_code[0]);
  2735.     motion->pmv[0][0] = motion_x;
  2736.     NEEDBITS;
  2737.     motion_y = motion->pmv[0][1] + get_motion_delta(motion->f_code[1]);
  2738.     motion_y = bound_motion_vector(motion_y, motion->f_code[1]);
  2739.     motion->pmv[0][1] = motion_y;
  2740.     MOTION(table, ref_field, motion_x, motion_y, 8, 0);
  2741.     NEEDBITS;
  2742.     ref_field = motion->ref2[UBITS(bit_buf, 1)];
  2743.     DUMPBITS(1);
  2744.     motion_x = motion->pmv[1][0] + get_motion_delta(motion->f_code[0]);
  2745.     motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
  2746.     motion->pmv[1][0] = motion_x;
  2747.     NEEDBITS;
  2748.     motion_y = motion->pmv[1][1] + get_motion_delta(motion->f_code[1]);
  2749.     motion_y = bound_motion_vector(motion_y, motion->f_code[1]);
  2750.     motion->pmv[1][1] = motion_y;
  2751.     MOTION(table, ref_field, motion_x, motion_y, 8, 8);
  2752. }
  2753. void CMpeg2Decoder::motion_fi_dmv(motion_t* motion, mpeg2_mc_fct * const * const table)
  2754. {
  2755.     int motion_x, motion_y, other_x, other_y;
  2756.     unsigned int pos_x, pos_y, xy_half, offset;
  2757.     NEEDBITS;
  2758.     motion_x = motion->pmv[0][0] + get_motion_delta(motion->f_code[0]);
  2759.     motion_x = bound_motion_vector(motion_x, motion->f_code[0]);
  2760.     motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
  2761.     NEEDBITS;
  2762.     other_x = ((motion_x + (motion_x > 0)) >> 1) + get_dmv();
  2763.     motion_y = motion->pmv[0][1] + get_motion_delta(motion->f_code[1]);
  2764.     motion_y = bound_motion_vector(motion_y, motion->f_code[1]);
  2765.     motion->pmv[1][1] = motion->pmv[0][1] = motion_y;
  2766.     other_y = ((motion_y + (motion_y > 0)) >> 1) + get_dmv () + m_dmv_offset;
  2767.     MOTION(m_mc->put, motion->ref[0], motion_x, motion_y, 16, 0);
  2768.     MOTION(m_mc->avg, motion->ref[1], other_x, other_y, 16, 0);
  2769. }
  2770. void CMpeg2Decoder::motion_fi_conceal()
  2771. {
  2772.     int tmp;
  2773.     NEEDBITS;
  2774.     DUMPBITS(1); /* remove field_select */
  2775.     tmp = m_f_motion.pmv[0][0] + get_motion_delta (m_f_motion.f_code[0]);
  2776.     tmp = bound_motion_vector(tmp, m_f_motion.f_code[0]);
  2777.     m_f_motion.pmv[1][0] = m_f_motion.pmv[0][0] = tmp;
  2778.     NEEDBITS;
  2779.     tmp = m_f_motion.pmv[0][1] + get_motion_delta(m_f_motion.f_code[1]);
  2780.     tmp = bound_motion_vector(tmp, m_f_motion.f_code[1]);
  2781.     m_f_motion.pmv[1][1] = m_f_motion.pmv[0][1] = tmp;
  2782.     DUMPBITS(1); /* remove marker_bit */
  2783. }
  2784. #define MOTION_CALL(routine, direction)
  2785. do {
  2786.     if((direction) & MACROBLOCK_MOTION_FORWARD)
  2787. routine(&m_f_motion, m_mc->put);
  2788.     if((direction) & MACROBLOCK_MOTION_BACKWARD)
  2789. routine(&m_b_motion, (direction & MACROBLOCK_MOTION_FORWARD) ? m_mc->avg : m_mc->put);
  2790. } while (0)
  2791. #define NEXT_MACROBLOCK
  2792. do {
  2793.     m_offset += 16;
  2794.     if(m_offset == m_width) {
  2795.     m_dest[0] += 16 * m_stride;
  2796.     m_dest[1] += 4 * m_stride;
  2797.     m_dest[2] += 4 * m_stride;
  2798. m_v_offset += 16;
  2799. if(m_v_offset > m_limit_y)
  2800. return;
  2801. m_offset = 0;
  2802.     }
  2803. } while (0)
  2804. void CMpeg2Decoder::mpeg2_init_fbuf(uint8_t* current_fbuf[3], uint8_t* forward_fbuf[3], uint8_t* backward_fbuf[3])
  2805. {
  2806.     int offset, stride, height, bottom_field;
  2807.     stride = m_width;
  2808.     bottom_field = (m_picture_structure == BOTTOM_FIELD);
  2809.     offset = bottom_field ? stride : 0;
  2810.     height = m_height;
  2811.     m_picture_dest[0] = current_fbuf[0] + offset;
  2812.     m_picture_dest[1] = current_fbuf[1] + (offset >> 1);
  2813.     m_picture_dest[2] = current_fbuf[2] + (offset >> 1);
  2814.     m_f_motion.ref[0][0] = forward_fbuf[0] + offset;
  2815.     m_f_motion.ref[0][1] = forward_fbuf[1] + (offset >> 1);
  2816.     m_f_motion.ref[0][2] = forward_fbuf[2] + (offset >> 1);
  2817.     m_b_motion.ref[0][0] = backward_fbuf[0] + offset;
  2818.     m_b_motion.ref[0][1] = backward_fbuf[1] + (offset >> 1);
  2819.     m_b_motion.ref[0][2] = backward_fbuf[2] + (offset >> 1);
  2820.     if(m_picture_structure != FRAME_PICTURE)
  2821. {
  2822. m_dmv_offset = bottom_field ? 1 : -1;
  2823. m_f_motion.ref2[0] = m_f_motion.ref[bottom_field];
  2824. m_f_motion.ref2[1] = m_f_motion.ref[!bottom_field];
  2825. m_b_motion.ref2[0] = m_b_motion.ref[bottom_field];
  2826. m_b_motion.ref2[1] = m_b_motion.ref[!bottom_field];
  2827. offset = stride - offset;
  2828. if(m_second_field && (m_coding_type != B_TYPE))
  2829. forward_fbuf = current_fbuf;
  2830. m_f_motion.ref[1][0] = forward_fbuf[0] + offset;
  2831. m_f_motion.ref[1][1] = forward_fbuf[1] + (offset >> 1);
  2832. m_f_motion.ref[1][2] = forward_fbuf[2] + (offset >> 1);
  2833. m_b_motion.ref[1][0] = backward_fbuf[0] + offset;
  2834. m_b_motion.ref[1][1] = backward_fbuf[1] + (offset >> 1);
  2835. m_b_motion.ref[1][2] = backward_fbuf[2] + (offset >> 1);
  2836. stride <<= 1;
  2837. height >>= 1;
  2838. }
  2839. m_stride = stride;
  2840. m_uv_stride = stride >> 1;
  2841. m_limit_x = 2 * m_width - 32;
  2842. m_limit_y_16 = 2 * height - 32;
  2843. m_limit_y_8 = 2 * height - 16;
  2844. m_limit_y = height - 16;
  2845. }
  2846. int CMpeg2Decoder::slice_init(int code)
  2847. {
  2848.     int offset;
  2849.     const MBAtab* mba;
  2850.     m_dc_dct_pred[0] = m_dc_dct_pred[1] =
  2851. m_dc_dct_pred[2] = 128 << m_intra_dc_precision;
  2852.     m_f_motion.pmv[0][0] = m_f_motion.pmv[0][1] = 0;
  2853.     m_f_motion.pmv[1][0] = m_f_motion.pmv[1][1] = 0;
  2854.     m_b_motion.pmv[0][0] = m_b_motion.pmv[0][1] = 0;
  2855.     m_b_motion.pmv[1][0] = m_b_motion.pmv[1][1] = 0;
  2856.     if(m_vertical_position_extension)
  2857. {
  2858. code += UBITS(bit_buf, 3) << 7;
  2859. DUMPBITS(3);
  2860.     }
  2861.     m_v_offset = (code - 1) * 16;
  2862.     offset = (code - 1) * m_stride * 4;
  2863.     m_dest[0] = m_picture_dest[0] + offset * 4;
  2864.     m_dest[1] = m_picture_dest[1] + offset;
  2865.     m_dest[2] = m_picture_dest[2] + offset;
  2866.     m_quantizer_scale = get_quantizer_scale();
  2867.     /* ignore intra_slice and all the extra data */
  2868.     while(bit_buf & 0x80000000)
  2869. {
  2870. DUMPBITS(9);
  2871. NEEDBITS;
  2872.     }
  2873.     /* decode initial macroblock address increment */
  2874.     offset = 0;
  2875.     while(1)
  2876. {
  2877. if(bit_buf >= 0x08000000)
  2878. {
  2879. mba = MBA_5 + (UBITS(bit_buf, 6) - 2);
  2880. break;
  2881. }
  2882. else if(bit_buf >= 0x01800000)
  2883. {
  2884. mba = MBA_11 + (UBITS(bit_buf, 12) - 24);
  2885. break;
  2886. }
  2887. else 
  2888. {
  2889. switch(UBITS(bit_buf, 12))
  2890. {
  2891. case 8: /* macroblock_escape */
  2892. offset += 33;
  2893. DUMPBITS(11);
  2894. NEEDBITS;
  2895. continue;
  2896. case 15: /* macroblock_stuffing (MPEG1 only) */
  2897. bit_buf &= 0xfffff;
  2898. DUMPBITS(11);
  2899. NEEDBITS;
  2900. continue;
  2901. default: /* error */
  2902. return 1;
  2903. }
  2904. }
  2905. }
  2906. DUMPBITS(mba->len + 1);
  2907. m_offset = (offset + mba->mba) << 4;
  2908. while(m_offset - m_width >= 0)
  2909. {
  2910. m_offset -= m_width;
  2911. m_dest[0] += 16 * m_stride;
  2912. m_dest[1] += 4 * m_stride;
  2913. m_dest[2] += 4 * m_stride;
  2914. m_v_offset += 16;
  2915. }
  2916. if(m_v_offset > m_limit_y)
  2917. return 1;
  2918. return 0;
  2919. }
  2920. void CMpeg2Decoder::mpeg2_slice(int code, const uint8_t* buffer)
  2921. {
  2922.     m_bitstream_buf = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];
  2923.     m_bitstream_ptr = buffer + 4;
  2924.     m_bitstream_bits = -16;
  2925.     if(slice_init(code))
  2926. return;
  2927. while(1)
  2928. {
  2929. int macroblock_modes;
  2930. int mba_inc;
  2931. const MBAtab * mba;
  2932. NEEDBITS;
  2933. macroblock_modes = get_macroblock_modes();
  2934. /* maybe integrate MACROBLOCK_QUANT test into get_macroblock_modes ? */
  2935. if(macroblock_modes & MACROBLOCK_QUANT)
  2936. m_quantizer_scale = get_quantizer_scale();
  2937. if(macroblock_modes & MACROBLOCK_INTRA)
  2938. {
  2939. int DCT_offset, DCT_stride;
  2940. int offset;
  2941. uint8_t* dest_y;
  2942. if(m_concealment_motion_vectors)
  2943. {
  2944. if(m_picture_structure == FRAME_PICTURE) motion_fr_conceal();
  2945. else motion_fi_conceal();
  2946. }
  2947. else
  2948. {
  2949. m_f_motion.pmv[0][0] = m_f_motion.pmv[0][1] = 0;
  2950. m_f_motion.pmv[1][0] = m_f_motion.pmv[1][1] = 0;
  2951. m_b_motion.pmv[0][0] = m_b_motion.pmv[0][1] = 0;
  2952. m_b_motion.pmv[1][0] = m_b_motion.pmv[1][1] = 0;
  2953. }
  2954. if(macroblock_modes & DCT_TYPE_INTERLACED)
  2955. {
  2956. DCT_offset = m_stride;
  2957. DCT_stride = m_stride * 2;
  2958. }
  2959. else
  2960. {
  2961. DCT_offset = m_stride * 8;
  2962. DCT_stride = m_stride;
  2963. }
  2964. offset = m_offset;
  2965. dest_y = m_dest[0] + offset;
  2966. slice_intra_DCT(0, dest_y, DCT_stride);
  2967. slice_intra_DCT(0, dest_y + 8, DCT_stride);
  2968. slice_intra_DCT(0, dest_y + DCT_offset, DCT_stride);
  2969. slice_intra_DCT(0, dest_y + DCT_offset + 8, DCT_stride);
  2970. slice_intra_DCT(1, m_dest[1] + (offset >> 1), m_uv_stride);
  2971. slice_intra_DCT (2, m_dest[2] + (offset >> 1), m_uv_stride);
  2972. if(m_coding_type == D_TYPE)
  2973. {
  2974. NEEDBITS;
  2975. DUMPBITS(1);
  2976. }
  2977. }
  2978. else
  2979. {
  2980. if(m_picture_structure == FRAME_PICTURE)
  2981. {
  2982. switch(macroblock_modes & MOTION_TYPE_MASK)
  2983. {
  2984. case MC_FRAME:
  2985. if(m_mpeg1) MOTION_CALL(motion_mp1, macroblock_modes);
  2986. else MOTION_CALL (motion_fr_frame, macroblock_modes);
  2987. break;
  2988. case MC_FIELD:
  2989. MOTION_CALL(motion_fr_field, macroblock_modes);
  2990. break;
  2991. case MC_DMV:
  2992. MOTION_CALL(motion_fr_dmv, MACROBLOCK_MOTION_FORWARD);
  2993. break;
  2994. case 0:
  2995. /* non-intra mb without forward mv in a P picture */
  2996. m_f_motion.pmv[0][0] = 0;
  2997. m_f_motion.pmv[0][1] = 0;
  2998. m_f_motion.pmv[1][0] = 0;
  2999. m_f_motion.pmv[1][1] = 0;
  3000. MOTION_CALL(motion_zero, MACROBLOCK_MOTION_FORWARD);
  3001. break;
  3002. }
  3003. }
  3004. else
  3005. {
  3006. switch (macroblock_modes & MOTION_TYPE_MASK)
  3007. {
  3008. case MC_FIELD:
  3009. MOTION_CALL(motion_fi_field, macroblock_modes);
  3010. break;
  3011. case MC_16X8:
  3012. MOTION_CALL(motion_fi_16x8, macroblock_modes);
  3013. break;
  3014. case MC_DMV:
  3015. MOTION_CALL(motion_fi_dmv, MACROBLOCK_MOTION_FORWARD);
  3016. break;
  3017. case 0:
  3018. /* non-intra mb without forward mv in a P picture */
  3019. m_f_motion.pmv[0][0] = 0;
  3020. m_f_motion.pmv[0][1] = 0;
  3021. m_f_motion.pmv[1][0] = 0;
  3022. m_f_motion.pmv[1][1] = 0;
  3023. MOTION_CALL(motion_zero, MACROBLOCK_MOTION_FORWARD);
  3024. break;
  3025. }
  3026. }
  3027. if(macroblock_modes & MACROBLOCK_PATTERN)
  3028. {
  3029. int coded_block_pattern;
  3030. int DCT_offset, DCT_stride;
  3031. int offset;
  3032. uint8_t* dest_y;
  3033. if(macroblock_modes & DCT_TYPE_INTERLACED)
  3034. {
  3035. DCT_offset = m_stride;
  3036. DCT_stride = m_stride * 2;
  3037. }
  3038. else
  3039. {
  3040. DCT_offset = m_stride * 8;
  3041. DCT_stride = m_stride;
  3042. }
  3043. coded_block_pattern = get_coded_block_pattern();
  3044. offset = m_offset;
  3045. dest_y = m_dest[0] + offset;
  3046. if(coded_block_pattern & 0x20)
  3047. slice_non_intra_DCT(dest_y, DCT_stride);
  3048. if(coded_block_pattern & 0x10)
  3049. slice_non_intra_DCT(dest_y + 8, DCT_stride);
  3050. if(coded_block_pattern & 0x08)
  3051. slice_non_intra_DCT(dest_y + DCT_offset, DCT_stride);
  3052. if(coded_block_pattern & 0x04)
  3053. slice_non_intra_DCT(dest_y + DCT_offset + 8, DCT_stride);
  3054. if(coded_block_pattern & 0x2)
  3055. slice_non_intra_DCT(m_dest[1] + (offset >> 1), m_uv_stride);
  3056. if(coded_block_pattern & 0x1)
  3057. slice_non_intra_DCT(m_dest[2] + (offset >> 1), m_uv_stride);
  3058. }
  3059. m_dc_dct_pred[0] = 
  3060. m_dc_dct_pred[1] = 
  3061. m_dc_dct_pred[2] = 128 << m_intra_dc_precision;
  3062. }
  3063. NEXT_MACROBLOCK;
  3064. NEEDBITS;
  3065. mba_inc = 0;
  3066. while(1)
  3067. {
  3068. if(bit_buf >= 0x10000000)
  3069. {
  3070. mba = MBA_5 + (UBITS(bit_buf, 5) - 2);
  3071. break;
  3072. }
  3073. else if(bit_buf >= 0x03000000)
  3074. {
  3075. mba = MBA_11 + (UBITS(bit_buf, 11) - 24);
  3076. break;
  3077. }
  3078. else
  3079. {
  3080. switch(UBITS(bit_buf, 11))
  3081. {
  3082. case 8: /* macroblock_escape */
  3083. mba_inc += 33;
  3084. /* pass through */
  3085. case 15: /* macroblock_stuffing (MPEG1 only) */
  3086. DUMPBITS(11);
  3087. NEEDBITS;
  3088. continue;
  3089. default: /* end of slice, or error */
  3090. return;
  3091. }
  3092. }
  3093. }
  3094. DUMPBITS(mba->len);
  3095. mba_inc += mba->mba;
  3096. if(mba_inc)
  3097. {
  3098. m_dc_dct_pred[0] = 
  3099. m_dc_dct_pred[1] =
  3100. m_dc_dct_pred[2] = 128 << m_intra_dc_precision;
  3101. if(m_coding_type == P_TYPE)
  3102. {
  3103. m_f_motion.pmv[0][0] = m_f_motion.pmv[0][1] = 0;
  3104. m_f_motion.pmv[1][0] = m_f_motion.pmv[1][1] = 0;
  3105. do {
  3106. MOTION_CALL(motion_zero, MACROBLOCK_MOTION_FORWARD);
  3107. NEXT_MACROBLOCK;
  3108. } while(--mba_inc);
  3109. }
  3110. else
  3111. {
  3112. do {
  3113. MOTION_CALL (motion_reuse, macroblock_modes);
  3114. NEXT_MACROBLOCK;
  3115. } while(--mba_inc);
  3116. }
  3117. }
  3118. }
  3119. }
  3120. #undef bit_buf
  3121. #undef bits
  3122. #undef bit_ptr
  3123. ///////////////////////////////////////////////////////////////////////////////////////////
  3124. ///////////////////////////////////////////////////////////////////////////////////////////
  3125. CMpeg2Info::CMpeg2Info()
  3126. {
  3127. m_sequence = NULL;
  3128.     m_gop = NULL;
  3129. Reset();
  3130. }
  3131. CMpeg2Info::~CMpeg2Info()
  3132. {
  3133. }
  3134. void CMpeg2Info::Reset()
  3135. {
  3136.     m_current_picture = m_current_picture_2nd = NULL;
  3137.     m_display_picture = m_display_picture_2nd = NULL;
  3138.     m_current_fbuf = m_display_fbuf = m_discard_fbuf = NULL;
  3139.     m_user_data = NULL;
  3140. m_user_data_len = 0;
  3141. }