getpicture.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:19k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "../mpeg3private.h"
  2. #include "mpeg3video.h"
  3. #include "vlc.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. int mpeg3video_get_cbp(mpeg3_slice_t *slice)
  8. {
  9.    int code;
  10. mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
  11.    if((code = mpeg3slice_showbits9(slice_buffer)) >= 128)
  12. {
  13.      code >>= 4;
  14.      mpeg3slice_flushbits(slice_buffer, mpeg3_CBPtab0[code].len);
  15.      return mpeg3_CBPtab0[code].val;
  16.    }
  17.    if(code >= 8)
  18. {
  19.      code >>= 1;
  20.      mpeg3slice_flushbits(slice_buffer, mpeg3_CBPtab1[code].len);
  21.      return mpeg3_CBPtab1[code].val;
  22.    }
  23.    if(code < 1)
  24. {
  25. /*     fprintf(stderr,"mpeg3video_get_cbp: invalid coded_block_pattern coden"); */
  26.      slice->fault = 1;
  27.      return 0;
  28.    }
  29.    mpeg3slice_flushbits(slice_buffer, mpeg3_CBPtab2[code].len);
  30.    return mpeg3_CBPtab2[code].val;
  31. }
  32. /* set block to zero */
  33. int mpeg3video_clearblock(mpeg3_slice_t *slice, int comp, int size)
  34. {
  35. slice->sparse[comp] = 1;
  36. /* Compiler error with 2.95 required hard coding the size to 6 */
  37. memset(slice->block[comp], 0, sizeof(short) * 64 * size);
  38. return 0;
  39. }
  40. static __inline int mpeg3video_getdclum(mpeg3_slice_buffer_t *slice_buffer)
  41. {
  42. int code, size, val;
  43. /* decode length */
  44. code = mpeg3slice_showbits5(slice_buffer);
  45. if(code < 31)
  46. {
  47.      size = mpeg3_DClumtab0[code].val;
  48.      mpeg3slice_flushbits(slice_buffer, mpeg3_DClumtab0[code].len);
  49. }
  50. else 
  51. {
  52.      code = mpeg3slice_showbits9(slice_buffer) - 0x1f0;
  53.      size = mpeg3_DClumtab1[code].val;
  54.      mpeg3slice_flushbits(slice_buffer, mpeg3_DClumtab1[code].len);
  55. }
  56. if(size == 0) val = 0;
  57. else 
  58. {
  59.      val = mpeg3slice_getbits(slice_buffer, size);
  60.      if((val & (1 << (size - 1))) == 0)  val -= (1 << size) - 1;
  61. }
  62. return val;
  63. }
  64. int mpeg3video_getdcchrom(mpeg3_slice_buffer_t *slice_buffer)
  65. {
  66. int code, size, val;
  67. /* decode length */
  68. code = mpeg3slice_showbits5(slice_buffer);
  69. if(code < 31)
  70. {
  71.      size = mpeg3_DCchromtab0[code].val;
  72.      mpeg3slice_flushbits(slice_buffer, mpeg3_DCchromtab0[code].len);
  73. }
  74. else 
  75. {
  76.      code = mpeg3slice_showbits(slice_buffer, 10) - 0x3e0;
  77.      size = mpeg3_DCchromtab1[code].val;
  78.      mpeg3slice_flushbits(slice_buffer, mpeg3_DCchromtab1[code].len);
  79. }
  80. if(size == 0) val = 0;
  81. else 
  82. {
  83.       val = mpeg3slice_getbits(slice_buffer, size);
  84.       if((val & (1 << (size - 1))) == 0) val -= (1 << size) - 1;
  85. }
  86. return val;
  87. }
  88. /* decode one intra coded MPEG-1 block */
  89. int mpeg3video_getintrablock(mpeg3_slice_t *slice, 
  90. mpeg3video_t *video,
  91. int comp, 
  92. int dc_dct_pred[])
  93. {
  94. int val, i, j, sign;
  95. unsigned int code;
  96. mpeg3_DCTtab_t *tab = 0;
  97. short *bp = slice->block[comp];
  98. mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
  99. /* decode DC coefficients */
  100.    if(comp < 4)         
  101.    bp[0] = (dc_dct_pred[0] += mpeg3video_getdclum(slice_buffer)) << 3;
  102.    else 
  103.    if(comp == 4)   
  104.    bp[0] = (dc_dct_pred[1] += mpeg3video_getdcchrom(slice_buffer)) << 3;
  105. else                
  106.    bp[0] = (dc_dct_pred[2] += mpeg3video_getdcchrom(slice_buffer)) << 3;
  107. #ifdef HAVE_MMX
  108. if(video->have_mmx)
  109.    bp[0] <<= 4;
  110. #endif
  111.    if(slice->fault) return 1;
  112. /* decode AC coefficients */
  113.    for(i = 1; ; i++)
  114. {
  115.      code = mpeg3slice_showbits16(slice_buffer);
  116.      if(code >= 16384)
  117. tab = &mpeg3_DCTtabnext[(code >> 12) - 4];
  118.      else 
  119. if(code >= 1024) tab = &mpeg3_DCTtab0[(code >> 8) - 4];
  120.      else 
  121. if(code >= 512) tab = &mpeg3_DCTtab1[(code >> 6) - 8];
  122.      else 
  123. if(code >= 256) tab = &mpeg3_DCTtab2[(code >> 4) - 16];
  124.      else 
  125. if(code >= 128) tab = &mpeg3_DCTtab3[(code >> 3) - 16];
  126.      else 
  127. if(code >= 64) tab = &mpeg3_DCTtab4[(code >> 2) - 16];
  128.      else 
  129. if(code >= 32) tab = &mpeg3_DCTtab5[(code >> 1) - 16];
  130.      else 
  131. if(code >= 16) tab = &mpeg3_DCTtab6[code - 16];
  132.      else 
  133. {
  134. /*        fprintf(stderr, "mpeg3video_getintrablock: invalid Huffman coden"); */
  135.         slice->fault = 1;
  136.         return 0;
  137.      }
  138.      mpeg3slice_flushbits(slice_buffer, tab->len);
  139.      if(tab->run == 64) break;  /* end_of_block */
  140.      if(tab->run == 65)
  141. {
  142. /* escape */
  143.      i += mpeg3slice_getbits(slice_buffer, 6);
  144.      if((val = mpeg3slice_getbits(slice_buffer, 8)) == 0) 
  145. val = mpeg3slice_getbits(slice_buffer, 8);
  146.      else 
  147. if(val == 128)         
  148. val = mpeg3slice_getbits(slice_buffer, 8) - 256;
  149.      else 
  150. if(val > 128)          
  151. val -= 256;
  152.      if((sign = (val < 0)) != 0) val= -val;
  153.      }
  154.      else 
  155. {
  156.      i += tab->run;
  157.      val = tab->level;
  158.      sign = mpeg3slice_getbit(slice_buffer);
  159.      }
  160. if(i < 64)
  161.      j = video->mpeg3_zigzag_scan_table[i];
  162. else
  163. {
  164.         slice->fault = 1;
  165.         return 0;
  166. }
  167. #ifdef HAVE_MMX
  168. if(video->have_mmx)
  169. {
  170.      val = (val * slice->quant_scale * video->intra_quantizer_matrix[j]) << 1;
  171.      val = (val - 16) | 16;
  172. }
  173. else
  174. #endif
  175. {
  176.      val = (val * slice->quant_scale * video->intra_quantizer_matrix[j]) >> 3;
  177.      val = (val - 1) | 1;
  178. }
  179.      bp[j] = sign ? -val : val;
  180. }
  181. if(j != 0) 
  182. {
  183. /* not a sparse matrix ! */
  184.        slice->sparse[comp] = 0;
  185. }
  186. return 0;
  187. }
  188. /* decode one non-intra coded MPEG-1 block */
  189. int mpeg3video_getinterblock(mpeg3_slice_t *slice, 
  190. mpeg3video_t *video, 
  191. int comp)
  192. {
  193. int val, i, j, sign;
  194. unsigned int code;
  195. mpeg3_DCTtab_t *tab; 
  196. short *bp = slice->block[comp];
  197. mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
  198. /* decode AC coefficients */
  199. for(i = 0; ; i++)
  200. {
  201.      code = mpeg3slice_showbits16(slice_buffer);
  202.      if(code >= 16384)
  203. {
  204.          if(i == 0) 
  205. tab = &mpeg3_DCTtabfirst[(code >> 12) - 4];
  206.          else      
  207. tab = &mpeg3_DCTtabnext[(code >> 12) - 4];
  208.      }
  209.      else 
  210. if(code >= 1024) tab = &mpeg3_DCTtab0[(code >> 8) - 4];
  211.      else 
  212. if(code >= 512)  tab = &mpeg3_DCTtab1[(code >> 6) - 8];
  213.      else 
  214. if(code >= 256)  tab = &mpeg3_DCTtab2[(code >> 4) - 16];
  215.      else 
  216. if(code >= 128)  tab = &mpeg3_DCTtab3[(code >> 3) - 16];
  217.      else 
  218. if(code >= 64)   tab = &mpeg3_DCTtab4[(code >> 2) - 16];
  219.      else 
  220. if(code >= 32)   tab = &mpeg3_DCTtab5[(code >> 1) - 16];
  221.      else 
  222. if(code >= 16)   tab = &mpeg3_DCTtab6[code - 16];
  223.      else 
  224. {
  225. // invalid Huffman code
  226.      slice->fault = 1;
  227.      return 1;
  228.      }
  229.      mpeg3slice_flushbits(slice_buffer, tab->len);
  230. /* end of block */
  231.      if(tab->run == 64)
  232.         break;   
  233.      if(tab->run == 65)
  234. {          
  235. /* escape  */
  236.      i += mpeg3slice_getbits(slice_buffer, 6);
  237.      if((val = mpeg3slice_getbits(slice_buffer, 8)) == 0) 
  238. val = mpeg3slice_getbits(slice_buffer, 8);
  239.      else 
  240. if(val == 128)  
  241. val = mpeg3slice_getbits(slice_buffer, 8) - 256;
  242.      else 
  243. if(val > 128) 
  244. val -= 256;
  245.      if((sign = (val < 0)) != 0) val = -val;
  246.      }
  247.      else 
  248. {
  249.      i += tab->run;
  250.      val = tab->level;
  251.      sign = mpeg3slice_getbit(slice_buffer);
  252.      }
  253.      j = video->mpeg3_zigzag_scan_table[i];
  254. #ifdef HAVE_MMX
  255. if(video->have_mmx)
  256. {
  257.      val = (((val << 1)+1) * slice->quant_scale * video->non_intra_quantizer_matrix[j]);
  258.      val = (val - 16) | 16;
  259. }
  260. else
  261. #endif
  262. {
  263.      val = (((val << 1)+1) * slice->quant_scale * video->non_intra_quantizer_matrix[j]) >> 4;
  264.      val = (val - 1) | 1;
  265. }
  266.      bp[j] = sign ? -val : val;
  267. }
  268. if(j != 0) 
  269. {
  270. /* not a sparse matrix ! */
  271.        slice->sparse[comp] = 0;
  272. }
  273. return 0;
  274. }
  275. /* decode one intra coded MPEG-2 block */
  276. int mpeg3video_getmpg2intrablock(mpeg3_slice_t *slice, 
  277. mpeg3video_t *video, 
  278. int comp, 
  279. int dc_dct_pred[])
  280. {
  281. int val, i, j, sign, nc;
  282. unsigned int code;
  283. mpeg3_DCTtab_t *tab;
  284. short *bp;
  285. int *qmat;
  286. mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
  287. /* with data partitioning, data always goes to base layer */
  288.    bp = slice->block[comp];
  289.    qmat = (comp < 4 || video->chroma_format == CHROMA420)
  290.          ? video->intra_quantizer_matrix
  291.          : video->chroma_intra_quantizer_matrix;
  292. /* decode DC coefficients */
  293. if(comp < 4)           
  294. val = (dc_dct_pred[0] += mpeg3video_getdclum(slice_buffer));
  295. else 
  296. if((comp & 1) == 0) 
  297. val = (dc_dct_pred[1] += mpeg3video_getdcchrom(slice_buffer));
  298. else                  
  299. val = (dc_dct_pred[2] += mpeg3video_getdcchrom(slice_buffer));
  300.    if(slice->fault) return 0;
  301. #ifdef HAVE_MMX
  302. if(video->have_mmx)
  303.    bp[0] = val << (7 - video->dc_prec);
  304. else
  305. #endif
  306.    bp[0] = val << (3 - video->dc_prec);
  307.    nc = 0;
  308. /* decode AC coefficients */
  309.    for(i = 1; ; i++)
  310. {
  311.      code = mpeg3slice_showbits16(slice_buffer);
  312.      if(code >= 16384 && !video->intravlc)
  313. tab = &mpeg3_DCTtabnext[(code >> 12) - 4];
  314.      else 
  315. if(code >= 1024)
  316. {
  317.      if(video->intravlc) 
  318. tab = &mpeg3_DCTtab0a[(code >> 8) - 4];
  319.      else 
  320. tab = &mpeg3_DCTtab0[(code >> 8) - 4];
  321.      }
  322.      else 
  323. if(code >= 512)
  324. {
  325.      if(video->intravlc)     
  326.       tab = &mpeg3_DCTtab1a[(code >> 6) - 8];
  327.      else              
  328. tab = &mpeg3_DCTtab1[(code >> 6) - 8];
  329.      }
  330.      else 
  331. if(code >= 256) tab = &mpeg3_DCTtab2[(code >> 4) - 16];
  332.      else 
  333. if(code >= 128) tab = &mpeg3_DCTtab3[(code >> 3) - 16];
  334.      else 
  335. if(code >= 64)  tab = &mpeg3_DCTtab4[(code >> 2) - 16];
  336.      else 
  337. if(code >= 32)  tab = &mpeg3_DCTtab5[(code >> 1) - 16];
  338.      else 
  339. if(code >= 16)  tab = &mpeg3_DCTtab6[code - 16];
  340.      else 
  341. {
  342. /*     fprintf(stderr,"mpeg3video_getmpg2intrablock: invalid Huffman coden"); */
  343.      slice->fault = 1;
  344.      return 1;
  345.      }
  346.      mpeg3slice_flushbits(slice_buffer, tab->len);
  347. /* end_of_block */
  348.      if(tab->run == 64)
  349.          break; 
  350.      if(tab->run == 65)
  351. {
  352. /* escape */
  353.         i += mpeg3slice_getbits(slice_buffer, 6);
  354.         val = mpeg3slice_getbits(slice_buffer, 12);
  355.         if((val & 2047) == 0)
  356. {
  357. // invalid signed_level (escape)
  358.          slice->fault = 1;
  359.          return 0;
  360.         }
  361.         if((sign = (val >= 2048)) != 0) val = 4096 - val;
  362.      }
  363.      else 
  364. {
  365.      i += tab->run;
  366.      val = tab->level;
  367.      sign = mpeg3slice_getbit(slice_buffer);
  368.      }
  369.      j = (video->altscan ? video->mpeg3_alternate_scan_table : video->mpeg3_zigzag_scan_table)[i];
  370. #ifdef HAVE_MMX
  371. if(video->have_mmx)
  372.      val = (val * slice->quant_scale * qmat[j]);
  373. else
  374. #endif
  375.      val = (val * slice->quant_scale * qmat[j]) >> 4;
  376.      bp[j] = sign ? -val : val;
  377.      nc++;
  378. }
  379. if(j != 0)
  380. {
  381. /* not a sparse matrix ! */
  382.       slice->sparse[comp] = 0;
  383. }
  384. return 1;
  385. }
  386. /* decode one non-intra coded MPEG-2 block */
  387. int mpeg3video_getmpg2interblock(mpeg3_slice_t *slice, 
  388. mpeg3video_t *video, 
  389. int comp)
  390. {
  391. int val, i, j, sign, nc;
  392. unsigned int code;
  393. mpeg3_DCTtab_t *tab;
  394. short *bp;
  395. int *qmat;
  396. mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
  397. /* with data partitioning, data always goes to base layer */
  398.    bp = slice->block[comp];
  399.    qmat = (comp < 4 || video->chroma_format == CHROMA420)
  400.          ? video->non_intra_quantizer_matrix
  401.          : video->chroma_non_intra_quantizer_matrix;
  402.    nc = 0;
  403. /* decode AC coefficients */
  404.    for(i = 0; ; i++)
  405. {
  406.      code = mpeg3slice_showbits16(slice_buffer);
  407.      if(code >= 16384)
  408. {
  409.        if(i == 0) tab = &mpeg3_DCTtabfirst[(code >> 12) - 4];
  410.        else      tab = &mpeg3_DCTtabnext[(code >> 12) - 4];
  411.      }
  412.      else 
  413. if(code >= 1024) tab = &mpeg3_DCTtab0[(code >> 8) - 4];
  414.      else 
  415. if(code >= 512)  tab = &mpeg3_DCTtab1[(code >> 6) - 8];
  416.      else 
  417. if(code >= 256)  tab = &mpeg3_DCTtab2[(code >> 4) - 16];
  418.      else 
  419. if(code >= 128)  tab = &mpeg3_DCTtab3[(code >> 3) - 16];
  420.      else 
  421. if(code >= 64)   tab = &mpeg3_DCTtab4[(code >> 2) - 16];
  422.      else 
  423. if(code >= 32)   tab = &mpeg3_DCTtab5[(code >> 1) - 16];
  424.      else 
  425. if(code >= 16)   tab = &mpeg3_DCTtab6[code - 16];
  426.      else 
  427. {
  428. // invalid Huffman code
  429.      slice->fault = 1;
  430.      return 0;
  431.      }
  432.      mpeg3slice_flushbits(slice_buffer, tab->len);
  433. /* end_of_block */
  434.      if(tab->run == 64)
  435.         break;          
  436.      if(tab->run == 65)
  437. {                 
  438. /* escape */
  439.      i += mpeg3slice_getbits(slice_buffer, 6);
  440.      val = mpeg3slice_getbits(slice_buffer, 12);
  441.      if((val & 2047) == 0)
  442. {
  443. /*         fprintf(stderr, "mpeg3video_getmpg2interblock: invalid signed_level (escape)n"); */
  444.          slice->fault = 1;
  445.          return 1;
  446.      }
  447.      if((sign = (val >= 2048)) != 0) val = 4096 - val;
  448.      }
  449.      else 
  450. {
  451.      i += tab->run;
  452.      val = tab->level;
  453.      sign = mpeg3slice_getbit(slice_buffer);
  454.      }
  455.      j = (video->altscan ? video->mpeg3_alternate_scan_table : video->mpeg3_zigzag_scan_table)[i];
  456. #ifdef HAVE_MMX
  457.   if(video->have_mmx)
  458.      val = (((val << 1)+1) * slice->quant_scale * qmat[j]) >> 1;
  459. else
  460. #endif
  461.       val = (((val << 1)+1) * slice->quant_scale * qmat[j]) >> 5;
  462.      bp[j] = sign ? (-val) : val ;
  463.      nc++;
  464. }
  465. if(j != 0) 
  466. {
  467.        slice->sparse[comp] = 0;
  468. }
  469. return 0;
  470. }
  471. /* decode all macroblocks of the current picture */
  472. int mpeg3video_get_macroblocks(mpeg3video_t *video, int framenum)
  473. {
  474. unsigned int code;
  475. mpeg3_slice_buffer_t *slice_buffer; /* Buffer being loaded */
  476. int i;
  477. int current_buffer;
  478. mpeg3_bits_t *vstream = video->vstream;
  479. /* Load every slice into a buffer array */
  480. video->total_slice_buffers = 0;
  481. current_buffer = 0;
  482. while(!mpeg3bits_eof(vstream) && 
  483. mpeg3bits_showbits32_noptr(vstream) >= MPEG3_SLICE_MIN_START && 
  484. mpeg3bits_showbits32_noptr(vstream) <= MPEG3_SLICE_MAX_START &&
  485. video->total_slice_buffers < MPEG3_MAX_CPUS)
  486. {
  487. /* Initialize the buffer */
  488. if(current_buffer >= video->slice_buffers_initialized)
  489. mpeg3_new_slice_buffer(&(video->slice_buffers[video->slice_buffers_initialized++]));
  490. slice_buffer = &(video->slice_buffers[current_buffer]);
  491. slice_buffer->buffer_size = 0;
  492. slice_buffer->current_position = 0;
  493. slice_buffer->bits_size = 0;
  494. slice_buffer->done = 0;
  495. /* Read the slice into the buffer including the slice start code */
  496. do
  497. {
  498. /* Expand buffer */
  499. if(slice_buffer->buffer_allocation <= slice_buffer->buffer_size)
  500. mpeg3_expand_slice_buffer(slice_buffer);
  501. /* Load 1 char into buffer */
  502. slice_buffer->data[slice_buffer->buffer_size++] = mpeg3bits_getbyte_noptr(vstream);
  503. }while(!mpeg3bits_eof(vstream) &&
  504. mpeg3bits_showbits24_noptr(vstream) != MPEG3_PACKET_START_CODE_PREFIX);
  505. /* Pad the buffer to get the last macroblock */
  506. if(slice_buffer->buffer_allocation <= slice_buffer->buffer_size + 4)
  507. mpeg3_expand_slice_buffer(slice_buffer);
  508. slice_buffer->data[slice_buffer->buffer_size++] = 0;
  509. slice_buffer->data[slice_buffer->buffer_size++] = 0;
  510. slice_buffer->data[slice_buffer->buffer_size++] = 1;
  511. slice_buffer->data[slice_buffer->buffer_size++] = 0;
  512. slice_buffer->bits_size = 0;
  513. #ifndef SDL_THREADS
  514. pthread_mutex_lock(&(slice_buffer->completion_lock));
  515. #else
  516. SDL_LockMutex(slice_buffer->completion_lock);
  517. #endif
  518. fflush(stdout);
  519. current_buffer++;
  520. video->total_slice_buffers++;
  521. }
  522. /* Run the slice decoders */
  523. if(video->total_slice_buffers > 0)
  524. {
  525. for(i = 0; i < video->total_slice_decoders; i++)
  526. {
  527. if(i == 0 && video->total_slice_decoders > 1)
  528. {
  529. video->slice_decoders[i].current_buffer = 0;
  530. video->slice_decoders[i].buffer_step = 1;
  531. video->slice_decoders[i].last_buffer = (video->total_slice_buffers - 1);
  532. }
  533. else
  534. if(i == 1)
  535. {
  536. video->slice_decoders[i].current_buffer = video->total_slice_buffers - 1;
  537. video->slice_decoders[i].buffer_step = -1;
  538. video->slice_decoders[i].last_buffer = 0;
  539. }
  540. else
  541. {
  542. video->slice_decoders[i].current_buffer = i;
  543. video->slice_decoders[i].buffer_step = 1;
  544. video->slice_decoders[i].last_buffer = video->total_slice_buffers - 1;
  545. }
  546. #ifndef SDL_THREADS
  547. pthread_mutex_unlock(&(video->slice_decoders[i].input_lock));
  548. #else
  549. SDL_UnlockMutex(video->slice_decoders[i].input_lock);
  550. #endif
  551. }
  552. }
  553. /* Wait for the slice buffers to finish */
  554. if(video->total_slice_buffers > 0)
  555. {
  556. for(i = 0; i < video->total_slice_buffers; i++)
  557. {
  558. #ifndef SDL_THREADS
  559. pthread_mutex_lock(&(video->slice_buffers[i].completion_lock));
  560. pthread_mutex_unlock(&(video->slice_buffers[i].completion_lock));
  561. #else
  562. SDL_LockMutex(video->slice_buffers[i].completion_lock);
  563. SDL_UnlockMutex(video->slice_buffers[i].completion_lock);
  564. #endif
  565. }
  566. /* Wait for decoders to finish so packages aren't overwritten */
  567. for(i = 0; i < video->total_slice_decoders; i++)
  568. {
  569. #ifndef SDL_THREADS
  570. pthread_mutex_lock(&(video->slice_decoders[i].completion_lock));
  571. #else
  572. SDL_LockMutex(video->slice_decoders[i].completion_lock);
  573. #endif
  574. }
  575. }
  576. return 0;
  577. }
  578. int mpeg3video_allocate_decoders(mpeg3video_t *video, int decoder_count)
  579. {
  580. int i;
  581. int cpus = video->cpus;
  582.   if (video->total_slice_decoders != cpus)
  583. {
  584. for(i = 0; i < video->total_slice_decoders; i++)
  585. {
  586. mpeg3_delete_slice_decoder(&(video->slice_decoders[i]));
  587. }
  588. for(i = 0; i < cpus && i < MPEG3_MAX_CPUS; i++)
  589. {
  590. mpeg3_new_slice_decoder(video, &(video->slice_decoders[i]));
  591. video->slice_decoders[i].thread_number = i;
  592. }
  593. video->total_slice_decoders = cpus;
  594. }
  595. return 0;
  596. }
  597. /* decode one frame or field picture */
  598. int mpeg3video_getpicture(mpeg3video_t *video, int framenum)
  599. {
  600. int i, result = 0;
  601. int cpus = video->cpus;
  602. if(video->pict_struct == FRAME_PICTURE && video->secondfield)
  603. {
  604. /* recover from illegal number of field pictures */
  605.      video->secondfield = 0;
  606. }
  607. if(!video->mpeg2)
  608. {
  609. video->current_repeat = video->repeat_count = 0;
  610. }
  611. mpeg3video_allocate_decoders(video, cpus);
  612.    for(i = 0; i < 3; i++)
  613. {
  614.      if(video->pict_type == B_TYPE)
  615. {
  616. video->newframe[i] = video->auxframe[i];
  617. }
  618.      else 
  619. {
  620.         if(!video->secondfield && !video->current_repeat)
  621. {
  622. /* Swap refframes for I frames */
  623.          unsigned char* tmp = video->oldrefframe[i];
  624.          video->oldrefframe[i] = video->refframe[i];
  625.          video->refframe[i] = tmp;
  626.         }
  627.        video->newframe[i] = video->refframe[i];
  628.      }
  629.      if(video->pict_struct == BOTTOM_FIELD)
  630. {
  631. /* Only used if fields are in different pictures */
  632.          video->newframe[i] += (i == 0) ? video->coded_picture_width : video->chrom_width;
  633. }
  634. }
  635. /* The problem is when a B frame lands on the first repeat and is skipped, */
  636. /* the second repeat goes for the same bitmap as the skipped repeat, */
  637. /* so it picks up a frame from 3 frames back. */
  638. /* The first repeat must consititutively read a B frame if its B frame is going to be */
  639. /* used in a later repeat. */
  640. if(!video->current_repeat)
  641. if(!(video->skip_bframes && video->pict_type == B_TYPE) || 
  642. (video->repeat_count >= 100 + 100 * video->skip_bframes))
  643.    result = mpeg3video_get_macroblocks(video, framenum);
  644. /* Set the frame to display */
  645. video->output_src = 0;
  646. if(framenum > -1 && !result)
  647. {
  648.      if(video->pict_struct == FRAME_PICTURE || video->secondfield)
  649. {
  650.          if(video->pict_type == B_TYPE)
  651. {
  652. video->output_src = video->auxframe;
  653. }
  654.          else
  655. {
  656. video->output_src = video->oldrefframe;
  657. }
  658.      }
  659.      else 
  660. {
  661. mpeg3video_display_second_field(video);
  662. }
  663. }
  664. if(video->mpeg2)
  665. {
  666. video->current_repeat += 100;
  667. }
  668.    if(video->pict_struct != FRAME_PICTURE) video->secondfield = !video->secondfield;
  669. return result;
  670. }