00001 #include "mpeg3private.h"
00002 #include "mpeg3protos.h"
00003 #include "vlc.h"
00004
00005 #include <stdio.h>
00006 #include <stdlib.h>
00007 #include <string.h>
00008
00009 int mpeg3video_get_cbp(mpeg3_slice_t *slice)
00010 {
00011 int code;
00012 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00013
00014 if((code = mpeg3slice_showbits9(slice_buffer)) >= 128)
00015 {
00016 code >>= 4;
00017 mpeg3slice_flushbits(slice_buffer, mpeg3_CBPtab0[code].len);
00018 return mpeg3_CBPtab0[code].val;
00019 }
00020
00021 if(code >= 8)
00022 {
00023 code >>= 1;
00024 mpeg3slice_flushbits(slice_buffer, mpeg3_CBPtab1[code].len);
00025 return mpeg3_CBPtab1[code].val;
00026 }
00027
00028 if(code < 1)
00029 {
00030
00031 slice->fault = 1;
00032 return 0;
00033 }
00034
00035 mpeg3slice_flushbits(slice_buffer, mpeg3_CBPtab2[code].len);
00036 return mpeg3_CBPtab2[code].val;
00037 }
00038
00039
00040
00041 int mpeg3video_clearblock(mpeg3_slice_t *slice, int comp, int size)
00042 {
00043 slice->sparse[comp] = 1;
00044
00045
00046
00047 bzero(slice->block[comp], sizeof(short) * 64 * size);
00048
00049 return 0;
00050 }
00051
00052 static inline int mpeg3video_getdclum(mpeg3_slice_buffer_t *slice_buffer)
00053 {
00054 int code, size, val;
00055
00056 code = mpeg3slice_showbits5(slice_buffer);
00057
00058 if(code < 31)
00059 {
00060 size = mpeg3_DClumtab0[code].val;
00061 mpeg3slice_flushbits(slice_buffer, mpeg3_DClumtab0[code].len);
00062 }
00063 else
00064 {
00065 code = mpeg3slice_showbits9(slice_buffer) - 0x1f0;
00066 size = mpeg3_DClumtab1[code].val;
00067 mpeg3slice_flushbits(slice_buffer, mpeg3_DClumtab1[code].len);
00068 }
00069
00070 if(size == 0) val = 0;
00071 else
00072 {
00073 val = mpeg3slice_getbits(slice_buffer, size);
00074 if((val & (1 << (size - 1))) == 0) val -= (1 << size) - 1;
00075 }
00076
00077 return val;
00078 }
00079
00080
00081 int mpeg3video_getdcchrom(mpeg3_slice_buffer_t *slice_buffer)
00082 {
00083 int code, size, val;
00084
00085
00086 code = mpeg3slice_showbits5(slice_buffer);
00087
00088 if(code < 31)
00089 {
00090 size = mpeg3_DCchromtab0[code].val;
00091 mpeg3slice_flushbits(slice_buffer, mpeg3_DCchromtab0[code].len);
00092 }
00093 else
00094 {
00095 code = mpeg3slice_showbits(slice_buffer, 10) - 0x3e0;
00096 size = mpeg3_DCchromtab1[code].val;
00097 mpeg3slice_flushbits(slice_buffer, mpeg3_DCchromtab1[code].len);
00098 }
00099
00100 if(size == 0) val = 0;
00101 else
00102 {
00103 val = mpeg3slice_getbits(slice_buffer, size);
00104 if((val & (1 << (size - 1))) == 0) val -= (1 << size) - 1;
00105 }
00106
00107 return val;
00108 }
00109
00110
00111
00112
00113 int mpeg3video_getintrablock(mpeg3_slice_t *slice,
00114 mpeg3video_t *video,
00115 int comp,
00116 int dc_dct_pred[])
00117 {
00118 int val, i, j = 8, sign;
00119 unsigned int code;
00120 mpeg3_DCTtab_t *tab = 0;
00121 short *bp = slice->block[comp];
00122 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00123
00124
00125 if(comp < 4)
00126 bp[0] = (dc_dct_pred[0] += mpeg3video_getdclum(slice_buffer)) << 3;
00127 else
00128 if(comp == 4)
00129 bp[0] = (dc_dct_pred[1] += mpeg3video_getdcchrom(slice_buffer)) << 3;
00130 else
00131 bp[0] = (dc_dct_pred[2] += mpeg3video_getdcchrom(slice_buffer)) << 3;
00132
00133 if(slice->fault) return 1;
00134
00135
00136 for(i = 1; ; i++)
00137 {
00138 code = mpeg3slice_showbits16(slice_buffer);
00139 if(code >= 16384)
00140 tab = &mpeg3_DCTtabnext[(code >> 12) - 4];
00141 else
00142 if(code >= 1024) tab = &mpeg3_DCTtab0[(code >> 8) - 4];
00143 else
00144 if(code >= 512) tab = &mpeg3_DCTtab1[(code >> 6) - 8];
00145 else
00146 if(code >= 256) tab = &mpeg3_DCTtab2[(code >> 4) - 16];
00147 else
00148 if(code >= 128) tab = &mpeg3_DCTtab3[(code >> 3) - 16];
00149 else
00150 if(code >= 64) tab = &mpeg3_DCTtab4[(code >> 2) - 16];
00151 else
00152 if(code >= 32) tab = &mpeg3_DCTtab5[(code >> 1) - 16];
00153 else
00154 if(code >= 16) tab = &mpeg3_DCTtab6[code - 16];
00155 else
00156 {
00157
00158 slice->fault = 1;
00159 return 0;
00160 }
00161
00162 mpeg3slice_flushbits(slice_buffer, tab->len);
00163
00164 if(tab->run == 64) break;
00165
00166 if(tab->run == 65)
00167 {
00168
00169 i += mpeg3slice_getbits(slice_buffer, 6);
00170
00171 if((val = mpeg3slice_getbits(slice_buffer, 8)) == 0)
00172 val = mpeg3slice_getbits(slice_buffer, 8);
00173 else
00174 if(val == 128)
00175 val = mpeg3slice_getbits(slice_buffer, 8) - 256;
00176 else
00177 if(val > 128)
00178 val -= 256;
00179
00180 if((sign = (val < 0)) != 0) val= -val;
00181 }
00182 else
00183 {
00184 i += tab->run;
00185 val = tab->level;
00186 sign = mpeg3slice_getbit(slice_buffer);
00187 }
00188
00189 if(i < 64)
00190 j = video->mpeg3_zigzag_scan_table[i];
00191 else
00192 {
00193 slice->fault = 1;
00194 return 0;
00195 }
00196
00197
00198 val = (val * slice->quant_scale * video->intra_quantizer_matrix[j]) >> 3;
00199 val = (val - 1) | 1;
00200
00201 bp[j] = sign ? -val : val;
00202 }
00203
00204 if(j != 0)
00205 {
00206
00207 slice->sparse[comp] = 0;
00208 }
00209 return 0;
00210 }
00211
00212
00213
00214
00215 int mpeg3video_getinterblock(mpeg3_slice_t *slice,
00216 mpeg3video_t *video,
00217 int comp)
00218 {
00219 int val, i, j, sign;
00220 unsigned int code;
00221 mpeg3_DCTtab_t *tab;
00222 short *bp = slice->block[comp];
00223 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00224
00225
00226 for(i = 0; ; i++)
00227 {
00228 code = mpeg3slice_showbits16(slice_buffer);
00229 if(code >= 16384)
00230 {
00231 if(i == 0)
00232 tab = &mpeg3_DCTtabfirst[(code >> 12) - 4];
00233 else
00234 tab = &mpeg3_DCTtabnext[(code >> 12) - 4];
00235 }
00236 else
00237 if(code >= 1024) tab = &mpeg3_DCTtab0[(code >> 8) - 4];
00238 else
00239 if(code >= 512) tab = &mpeg3_DCTtab1[(code >> 6) - 8];
00240 else
00241 if(code >= 256) tab = &mpeg3_DCTtab2[(code >> 4) - 16];
00242 else
00243 if(code >= 128) tab = &mpeg3_DCTtab3[(code >> 3) - 16];
00244 else
00245 if(code >= 64) tab = &mpeg3_DCTtab4[(code >> 2) - 16];
00246 else
00247 if(code >= 32) tab = &mpeg3_DCTtab5[(code >> 1) - 16];
00248 else
00249 if(code >= 16) tab = &mpeg3_DCTtab6[code - 16];
00250 else
00251 {
00252
00253 slice->fault = 1;
00254 return 1;
00255 }
00256
00257 mpeg3slice_flushbits(slice_buffer, tab->len);
00258
00259
00260 if(tab->run == 64)
00261 break;
00262
00263 if(tab->run == 65)
00264 {
00265
00266 i += mpeg3slice_getbits(slice_buffer, 6);
00267 if((val = mpeg3slice_getbits(slice_buffer, 8)) == 0)
00268 val = mpeg3slice_getbits(slice_buffer, 8);
00269 else
00270 if(val == 128)
00271 val = mpeg3slice_getbits(slice_buffer, 8) - 256;
00272 else
00273 if(val > 128)
00274 val -= 256;
00275
00276 if((sign = (val < 0)) != 0) val = -val;
00277 }
00278 else
00279 {
00280 i += tab->run;
00281 val = tab->level;
00282 sign = mpeg3slice_getbit(slice_buffer);
00283 }
00284
00285 j = video->mpeg3_zigzag_scan_table[i];
00286
00287 val = (((val << 1)+1) * slice->quant_scale * video->non_intra_quantizer_matrix[j]) >> 4;
00288 val = (val - 1) | 1;
00289
00290 bp[j] = sign ? -val : val;
00291 }
00292
00293 if(j != 0)
00294 {
00295
00296 slice->sparse[comp] = 0;
00297 }
00298 return 0;
00299 }
00300
00301
00302
00303 int mpeg3video_getmpg2intrablock(mpeg3_slice_t *slice,
00304 mpeg3video_t *video,
00305 int comp,
00306 int dc_dct_pred[])
00307 {
00308 int val, i, j, sign, nc;
00309 unsigned int code;
00310 mpeg3_DCTtab_t *tab;
00311 short *bp;
00312 int *qmat;
00313 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00314
00315
00316 bp = slice->block[comp];
00317
00318 qmat = (comp < 4 || video->chroma_format == CHROMA420)
00319 ? video->intra_quantizer_matrix
00320 : video->chroma_intra_quantizer_matrix;
00321
00322
00323 if(comp < 4)
00324 val = (dc_dct_pred[0] += mpeg3video_getdclum(slice_buffer));
00325 else
00326 if((comp & 1) == 0)
00327 val = (dc_dct_pred[1] += mpeg3video_getdcchrom(slice_buffer));
00328 else
00329 val = (dc_dct_pred[2] += mpeg3video_getdcchrom(slice_buffer));
00330
00331 if(slice->fault) return 0;
00332 bp[0] = val << (3 - video->dc_prec);
00333
00334 nc = 0;
00335
00336
00337 for(i = 1; ; i++)
00338 {
00339 code = mpeg3slice_showbits16(slice_buffer);
00340
00341 if(code >= 16384 && !video->intravlc)
00342 tab = &mpeg3_DCTtabnext[(code >> 12) - 4];
00343 else
00344 if(code >= 1024)
00345 {
00346 if(video->intravlc)
00347 tab = &mpeg3_DCTtab0a[(code >> 8) - 4];
00348 else
00349 tab = &mpeg3_DCTtab0[(code >> 8) - 4];
00350 }
00351 else
00352 if(code >= 512)
00353 {
00354 if(video->intravlc)
00355 tab = &mpeg3_DCTtab1a[(code >> 6) - 8];
00356 else
00357 tab = &mpeg3_DCTtab1[(code >> 6) - 8];
00358 }
00359 else
00360 if(code >= 256) tab = &mpeg3_DCTtab2[(code >> 4) - 16];
00361 else
00362 if(code >= 128) tab = &mpeg3_DCTtab3[(code >> 3) - 16];
00363 else
00364 if(code >= 64) tab = &mpeg3_DCTtab4[(code >> 2) - 16];
00365 else
00366 if(code >= 32) tab = &mpeg3_DCTtab5[(code >> 1) - 16];
00367 else
00368 if(code >= 16) tab = &mpeg3_DCTtab6[code - 16];
00369 else
00370 {
00371
00372 slice->fault = 1;
00373 return 1;
00374 }
00375
00376 mpeg3slice_flushbits(slice_buffer, tab->len);
00377
00378
00379 if(tab->run == 64)
00380 break;
00381
00382 if(tab->run == 65)
00383 {
00384
00385 i += mpeg3slice_getbits(slice_buffer, 6);
00386
00387 val = mpeg3slice_getbits(slice_buffer, 12);
00388 if((val & 2047) == 0)
00389 {
00390
00391 slice->fault = 1;
00392 return 0;
00393 }
00394 if((sign = (val >= 2048)) != 0) val = 4096 - val;
00395 }
00396 else
00397 {
00398 i += tab->run;
00399 val = tab->level;
00400 sign = mpeg3slice_getbit(slice_buffer);
00401 }
00402
00403 j = (video->altscan ? video->mpeg3_alternate_scan_table : video->mpeg3_zigzag_scan_table)[i];
00404
00405 val = (val * slice->quant_scale * qmat[j]) >> 4;
00406
00407 bp[j] = sign ? -val : val;
00408 nc++;
00409 }
00410
00411 if(j != 0)
00412 {
00413
00414 slice->sparse[comp] = 0;
00415 }
00416 return 1;
00417 }
00418
00419
00420
00421
00422 int mpeg3video_getmpg2interblock(mpeg3_slice_t *slice,
00423 mpeg3video_t *video,
00424 int comp)
00425 {
00426 int val, i, j, sign, nc;
00427 unsigned int code;
00428 mpeg3_DCTtab_t *tab;
00429 short *bp;
00430 int *qmat;
00431 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00432
00433
00434 bp = slice->block[comp];
00435
00436 qmat = (comp < 4 || video->chroma_format == CHROMA420)
00437 ? video->non_intra_quantizer_matrix
00438 : video->chroma_non_intra_quantizer_matrix;
00439
00440 nc = 0;
00441
00442
00443 for(i = 0; ; i++)
00444 {
00445 code = mpeg3slice_showbits16(slice_buffer);
00446 if(code >= 16384)
00447 {
00448 if(i == 0) tab = &mpeg3_DCTtabfirst[(code >> 12) - 4];
00449 else tab = &mpeg3_DCTtabnext[(code >> 12) - 4];
00450 }
00451 else
00452 if(code >= 1024) tab = &mpeg3_DCTtab0[(code >> 8) - 4];
00453 else
00454 if(code >= 512) tab = &mpeg3_DCTtab1[(code >> 6) - 8];
00455 else
00456 if(code >= 256) tab = &mpeg3_DCTtab2[(code >> 4) - 16];
00457 else
00458 if(code >= 128) tab = &mpeg3_DCTtab3[(code >> 3) - 16];
00459 else
00460 if(code >= 64) tab = &mpeg3_DCTtab4[(code >> 2) - 16];
00461 else
00462 if(code >= 32) tab = &mpeg3_DCTtab5[(code >> 1) - 16];
00463 else
00464 if(code >= 16) tab = &mpeg3_DCTtab6[code - 16];
00465 else
00466 {
00467
00468 slice->fault = 1;
00469 return 0;
00470 }
00471
00472 mpeg3slice_flushbits(slice_buffer, tab->len);
00473
00474
00475 if(tab->run == 64)
00476 break;
00477
00478 if(tab->run == 65)
00479 {
00480
00481 i += mpeg3slice_getbits(slice_buffer, 6);
00482 val = mpeg3slice_getbits(slice_buffer, 12);
00483 if((val & 2047) == 0)
00484 {
00485
00486 slice->fault = 1;
00487 return 1;
00488 }
00489 if((sign = (val >= 2048)) != 0) val = 4096 - val;
00490 }
00491 else
00492 {
00493 i += tab->run;
00494 val = tab->level;
00495 sign = mpeg3slice_getbit(slice_buffer);
00496 }
00497
00498 j = (video->altscan ? video->mpeg3_alternate_scan_table : video->mpeg3_zigzag_scan_table)[i];
00499
00500 val = (((val << 1)+1) * slice->quant_scale * qmat[j]) >> 5;
00501
00502 bp[j] = sign ? (-val) : val ;
00503 nc++;
00504 }
00505
00506 if(j != 0)
00507 {
00508 slice->sparse[comp] = 0;
00509 }
00510 return 0;
00511 }
00512
00513
00514
00515 int mpeg3video_get_macroblocks(mpeg3video_t *video, int framenum)
00516 {
00517 unsigned int code;
00518 mpeg3_slice_buffer_t *slice_buffer;
00519 int i;
00520 int current_buffer;
00521 mpeg3_bits_t *vstream = video->vstream;
00522
00523
00524 video->total_slice_buffers = 0;
00525 current_buffer = 0;
00526
00527 while(!mpeg3bits_eof(vstream) &&
00528 mpeg3bits_showbits32_noptr(vstream) >= MPEG3_SLICE_MIN_START &&
00529 mpeg3bits_showbits32_noptr(vstream) <= MPEG3_SLICE_MAX_START &&
00530 video->total_slice_buffers < MPEG3_MAX_CPUS)
00531 {
00532
00533 if(current_buffer >= video->slice_buffers_initialized)
00534 mpeg3_new_slice_buffer(&(video->slice_buffers[video->slice_buffers_initialized++]));
00535 slice_buffer = &(video->slice_buffers[current_buffer]);
00536 slice_buffer->buffer_size = 0;
00537 slice_buffer->current_position = 0;
00538 slice_buffer->bits_size = 0;
00539 slice_buffer->done = 0;
00540
00541
00542 do
00543 {
00544
00545 if(slice_buffer->buffer_allocation <= slice_buffer->buffer_size)
00546 mpeg3_expand_slice_buffer(slice_buffer);
00547
00548
00549 slice_buffer->data[slice_buffer->buffer_size++] = mpeg3bits_getbyte_noptr(vstream);
00550 }while(!mpeg3bits_eof(vstream) &&
00551 mpeg3bits_showbits24_noptr(vstream) != MPEG3_PACKET_START_CODE_PREFIX);
00552
00553
00554 if(slice_buffer->buffer_allocation <= slice_buffer->buffer_size + 4)
00555 mpeg3_expand_slice_buffer(slice_buffer);
00556
00557 slice_buffer->data[slice_buffer->buffer_size++] = 0;
00558 slice_buffer->data[slice_buffer->buffer_size++] = 0;
00559 slice_buffer->data[slice_buffer->buffer_size++] = 1;
00560 slice_buffer->data[slice_buffer->buffer_size++] = 0;
00561 slice_buffer->bits_size = 0;
00562
00563 pthread_mutex_lock(&(slice_buffer->completion_lock));
00564 current_buffer++;
00565 video->total_slice_buffers++;
00566 }
00567
00568
00569
00570
00571 if(video->total_slice_buffers > 0)
00572 {
00573 for(i = 0; i < video->total_slice_decoders; i++)
00574 {
00575 if(i == 0 && video->total_slice_decoders > 1)
00576 {
00577 video->slice_decoders[i].current_buffer = 0;
00578 video->slice_decoders[i].buffer_step = 1;
00579 video->slice_decoders[i].last_buffer = (video->total_slice_buffers - 1);
00580 }
00581 else
00582 if(i == 1)
00583 {
00584 video->slice_decoders[i].current_buffer = video->total_slice_buffers - 1;
00585 video->slice_decoders[i].buffer_step = -1;
00586 video->slice_decoders[i].last_buffer = 0;
00587 }
00588 else
00589 {
00590 video->slice_decoders[i].current_buffer = i;
00591 video->slice_decoders[i].buffer_step = 1;
00592 video->slice_decoders[i].last_buffer = video->total_slice_buffers - 1;
00593 }
00594 pthread_mutex_unlock(&(video->slice_decoders[i].input_lock));
00595 }
00596 }
00597
00598
00599 if(video->total_slice_buffers > 0)
00600 {
00601 for(i = 0; i < video->total_slice_buffers; i++)
00602 {
00603 pthread_mutex_lock(&(video->slice_buffers[i].completion_lock));
00604 pthread_mutex_unlock(&(video->slice_buffers[i].completion_lock));
00605 }
00606
00607
00608 for(i = 0; i < video->total_slice_decoders; i++)
00609 {
00610 pthread_mutex_lock(&(video->slice_decoders[i].completion_lock));
00611 }
00612 }
00613 return 0;
00614 }
00615
00616 int mpeg3video_allocate_decoders(mpeg3video_t *video, int decoder_count)
00617 {
00618 int i;
00619 mpeg3_t *file = video->file;
00620
00621 if(video->total_slice_decoders != file->cpus)
00622 {
00623 for(i = 0; i < video->total_slice_decoders; i++)
00624 {
00625 mpeg3_delete_slice_decoder(&(video->slice_decoders[i]));
00626 }
00627
00628 for(i = 0; i < file->cpus && i < MPEG3_MAX_CPUS; i++)
00629 {
00630 mpeg3_new_slice_decoder(video, &(video->slice_decoders[i]));
00631 video->slice_decoders[i].thread_number = i;
00632 }
00633
00634 video->total_slice_decoders = file->cpus;
00635 }
00636 return 0;
00637 }
00638
00639
00640
00641 int mpeg3video_getpicture(mpeg3video_t *video, int framenum)
00642 {
00643 int i, result = 0;
00644 mpeg3_t *file = video->file;
00645
00646 if(video->pict_struct == FRAME_PICTURE && video->secondfield)
00647 {
00648
00649 video->secondfield = 0;
00650 }
00651
00652 if(!video->mpeg2)
00653 {
00654 video->current_repeat = video->repeat_count = 0;
00655 }
00656
00657 mpeg3video_allocate_decoders(video, file->cpus);
00658
00659 for(i = 0; i < 3; i++)
00660 {
00661 if(video->pict_type == B_TYPE)
00662 {
00663 video->newframe[i] = video->auxframe[i];
00664 }
00665 else
00666 {
00667 if(!video->secondfield && !video->current_repeat)
00668 {
00669
00670 unsigned char* tmp = video->oldrefframe[i];
00671 video->oldrefframe[i] = video->refframe[i];
00672 video->refframe[i] = tmp;
00673 }
00674
00675 video->newframe[i] = video->refframe[i];
00676 }
00677
00678 if(video->pict_struct == BOTTOM_FIELD)
00679 {
00680
00681 video->newframe[i] += (i == 0) ?
00682 video->coded_picture_width :
00683 video->chrom_width;
00684 }
00685 }
00686
00687
00688
00689
00690
00691
00692
00693 if(!video->current_repeat)
00694 if(!(video->skip_bframes && video->pict_type == B_TYPE) ||
00695 (video->repeat_count >= 100 + 100 * video->skip_bframes))
00696 result = mpeg3video_get_macroblocks(video, framenum);
00697
00698
00699 video->output_src[0] = 0;
00700 video->output_src[1] = 0;
00701 video->output_src[2] = 0;
00702 if(framenum > -1 && !result)
00703 {
00704 if(video->pict_struct == FRAME_PICTURE || video->secondfield)
00705 {
00706 if(video->pict_type == B_TYPE)
00707 {
00708 video->output_src[0] = video->auxframe[0];
00709 video->output_src[1] = video->auxframe[1];
00710 video->output_src[2] = video->auxframe[2];
00711 }
00712 else
00713 {
00714 video->output_src[0] = video->oldrefframe[0];
00715 video->output_src[1] = video->oldrefframe[1];
00716 video->output_src[2] = video->oldrefframe[2];
00717 }
00718 }
00719 else
00720 {
00721 mpeg3video_display_second_field(video);
00722 }
00723 }
00724
00725 if(video->mpeg2)
00726 {
00727 video->current_repeat += 100;
00728 }
00729
00730 if(video->pict_struct != FRAME_PICTURE)
00731 video->secondfield = !video->secondfield;
00732 return result;
00733 }