Originally committed as revision 21079 to svn://svn.ffmpeg.org/ffmpeg/trunk
| ... | ... |
@@ -124,10 +124,10 @@ OBJS-$(CONFIG_H261_ENCODER) += h261enc.o h261.o \ |
| 124 | 124 |
mpegvideo_enc.o motion_est.o \ |
| 125 | 125 |
ratecontrol.o mpeg12data.o \ |
| 126 | 126 |
mpegvideo.o |
| 127 |
-OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o flvdec.o intelh263dec.o \ |
|
| 127 |
+OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o mpeg4video.o mpeg4videodec.o flvdec.o intelh263dec.o \ |
|
| 128 | 128 |
mpegvideo.o error_resilience.o |
| 129 | 129 |
OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o |
| 130 |
-OBJS-$(CONFIG_H263_ENCODER) += mpegvideo_enc.o motion_est.o \ |
|
| 130 |
+OBJS-$(CONFIG_H263_ENCODER) += mpegvideo_enc.o mpeg4video.o mpeg4videoenc.o motion_est.o \ |
|
| 131 | 131 |
ratecontrol.o h263.o flvenc.o mpeg12data.o \ |
| 132 | 132 |
mpegvideo.o error_resilience.o |
| 133 | 133 |
OBJS-$(CONFIG_H264_DECODER) += h264.o h264idct.o h264pred.o cabac.o \ |
| ... | ... |
@@ -37,11 +37,12 @@ |
| 37 | 37 |
#include "dsputil.h" |
| 38 | 38 |
#include "avcodec.h" |
| 39 | 39 |
#include "mpegvideo.h" |
| 40 |
+#include "h263.h" |
|
| 40 | 41 |
#include "h263data.h" |
| 41 |
-#include "mpeg4data.h" |
|
| 42 | 42 |
#include "mathops.h" |
| 43 | 43 |
#include "unary.h" |
| 44 | 44 |
#include "flv.h" |
| 45 |
+#include "mpeg4video.h" |
|
| 45 | 46 |
|
| 46 | 47 |
//#undef NDEBUG |
| 47 | 48 |
//#include <assert.h> |
| ... | ... |
@@ -50,26 +51,12 @@ |
| 50 | 50 |
// reading vlc values. Changing these may improve speed and data cache needs |
| 51 | 51 |
// be aware though that decreasing them may need the number of stages that is |
| 52 | 52 |
// passed to get_vlc* to be increased. |
| 53 |
-#define INTRA_MCBPC_VLC_BITS 6 |
|
| 54 |
-#define INTER_MCBPC_VLC_BITS 7 |
|
| 55 |
-#define CBPY_VLC_BITS 6 |
|
| 56 | 53 |
#define MV_VLC_BITS 9 |
| 57 |
-#define DC_VLC_BITS 9 |
|
| 58 |
-#define SPRITE_TRAJ_VLC_BITS 6 |
|
| 59 |
-#define MB_TYPE_B_VLC_BITS 4 |
|
| 60 |
-#define TEX_VLC_BITS 9 |
|
| 61 | 54 |
#define H263_MBTYPE_B_VLC_BITS 6 |
| 62 | 55 |
#define CBPC_B_VLC_BITS 3 |
| 63 | 56 |
|
| 64 |
-#if CONFIG_ENCODERS |
|
| 65 |
-//The uni_DCtab_* tables below contain unified bits+length tables to encode DC |
|
| 66 |
-//differences in mpeg4. Unified in the sense that the specification specifies |
|
| 67 |
-//this encoding in several steps. |
|
| 68 |
-static uint8_t uni_DCtab_lum_len[512]; |
|
| 69 |
-static uint8_t uni_DCtab_chrom_len[512]; |
|
| 70 |
-static uint16_t uni_DCtab_lum_bits[512]; |
|
| 71 |
-static uint16_t uni_DCtab_chrom_bits[512]; |
|
| 72 | 57 |
|
| 58 |
+#if CONFIG_ENCODERS |
|
| 73 | 59 |
/** |
| 74 | 60 |
* Table of number of bits a motion vector component needs. |
| 75 | 61 |
*/ |
| ... | ... |
@@ -88,34 +75,16 @@ static uint8_t umv_fcode_tab[MAX_MV*2+1]; |
| 88 | 88 |
|
| 89 | 89 |
//unified encoding tables for run length encoding of coefficients |
| 90 | 90 |
//unified in the sense that the specification specifies the encoding in several steps. |
| 91 |
-static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2]; |
|
| 92 |
-static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2]; |
|
| 93 |
-static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2]; |
|
| 94 |
-static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2]; |
|
| 95 | 91 |
static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2]; |
| 96 | 92 |
static uint8_t uni_h263_inter_rl_len [64*64*2*2]; |
| 97 | 93 |
//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level)) |
| 98 | 94 |
//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64) |
| 99 | 95 |
#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level)) |
| 100 | 96 |
|
| 101 |
-/* mpeg4 |
|
| 102 |
-inter |
|
| 103 |
-max level: 24/6 |
|
| 104 |
-max run: 53/63 |
|
| 105 |
- |
|
| 106 |
-intra |
|
| 107 |
-max level: 53/16 |
|
| 108 |
-max run: 29/41 |
|
| 109 |
-*/ |
|
| 110 | 97 |
#endif |
| 111 | 98 |
|
| 112 |
-static uint8_t static_rl_table_store[5][2][2*MAX_RUN + MAX_LEVEL + 3]; |
|
| 99 |
+static uint8_t static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3]; |
|
| 113 | 100 |
|
| 114 |
-#if 0 //3IV1 is quite rare and it slows things down a tiny bit |
|
| 115 |
-#define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
|
|
| 116 |
-#else |
|
| 117 |
-#define IS_3IV1 0 |
|
| 118 |
-#endif |
|
| 119 | 101 |
|
| 120 | 102 |
int h263_get_picture_format(int width, int height) |
| 121 | 103 |
{
|
| ... | ... |
@@ -159,13 +128,13 @@ void ff_h263_show_pict_info(MpegEncContext *s){
|
| 159 | 159 |
* This may be one of the standard aspect ratios or it specifies |
| 160 | 160 |
* that the aspect will be stored explicitly later. |
| 161 | 161 |
*/ |
| 162 |
-static av_const int aspect_to_info(AVRational aspect){
|
|
| 162 |
+av_const int ff_h263_aspect_to_info(AVRational aspect){
|
|
| 163 | 163 |
int i; |
| 164 | 164 |
|
| 165 | 165 |
if(aspect.num==0) aspect= (AVRational){1,1};
|
| 166 | 166 |
|
| 167 | 167 |
for(i=1; i<6; i++){
|
| 168 |
- if(av_cmp_q(pixel_aspect[i], aspect) == 0){
|
|
| 168 |
+ if(av_cmp_q(ff_h263_pixel_aspect[i], aspect) == 0){
|
|
| 169 | 169 |
return i; |
| 170 | 170 |
} |
| 171 | 171 |
} |
| ... | ... |
@@ -265,7 +234,7 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number) |
| 265 | 265 |
|
| 266 | 266 |
if (format == 7) {
|
| 267 | 267 |
/* Custom Picture Format (CPFMT) */ |
| 268 |
- s->aspect_ratio_info= aspect_to_info(s->avctx->sample_aspect_ratio); |
|
| 268 |
+ s->aspect_ratio_info= ff_h263_aspect_to_info(s->avctx->sample_aspect_ratio); |
|
| 269 | 269 |
|
| 270 | 270 |
put_bits(&s->pb,4,s->aspect_ratio_info); |
| 271 | 271 |
put_bits(&s->pb,9,(s->width >> 2) - 1); |
| ... | ... |
@@ -342,149 +311,6 @@ void h263_encode_gob_header(MpegEncContext * s, int mb_line) |
| 342 | 342 |
} |
| 343 | 343 |
|
| 344 | 344 |
/** |
| 345 |
- * Returns the number of bits that encoding the 8x8 block in block would need. |
|
| 346 |
- * @param[in] block_last_index last index in scantable order that refers to a non zero element in block. |
|
| 347 |
- */ |
|
| 348 |
-static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
|
|
| 349 |
- int last=0; |
|
| 350 |
- int j; |
|
| 351 |
- int rate=0; |
|
| 352 |
- |
|
| 353 |
- for(j=1; j<=block_last_index; j++){
|
|
| 354 |
- const int index= scantable[j]; |
|
| 355 |
- int level= block[index]; |
|
| 356 |
- if(level){
|
|
| 357 |
- level+= 64; |
|
| 358 |
- if((level&(~127)) == 0){
|
|
| 359 |
- if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)]; |
|
| 360 |
- else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)]; |
|
| 361 |
- }else |
|
| 362 |
- rate += s->ac_esc_length; |
|
| 363 |
- |
|
| 364 |
- last= j; |
|
| 365 |
- } |
|
| 366 |
- } |
|
| 367 |
- |
|
| 368 |
- return rate; |
|
| 369 |
-} |
|
| 370 |
- |
|
| 371 |
- |
|
| 372 |
-/** |
|
| 373 |
- * Restores the ac coefficients in block that have been changed by decide_ac_pred(). |
|
| 374 |
- * This function also restores s->block_last_index. |
|
| 375 |
- * @param[in,out] block MB coefficients, these will be restored |
|
| 376 |
- * @param[in] dir ac prediction direction for each 8x8 block |
|
| 377 |
- * @param[out] st scantable for each 8x8 block |
|
| 378 |
- * @param[in] zigzag_last_index index refering to the last non zero coefficient in zigzag order |
|
| 379 |
- */ |
|
| 380 |
-static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], const int dir[6], uint8_t *st[6], const int zigzag_last_index[6]) |
|
| 381 |
-{
|
|
| 382 |
- int i, n; |
|
| 383 |
- memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6); |
|
| 384 |
- |
|
| 385 |
- for(n=0; n<6; n++){
|
|
| 386 |
- int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
|
| 387 |
- |
|
| 388 |
- st[n]= s->intra_scantable.permutated; |
|
| 389 |
- if(dir[n]){
|
|
| 390 |
- /* top prediction */ |
|
| 391 |
- for(i=1; i<8; i++){
|
|
| 392 |
- block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8]; |
|
| 393 |
- } |
|
| 394 |
- }else{
|
|
| 395 |
- /* left prediction */ |
|
| 396 |
- for(i=1; i<8; i++){
|
|
| 397 |
- block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ]; |
|
| 398 |
- } |
|
| 399 |
- } |
|
| 400 |
- } |
|
| 401 |
-} |
|
| 402 |
- |
|
| 403 |
-/** |
|
| 404 |
- * Returns the optimal value (0 or 1) for the ac_pred element for the given MB in mpeg4. |
|
| 405 |
- * This function will also update s->block_last_index and s->ac_val. |
|
| 406 |
- * @param[in,out] block MB coefficients, these will be updated if 1 is returned |
|
| 407 |
- * @param[in] dir ac prediction direction for each 8x8 block |
|
| 408 |
- * @param[out] st scantable for each 8x8 block |
|
| 409 |
- * @param[out] zigzag_last_index index refering to the last non zero coefficient in zigzag order |
|
| 410 |
- */ |
|
| 411 |
-static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], const int dir[6], uint8_t *st[6], int zigzag_last_index[6]) |
|
| 412 |
-{
|
|
| 413 |
- int score= 0; |
|
| 414 |
- int i, n; |
|
| 415 |
- int8_t * const qscale_table= s->current_picture.qscale_table; |
|
| 416 |
- |
|
| 417 |
- memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6); |
|
| 418 |
- |
|
| 419 |
- for(n=0; n<6; n++){
|
|
| 420 |
- int16_t *ac_val, *ac_val1; |
|
| 421 |
- |
|
| 422 |
- score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated); |
|
| 423 |
- |
|
| 424 |
- ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
|
| 425 |
- ac_val1= ac_val; |
|
| 426 |
- if(dir[n]){
|
|
| 427 |
- const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride; |
|
| 428 |
- /* top prediction */ |
|
| 429 |
- ac_val-= s->block_wrap[n]*16; |
|
| 430 |
- if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
|
|
| 431 |
- /* same qscale */ |
|
| 432 |
- for(i=1; i<8; i++){
|
|
| 433 |
- const int level= block[n][s->dsp.idct_permutation[i ]]; |
|
| 434 |
- block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8]; |
|
| 435 |
- ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]]; |
|
| 436 |
- ac_val1[i+8]= level; |
|
| 437 |
- } |
|
| 438 |
- }else{
|
|
| 439 |
- /* different qscale, we must rescale */ |
|
| 440 |
- for(i=1; i<8; i++){
|
|
| 441 |
- const int level= block[n][s->dsp.idct_permutation[i ]]; |
|
| 442 |
- block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); |
|
| 443 |
- ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]]; |
|
| 444 |
- ac_val1[i+8]= level; |
|
| 445 |
- } |
|
| 446 |
- } |
|
| 447 |
- st[n]= s->intra_h_scantable.permutated; |
|
| 448 |
- }else{
|
|
| 449 |
- const int xy= s->mb_x-1 + s->mb_y*s->mb_stride; |
|
| 450 |
- /* left prediction */ |
|
| 451 |
- ac_val-= 16; |
|
| 452 |
- if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
|
|
| 453 |
- /* same qscale */ |
|
| 454 |
- for(i=1; i<8; i++){
|
|
| 455 |
- const int level= block[n][s->dsp.idct_permutation[i<<3]]; |
|
| 456 |
- block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i]; |
|
| 457 |
- ac_val1[i ]= level; |
|
| 458 |
- ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]]; |
|
| 459 |
- } |
|
| 460 |
- }else{
|
|
| 461 |
- /* different qscale, we must rescale */ |
|
| 462 |
- for(i=1; i<8; i++){
|
|
| 463 |
- const int level= block[n][s->dsp.idct_permutation[i<<3]]; |
|
| 464 |
- block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); |
|
| 465 |
- ac_val1[i ]= level; |
|
| 466 |
- ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]]; |
|
| 467 |
- } |
|
| 468 |
- } |
|
| 469 |
- st[n]= s->intra_v_scantable.permutated; |
|
| 470 |
- } |
|
| 471 |
- |
|
| 472 |
- for(i=63; i>0; i--) //FIXME optimize |
|
| 473 |
- if(block[n][ st[n][i] ]) break; |
|
| 474 |
- s->block_last_index[n]= i; |
|
| 475 |
- |
|
| 476 |
- score += get_block_rate(s, block[n], s->block_last_index[n], st[n]); |
|
| 477 |
- } |
|
| 478 |
- |
|
| 479 |
- if(score < 0){
|
|
| 480 |
- return 1; |
|
| 481 |
- }else{
|
|
| 482 |
- restore_ac_coeffs(s, block, dir, st, zigzag_last_index); |
|
| 483 |
- return 0; |
|
| 484 |
- } |
|
| 485 |
-} |
|
| 486 |
- |
|
| 487 |
-/** |
|
| 488 | 345 |
* modify qscale so that encoding is acually possible in h263 (limit difference to -2..2) |
| 489 | 346 |
*/ |
| 490 | 347 |
void ff_clean_h263_qscales(MpegEncContext *s){
|
| ... | ... |
@@ -513,49 +339,12 @@ void ff_clean_h263_qscales(MpegEncContext *s){
|
| 513 | 513 |
} |
| 514 | 514 |
} |
| 515 | 515 |
|
| 516 |
-/** |
|
| 517 |
- * modify mb_type & qscale so that encoding is acually possible in mpeg4 |
|
| 518 |
- */ |
|
| 519 |
-void ff_clean_mpeg4_qscales(MpegEncContext *s){
|
|
| 520 |
- int i; |
|
| 521 |
- int8_t * const qscale_table= s->current_picture.qscale_table; |
|
| 522 |
- |
|
| 523 |
- ff_clean_h263_qscales(s); |
|
| 524 |
- |
|
| 525 |
- if(s->pict_type== FF_B_TYPE){
|
|
| 526 |
- int odd=0; |
|
| 527 |
- /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */ |
|
| 528 |
- |
|
| 529 |
- for(i=0; i<s->mb_num; i++){
|
|
| 530 |
- int mb_xy= s->mb_index2xy[i]; |
|
| 531 |
- odd += qscale_table[mb_xy]&1; |
|
| 532 |
- } |
|
| 533 |
- |
|
| 534 |
- if(2*odd > s->mb_num) odd=1; |
|
| 535 |
- else odd=0; |
|
| 536 |
- |
|
| 537 |
- for(i=0; i<s->mb_num; i++){
|
|
| 538 |
- int mb_xy= s->mb_index2xy[i]; |
|
| 539 |
- if((qscale_table[mb_xy]&1) != odd) |
|
| 540 |
- qscale_table[mb_xy]++; |
|
| 541 |
- if(qscale_table[mb_xy] > 31) |
|
| 542 |
- qscale_table[mb_xy]= 31; |
|
| 543 |
- } |
|
| 544 |
- |
|
| 545 |
- for(i=1; i<s->mb_num; i++){
|
|
| 546 |
- int mb_xy= s->mb_index2xy[i]; |
|
| 547 |
- if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
|
|
| 548 |
- s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR; |
|
| 549 |
- } |
|
| 550 |
- } |
|
| 551 |
- } |
|
| 552 |
-} |
|
| 553 |
- |
|
| 554 | 516 |
#endif //CONFIG_ENCODERS |
| 555 | 517 |
|
| 556 | 518 |
#define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0])) |
| 557 | 519 |
#define tab_bias (tab_size/2) |
| 558 | 520 |
|
| 521 |
+//used by mpeg4 and rv10 decoder |
|
| 559 | 522 |
void ff_mpeg4_init_direct_mv(MpegEncContext *s){
|
| 560 | 523 |
int i; |
| 561 | 524 |
for(i=0; i<tab_size; i++){
|
| ... | ... |
@@ -702,828 +491,10 @@ void ff_h263_update_motion_val(MpegEncContext * s){
|
| 702 | 702 |
} |
| 703 | 703 |
} |
| 704 | 704 |
|
| 705 |
-/** |
|
| 706 |
- * predicts the dc. |
|
| 707 |
- * encoding quantized level -> quantized diff |
|
| 708 |
- * decoding quantized diff -> quantized level |
|
| 709 |
- * @param n block index (0-3 are luma, 4-5 are chroma) |
|
| 710 |
- * @param dir_ptr pointer to an integer where the prediction direction will be stored |
|
| 711 |
- */ |
|
| 712 |
-static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding) |
|
| 713 |
-{
|
|
| 714 |
- int a, b, c, wrap, pred, scale, ret; |
|
| 715 |
- int16_t *dc_val; |
|
| 716 |
- |
|
| 717 |
- /* find prediction */ |
|
| 718 |
- if (n < 4) {
|
|
| 719 |
- scale = s->y_dc_scale; |
|
| 720 |
- } else {
|
|
| 721 |
- scale = s->c_dc_scale; |
|
| 722 |
- } |
|
| 723 |
- if(IS_3IV1) |
|
| 724 |
- scale= 8; |
|
| 725 |
- |
|
| 726 |
- wrap= s->block_wrap[n]; |
|
| 727 |
- dc_val = s->dc_val[0] + s->block_index[n]; |
|
| 728 |
- |
|
| 729 |
- /* B C |
|
| 730 |
- * A X |
|
| 731 |
- */ |
|
| 732 |
- a = dc_val[ - 1]; |
|
| 733 |
- b = dc_val[ - 1 - wrap]; |
|
| 734 |
- c = dc_val[ - wrap]; |
|
| 735 |
- |
|
| 736 |
- /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */ |
|
| 737 |
- if(s->first_slice_line && n!=3){
|
|
| 738 |
- if(n!=2) b=c= 1024; |
|
| 739 |
- if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024; |
|
| 740 |
- } |
|
| 741 |
- if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
|
|
| 742 |
- if(n==0 || n==4 || n==5) |
|
| 743 |
- b=1024; |
|
| 744 |
- } |
|
| 745 |
- |
|
| 746 |
- if (abs(a - b) < abs(b - c)) {
|
|
| 747 |
- pred = c; |
|
| 748 |
- *dir_ptr = 1; /* top */ |
|
| 749 |
- } else {
|
|
| 750 |
- pred = a; |
|
| 751 |
- *dir_ptr = 0; /* left */ |
|
| 752 |
- } |
|
| 753 |
- /* we assume pred is positive */ |
|
| 754 |
- pred = FASTDIV((pred + (scale >> 1)), scale); |
|
| 755 |
- |
|
| 756 |
- if(encoding){
|
|
| 757 |
- ret = level - pred; |
|
| 758 |
- }else{
|
|
| 759 |
- level += pred; |
|
| 760 |
- ret= level; |
|
| 761 |
- if(s->error_recognition>=3){
|
|
| 762 |
- if(level<0){
|
|
| 763 |
- av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y); |
|
| 764 |
- return -1; |
|
| 765 |
- } |
|
| 766 |
- if(level*scale > 2048 + scale){
|
|
| 767 |
- av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y); |
|
| 768 |
- return -1; |
|
| 769 |
- } |
|
| 770 |
- } |
|
| 771 |
- } |
|
| 772 |
- level *=scale; |
|
| 773 |
- if(level&(~2047)){
|
|
| 774 |
- if(level<0) |
|
| 775 |
- level=0; |
|
| 776 |
- else if(!(s->workaround_bugs&FF_BUG_DC_CLIP)) |
|
| 777 |
- level=2047; |
|
| 778 |
- } |
|
| 779 |
- dc_val[0]= level; |
|
| 780 |
- |
|
| 781 |
- return ret; |
|
| 782 |
-} |
|
| 783 |
- |
|
| 784 | 705 |
#if CONFIG_ENCODERS |
| 785 | 706 |
|
| 786 |
-/** |
|
| 787 |
- * encodes the dc value. |
|
| 788 |
- * @param n block index (0-3 are luma, 4-5 are chroma) |
|
| 789 |
- */ |
|
| 790 |
-static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) |
|
| 791 |
-{
|
|
| 792 |
-#if 1 |
|
| 793 |
- level+=256; |
|
| 794 |
- if (n < 4) {
|
|
| 795 |
- /* luminance */ |
|
| 796 |
- put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]); |
|
| 797 |
- } else {
|
|
| 798 |
- /* chrominance */ |
|
| 799 |
- put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]); |
|
| 800 |
- } |
|
| 801 |
-#else |
|
| 802 |
- int size, v; |
|
| 803 |
- /* find number of bits */ |
|
| 804 |
- size = 0; |
|
| 805 |
- v = abs(level); |
|
| 806 |
- while (v) {
|
|
| 807 |
- v >>= 1; |
|
| 808 |
- size++; |
|
| 809 |
- } |
|
| 810 |
- |
|
| 811 |
- if (n < 4) {
|
|
| 812 |
- /* luminance */ |
|
| 813 |
- put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]); |
|
| 814 |
- } else {
|
|
| 815 |
- /* chrominance */ |
|
| 816 |
- put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]); |
|
| 817 |
- } |
|
| 818 |
- |
|
| 819 |
- /* encode remaining bits */ |
|
| 820 |
- if (size > 0) {
|
|
| 821 |
- if (level < 0) |
|
| 822 |
- level = (-level) ^ ((1 << size) - 1); |
|
| 823 |
- put_bits(&s->pb, size, level); |
|
| 824 |
- if (size > 8) |
|
| 825 |
- put_bits(&s->pb, 1, 1); |
|
| 826 |
- } |
|
| 827 |
-#endif |
|
| 828 |
-} |
|
| 829 |
- |
|
| 830 |
-static inline int mpeg4_get_dc_length(int level, int n){
|
|
| 831 |
- if (n < 4) {
|
|
| 832 |
- return uni_DCtab_lum_len[level + 256]; |
|
| 833 |
- } else {
|
|
| 834 |
- return uni_DCtab_chrom_len[level + 256]; |
|
| 835 |
- } |
|
| 836 |
-} |
|
| 837 |
- |
|
| 838 |
-/** |
|
| 839 |
- * encodes a 8x8 block |
|
| 840 |
- * @param n block index (0-3 are luma, 4-5 are chroma) |
|
| 841 |
- */ |
|
| 842 |
-static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, |
|
| 843 |
- uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) |
|
| 844 |
-{
|
|
| 845 |
- int i, last_non_zero; |
|
| 846 |
-#if 0 //variables for the outcommented version |
|
| 847 |
- int code, sign, last; |
|
| 848 |
-#endif |
|
| 849 |
- const RLTable *rl; |
|
| 850 |
- uint32_t *bits_tab; |
|
| 851 |
- uint8_t *len_tab; |
|
| 852 |
- const int last_index = s->block_last_index[n]; |
|
| 853 |
- |
|
| 854 |
- if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
|
|
| 855 |
- /* mpeg4 based DC predictor */ |
|
| 856 |
- mpeg4_encode_dc(dc_pb, intra_dc, n); |
|
| 857 |
- if(last_index<1) return; |
|
| 858 |
- i = 1; |
|
| 859 |
- rl = &rl_intra; |
|
| 860 |
- bits_tab= uni_mpeg4_intra_rl_bits; |
|
| 861 |
- len_tab = uni_mpeg4_intra_rl_len; |
|
| 862 |
- } else {
|
|
| 863 |
- if(last_index<0) return; |
|
| 864 |
- i = 0; |
|
| 865 |
- rl = &rl_inter; |
|
| 866 |
- bits_tab= uni_mpeg4_inter_rl_bits; |
|
| 867 |
- len_tab = uni_mpeg4_inter_rl_len; |
|
| 868 |
- } |
|
| 869 |
- |
|
| 870 |
- /* AC coefs */ |
|
| 871 |
- last_non_zero = i - 1; |
|
| 872 |
-#if 1 |
|
| 873 |
- for (; i < last_index; i++) {
|
|
| 874 |
- int level = block[ scan_table[i] ]; |
|
| 875 |
- if (level) {
|
|
| 876 |
- int run = i - last_non_zero - 1; |
|
| 877 |
- level+=64; |
|
| 878 |
- if((level&(~127)) == 0){
|
|
| 879 |
- const int index= UNI_MPEG4_ENC_INDEX(0, run, level); |
|
| 880 |
- put_bits(ac_pb, len_tab[index], bits_tab[index]); |
|
| 881 |
- }else{ //ESC3
|
|
| 882 |
- put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(0<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1); |
|
| 883 |
- } |
|
| 884 |
- last_non_zero = i; |
|
| 885 |
- } |
|
| 886 |
- } |
|
| 887 |
- /*if(i<=last_index)*/{
|
|
| 888 |
- int level = block[ scan_table[i] ]; |
|
| 889 |
- int run = i - last_non_zero - 1; |
|
| 890 |
- level+=64; |
|
| 891 |
- if((level&(~127)) == 0){
|
|
| 892 |
- const int index= UNI_MPEG4_ENC_INDEX(1, run, level); |
|
| 893 |
- put_bits(ac_pb, len_tab[index], bits_tab[index]); |
|
| 894 |
- }else{ //ESC3
|
|
| 895 |
- put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(1<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1); |
|
| 896 |
- } |
|
| 897 |
- } |
|
| 898 |
-#else |
|
| 899 |
- for (; i <= last_index; i++) {
|
|
| 900 |
- const int slevel = block[ scan_table[i] ]; |
|
| 901 |
- if (slevel) {
|
|
| 902 |
- int level; |
|
| 903 |
- int run = i - last_non_zero - 1; |
|
| 904 |
- last = (i == last_index); |
|
| 905 |
- sign = 0; |
|
| 906 |
- level = slevel; |
|
| 907 |
- if (level < 0) {
|
|
| 908 |
- sign = 1; |
|
| 909 |
- level = -level; |
|
| 910 |
- } |
|
| 911 |
- code = get_rl_index(rl, last, run, level); |
|
| 912 |
- put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); |
|
| 913 |
- if (code == rl->n) {
|
|
| 914 |
- int level1, run1; |
|
| 915 |
- level1 = level - rl->max_level[last][run]; |
|
| 916 |
- if (level1 < 1) |
|
| 917 |
- goto esc2; |
|
| 918 |
- code = get_rl_index(rl, last, run, level1); |
|
| 919 |
- if (code == rl->n) {
|
|
| 920 |
- esc2: |
|
| 921 |
- put_bits(ac_pb, 1, 1); |
|
| 922 |
- if (level > MAX_LEVEL) |
|
| 923 |
- goto esc3; |
|
| 924 |
- run1 = run - rl->max_run[last][level] - 1; |
|
| 925 |
- if (run1 < 0) |
|
| 926 |
- goto esc3; |
|
| 927 |
- code = get_rl_index(rl, last, run1, level); |
|
| 928 |
- if (code == rl->n) {
|
|
| 929 |
- esc3: |
|
| 930 |
- /* third escape */ |
|
| 931 |
- put_bits(ac_pb, 1, 1); |
|
| 932 |
- put_bits(ac_pb, 1, last); |
|
| 933 |
- put_bits(ac_pb, 6, run); |
|
| 934 |
- put_bits(ac_pb, 1, 1); |
|
| 935 |
- put_sbits(ac_pb, 12, slevel); |
|
| 936 |
- put_bits(ac_pb, 1, 1); |
|
| 937 |
- } else {
|
|
| 938 |
- /* second escape */ |
|
| 939 |
- put_bits(ac_pb, 1, 0); |
|
| 940 |
- put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); |
|
| 941 |
- put_bits(ac_pb, 1, sign); |
|
| 942 |
- } |
|
| 943 |
- } else {
|
|
| 944 |
- /* first escape */ |
|
| 945 |
- put_bits(ac_pb, 1, 0); |
|
| 946 |
- put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); |
|
| 947 |
- put_bits(ac_pb, 1, sign); |
|
| 948 |
- } |
|
| 949 |
- } else {
|
|
| 950 |
- put_bits(ac_pb, 1, sign); |
|
| 951 |
- } |
|
| 952 |
- last_non_zero = i; |
|
| 953 |
- } |
|
| 954 |
- } |
|
| 955 |
-#endif |
|
| 956 |
-} |
|
| 957 |
- |
|
| 958 |
-static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, |
|
| 959 |
- uint8_t *scan_table) |
|
| 960 |
-{
|
|
| 961 |
- int i, last_non_zero; |
|
| 962 |
- uint8_t *len_tab; |
|
| 963 |
- const int last_index = s->block_last_index[n]; |
|
| 964 |
- int len=0; |
|
| 965 |
- |
|
| 966 |
- if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
|
|
| 967 |
- /* mpeg4 based DC predictor */ |
|
| 968 |
- len += mpeg4_get_dc_length(intra_dc, n); |
|
| 969 |
- if(last_index<1) return len; |
|
| 970 |
- i = 1; |
|
| 971 |
- len_tab = uni_mpeg4_intra_rl_len; |
|
| 972 |
- } else {
|
|
| 973 |
- if(last_index<0) return 0; |
|
| 974 |
- i = 0; |
|
| 975 |
- len_tab = uni_mpeg4_inter_rl_len; |
|
| 976 |
- } |
|
| 977 |
- |
|
| 978 |
- /* AC coefs */ |
|
| 979 |
- last_non_zero = i - 1; |
|
| 980 |
- for (; i < last_index; i++) {
|
|
| 981 |
- int level = block[ scan_table[i] ]; |
|
| 982 |
- if (level) {
|
|
| 983 |
- int run = i - last_non_zero - 1; |
|
| 984 |
- level+=64; |
|
| 985 |
- if((level&(~127)) == 0){
|
|
| 986 |
- const int index= UNI_MPEG4_ENC_INDEX(0, run, level); |
|
| 987 |
- len += len_tab[index]; |
|
| 988 |
- }else{ //ESC3
|
|
| 989 |
- len += 7+2+1+6+1+12+1; |
|
| 990 |
- } |
|
| 991 |
- last_non_zero = i; |
|
| 992 |
- } |
|
| 993 |
- } |
|
| 994 |
- /*if(i<=last_index)*/{
|
|
| 995 |
- int level = block[ scan_table[i] ]; |
|
| 996 |
- int run = i - last_non_zero - 1; |
|
| 997 |
- level+=64; |
|
| 998 |
- if((level&(~127)) == 0){
|
|
| 999 |
- const int index= UNI_MPEG4_ENC_INDEX(1, run, level); |
|
| 1000 |
- len += len_tab[index]; |
|
| 1001 |
- }else{ //ESC3
|
|
| 1002 |
- len += 7+2+1+6+1+12+1; |
|
| 1003 |
- } |
|
| 1004 |
- } |
|
| 1005 |
- |
|
| 1006 |
- return len; |
|
| 1007 |
-} |
|
| 1008 |
- |
|
| 1009 |
-static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
|
|
| 1010 |
- int l, bit_size, code; |
|
| 1011 |
- |
|
| 1012 |
- if (val == 0) {
|
|
| 1013 |
- return mvtab[0][1]; |
|
| 1014 |
- } else {
|
|
| 1015 |
- bit_size = f_code - 1; |
|
| 1016 |
- /* modulo encoding */ |
|
| 1017 |
- l= INT_BIT - 6 - bit_size; |
|
| 1018 |
- val = (val<<l)>>l; |
|
| 1019 |
- val--; |
|
| 1020 |
- code = (val >> bit_size) + 1; |
|
| 1021 |
- |
|
| 1022 |
- return mvtab[code][1] + 1 + bit_size; |
|
| 1023 |
- } |
|
| 1024 |
-} |
|
| 1025 |
- |
|
| 1026 |
-static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
|
|
| 1027 |
- if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
|
|
| 1028 |
- skip_put_bits(&s->pb, |
|
| 1029 |
- h263_get_motion_length(s, x, f_code) |
|
| 1030 |
- +h263_get_motion_length(s, y, f_code)); |
|
| 1031 |
- }else{
|
|
| 1032 |
- ff_h263_encode_motion(s, x, f_code); |
|
| 1033 |
- ff_h263_encode_motion(s, y, f_code); |
|
| 1034 |
- } |
|
| 1035 |
-} |
|
| 1036 |
- |
|
| 1037 |
-static inline int get_p_cbp(MpegEncContext * s, |
|
| 1038 |
- DCTELEM block[6][64], |
|
| 1039 |
- int motion_x, int motion_y){
|
|
| 1040 |
- int cbp, i; |
|
| 1041 |
- |
|
| 1042 |
- if(s->flags & CODEC_FLAG_CBP_RD){
|
|
| 1043 |
- int best_cbpy_score= INT_MAX; |
|
| 1044 |
- int best_cbpc_score= INT_MAX; |
|
| 1045 |
- int cbpc = (-1), cbpy= (-1); |
|
| 1046 |
- const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0); |
|
| 1047 |
- const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); |
|
| 1048 |
- |
|
| 1049 |
- for(i=0; i<4; i++){
|
|
| 1050 |
- int score= inter_MCBPC_bits[i + offset] * lambda; |
|
| 1051 |
- if(i&1) score += s->coded_score[5]; |
|
| 1052 |
- if(i&2) score += s->coded_score[4]; |
|
| 1053 |
- |
|
| 1054 |
- if(score < best_cbpc_score){
|
|
| 1055 |
- best_cbpc_score= score; |
|
| 1056 |
- cbpc= i; |
|
| 1057 |
- } |
|
| 1058 |
- } |
|
| 1059 |
- |
|
| 1060 |
- for(i=0; i<16; i++){
|
|
| 1061 |
- int score= cbpy_tab[i ^ 0xF][1] * lambda; |
|
| 1062 |
- if(i&1) score += s->coded_score[3]; |
|
| 1063 |
- if(i&2) score += s->coded_score[2]; |
|
| 1064 |
- if(i&4) score += s->coded_score[1]; |
|
| 1065 |
- if(i&8) score += s->coded_score[0]; |
|
| 1066 |
- |
|
| 1067 |
- if(score < best_cbpy_score){
|
|
| 1068 |
- best_cbpy_score= score; |
|
| 1069 |
- cbpy= i; |
|
| 1070 |
- } |
|
| 1071 |
- } |
|
| 1072 |
- cbp= cbpc + 4*cbpy; |
|
| 1073 |
- if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
|
|
| 1074 |
- if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0) |
|
| 1075 |
- cbp= 0; |
|
| 1076 |
- } |
|
| 1077 |
- |
|
| 1078 |
- for (i = 0; i < 6; i++) {
|
|
| 1079 |
- if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
|
|
| 1080 |
- s->block_last_index[i]= -1; |
|
| 1081 |
- s->dsp.clear_block(s->block[i]); |
|
| 1082 |
- } |
|
| 1083 |
- } |
|
| 1084 |
- }else{
|
|
| 1085 |
- cbp= 0; |
|
| 1086 |
- for (i = 0; i < 6; i++) {
|
|
| 1087 |
- if (s->block_last_index[i] >= 0) |
|
| 1088 |
- cbp |= 1 << (5 - i); |
|
| 1089 |
- } |
|
| 1090 |
- } |
|
| 1091 |
- return cbp; |
|
| 1092 |
-} |
|
| 1093 |
- |
|
| 1094 |
-static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64], |
|
| 1095 |
- int motion_x, int motion_y, int mb_type){
|
|
| 1096 |
- int cbp=0, i; |
|
| 1097 |
- |
|
| 1098 |
- if(s->flags & CODEC_FLAG_CBP_RD){
|
|
| 1099 |
- int score=0; |
|
| 1100 |
- const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); |
|
| 1101 |
- |
|
| 1102 |
- for(i=0; i<6; i++){
|
|
| 1103 |
- if(s->coded_score[i] < 0){
|
|
| 1104 |
- score += s->coded_score[i]; |
|
| 1105 |
- cbp |= 1 << (5 - i); |
|
| 1106 |
- } |
|
| 1107 |
- } |
|
| 1108 |
- |
|
| 1109 |
- if(cbp){
|
|
| 1110 |
- int zero_score= -6; |
|
| 1111 |
- if ((motion_x | motion_y | s->dquant | mb_type) == 0){
|
|
| 1112 |
- zero_score-= 4; //2*MV + mb_type + cbp bit |
|
| 1113 |
- } |
|
| 1114 |
- |
|
| 1115 |
- zero_score*= lambda; |
|
| 1116 |
- if(zero_score <= score){
|
|
| 1117 |
- cbp=0; |
|
| 1118 |
- } |
|
| 1119 |
- } |
|
| 1120 |
- |
|
| 1121 |
- for (i = 0; i < 6; i++) {
|
|
| 1122 |
- if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
|
|
| 1123 |
- s->block_last_index[i]= -1; |
|
| 1124 |
- s->dsp.clear_block(s->block[i]); |
|
| 1125 |
- } |
|
| 1126 |
- } |
|
| 1127 |
- }else{
|
|
| 1128 |
- for (i = 0; i < 6; i++) {
|
|
| 1129 |
- if (s->block_last_index[i] >= 0) |
|
| 1130 |
- cbp |= 1 << (5 - i); |
|
| 1131 |
- } |
|
| 1132 |
- } |
|
| 1133 |
- return cbp; |
|
| 1134 |
-} |
|
| 1135 |
- |
|
| 1136 |
-static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6], |
|
| 1137 |
- uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
|
|
| 1138 |
- int i; |
|
| 1139 |
- |
|
| 1140 |
- if(scan_table){
|
|
| 1141 |
- if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
|
|
| 1142 |
- for (i = 0; i < 6; i++) {
|
|
| 1143 |
- skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i])); |
|
| 1144 |
- } |
|
| 1145 |
- }else{
|
|
| 1146 |
- /* encode each block */ |
|
| 1147 |
- for (i = 0; i < 6; i++) {
|
|
| 1148 |
- mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb); |
|
| 1149 |
- } |
|
| 1150 |
- } |
|
| 1151 |
- }else{
|
|
| 1152 |
- if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
|
|
| 1153 |
- for (i = 0; i < 6; i++) {
|
|
| 1154 |
- skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated)); |
|
| 1155 |
- } |
|
| 1156 |
- }else{
|
|
| 1157 |
- /* encode each block */ |
|
| 1158 |
- for (i = 0; i < 6; i++) {
|
|
| 1159 |
- mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb); |
|
| 1160 |
- } |
|
| 1161 |
- } |
|
| 1162 |
- } |
|
| 1163 |
-} |
|
| 1164 |
- |
|
| 1165 | 707 |
static const int dquant_code[5]= {1,0,9,2,3};
|
| 1166 | 708 |
|
| 1167 |
-void mpeg4_encode_mb(MpegEncContext * s, |
|
| 1168 |
- DCTELEM block[6][64], |
|
| 1169 |
- int motion_x, int motion_y) |
|
| 1170 |
-{
|
|
| 1171 |
- int cbpc, cbpy, pred_x, pred_y; |
|
| 1172 |
- PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb; |
|
| 1173 |
- PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb; |
|
| 1174 |
- PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2 : &s->pb; |
|
| 1175 |
- const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0; |
|
| 1176 |
- |
|
| 1177 |
- if (!s->mb_intra) {
|
|
| 1178 |
- int i, cbp; |
|
| 1179 |
- |
|
| 1180 |
- if(s->pict_type==FF_B_TYPE){
|
|
| 1181 |
- static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
|
|
| 1182 |
- int mb_type= mb_type_table[s->mv_dir]; |
|
| 1183 |
- |
|
| 1184 |
- if(s->mb_x==0){
|
|
| 1185 |
- for(i=0; i<2; i++){
|
|
| 1186 |
- s->last_mv[i][0][0]= |
|
| 1187 |
- s->last_mv[i][0][1]= |
|
| 1188 |
- s->last_mv[i][1][0]= |
|
| 1189 |
- s->last_mv[i][1][1]= 0; |
|
| 1190 |
- } |
|
| 1191 |
- } |
|
| 1192 |
- |
|
| 1193 |
- assert(s->dquant>=-2 && s->dquant<=2); |
|
| 1194 |
- assert((s->dquant&1)==0); |
|
| 1195 |
- assert(mb_type>=0); |
|
| 1196 |
- |
|
| 1197 |
- /* nothing to do if this MB was skipped in the next P Frame */ |
|
| 1198 |
- if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
|
|
| 1199 |
- s->skip_count++; |
|
| 1200 |
- s->mv[0][0][0]= |
|
| 1201 |
- s->mv[0][0][1]= |
|
| 1202 |
- s->mv[1][0][0]= |
|
| 1203 |
- s->mv[1][0][1]= 0; |
|
| 1204 |
- s->mv_dir= MV_DIR_FORWARD; //doesn't matter |
|
| 1205 |
- s->qscale -= s->dquant; |
|
| 1206 |
-// s->mb_skipped=1; |
|
| 1207 |
- |
|
| 1208 |
- return; |
|
| 1209 |
- } |
|
| 1210 |
- |
|
| 1211 |
- cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type); |
|
| 1212 |
- |
|
| 1213 |
- if ((cbp | motion_x | motion_y | mb_type) ==0) {
|
|
| 1214 |
- /* direct MB with MV={0,0} */
|
|
| 1215 |
- assert(s->dquant==0); |
|
| 1216 |
- |
|
| 1217 |
- put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */ |
|
| 1218 |
- |
|
| 1219 |
- if(interleaved_stats){
|
|
| 1220 |
- s->misc_bits++; |
|
| 1221 |
- s->last_bits++; |
|
| 1222 |
- } |
|
| 1223 |
- s->skip_count++; |
|
| 1224 |
- return; |
|
| 1225 |
- } |
|
| 1226 |
- |
|
| 1227 |
- put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */ |
|
| 1228 |
- put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge |
|
| 1229 |
- put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :) |
|
| 1230 |
- if(cbp) put_bits(&s->pb, 6, cbp); |
|
| 1231 |
- |
|
| 1232 |
- if(cbp && mb_type){
|
|
| 1233 |
- if(s->dquant) |
|
| 1234 |
- put_bits(&s->pb, 2, (s->dquant>>2)+3); |
|
| 1235 |
- else |
|
| 1236 |
- put_bits(&s->pb, 1, 0); |
|
| 1237 |
- }else |
|
| 1238 |
- s->qscale -= s->dquant; |
|
| 1239 |
- |
|
| 1240 |
- if(!s->progressive_sequence){
|
|
| 1241 |
- if(cbp) |
|
| 1242 |
- put_bits(&s->pb, 1, s->interlaced_dct); |
|
| 1243 |
- if(mb_type) // not direct mode |
|
| 1244 |
- put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD); |
|
| 1245 |
- } |
|
| 1246 |
- |
|
| 1247 |
- if(interleaved_stats){
|
|
| 1248 |
- s->misc_bits+= get_bits_diff(s); |
|
| 1249 |
- } |
|
| 1250 |
- |
|
| 1251 |
- if(mb_type == 0){
|
|
| 1252 |
- assert(s->mv_dir & MV_DIRECT); |
|
| 1253 |
- ff_h263_encode_motion_vector(s, motion_x, motion_y, 1); |
|
| 1254 |
- s->b_count++; |
|
| 1255 |
- s->f_count++; |
|
| 1256 |
- }else{
|
|
| 1257 |
- assert(mb_type > 0 && mb_type < 4); |
|
| 1258 |
- if(s->mv_type != MV_TYPE_FIELD){
|
|
| 1259 |
- if(s->mv_dir & MV_DIR_FORWARD){
|
|
| 1260 |
- ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0], |
|
| 1261 |
- s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code); |
|
| 1262 |
- s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0]; |
|
| 1263 |
- s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1]; |
|
| 1264 |
- s->f_count++; |
|
| 1265 |
- } |
|
| 1266 |
- if(s->mv_dir & MV_DIR_BACKWARD){
|
|
| 1267 |
- ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0], |
|
| 1268 |
- s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code); |
|
| 1269 |
- s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0]; |
|
| 1270 |
- s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1]; |
|
| 1271 |
- s->b_count++; |
|
| 1272 |
- } |
|
| 1273 |
- }else{
|
|
| 1274 |
- if(s->mv_dir & MV_DIR_FORWARD){
|
|
| 1275 |
- put_bits(&s->pb, 1, s->field_select[0][0]); |
|
| 1276 |
- put_bits(&s->pb, 1, s->field_select[0][1]); |
|
| 1277 |
- } |
|
| 1278 |
- if(s->mv_dir & MV_DIR_BACKWARD){
|
|
| 1279 |
- put_bits(&s->pb, 1, s->field_select[1][0]); |
|
| 1280 |
- put_bits(&s->pb, 1, s->field_select[1][1]); |
|
| 1281 |
- } |
|
| 1282 |
- if(s->mv_dir & MV_DIR_FORWARD){
|
|
| 1283 |
- for(i=0; i<2; i++){
|
|
| 1284 |
- ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0] , |
|
| 1285 |
- s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code); |
|
| 1286 |
- s->last_mv[0][i][0]= s->mv[0][i][0]; |
|
| 1287 |
- s->last_mv[0][i][1]= s->mv[0][i][1]*2; |
|
| 1288 |
- } |
|
| 1289 |
- s->f_count++; |
|
| 1290 |
- } |
|
| 1291 |
- if(s->mv_dir & MV_DIR_BACKWARD){
|
|
| 1292 |
- for(i=0; i<2; i++){
|
|
| 1293 |
- ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0] , |
|
| 1294 |
- s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code); |
|
| 1295 |
- s->last_mv[1][i][0]= s->mv[1][i][0]; |
|
| 1296 |
- s->last_mv[1][i][1]= s->mv[1][i][1]*2; |
|
| 1297 |
- } |
|
| 1298 |
- s->b_count++; |
|
| 1299 |
- } |
|
| 1300 |
- } |
|
| 1301 |
- } |
|
| 1302 |
- |
|
| 1303 |
- if(interleaved_stats){
|
|
| 1304 |
- s->mv_bits+= get_bits_diff(s); |
|
| 1305 |
- } |
|
| 1306 |
- |
|
| 1307 |
- mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb); |
|
| 1308 |
- |
|
| 1309 |
- if(interleaved_stats){
|
|
| 1310 |
- s->p_tex_bits+= get_bits_diff(s); |
|
| 1311 |
- } |
|
| 1312 |
- |
|
| 1313 |
- }else{ /* s->pict_type==FF_B_TYPE */
|
|
| 1314 |
- cbp= get_p_cbp(s, block, motion_x, motion_y); |
|
| 1315 |
- |
|
| 1316 |
- if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
|
|
| 1317 |
- /* check if the B frames can skip it too, as we must skip it if we skip here |
|
| 1318 |
- why didn't they just compress the skip-mb bits instead of reusing them ?! */ |
|
| 1319 |
- if(s->max_b_frames>0){
|
|
| 1320 |
- int i; |
|
| 1321 |
- int x,y, offset; |
|
| 1322 |
- uint8_t *p_pic; |
|
| 1323 |
- |
|
| 1324 |
- x= s->mb_x*16; |
|
| 1325 |
- y= s->mb_y*16; |
|
| 1326 |
- if(x+16 > s->width) x= s->width-16; |
|
| 1327 |
- if(y+16 > s->height) y= s->height-16; |
|
| 1328 |
- |
|
| 1329 |
- offset= x + y*s->linesize; |
|
| 1330 |
- p_pic= s->new_picture.data[0] + offset; |
|
| 1331 |
- |
|
| 1332 |
- s->mb_skipped=1; |
|
| 1333 |
- for(i=0; i<s->max_b_frames; i++){
|
|
| 1334 |
- uint8_t *b_pic; |
|
| 1335 |
- int diff; |
|
| 1336 |
- Picture *pic= s->reordered_input_picture[i+1]; |
|
| 1337 |
- |
|
| 1338 |
- if(pic==NULL || pic->pict_type!=FF_B_TYPE) break; |
|
| 1339 |
- |
|
| 1340 |
- b_pic= pic->data[0] + offset; |
|
| 1341 |
- if(pic->type != FF_BUFFER_TYPE_SHARED) |
|
| 1342 |
- b_pic+= INPLACE_OFFSET; |
|
| 1343 |
- diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16); |
|
| 1344 |
- if(diff>s->qscale*70){ //FIXME check that 70 is optimal
|
|
| 1345 |
- s->mb_skipped=0; |
|
| 1346 |
- break; |
|
| 1347 |
- } |
|
| 1348 |
- } |
|
| 1349 |
- }else |
|
| 1350 |
- s->mb_skipped=1; |
|
| 1351 |
- |
|
| 1352 |
- if(s->mb_skipped==1){
|
|
| 1353 |
- /* skip macroblock */ |
|
| 1354 |
- put_bits(&s->pb, 1, 1); |
|
| 1355 |
- |
|
| 1356 |
- if(interleaved_stats){
|
|
| 1357 |
- s->misc_bits++; |
|
| 1358 |
- s->last_bits++; |
|
| 1359 |
- } |
|
| 1360 |
- s->skip_count++; |
|
| 1361 |
- |
|
| 1362 |
- return; |
|
| 1363 |
- } |
|
| 1364 |
- } |
|
| 1365 |
- |
|
| 1366 |
- put_bits(&s->pb, 1, 0); /* mb coded */ |
|
| 1367 |
- cbpc = cbp & 3; |
|
| 1368 |
- cbpy = cbp >> 2; |
|
| 1369 |
- cbpy ^= 0xf; |
|
| 1370 |
- if(s->mv_type==MV_TYPE_16X16){
|
|
| 1371 |
- if(s->dquant) cbpc+= 8; |
|
| 1372 |
- put_bits(&s->pb, |
|
| 1373 |
- inter_MCBPC_bits[cbpc], |
|
| 1374 |
- inter_MCBPC_code[cbpc]); |
|
| 1375 |
- |
|
| 1376 |
- put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
|
| 1377 |
- if(s->dquant) |
|
| 1378 |
- put_bits(pb2, 2, dquant_code[s->dquant+2]); |
|
| 1379 |
- |
|
| 1380 |
- if(!s->progressive_sequence){
|
|
| 1381 |
- if(cbp) |
|
| 1382 |
- put_bits(pb2, 1, s->interlaced_dct); |
|
| 1383 |
- put_bits(pb2, 1, 0); |
|
| 1384 |
- } |
|
| 1385 |
- |
|
| 1386 |
- if(interleaved_stats){
|
|
| 1387 |
- s->misc_bits+= get_bits_diff(s); |
|
| 1388 |
- } |
|
| 1389 |
- |
|
| 1390 |
- /* motion vectors: 16x16 mode */ |
|
| 1391 |
- h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
|
| 1392 |
- |
|
| 1393 |
- ff_h263_encode_motion_vector(s, motion_x - pred_x, |
|
| 1394 |
- motion_y - pred_y, s->f_code); |
|
| 1395 |
- }else if(s->mv_type==MV_TYPE_FIELD){
|
|
| 1396 |
- if(s->dquant) cbpc+= 8; |
|
| 1397 |
- put_bits(&s->pb, |
|
| 1398 |
- inter_MCBPC_bits[cbpc], |
|
| 1399 |
- inter_MCBPC_code[cbpc]); |
|
| 1400 |
- |
|
| 1401 |
- put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
|
| 1402 |
- if(s->dquant) |
|
| 1403 |
- put_bits(pb2, 2, dquant_code[s->dquant+2]); |
|
| 1404 |
- |
|
| 1405 |
- assert(!s->progressive_sequence); |
|
| 1406 |
- if(cbp) |
|
| 1407 |
- put_bits(pb2, 1, s->interlaced_dct); |
|
| 1408 |
- put_bits(pb2, 1, 1); |
|
| 1409 |
- |
|
| 1410 |
- if(interleaved_stats){
|
|
| 1411 |
- s->misc_bits+= get_bits_diff(s); |
|
| 1412 |
- } |
|
| 1413 |
- |
|
| 1414 |
- /* motion vectors: 16x8 interlaced mode */ |
|
| 1415 |
- h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
|
| 1416 |
- pred_y /=2; |
|
| 1417 |
- |
|
| 1418 |
- put_bits(&s->pb, 1, s->field_select[0][0]); |
|
| 1419 |
- put_bits(&s->pb, 1, s->field_select[0][1]); |
|
| 1420 |
- |
|
| 1421 |
- ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x, |
|
| 1422 |
- s->mv[0][0][1] - pred_y, s->f_code); |
|
| 1423 |
- ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x, |
|
| 1424 |
- s->mv[0][1][1] - pred_y, s->f_code); |
|
| 1425 |
- }else{
|
|
| 1426 |
- assert(s->mv_type==MV_TYPE_8X8); |
|
| 1427 |
- put_bits(&s->pb, |
|
| 1428 |
- inter_MCBPC_bits[cbpc+16], |
|
| 1429 |
- inter_MCBPC_code[cbpc+16]); |
|
| 1430 |
- put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
|
| 1431 |
- |
|
| 1432 |
- if(!s->progressive_sequence){
|
|
| 1433 |
- if(cbp) |
|
| 1434 |
- put_bits(pb2, 1, s->interlaced_dct); |
|
| 1435 |
- } |
|
| 1436 |
- |
|
| 1437 |
- if(interleaved_stats){
|
|
| 1438 |
- s->misc_bits+= get_bits_diff(s); |
|
| 1439 |
- } |
|
| 1440 |
- |
|
| 1441 |
- for(i=0; i<4; i++){
|
|
| 1442 |
- /* motion vectors: 8x8 mode*/ |
|
| 1443 |
- h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
|
| 1444 |
- |
|
| 1445 |
- ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x, |
|
| 1446 |
- s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code); |
|
| 1447 |
- } |
|
| 1448 |
- } |
|
| 1449 |
- |
|
| 1450 |
- if(interleaved_stats){
|
|
| 1451 |
- s->mv_bits+= get_bits_diff(s); |
|
| 1452 |
- } |
|
| 1453 |
- |
|
| 1454 |
- mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb); |
|
| 1455 |
- |
|
| 1456 |
- if(interleaved_stats){
|
|
| 1457 |
- s->p_tex_bits+= get_bits_diff(s); |
|
| 1458 |
- } |
|
| 1459 |
- s->f_count++; |
|
| 1460 |
- } |
|
| 1461 |
- } else {
|
|
| 1462 |
- int cbp; |
|
| 1463 |
- int dc_diff[6]; //dc values with the dc prediction subtracted |
|
| 1464 |
- int dir[6]; //prediction direction |
|
| 1465 |
- int zigzag_last_index[6]; |
|
| 1466 |
- uint8_t *scan_table[6]; |
|
| 1467 |
- int i; |
|
| 1468 |
- |
|
| 1469 |
- for(i=0; i<6; i++){
|
|
| 1470 |
- dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1); |
|
| 1471 |
- } |
|
| 1472 |
- |
|
| 1473 |
- if(s->flags & CODEC_FLAG_AC_PRED){
|
|
| 1474 |
- s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index); |
|
| 1475 |
- }else{
|
|
| 1476 |
- for(i=0; i<6; i++) |
|
| 1477 |
- scan_table[i]= s->intra_scantable.permutated; |
|
| 1478 |
- } |
|
| 1479 |
- |
|
| 1480 |
- /* compute cbp */ |
|
| 1481 |
- cbp = 0; |
|
| 1482 |
- for (i = 0; i < 6; i++) {
|
|
| 1483 |
- if (s->block_last_index[i] >= 1) |
|
| 1484 |
- cbp |= 1 << (5 - i); |
|
| 1485 |
- } |
|
| 1486 |
- |
|
| 1487 |
- cbpc = cbp & 3; |
|
| 1488 |
- if (s->pict_type == FF_I_TYPE) {
|
|
| 1489 |
- if(s->dquant) cbpc+=4; |
|
| 1490 |
- put_bits(&s->pb, |
|
| 1491 |
- intra_MCBPC_bits[cbpc], |
|
| 1492 |
- intra_MCBPC_code[cbpc]); |
|
| 1493 |
- } else {
|
|
| 1494 |
- if(s->dquant) cbpc+=8; |
|
| 1495 |
- put_bits(&s->pb, 1, 0); /* mb coded */ |
|
| 1496 |
- put_bits(&s->pb, |
|
| 1497 |
- inter_MCBPC_bits[cbpc + 4], |
|
| 1498 |
- inter_MCBPC_code[cbpc + 4]); |
|
| 1499 |
- } |
|
| 1500 |
- put_bits(pb2, 1, s->ac_pred); |
|
| 1501 |
- cbpy = cbp >> 2; |
|
| 1502 |
- put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
|
| 1503 |
- if(s->dquant) |
|
| 1504 |
- put_bits(dc_pb, 2, dquant_code[s->dquant+2]); |
|
| 1505 |
- |
|
| 1506 |
- if(!s->progressive_sequence){
|
|
| 1507 |
- put_bits(dc_pb, 1, s->interlaced_dct); |
|
| 1508 |
- } |
|
| 1509 |
- |
|
| 1510 |
- if(interleaved_stats){
|
|
| 1511 |
- s->misc_bits+= get_bits_diff(s); |
|
| 1512 |
- } |
|
| 1513 |
- |
|
| 1514 |
- mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb); |
|
| 1515 |
- |
|
| 1516 |
- if(interleaved_stats){
|
|
| 1517 |
- s->i_tex_bits+= get_bits_diff(s); |
|
| 1518 |
- } |
|
| 1519 |
- s->i_count++; |
|
| 1520 |
- |
|
| 1521 |
- /* restore ac coeffs & last_index stuff if we messed them up with the prediction */ |
|
| 1522 |
- if(s->ac_pred) |
|
| 1523 |
- restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index); |
|
| 1524 |
- } |
|
| 1525 |
-} |
|
| 1526 |
- |
|
| 1527 | 709 |
/** |
| 1528 | 710 |
* encodes a 8x8 block. |
| 1529 | 711 |
* @param block the 8x8 block |
| ... | ... |
@@ -2155,259 +1126,6 @@ int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir, |
| 2155 | 2155 |
#if CONFIG_ENCODERS |
| 2156 | 2156 |
|
| 2157 | 2157 |
/***************************************************/ |
| 2158 |
-/** |
|
| 2159 |
- * add mpeg4 stuffing bits (01...1) |
|
| 2160 |
- */ |
|
| 2161 |
-void ff_mpeg4_stuffing(PutBitContext * pbc) |
|
| 2162 |
-{
|
|
| 2163 |
- int length; |
|
| 2164 |
- put_bits(pbc, 1, 0); |
|
| 2165 |
- length= (-put_bits_count(pbc))&7; |
|
| 2166 |
- if(length) put_bits(pbc, length, (1<<length)-1); |
|
| 2167 |
-} |
|
| 2168 |
- |
|
| 2169 |
-/* must be called before writing the header */ |
|
| 2170 |
-void ff_set_mpeg4_time(MpegEncContext * s){
|
|
| 2171 |
- if(s->pict_type==FF_B_TYPE){
|
|
| 2172 |
- ff_mpeg4_init_direct_mv(s); |
|
| 2173 |
- }else{
|
|
| 2174 |
- s->last_time_base= s->time_base; |
|
| 2175 |
- s->time_base= s->time/s->avctx->time_base.den; |
|
| 2176 |
- } |
|
| 2177 |
-} |
|
| 2178 |
- |
|
| 2179 |
-static void mpeg4_encode_gop_header(MpegEncContext * s){
|
|
| 2180 |
- int hours, minutes, seconds; |
|
| 2181 |
- int64_t time; |
|
| 2182 |
- |
|
| 2183 |
- put_bits(&s->pb, 16, 0); |
|
| 2184 |
- put_bits(&s->pb, 16, GOP_STARTCODE); |
|
| 2185 |
- |
|
| 2186 |
- time= s->current_picture_ptr->pts; |
|
| 2187 |
- if(s->reordered_input_picture[1]) |
|
| 2188 |
- time= FFMIN(time, s->reordered_input_picture[1]->pts); |
|
| 2189 |
- time= time*s->avctx->time_base.num; |
|
| 2190 |
- |
|
| 2191 |
- seconds= time/s->avctx->time_base.den; |
|
| 2192 |
- minutes= seconds/60; seconds %= 60; |
|
| 2193 |
- hours= minutes/60; minutes %= 60; |
|
| 2194 |
- hours%=24; |
|
| 2195 |
- |
|
| 2196 |
- put_bits(&s->pb, 5, hours); |
|
| 2197 |
- put_bits(&s->pb, 6, minutes); |
|
| 2198 |
- put_bits(&s->pb, 1, 1); |
|
| 2199 |
- put_bits(&s->pb, 6, seconds); |
|
| 2200 |
- |
|
| 2201 |
- put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP)); |
|
| 2202 |
- put_bits(&s->pb, 1, 0); //broken link == NO |
|
| 2203 |
- |
|
| 2204 |
- s->last_time_base= time / s->avctx->time_base.den; |
|
| 2205 |
- |
|
| 2206 |
- ff_mpeg4_stuffing(&s->pb); |
|
| 2207 |
-} |
|
| 2208 |
- |
|
| 2209 |
-static void mpeg4_encode_visual_object_header(MpegEncContext * s){
|
|
| 2210 |
- int profile_and_level_indication; |
|
| 2211 |
- int vo_ver_id; |
|
| 2212 |
- |
|
| 2213 |
- if(s->avctx->profile != FF_PROFILE_UNKNOWN){
|
|
| 2214 |
- profile_and_level_indication = s->avctx->profile << 4; |
|
| 2215 |
- }else if(s->max_b_frames || s->quarter_sample){
|
|
| 2216 |
- profile_and_level_indication= 0xF0; // adv simple |
|
| 2217 |
- }else{
|
|
| 2218 |
- profile_and_level_indication= 0x00; // simple |
|
| 2219 |
- } |
|
| 2220 |
- |
|
| 2221 |
- if(s->avctx->level != FF_LEVEL_UNKNOWN){
|
|
| 2222 |
- profile_and_level_indication |= s->avctx->level; |
|
| 2223 |
- }else{
|
|
| 2224 |
- profile_and_level_indication |= 1; //level 1 |
|
| 2225 |
- } |
|
| 2226 |
- |
|
| 2227 |
- if(profile_and_level_indication>>4 == 0xF){
|
|
| 2228 |
- vo_ver_id= 5; |
|
| 2229 |
- }else{
|
|
| 2230 |
- vo_ver_id= 1; |
|
| 2231 |
- } |
|
| 2232 |
- |
|
| 2233 |
- //FIXME levels |
|
| 2234 |
- |
|
| 2235 |
- put_bits(&s->pb, 16, 0); |
|
| 2236 |
- put_bits(&s->pb, 16, VOS_STARTCODE); |
|
| 2237 |
- |
|
| 2238 |
- put_bits(&s->pb, 8, profile_and_level_indication); |
|
| 2239 |
- |
|
| 2240 |
- put_bits(&s->pb, 16, 0); |
|
| 2241 |
- put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE); |
|
| 2242 |
- |
|
| 2243 |
- put_bits(&s->pb, 1, 1); |
|
| 2244 |
- put_bits(&s->pb, 4, vo_ver_id); |
|
| 2245 |
- put_bits(&s->pb, 3, 1); //priority |
|
| 2246 |
- |
|
| 2247 |
- put_bits(&s->pb, 4, 1); //visual obj type== video obj |
|
| 2248 |
- |
|
| 2249 |
- put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME |
|
| 2250 |
- |
|
| 2251 |
- ff_mpeg4_stuffing(&s->pb); |
|
| 2252 |
-} |
|
| 2253 |
- |
|
| 2254 |
-static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number) |
|
| 2255 |
-{
|
|
| 2256 |
- int vo_ver_id; |
|
| 2257 |
- |
|
| 2258 |
- if (!CONFIG_MPEG4_ENCODER) return; |
|
| 2259 |
- |
|
| 2260 |
- if(s->max_b_frames || s->quarter_sample){
|
|
| 2261 |
- vo_ver_id= 5; |
|
| 2262 |
- s->vo_type= ADV_SIMPLE_VO_TYPE; |
|
| 2263 |
- }else{
|
|
| 2264 |
- vo_ver_id= 1; |
|
| 2265 |
- s->vo_type= SIMPLE_VO_TYPE; |
|
| 2266 |
- } |
|
| 2267 |
- |
|
| 2268 |
- put_bits(&s->pb, 16, 0); |
|
| 2269 |
- put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */ |
|
| 2270 |
- put_bits(&s->pb, 16, 0); |
|
| 2271 |
- put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */ |
|
| 2272 |
- |
|
| 2273 |
- put_bits(&s->pb, 1, 0); /* random access vol */ |
|
| 2274 |
- put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */ |
|
| 2275 |
- if(s->workaround_bugs & FF_BUG_MS) {
|
|
| 2276 |
- put_bits(&s->pb, 1, 0); /* is obj layer id= no */ |
|
| 2277 |
- } else {
|
|
| 2278 |
- put_bits(&s->pb, 1, 1); /* is obj layer id= yes */ |
|
| 2279 |
- put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */ |
|
| 2280 |
- put_bits(&s->pb, 3, 1); /* is obj layer priority */ |
|
| 2281 |
- } |
|
| 2282 |
- |
|
| 2283 |
- s->aspect_ratio_info= aspect_to_info(s->avctx->sample_aspect_ratio); |
|
| 2284 |
- |
|
| 2285 |
- put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */ |
|
| 2286 |
- if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
|
|
| 2287 |
- put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num); |
|
| 2288 |
- put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den); |
|
| 2289 |
- } |
|
| 2290 |
- |
|
| 2291 |
- if(s->workaround_bugs & FF_BUG_MS) { //
|
|
| 2292 |
- put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */ |
|
| 2293 |
- } else {
|
|
| 2294 |
- put_bits(&s->pb, 1, 1); /* vol control parameters= yes */ |
|
| 2295 |
- put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */ |
|
| 2296 |
- put_bits(&s->pb, 1, s->low_delay); |
|
| 2297 |
- put_bits(&s->pb, 1, 0); /* vbv parameters= no */ |
|
| 2298 |
- } |
|
| 2299 |
- |
|
| 2300 |
- put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */ |
|
| 2301 |
- put_bits(&s->pb, 1, 1); /* marker bit */ |
|
| 2302 |
- |
|
| 2303 |
- put_bits(&s->pb, 16, s->avctx->time_base.den); |
|
| 2304 |
- if (s->time_increment_bits < 1) |
|
| 2305 |
- s->time_increment_bits = 1; |
|
| 2306 |
- put_bits(&s->pb, 1, 1); /* marker bit */ |
|
| 2307 |
- put_bits(&s->pb, 1, 0); /* fixed vop rate=no */ |
|
| 2308 |
- put_bits(&s->pb, 1, 1); /* marker bit */ |
|
| 2309 |
- put_bits(&s->pb, 13, s->width); /* vol width */ |
|
| 2310 |
- put_bits(&s->pb, 1, 1); /* marker bit */ |
|
| 2311 |
- put_bits(&s->pb, 13, s->height); /* vol height */ |
|
| 2312 |
- put_bits(&s->pb, 1, 1); /* marker bit */ |
|
| 2313 |
- put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1); |
|
| 2314 |
- put_bits(&s->pb, 1, 1); /* obmc disable */ |
|
| 2315 |
- if (vo_ver_id == 1) {
|
|
| 2316 |
- put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */ |
|
| 2317 |
- }else{
|
|
| 2318 |
- put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */ |
|
| 2319 |
- } |
|
| 2320 |
- |
|
| 2321 |
- put_bits(&s->pb, 1, 0); /* not 8 bit == false */ |
|
| 2322 |
- put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/ |
|
| 2323 |
- |
|
| 2324 |
- if(s->mpeg_quant){
|
|
| 2325 |
- ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix); |
|
| 2326 |
- ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix); |
|
| 2327 |
- } |
|
| 2328 |
- |
|
| 2329 |
- if (vo_ver_id != 1) |
|
| 2330 |
- put_bits(&s->pb, 1, s->quarter_sample); |
|
| 2331 |
- put_bits(&s->pb, 1, 1); /* complexity estimation disable */ |
|
| 2332 |
- s->resync_marker= s->rtp_mode; |
|
| 2333 |
- put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */ |
|
| 2334 |
- put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0); |
|
| 2335 |
- if(s->data_partitioning){
|
|
| 2336 |
- put_bits(&s->pb, 1, 0); /* no rvlc */ |
|
| 2337 |
- } |
|
| 2338 |
- |
|
| 2339 |
- if (vo_ver_id != 1){
|
|
| 2340 |
- put_bits(&s->pb, 1, 0); /* newpred */ |
|
| 2341 |
- put_bits(&s->pb, 1, 0); /* reduced res vop */ |
|
| 2342 |
- } |
|
| 2343 |
- put_bits(&s->pb, 1, 0); /* scalability */ |
|
| 2344 |
- |
|
| 2345 |
- ff_mpeg4_stuffing(&s->pb); |
|
| 2346 |
- |
|
| 2347 |
- /* user data */ |
|
| 2348 |
- if(!(s->flags & CODEC_FLAG_BITEXACT)){
|
|
| 2349 |
- put_bits(&s->pb, 16, 0); |
|
| 2350 |
- put_bits(&s->pb, 16, 0x1B2); /* user_data */ |
|
| 2351 |
- ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0); |
|
| 2352 |
- } |
|
| 2353 |
-} |
|
| 2354 |
- |
|
| 2355 |
-/* write mpeg4 VOP header */ |
|
| 2356 |
-void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number) |
|
| 2357 |
-{
|
|
| 2358 |
- int time_incr; |
|
| 2359 |
- int time_div, time_mod; |
|
| 2360 |
- |
|
| 2361 |
- if(s->pict_type==FF_I_TYPE){
|
|
| 2362 |
- if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
|
|
| 2363 |
- if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy |
|
| 2364 |
- mpeg4_encode_visual_object_header(s); |
|
| 2365 |
- if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy |
|
| 2366 |
- mpeg4_encode_vol_header(s, 0, 0); |
|
| 2367 |
- } |
|
| 2368 |
- if(!(s->workaround_bugs & FF_BUG_MS)) |
|
| 2369 |
- mpeg4_encode_gop_header(s); |
|
| 2370 |
- } |
|
| 2371 |
- |
|
| 2372 |
- s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE; |
|
| 2373 |
- |
|
| 2374 |
- put_bits(&s->pb, 16, 0); /* vop header */ |
|
| 2375 |
- put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */ |
|
| 2376 |
- put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */ |
|
| 2377 |
- |
|
| 2378 |
- assert(s->time>=0); |
|
| 2379 |
- time_div= s->time/s->avctx->time_base.den; |
|
| 2380 |
- time_mod= s->time%s->avctx->time_base.den; |
|
| 2381 |
- time_incr= time_div - s->last_time_base; |
|
| 2382 |
- assert(time_incr >= 0); |
|
| 2383 |
- while(time_incr--) |
|
| 2384 |
- put_bits(&s->pb, 1, 1); |
|
| 2385 |
- |
|
| 2386 |
- put_bits(&s->pb, 1, 0); |
|
| 2387 |
- |
|
| 2388 |
- put_bits(&s->pb, 1, 1); /* marker */ |
|
| 2389 |
- put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */ |
|
| 2390 |
- put_bits(&s->pb, 1, 1); /* marker */ |
|
| 2391 |
- put_bits(&s->pb, 1, 1); /* vop coded */ |
|
| 2392 |
- if ( s->pict_type == FF_P_TYPE |
|
| 2393 |
- || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
|
|
| 2394 |
- put_bits(&s->pb, 1, s->no_rounding); /* rounding type */ |
|
| 2395 |
- } |
|
| 2396 |
- put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */ |
|
| 2397 |
- if(!s->progressive_sequence){
|
|
| 2398 |
- put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first); |
|
| 2399 |
- put_bits(&s->pb, 1, s->alternate_scan); |
|
| 2400 |
- } |
|
| 2401 |
- //FIXME sprite stuff |
|
| 2402 |
- |
|
| 2403 |
- put_bits(&s->pb, 5, s->qscale); |
|
| 2404 |
- |
|
| 2405 |
- if (s->pict_type != FF_I_TYPE) |
|
| 2406 |
- put_bits(&s->pb, 3, s->f_code); /* fcode_for */ |
|
| 2407 |
- if (s->pict_type == FF_B_TYPE) |
|
| 2408 |
- put_bits(&s->pb, 3, s->b_code); /* fcode_back */ |
|
| 2409 |
-} |
|
| 2410 |
- |
|
| 2411 | 2158 |
void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code) |
| 2412 | 2159 |
{
|
| 2413 | 2160 |
int range, l, bit_size, sign, code, bits; |
| ... | ... |
@@ -2479,139 +1197,6 @@ static void init_mv_penalty_and_fcode(MpegEncContext *s) |
| 2479 | 2479 |
} |
| 2480 | 2480 |
} |
| 2481 | 2481 |
|
| 2482 |
-static void init_uni_dc_tab(void) |
|
| 2483 |
-{
|
|
| 2484 |
- int level, uni_code, uni_len; |
|
| 2485 |
- |
|
| 2486 |
- for(level=-256; level<256; level++){
|
|
| 2487 |
- int size, v, l; |
|
| 2488 |
- /* find number of bits */ |
|
| 2489 |
- size = 0; |
|
| 2490 |
- v = abs(level); |
|
| 2491 |
- while (v) {
|
|
| 2492 |
- v >>= 1; |
|
| 2493 |
- size++; |
|
| 2494 |
- } |
|
| 2495 |
- |
|
| 2496 |
- if (level < 0) |
|
| 2497 |
- l= (-level) ^ ((1 << size) - 1); |
|
| 2498 |
- else |
|
| 2499 |
- l= level; |
|
| 2500 |
- |
|
| 2501 |
- /* luminance */ |
|
| 2502 |
- uni_code= DCtab_lum[size][0]; |
|
| 2503 |
- uni_len = DCtab_lum[size][1]; |
|
| 2504 |
- |
|
| 2505 |
- if (size > 0) {
|
|
| 2506 |
- uni_code<<=size; uni_code|=l; |
|
| 2507 |
- uni_len+=size; |
|
| 2508 |
- if (size > 8){
|
|
| 2509 |
- uni_code<<=1; uni_code|=1; |
|
| 2510 |
- uni_len++; |
|
| 2511 |
- } |
|
| 2512 |
- } |
|
| 2513 |
- uni_DCtab_lum_bits[level+256]= uni_code; |
|
| 2514 |
- uni_DCtab_lum_len [level+256]= uni_len; |
|
| 2515 |
- |
|
| 2516 |
- /* chrominance */ |
|
| 2517 |
- uni_code= DCtab_chrom[size][0]; |
|
| 2518 |
- uni_len = DCtab_chrom[size][1]; |
|
| 2519 |
- |
|
| 2520 |
- if (size > 0) {
|
|
| 2521 |
- uni_code<<=size; uni_code|=l; |
|
| 2522 |
- uni_len+=size; |
|
| 2523 |
- if (size > 8){
|
|
| 2524 |
- uni_code<<=1; uni_code|=1; |
|
| 2525 |
- uni_len++; |
|
| 2526 |
- } |
|
| 2527 |
- } |
|
| 2528 |
- uni_DCtab_chrom_bits[level+256]= uni_code; |
|
| 2529 |
- uni_DCtab_chrom_len [level+256]= uni_len; |
|
| 2530 |
- |
|
| 2531 |
- } |
|
| 2532 |
-} |
|
| 2533 |
- |
|
| 2534 |
-static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
|
|
| 2535 |
- int slevel, run, last; |
|
| 2536 |
- |
|
| 2537 |
- assert(MAX_LEVEL >= 64); |
|
| 2538 |
- assert(MAX_RUN >= 63); |
|
| 2539 |
- |
|
| 2540 |
- for(slevel=-64; slevel<64; slevel++){
|
|
| 2541 |
- if(slevel==0) continue; |
|
| 2542 |
- for(run=0; run<64; run++){
|
|
| 2543 |
- for(last=0; last<=1; last++){
|
|
| 2544 |
- const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64); |
|
| 2545 |
- int level= slevel < 0 ? -slevel : slevel; |
|
| 2546 |
- int sign= slevel < 0 ? 1 : 0; |
|
| 2547 |
- int bits, len, code; |
|
| 2548 |
- int level1, run1; |
|
| 2549 |
- |
|
| 2550 |
- len_tab[index]= 100; |
|
| 2551 |
- |
|
| 2552 |
- /* ESC0 */ |
|
| 2553 |
- code= get_rl_index(rl, last, run, level); |
|
| 2554 |
- bits= rl->table_vlc[code][0]; |
|
| 2555 |
- len= rl->table_vlc[code][1]; |
|
| 2556 |
- bits=bits*2+sign; len++; |
|
| 2557 |
- |
|
| 2558 |
- if(code!=rl->n && len < len_tab[index]){
|
|
| 2559 |
- bits_tab[index]= bits; |
|
| 2560 |
- len_tab [index]= len; |
|
| 2561 |
- } |
|
| 2562 |
- /* ESC1 */ |
|
| 2563 |
- bits= rl->table_vlc[rl->n][0]; |
|
| 2564 |
- len= rl->table_vlc[rl->n][1]; |
|
| 2565 |
- bits=bits*2; len++; //esc1 |
|
| 2566 |
- level1= level - rl->max_level[last][run]; |
|
| 2567 |
- if(level1>0){
|
|
| 2568 |
- code= get_rl_index(rl, last, run, level1); |
|
| 2569 |
- bits<<= rl->table_vlc[code][1]; |
|
| 2570 |
- len += rl->table_vlc[code][1]; |
|
| 2571 |
- bits += rl->table_vlc[code][0]; |
|
| 2572 |
- bits=bits*2+sign; len++; |
|
| 2573 |
- |
|
| 2574 |
- if(code!=rl->n && len < len_tab[index]){
|
|
| 2575 |
- bits_tab[index]= bits; |
|
| 2576 |
- len_tab [index]= len; |
|
| 2577 |
- } |
|
| 2578 |
- } |
|
| 2579 |
- /* ESC2 */ |
|
| 2580 |
- bits= rl->table_vlc[rl->n][0]; |
|
| 2581 |
- len= rl->table_vlc[rl->n][1]; |
|
| 2582 |
- bits=bits*4+2; len+=2; //esc2 |
|
| 2583 |
- run1 = run - rl->max_run[last][level] - 1; |
|
| 2584 |
- if(run1>=0){
|
|
| 2585 |
- code= get_rl_index(rl, last, run1, level); |
|
| 2586 |
- bits<<= rl->table_vlc[code][1]; |
|
| 2587 |
- len += rl->table_vlc[code][1]; |
|
| 2588 |
- bits += rl->table_vlc[code][0]; |
|
| 2589 |
- bits=bits*2+sign; len++; |
|
| 2590 |
- |
|
| 2591 |
- if(code!=rl->n && len < len_tab[index]){
|
|
| 2592 |
- bits_tab[index]= bits; |
|
| 2593 |
- len_tab [index]= len; |
|
| 2594 |
- } |
|
| 2595 |
- } |
|
| 2596 |
- /* ESC3 */ |
|
| 2597 |
- bits= rl->table_vlc[rl->n][0]; |
|
| 2598 |
- len = rl->table_vlc[rl->n][1]; |
|
| 2599 |
- bits=bits*4+3; len+=2; //esc3 |
|
| 2600 |
- bits=bits*2+last; len++; |
|
| 2601 |
- bits=bits*64+run; len+=6; |
|
| 2602 |
- bits=bits*2+1; len++; //marker |
|
| 2603 |
- bits=bits*4096+(slevel&0xfff); len+=12; |
|
| 2604 |
- bits=bits*2+1; len++; //marker |
|
| 2605 |
- |
|
| 2606 |
- if(len < len_tab[index]){
|
|
| 2607 |
- bits_tab[index]= bits; |
|
| 2608 |
- len_tab [index]= len; |
|
| 2609 |
- } |
|
| 2610 |
- } |
|
| 2611 |
- } |
|
| 2612 |
- } |
|
| 2613 |
-} |
|
| 2614 |
- |
|
| 2615 | 2482 |
static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
|
| 2616 | 2483 |
int slevel, run, last; |
| 2617 | 2484 |
|
| ... | ... |
@@ -2662,14 +1247,8 @@ void h263_encode_init(MpegEncContext *s) |
| 2662 | 2662 |
if (!done) {
|
| 2663 | 2663 |
done = 1; |
| 2664 | 2664 |
|
| 2665 |
- init_uni_dc_tab(); |
|
| 2666 |
- |
|
| 2667 | 2665 |
init_rl(&rl_inter, static_rl_table_store[0]); |
| 2668 |
- init_rl(&rl_intra, static_rl_table_store[1]); |
|
| 2669 |
- init_rl(&rl_intra_aic, static_rl_table_store[2]); |
|
| 2670 |
- |
|
| 2671 |
- init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len); |
|
| 2672 |
- init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len); |
|
| 2666 |
+ init_rl(&rl_intra_aic, static_rl_table_store[1]); |
|
| 2673 | 2667 |
|
| 2674 | 2668 |
init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len); |
| 2675 | 2669 |
init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len); |
| ... | ... |
@@ -2690,32 +1269,6 @@ void h263_encode_init(MpegEncContext *s) |
| 2690 | 2690 |
switch(s->codec_id){
|
| 2691 | 2691 |
case CODEC_ID_MPEG4: |
| 2692 | 2692 |
s->fcode_tab= fcode_tab; |
| 2693 |
- s->min_qcoeff= -2048; |
|
| 2694 |
- s->max_qcoeff= 2047; |
|
| 2695 |
- s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len; |
|
| 2696 |
- s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64; |
|
| 2697 |
- s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len; |
|
| 2698 |
- s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64; |
|
| 2699 |
- s->luma_dc_vlc_length= uni_DCtab_lum_len; |
|
| 2700 |
- s->chroma_dc_vlc_length= uni_DCtab_chrom_len; |
|
| 2701 |
- s->ac_esc_length= 7+2+1+6+1+12+1; |
|
| 2702 |
- s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; |
|
| 2703 |
- s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; |
|
| 2704 |
- |
|
| 2705 |
- if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
|
|
| 2706 |
- |
|
| 2707 |
- s->avctx->extradata= av_malloc(1024); |
|
| 2708 |
- init_put_bits(&s->pb, s->avctx->extradata, 1024); |
|
| 2709 |
- |
|
| 2710 |
- if(!(s->workaround_bugs & FF_BUG_MS)) |
|
| 2711 |
- mpeg4_encode_visual_object_header(s); |
|
| 2712 |
- mpeg4_encode_vol_header(s, 0, 0); |
|
| 2713 |
- |
|
| 2714 |
-// ff_mpeg4_stuffing(&s->pb); ? |
|
| 2715 |
- flush_put_bits(&s->pb); |
|
| 2716 |
- s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3; |
|
| 2717 |
- } |
|
| 2718 |
- |
|
| 2719 | 2693 |
break; |
| 2720 | 2694 |
case CODEC_ID_H263P: |
| 2721 | 2695 |
if(s->umvplus) |
| ... | ... |
@@ -2749,76 +1302,13 @@ void h263_encode_init(MpegEncContext *s) |
| 2749 | 2749 |
} |
| 2750 | 2750 |
#endif //CONFIG_ENCODERS |
| 2751 | 2751 |
|
| 2752 |
-/** |
|
| 2753 |
- * predicts the ac. |
|
| 2754 |
- * @param n block index (0-3 are luma, 4-5 are chroma) |
|
| 2755 |
- * @param dir the ac prediction direction |
|
| 2756 |
- */ |
|
| 2757 |
-void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
|
| 2758 |
- int dir) |
|
| 2759 |
-{
|
|
| 2760 |
- int i; |
|
| 2761 |
- int16_t *ac_val, *ac_val1; |
|
| 2762 |
- int8_t * const qscale_table= s->current_picture.qscale_table; |
|
| 2763 |
- |
|
| 2764 |
- /* find prediction */ |
|
| 2765 |
- ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
|
| 2766 |
- ac_val1 = ac_val; |
|
| 2767 |
- if (s->ac_pred) {
|
|
| 2768 |
- if (dir == 0) {
|
|
| 2769 |
- const int xy= s->mb_x-1 + s->mb_y*s->mb_stride; |
|
| 2770 |
- /* left prediction */ |
|
| 2771 |
- ac_val -= 16; |
|
| 2772 |
- |
|
| 2773 |
- if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
|
|
| 2774 |
- /* same qscale */ |
|
| 2775 |
- for(i=1;i<8;i++) {
|
|
| 2776 |
- block[s->dsp.idct_permutation[i<<3]] += ac_val[i]; |
|
| 2777 |
- } |
|
| 2778 |
- }else{
|
|
| 2779 |
- /* different qscale, we must rescale */ |
|
| 2780 |
- for(i=1;i<8;i++) {
|
|
| 2781 |
- block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); |
|
| 2782 |
- } |
|
| 2783 |
- } |
|
| 2784 |
- } else {
|
|
| 2785 |
- const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride; |
|
| 2786 |
- /* top prediction */ |
|
| 2787 |
- ac_val -= 16 * s->block_wrap[n]; |
|
| 2788 |
- |
|
| 2789 |
- if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
|
|
| 2790 |
- /* same qscale */ |
|
| 2791 |
- for(i=1;i<8;i++) {
|
|
| 2792 |
- block[s->dsp.idct_permutation[i]] += ac_val[i + 8]; |
|
| 2793 |
- } |
|
| 2794 |
- }else{
|
|
| 2795 |
- /* different qscale, we must rescale */ |
|
| 2796 |
- for(i=1;i<8;i++) {
|
|
| 2797 |
- block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); |
|
| 2798 |
- } |
|
| 2799 |
- } |
|
| 2800 |
- } |
|
| 2801 |
- } |
|
| 2802 |
- /* left copy */ |
|
| 2803 |
- for(i=1;i<8;i++) |
|
| 2804 |
- ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]]; |
|
| 2805 |
- |
|
| 2806 |
- /* top copy */ |
|
| 2807 |
- for(i=1;i<8;i++) |
|
| 2808 |
- ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]]; |
|
| 2809 |
- |
|
| 2810 |
-} |
|
| 2811 |
- |
|
| 2812 | 2752 |
/***********************************************/ |
| 2813 | 2753 |
/* decoding */ |
| 2814 | 2754 |
|
| 2815 |
-static VLC intra_MCBPC_vlc; |
|
| 2816 |
-static VLC inter_MCBPC_vlc; |
|
| 2817 |
-static VLC cbpy_vlc; |
|
| 2755 |
+VLC intra_MCBPC_vlc; |
|
| 2756 |
+VLC inter_MCBPC_vlc; |
|
| 2757 |
+VLC cbpy_vlc; |
|
| 2818 | 2758 |
static VLC mv_vlc; |
| 2819 |
-static VLC dc_lum, dc_chrom; |
|
| 2820 |
-static VLC sprite_trajectory; |
|
| 2821 |
-static VLC mb_type_b_vlc; |
|
| 2822 | 2759 |
static VLC h263_mbtype_b_vlc; |
| 2823 | 2760 |
static VLC cbpc_b_vlc; |
| 2824 | 2761 |
|
| ... | ... |
@@ -2845,27 +1335,9 @@ void h263_decode_init_vlc(MpegEncContext *s) |
| 2845 | 2845 |
&mvtab[0][1], 2, 1, |
| 2846 | 2846 |
&mvtab[0][0], 2, 1, 538); |
| 2847 | 2847 |
init_rl(&rl_inter, static_rl_table_store[0]); |
| 2848 |
- init_rl(&rl_intra, static_rl_table_store[1]); |
|
| 2849 |
- init_rl(&rvlc_rl_inter, static_rl_table_store[3]); |
|
| 2850 |
- init_rl(&rvlc_rl_intra, static_rl_table_store[4]); |
|
| 2851 |
- init_rl(&rl_intra_aic, static_rl_table_store[2]); |
|
| 2848 |
+ init_rl(&rl_intra_aic, static_rl_table_store[1]); |
|
| 2852 | 2849 |
INIT_VLC_RL(rl_inter, 554); |
| 2853 |
- INIT_VLC_RL(rl_intra, 554); |
|
| 2854 |
- INIT_VLC_RL(rvlc_rl_inter, 1072); |
|
| 2855 |
- INIT_VLC_RL(rvlc_rl_intra, 1072); |
|
| 2856 | 2850 |
INIT_VLC_RL(rl_intra_aic, 554); |
| 2857 |
- INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */, |
|
| 2858 |
- &DCtab_lum[0][1], 2, 1, |
|
| 2859 |
- &DCtab_lum[0][0], 2, 1, 512); |
|
| 2860 |
- INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */, |
|
| 2861 |
- &DCtab_chrom[0][1], 2, 1, |
|
| 2862 |
- &DCtab_chrom[0][0], 2, 1, 512); |
|
| 2863 |
- INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15, |
|
| 2864 |
- &sprite_trajectory_tab[0][1], 4, 2, |
|
| 2865 |
- &sprite_trajectory_tab[0][0], 4, 2, 128); |
|
| 2866 |
- INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4, |
|
| 2867 |
- &mb_type_b_tab[0][1], 2, 1, |
|
| 2868 |
- &mb_type_b_tab[0][0], 2, 1, 16); |
|
| 2869 | 2851 |
INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15, |
| 2870 | 2852 |
&h263_mbtype_b_tab[0][1], 2, 1, |
| 2871 | 2853 |
&h263_mbtype_b_tab[0][0], 2, 1, 80); |
| ... | ... |
@@ -2974,438 +1446,6 @@ static inline void memsetw(short *tab, int val, int n) |
| 2974 | 2974 |
tab[i] = val; |
| 2975 | 2975 |
} |
| 2976 | 2976 |
|
| 2977 |
-#if CONFIG_ENCODERS |
|
| 2978 |
- |
|
| 2979 |
-void ff_mpeg4_init_partitions(MpegEncContext *s) |
|
| 2980 |
-{
|
|
| 2981 |
- uint8_t *start= put_bits_ptr(&s->pb); |
|
| 2982 |
- uint8_t *end= s->pb.buf_end; |
|
| 2983 |
- int size= end - start; |
|
| 2984 |
- int pb_size = (((intptr_t)start + size/3)&(~3)) - (intptr_t)start; |
|
| 2985 |
- int tex_size= (size - 2*pb_size)&(~3); |
|
| 2986 |
- |
|
| 2987 |
- set_put_bits_buffer_size(&s->pb, pb_size); |
|
| 2988 |
- init_put_bits(&s->tex_pb, start + pb_size , tex_size); |
|
| 2989 |
- init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size); |
|
| 2990 |
-} |
|
| 2991 |
- |
|
| 2992 |
-void ff_mpeg4_merge_partitions(MpegEncContext *s) |
|
| 2993 |
-{
|
|
| 2994 |
- const int pb2_len = put_bits_count(&s->pb2 ); |
|
| 2995 |
- const int tex_pb_len= put_bits_count(&s->tex_pb); |
|
| 2996 |
- const int bits= put_bits_count(&s->pb); |
|
| 2997 |
- |
|
| 2998 |
- if(s->pict_type==FF_I_TYPE){
|
|
| 2999 |
- put_bits(&s->pb, 19, DC_MARKER); |
|
| 3000 |
- s->misc_bits+=19 + pb2_len + bits - s->last_bits; |
|
| 3001 |
- s->i_tex_bits+= tex_pb_len; |
|
| 3002 |
- }else{
|
|
| 3003 |
- put_bits(&s->pb, 17, MOTION_MARKER); |
|
| 3004 |
- s->misc_bits+=17 + pb2_len; |
|
| 3005 |
- s->mv_bits+= bits - s->last_bits; |
|
| 3006 |
- s->p_tex_bits+= tex_pb_len; |
|
| 3007 |
- } |
|
| 3008 |
- |
|
| 3009 |
- flush_put_bits(&s->pb2); |
|
| 3010 |
- flush_put_bits(&s->tex_pb); |
|
| 3011 |
- |
|
| 3012 |
- set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf); |
|
| 3013 |
- ff_copy_bits(&s->pb, s->pb2.buf , pb2_len); |
|
| 3014 |
- ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len); |
|
| 3015 |
- s->last_bits= put_bits_count(&s->pb); |
|
| 3016 |
-} |
|
| 3017 |
- |
|
| 3018 |
-#endif //CONFIG_ENCODERS |
|
| 3019 |
- |
|
| 3020 |
-int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
|
|
| 3021 |
- switch(s->pict_type){
|
|
| 3022 |
- case FF_I_TYPE: |
|
| 3023 |
- return 16; |
|
| 3024 |
- case FF_P_TYPE: |
|
| 3025 |
- case FF_S_TYPE: |
|
| 3026 |
- return s->f_code+15; |
|
| 3027 |
- case FF_B_TYPE: |
|
| 3028 |
- return FFMAX3(s->f_code, s->b_code, 2) + 15; |
|
| 3029 |
- default: |
|
| 3030 |
- return -1; |
|
| 3031 |
- } |
|
| 3032 |
-} |
|
| 3033 |
- |
|
| 3034 |
-#if CONFIG_ENCODERS |
|
| 3035 |
- |
|
| 3036 |
-void ff_mpeg4_encode_video_packet_header(MpegEncContext *s) |
|
| 3037 |
-{
|
|
| 3038 |
- int mb_num_bits= av_log2(s->mb_num - 1) + 1; |
|
| 3039 |
- |
|
| 3040 |
- put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0); |
|
| 3041 |
- put_bits(&s->pb, 1, 1); |
|
| 3042 |
- |
|
| 3043 |
- put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width); |
|
| 3044 |
- put_bits(&s->pb, s->quant_precision, s->qscale); |
|
| 3045 |
- put_bits(&s->pb, 1, 0); /* no HEC */ |
|
| 3046 |
-} |
|
| 3047 |
- |
|
| 3048 |
-#endif //CONFIG_ENCODERS |
|
| 3049 |
- |
|
| 3050 |
-/** |
|
| 3051 |
- * check if the next stuff is a resync marker or the end. |
|
| 3052 |
- * @return 0 if not |
|
| 3053 |
- */ |
|
| 3054 |
-static inline int mpeg4_is_resync(MpegEncContext *s){
|
|
| 3055 |
- int bits_count= get_bits_count(&s->gb); |
|
| 3056 |
- int v= show_bits(&s->gb, 16); |
|
| 3057 |
- |
|
| 3058 |
- if(s->workaround_bugs&FF_BUG_NO_PADDING){
|
|
| 3059 |
- return 0; |
|
| 3060 |
- } |
|
| 3061 |
- |
|
| 3062 |
- while(v<=0xFF){
|
|
| 3063 |
- if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame) |
|
| 3064 |
- break; |
|
| 3065 |
- skip_bits(&s->gb, 8+s->pict_type); |
|
| 3066 |
- bits_count+= 8+s->pict_type; |
|
| 3067 |
- v= show_bits(&s->gb, 16); |
|
| 3068 |
- } |
|
| 3069 |
- |
|
| 3070 |
- if(bits_count + 8 >= s->gb.size_in_bits){
|
|
| 3071 |
- v>>=8; |
|
| 3072 |
- v|= 0x7F >> (7-(bits_count&7)); |
|
| 3073 |
- |
|
| 3074 |
- if(v==0x7F) |
|
| 3075 |
- return 1; |
|
| 3076 |
- }else{
|
|
| 3077 |
- if(v == ff_mpeg4_resync_prefix[bits_count&7]){
|
|
| 3078 |
- int len; |
|
| 3079 |
- GetBitContext gb= s->gb; |
|
| 3080 |
- |
|
| 3081 |
- skip_bits(&s->gb, 1); |
|
| 3082 |
- align_get_bits(&s->gb); |
|
| 3083 |
- |
|
| 3084 |
- for(len=0; len<32; len++){
|
|
| 3085 |
- if(get_bits1(&s->gb)) break; |
|
| 3086 |
- } |
|
| 3087 |
- |
|
| 3088 |
- s->gb= gb; |
|
| 3089 |
- |
|
| 3090 |
- if(len>=ff_mpeg4_get_video_packet_prefix_length(s)) |
|
| 3091 |
- return 1; |
|
| 3092 |
- } |
|
| 3093 |
- } |
|
| 3094 |
- return 0; |
|
| 3095 |
-} |
|
| 3096 |
- |
|
| 3097 |
-static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb) |
|
| 3098 |
-{
|
|
| 3099 |
- int i; |
|
| 3100 |
- int a= 2<<s->sprite_warping_accuracy; |
|
| 3101 |
- int rho= 3-s->sprite_warping_accuracy; |
|
| 3102 |
- int r=16/a; |
|
| 3103 |
- const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
|
|
| 3104 |
- int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
|
|
| 3105 |
- int sprite_ref[4][2]; |
|
| 3106 |
- int virtual_ref[2][2]; |
|
| 3107 |
- int w2, h2, w3, h3; |
|
| 3108 |
- int alpha=0, beta=0; |
|
| 3109 |
- int w= s->width; |
|
| 3110 |
- int h= s->height; |
|
| 3111 |
- int min_ab; |
|
| 3112 |
- |
|
| 3113 |
- for(i=0; i<s->num_sprite_warping_points; i++){
|
|
| 3114 |
- int length; |
|
| 3115 |
- int x=0, y=0; |
|
| 3116 |
- |
|
| 3117 |
- length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3); |
|
| 3118 |
- if(length){
|
|
| 3119 |
- x= get_xbits(gb, length); |
|
| 3120 |
- } |
|
| 3121 |
- if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */ |
|
| 3122 |
- |
|
| 3123 |
- length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3); |
|
| 3124 |
- if(length){
|
|
| 3125 |
- y=get_xbits(gb, length); |
|
| 3126 |
- } |
|
| 3127 |
- skip_bits1(gb); /* marker bit */ |
|
| 3128 |
- s->sprite_traj[i][0]= d[i][0]= x; |
|
| 3129 |
- s->sprite_traj[i][1]= d[i][1]= y; |
|
| 3130 |
- } |
|
| 3131 |
- for(; i<4; i++) |
|
| 3132 |
- s->sprite_traj[i][0]= s->sprite_traj[i][1]= 0; |
|
| 3133 |
- |
|
| 3134 |
- while((1<<alpha)<w) alpha++; |
|
| 3135 |
- while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h' |
|
| 3136 |
- w2= 1<<alpha; |
|
| 3137 |
- h2= 1<<beta; |
|
| 3138 |
- |
|
| 3139 |
-// Note, the 4th point isn't used for GMC |
|
| 3140 |
- if(s->divx_version==500 && s->divx_build==413){
|
|
| 3141 |
- sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0]; |
|
| 3142 |
- sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1]; |
|
| 3143 |
- sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0]; |
|
| 3144 |
- sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1]; |
|
| 3145 |
- sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0]; |
|
| 3146 |
- sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1]; |
|
| 3147 |
- } else {
|
|
| 3148 |
- sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]); |
|
| 3149 |
- sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]); |
|
| 3150 |
- sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]); |
|
| 3151 |
- sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]); |
|
| 3152 |
- sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]); |
|
| 3153 |
- sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]); |
|
| 3154 |
- } |
|
| 3155 |
-/* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]); |
|
| 3156 |
- sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */ |
|
| 3157 |
- |
|
| 3158 |
-// this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...) |
|
| 3159 |
-// perhaps it should be reordered to be more readable ... |
|
| 3160 |
-// the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides |
|
| 3161 |
-// so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form |
|
| 3162 |
- virtual_ref[0][0]= 16*(vop_ref[0][0] + w2) |
|
| 3163 |
- + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w); |
|
| 3164 |
- virtual_ref[0][1]= 16*vop_ref[0][1] |
|
| 3165 |
- + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w); |
|
| 3166 |
- virtual_ref[1][0]= 16*vop_ref[0][0] |
|
| 3167 |
- + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h); |
|
| 3168 |
- virtual_ref[1][1]= 16*(vop_ref[0][1] + h2) |
|
| 3169 |
- + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h); |
|
| 3170 |
- |
|
| 3171 |
- switch(s->num_sprite_warping_points) |
|
| 3172 |
- {
|
|
| 3173 |
- case 0: |
|
| 3174 |
- s->sprite_offset[0][0]= 0; |
|
| 3175 |
- s->sprite_offset[0][1]= 0; |
|
| 3176 |
- s->sprite_offset[1][0]= 0; |
|
| 3177 |
- s->sprite_offset[1][1]= 0; |
|
| 3178 |
- s->sprite_delta[0][0]= a; |
|
| 3179 |
- s->sprite_delta[0][1]= 0; |
|
| 3180 |
- s->sprite_delta[1][0]= 0; |
|
| 3181 |
- s->sprite_delta[1][1]= a; |
|
| 3182 |
- s->sprite_shift[0]= 0; |
|
| 3183 |
- s->sprite_shift[1]= 0; |
|
| 3184 |
- break; |
|
| 3185 |
- case 1: //GMC only |
|
| 3186 |
- s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0]; |
|
| 3187 |
- s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1]; |
|
| 3188 |
- s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2); |
|
| 3189 |
- s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2); |
|
| 3190 |
- s->sprite_delta[0][0]= a; |
|
| 3191 |
- s->sprite_delta[0][1]= 0; |
|
| 3192 |
- s->sprite_delta[1][0]= 0; |
|
| 3193 |
- s->sprite_delta[1][1]= a; |
|
| 3194 |
- s->sprite_shift[0]= 0; |
|
| 3195 |
- s->sprite_shift[1]= 0; |
|
| 3196 |
- break; |
|
| 3197 |
- case 2: |
|
| 3198 |
- s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho)) |
|
| 3199 |
- + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0]) |
|
| 3200 |
- + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1]) |
|
| 3201 |
- + (1<<(alpha+rho-1)); |
|
| 3202 |
- s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho)) |
|
| 3203 |
- + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0]) |
|
| 3204 |
- + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1]) |
|
| 3205 |
- + (1<<(alpha+rho-1)); |
|
| 3206 |
- s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1) |
|
| 3207 |
- +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1) |
|
| 3208 |
- +2*w2*r*sprite_ref[0][0] |
|
| 3209 |
- - 16*w2 |
|
| 3210 |
- + (1<<(alpha+rho+1))); |
|
| 3211 |
- s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1) |
|
| 3212 |
- +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1) |
|
| 3213 |
- +2*w2*r*sprite_ref[0][1] |
|
| 3214 |
- - 16*w2 |
|
| 3215 |
- + (1<<(alpha+rho+1))); |
|
| 3216 |
- s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); |
|
| 3217 |
- s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]); |
|
| 3218 |
- s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]); |
|
| 3219 |
- s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); |
|
| 3220 |
- |
|
| 3221 |
- s->sprite_shift[0]= alpha+rho; |
|
| 3222 |
- s->sprite_shift[1]= alpha+rho+2; |
|
| 3223 |
- break; |
|
| 3224 |
- case 3: |
|
| 3225 |
- min_ab= FFMIN(alpha, beta); |
|
| 3226 |
- w3= w2>>min_ab; |
|
| 3227 |
- h3= h2>>min_ab; |
|
| 3228 |
- s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab)) |
|
| 3229 |
- + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0]) |
|
| 3230 |
- + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1]) |
|
| 3231 |
- + (1<<(alpha+beta+rho-min_ab-1)); |
|
| 3232 |
- s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab)) |
|
| 3233 |
- + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0]) |
|
| 3234 |
- + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1]) |
|
| 3235 |
- + (1<<(alpha+beta+rho-min_ab-1)); |
|
| 3236 |
- s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1) |
|
| 3237 |
- + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1) |
|
| 3238 |
- + 2*w2*h3*r*sprite_ref[0][0] |
|
| 3239 |
- - 16*w2*h3 |
|
| 3240 |
- + (1<<(alpha+beta+rho-min_ab+1)); |
|
| 3241 |
- s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1) |
|
| 3242 |
- + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1) |
|
| 3243 |
- + 2*w2*h3*r*sprite_ref[0][1] |
|
| 3244 |
- - 16*w2*h3 |
|
| 3245 |
- + (1<<(alpha+beta+rho-min_ab+1)); |
|
| 3246 |
- s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3; |
|
| 3247 |
- s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3; |
|
| 3248 |
- s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3; |
|
| 3249 |
- s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3; |
|
| 3250 |
- |
|
| 3251 |
- s->sprite_shift[0]= alpha + beta + rho - min_ab; |
|
| 3252 |
- s->sprite_shift[1]= alpha + beta + rho - min_ab + 2; |
|
| 3253 |
- break; |
|
| 3254 |
- } |
|
| 3255 |
- /* try to simplify the situation */ |
|
| 3256 |
- if( s->sprite_delta[0][0] == a<<s->sprite_shift[0] |
|
| 3257 |
- && s->sprite_delta[0][1] == 0 |
|
| 3258 |
- && s->sprite_delta[1][0] == 0 |
|
| 3259 |
- && s->sprite_delta[1][1] == a<<s->sprite_shift[0]) |
|
| 3260 |
- {
|
|
| 3261 |
- s->sprite_offset[0][0]>>=s->sprite_shift[0]; |
|
| 3262 |
- s->sprite_offset[0][1]>>=s->sprite_shift[0]; |
|
| 3263 |
- s->sprite_offset[1][0]>>=s->sprite_shift[1]; |
|
| 3264 |
- s->sprite_offset[1][1]>>=s->sprite_shift[1]; |
|
| 3265 |
- s->sprite_delta[0][0]= a; |
|
| 3266 |
- s->sprite_delta[0][1]= 0; |
|
| 3267 |
- s->sprite_delta[1][0]= 0; |
|
| 3268 |
- s->sprite_delta[1][1]= a; |
|
| 3269 |
- s->sprite_shift[0]= 0; |
|
| 3270 |
- s->sprite_shift[1]= 0; |
|
| 3271 |
- s->real_sprite_warping_points=1; |
|
| 3272 |
- } |
|
| 3273 |
- else{
|
|
| 3274 |
- int shift_y= 16 - s->sprite_shift[0]; |
|
| 3275 |
- int shift_c= 16 - s->sprite_shift[1]; |
|
| 3276 |
- for(i=0; i<2; i++){
|
|
| 3277 |
- s->sprite_offset[0][i]<<= shift_y; |
|
| 3278 |
- s->sprite_offset[1][i]<<= shift_c; |
|
| 3279 |
- s->sprite_delta[0][i]<<= shift_y; |
|
| 3280 |
- s->sprite_delta[1][i]<<= shift_y; |
|
| 3281 |
- s->sprite_shift[i]= 16; |
|
| 3282 |
- } |
|
| 3283 |
- s->real_sprite_warping_points= s->num_sprite_warping_points; |
|
| 3284 |
- } |
|
| 3285 |
-} |
|
| 3286 |
- |
|
| 3287 |
-/** |
|
| 3288 |
- * decodes the next video packet. |
|
| 3289 |
- * @return <0 if something went wrong |
|
| 3290 |
- */ |
|
| 3291 |
-static int mpeg4_decode_video_packet_header(MpegEncContext *s) |
|
| 3292 |
-{
|
|
| 3293 |
- int mb_num_bits= av_log2(s->mb_num - 1) + 1; |
|
| 3294 |
- int header_extension=0, mb_num, len; |
|
| 3295 |
- |
|
| 3296 |
- /* is there enough space left for a video packet + header */ |
|
| 3297 |
- if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1; |
|
| 3298 |
- |
|
| 3299 |
- for(len=0; len<32; len++){
|
|
| 3300 |
- if(get_bits1(&s->gb)) break; |
|
| 3301 |
- } |
|
| 3302 |
- |
|
| 3303 |
- if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
|
|
| 3304 |
- av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n"); |
|
| 3305 |
- return -1; |
|
| 3306 |
- } |
|
| 3307 |
- |
|
| 3308 |
- if(s->shape != RECT_SHAPE){
|
|
| 3309 |
- header_extension= get_bits1(&s->gb); |
|
| 3310 |
- //FIXME more stuff here |
|
| 3311 |
- } |
|
| 3312 |
- |
|
| 3313 |
- mb_num= get_bits(&s->gb, mb_num_bits); |
|
| 3314 |
- if(mb_num>=s->mb_num){
|
|
| 3315 |
- av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num); |
|
| 3316 |
- return -1; |
|
| 3317 |
- } |
|
| 3318 |
- if(s->pict_type == FF_B_TYPE){
|
|
| 3319 |
- while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++; |
|
| 3320 |
- if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded |
|
| 3321 |
- } |
|
| 3322 |
- |
|
| 3323 |
- s->mb_x= mb_num % s->mb_width; |
|
| 3324 |
- s->mb_y= mb_num / s->mb_width; |
|
| 3325 |
- |
|
| 3326 |
- if(s->shape != BIN_ONLY_SHAPE){
|
|
| 3327 |
- int qscale= get_bits(&s->gb, s->quant_precision); |
|
| 3328 |
- if(qscale) |
|
| 3329 |
- s->chroma_qscale=s->qscale= qscale; |
|
| 3330 |
- } |
|
| 3331 |
- |
|
| 3332 |
- if(s->shape == RECT_SHAPE){
|
|
| 3333 |
- header_extension= get_bits1(&s->gb); |
|
| 3334 |
- } |
|
| 3335 |
- if(header_extension){
|
|
| 3336 |
- int time_increment; |
|
| 3337 |
- int time_incr=0; |
|
| 3338 |
- |
|
| 3339 |
- while (get_bits1(&s->gb) != 0) |
|
| 3340 |
- time_incr++; |
|
| 3341 |
- |
|
| 3342 |
- check_marker(&s->gb, "before time_increment in video packed header"); |
|
| 3343 |
- time_increment= get_bits(&s->gb, s->time_increment_bits); |
|
| 3344 |
- check_marker(&s->gb, "before vop_coding_type in video packed header"); |
|
| 3345 |
- |
|
| 3346 |
- skip_bits(&s->gb, 2); /* vop coding type */ |
|
| 3347 |
- //FIXME not rect stuff here |
|
| 3348 |
- |
|
| 3349 |
- if(s->shape != BIN_ONLY_SHAPE){
|
|
| 3350 |
- skip_bits(&s->gb, 3); /* intra dc vlc threshold */ |
|
| 3351 |
-//FIXME don't just ignore everything |
|
| 3352 |
- if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
|
|
| 3353 |
- mpeg4_decode_sprite_trajectory(s, &s->gb); |
|
| 3354 |
- av_log(s->avctx, AV_LOG_ERROR, "untested\n"); |
|
| 3355 |
- } |
|
| 3356 |
- |
|
| 3357 |
- //FIXME reduced res stuff here |
|
| 3358 |
- |
|
| 3359 |
- if (s->pict_type != FF_I_TYPE) {
|
|
| 3360 |
- int f_code = get_bits(&s->gb, 3); /* fcode_for */ |
|
| 3361 |
- if(f_code==0){
|
|
| 3362 |
- av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n"); |
|
| 3363 |
- } |
|
| 3364 |
- } |
|
| 3365 |
- if (s->pict_type == FF_B_TYPE) {
|
|
| 3366 |
- int b_code = get_bits(&s->gb, 3); |
|
| 3367 |
- if(b_code==0){
|
|
| 3368 |
- av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n"); |
|
| 3369 |
- } |
|
| 3370 |
- } |
|
| 3371 |
- } |
|
| 3372 |
- } |
|
| 3373 |
- //FIXME new-pred stuff |
|
| 3374 |
- |
|
| 3375 |
- return 0; |
|
| 3376 |
-} |
|
| 3377 |
- |
|
| 3378 |
-void ff_mpeg4_clean_buffers(MpegEncContext *s) |
|
| 3379 |
-{
|
|
| 3380 |
- int c_wrap, c_xy, l_wrap, l_xy; |
|
| 3381 |
- |
|
| 3382 |
- l_wrap= s->b8_stride; |
|
| 3383 |
- l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1; |
|
| 3384 |
- c_wrap= s->mb_stride; |
|
| 3385 |
- c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1; |
|
| 3386 |
- |
|
| 3387 |
-#if 0 |
|
| 3388 |
- /* clean DC */ |
|
| 3389 |
- memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1); |
|
| 3390 |
- memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1); |
|
| 3391 |
- memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1); |
|
| 3392 |
-#endif |
|
| 3393 |
- |
|
| 3394 |
- /* clean AC */ |
|
| 3395 |
- memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t)); |
|
| 3396 |
- memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); |
|
| 3397 |
- memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); |
|
| 3398 |
- |
|
| 3399 |
- /* clean MV */ |
|
| 3400 |
- // we can't clear the MVs as they might be needed by a b frame |
|
| 3401 |
-// memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t)); |
|
| 3402 |
-// memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2)); |
|
| 3403 |
- s->last_mv[0][0][0]= |
|
| 3404 |
- s->last_mv[0][0][1]= |
|
| 3405 |
- s->last_mv[1][0][0]= |
|
| 3406 |
- s->last_mv[1][0][1]= 0; |
|
| 3407 |
-} |
|
| 3408 |
- |
|
| 3409 | 2977 |
/** |
| 3410 | 2978 |
* finds the next resync_marker |
| 3411 | 2979 |
* @param p pointer to buffer to scan |
| ... | ... |
@@ -3473,7 +1513,7 @@ int ff_h263_resync(MpegEncContext *s){
|
| 3473 | 3473 |
return -1; |
| 3474 | 3474 |
} |
| 3475 | 3475 |
|
| 3476 |
-static int h263_decode_motion(MpegEncContext * s, int pred, int f_code) |
|
| 3476 |
+int h263_decode_motion(MpegEncContext * s, int pred, int f_code) |
|
| 3477 | 3477 |
{
|
| 3478 | 3478 |
int code, val, sign, shift, l; |
| 3479 | 3479 |
code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2); |
| ... | ... |
@@ -3510,745 +1550,6 @@ static int h263_decode_motion(MpegEncContext * s, int pred, int f_code) |
| 3510 | 3510 |
return val; |
| 3511 | 3511 |
} |
| 3512 | 3512 |
|
| 3513 |
-/** |
|
| 3514 |
- * gets the average motion vector for a GMC MB. |
|
| 3515 |
- * @param n either 0 for the x component or 1 for y |
|
| 3516 |
- * @returns the average MV for a GMC MB |
|
| 3517 |
- */ |
|
| 3518 |
-static inline int get_amv(MpegEncContext *s, int n){
|
|
| 3519 |
- int x, y, mb_v, sum, dx, dy, shift; |
|
| 3520 |
- int len = 1 << (s->f_code + 4); |
|
| 3521 |
- const int a= s->sprite_warping_accuracy; |
|
| 3522 |
- |
|
| 3523 |
- if(s->workaround_bugs & FF_BUG_AMV) |
|
| 3524 |
- len >>= s->quarter_sample; |
|
| 3525 |
- |
|
| 3526 |
- if(s->real_sprite_warping_points==1){
|
|
| 3527 |
- if(s->divx_version==500 && s->divx_build==413) |
|
| 3528 |
- sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample)); |
|
| 3529 |
- else |
|
| 3530 |
- sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a); |
|
| 3531 |
- }else{
|
|
| 3532 |
- dx= s->sprite_delta[n][0]; |
|
| 3533 |
- dy= s->sprite_delta[n][1]; |
|
| 3534 |
- shift= s->sprite_shift[0]; |
|
| 3535 |
- if(n) dy -= 1<<(shift + a + 1); |
|
| 3536 |
- else dx -= 1<<(shift + a + 1); |
|
| 3537 |
- mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16; |
|
| 3538 |
- |
|
| 3539 |
- sum=0; |
|
| 3540 |
- for(y=0; y<16; y++){
|
|
| 3541 |
- int v; |
|
| 3542 |
- |
|
| 3543 |
- v= mb_v + dy*y; |
|
| 3544 |
- //XXX FIXME optimize |
|
| 3545 |
- for(x=0; x<16; x++){
|
|
| 3546 |
- sum+= v>>shift; |
|
| 3547 |
- v+= dx; |
|
| 3548 |
- } |
|
| 3549 |
- } |
|
| 3550 |
- sum= RSHIFT(sum, a+8-s->quarter_sample); |
|
| 3551 |
- } |
|
| 3552 |
- |
|
| 3553 |
- if (sum < -len) sum= -len; |
|
| 3554 |
- else if (sum >= len) sum= len-1; |
|
| 3555 |
- |
|
| 3556 |
- return sum; |
|
| 3557 |
-} |
|
| 3558 |
- |
|
| 3559 |
-/** |
|
| 3560 |
- * decodes the dc value. |
|
| 3561 |
- * @param n block index (0-3 are luma, 4-5 are chroma) |
|
| 3562 |
- * @param dir_ptr the prediction direction will be stored here |
|
| 3563 |
- * @return the quantized dc |
|
| 3564 |
- */ |
|
| 3565 |
-static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) |
|
| 3566 |
-{
|
|
| 3567 |
- int level, code; |
|
| 3568 |
- |
|
| 3569 |
- if (n < 4) |
|
| 3570 |
- code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); |
|
| 3571 |
- else |
|
| 3572 |
- code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); |
|
| 3573 |
- if (code < 0 || code > 9 /* && s->nbit<9 */){
|
|
| 3574 |
- av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); |
|
| 3575 |
- return -1; |
|
| 3576 |
- } |
|
| 3577 |
- if (code == 0) {
|
|
| 3578 |
- level = 0; |
|
| 3579 |
- } else {
|
|
| 3580 |
- if(IS_3IV1){
|
|
| 3581 |
- if(code==1) |
|
| 3582 |
- level= 2*get_bits1(&s->gb)-1; |
|
| 3583 |
- else{
|
|
| 3584 |
- if(get_bits1(&s->gb)) |
|
| 3585 |
- level = get_bits(&s->gb, code-1) + (1<<(code-1)); |
|
| 3586 |
- else |
|
| 3587 |
- level = -get_bits(&s->gb, code-1) - (1<<(code-1)); |
|
| 3588 |
- } |
|
| 3589 |
- }else{
|
|
| 3590 |
- level = get_xbits(&s->gb, code); |
|
| 3591 |
- } |
|
| 3592 |
- |
|
| 3593 |
- if (code > 8){
|
|
| 3594 |
- if(get_bits1(&s->gb)==0){ /* marker */
|
|
| 3595 |
- if(s->error_recognition>=2){
|
|
| 3596 |
- av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n"); |
|
| 3597 |
- return -1; |
|
| 3598 |
- } |
|
| 3599 |
- } |
|
| 3600 |
- } |
|
| 3601 |
- } |
|
| 3602 |
- |
|
| 3603 |
- return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0); |
|
| 3604 |
-} |
|
| 3605 |
- |
|
| 3606 |
-/** |
|
| 3607 |
- * decodes first partition. |
|
| 3608 |
- * @return number of MBs decoded or <0 if an error occurred |
|
| 3609 |
- */ |
|
| 3610 |
-static int mpeg4_decode_partition_a(MpegEncContext *s){
|
|
| 3611 |
- int mb_num; |
|
| 3612 |
- static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
|
|
| 3613 |
- |
|
| 3614 |
- /* decode first partition */ |
|
| 3615 |
- mb_num=0; |
|
| 3616 |
- s->first_slice_line=1; |
|
| 3617 |
- for(; s->mb_y<s->mb_height; s->mb_y++){
|
|
| 3618 |
- ff_init_block_index(s); |
|
| 3619 |
- for(; s->mb_x<s->mb_width; s->mb_x++){
|
|
| 3620 |
- const int xy= s->mb_x + s->mb_y*s->mb_stride; |
|
| 3621 |
- int cbpc; |
|
| 3622 |
- int dir=0; |
|
| 3623 |
- |
|
| 3624 |
- mb_num++; |
|
| 3625 |
- ff_update_block_index(s); |
|
| 3626 |
- if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1) |
|
| 3627 |
- s->first_slice_line=0; |
|
| 3628 |
- |
|
| 3629 |
- if(s->pict_type==FF_I_TYPE){
|
|
| 3630 |
- int i; |
|
| 3631 |
- |
|
| 3632 |
- do{
|
|
| 3633 |
- if(show_bits_long(&s->gb, 19)==DC_MARKER){
|
|
| 3634 |
- return mb_num-1; |
|
| 3635 |
- } |
|
| 3636 |
- |
|
| 3637 |
- cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2); |
|
| 3638 |
- if (cbpc < 0){
|
|
| 3639 |
- av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 3640 |
- return -1; |
|
| 3641 |
- } |
|
| 3642 |
- }while(cbpc == 8); |
|
| 3643 |
- |
|
| 3644 |
- s->cbp_table[xy]= cbpc & 3; |
|
| 3645 |
- s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
|
| 3646 |
- s->mb_intra = 1; |
|
| 3647 |
- |
|
| 3648 |
- if(cbpc & 4) {
|
|
| 3649 |
- ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
| 3650 |
- } |
|
| 3651 |
- s->current_picture.qscale_table[xy]= s->qscale; |
|
| 3652 |
- |
|
| 3653 |
- s->mbintra_table[xy]= 1; |
|
| 3654 |
- for(i=0; i<6; i++){
|
|
| 3655 |
- int dc_pred_dir; |
|
| 3656 |
- int dc= mpeg4_decode_dc(s, i, &dc_pred_dir); |
|
| 3657 |
- if(dc < 0){
|
|
| 3658 |
- av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 3659 |
- return -1; |
|
| 3660 |
- } |
|
| 3661 |
- dir<<=1; |
|
| 3662 |
- if(dc_pred_dir) dir|=1; |
|
| 3663 |
- } |
|
| 3664 |
- s->pred_dir_table[xy]= dir; |
|
| 3665 |
- }else{ /* P/S_TYPE */
|
|
| 3666 |
- int mx, my, pred_x, pred_y, bits; |
|
| 3667 |
- int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]]; |
|
| 3668 |
- const int stride= s->b8_stride*2; |
|
| 3669 |
- |
|
| 3670 |
-try_again: |
|
| 3671 |
- bits= show_bits(&s->gb, 17); |
|
| 3672 |
- if(bits==MOTION_MARKER){
|
|
| 3673 |
- return mb_num-1; |
|
| 3674 |
- } |
|
| 3675 |
- skip_bits1(&s->gb); |
|
| 3676 |
- if(bits&0x10000){
|
|
| 3677 |
- /* skip mb */ |
|
| 3678 |
- if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
|
|
| 3679 |
- s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0; |
|
| 3680 |
- mx= get_amv(s, 0); |
|
| 3681 |
- my= get_amv(s, 1); |
|
| 3682 |
- }else{
|
|
| 3683 |
- s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 3684 |
- mx=my=0; |
|
| 3685 |
- } |
|
| 3686 |
- mot_val[0 ]= mot_val[2 ]= |
|
| 3687 |
- mot_val[0+stride]= mot_val[2+stride]= mx; |
|
| 3688 |
- mot_val[1 ]= mot_val[3 ]= |
|
| 3689 |
- mot_val[1+stride]= mot_val[3+stride]= my; |
|
| 3690 |
- |
|
| 3691 |
- if(s->mbintra_table[xy]) |
|
| 3692 |
- ff_clean_intra_table_entries(s); |
|
| 3693 |
- continue; |
|
| 3694 |
- } |
|
| 3695 |
- |
|
| 3696 |
- cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); |
|
| 3697 |
- if (cbpc < 0){
|
|
| 3698 |
- av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 3699 |
- return -1; |
|
| 3700 |
- } |
|
| 3701 |
- if(cbpc == 20) |
|
| 3702 |
- goto try_again; |
|
| 3703 |
- |
|
| 3704 |
- s->cbp_table[xy]= cbpc&(8+3); //8 is dquant |
|
| 3705 |
- |
|
| 3706 |
- s->mb_intra = ((cbpc & 4) != 0); |
|
| 3707 |
- |
|
| 3708 |
- if(s->mb_intra){
|
|
| 3709 |
- s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
|
| 3710 |
- s->mbintra_table[xy]= 1; |
|
| 3711 |
- mot_val[0 ]= mot_val[2 ]= |
|
| 3712 |
- mot_val[0+stride]= mot_val[2+stride]= 0; |
|
| 3713 |
- mot_val[1 ]= mot_val[3 ]= |
|
| 3714 |
- mot_val[1+stride]= mot_val[3+stride]= 0; |
|
| 3715 |
- }else{
|
|
| 3716 |
- if(s->mbintra_table[xy]) |
|
| 3717 |
- ff_clean_intra_table_entries(s); |
|
| 3718 |
- |
|
| 3719 |
- if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0) |
|
| 3720 |
- s->mcsel= get_bits1(&s->gb); |
|
| 3721 |
- else s->mcsel= 0; |
|
| 3722 |
- |
|
| 3723 |
- if ((cbpc & 16) == 0) {
|
|
| 3724 |
- /* 16x16 motion prediction */ |
|
| 3725 |
- |
|
| 3726 |
- h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
|
| 3727 |
- if(!s->mcsel){
|
|
| 3728 |
- mx = h263_decode_motion(s, pred_x, s->f_code); |
|
| 3729 |
- if (mx >= 0xffff) |
|
| 3730 |
- return -1; |
|
| 3731 |
- |
|
| 3732 |
- my = h263_decode_motion(s, pred_y, s->f_code); |
|
| 3733 |
- if (my >= 0xffff) |
|
| 3734 |
- return -1; |
|
| 3735 |
- s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 3736 |
- } else {
|
|
| 3737 |
- mx = get_amv(s, 0); |
|
| 3738 |
- my = get_amv(s, 1); |
|
| 3739 |
- s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0; |
|
| 3740 |
- } |
|
| 3741 |
- |
|
| 3742 |
- mot_val[0 ]= mot_val[2 ] = |
|
| 3743 |
- mot_val[0+stride]= mot_val[2+stride]= mx; |
|
| 3744 |
- mot_val[1 ]= mot_val[3 ]= |
|
| 3745 |
- mot_val[1+stride]= mot_val[3+stride]= my; |
|
| 3746 |
- } else {
|
|
| 3747 |
- int i; |
|
| 3748 |
- s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0; |
|
| 3749 |
- for(i=0;i<4;i++) {
|
|
| 3750 |
- int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
|
| 3751 |
- mx = h263_decode_motion(s, pred_x, s->f_code); |
|
| 3752 |
- if (mx >= 0xffff) |
|
| 3753 |
- return -1; |
|
| 3754 |
- |
|
| 3755 |
- my = h263_decode_motion(s, pred_y, s->f_code); |
|
| 3756 |
- if (my >= 0xffff) |
|
| 3757 |
- return -1; |
|
| 3758 |
- mot_val[0] = mx; |
|
| 3759 |
- mot_val[1] = my; |
|
| 3760 |
- } |
|
| 3761 |
- } |
|
| 3762 |
- } |
|
| 3763 |
- } |
|
| 3764 |
- } |
|
| 3765 |
- s->mb_x= 0; |
|
| 3766 |
- } |
|
| 3767 |
- |
|
| 3768 |
- return mb_num; |
|
| 3769 |
-} |
|
| 3770 |
- |
|
| 3771 |
-/** |
|
| 3772 |
- * decode second partition. |
|
| 3773 |
- * @return <0 if an error occurred |
|
| 3774 |
- */ |
|
| 3775 |
-static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
|
|
| 3776 |
- int mb_num=0; |
|
| 3777 |
- static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
|
|
| 3778 |
- |
|
| 3779 |
- s->mb_x= s->resync_mb_x; |
|
| 3780 |
- s->first_slice_line=1; |
|
| 3781 |
- for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
|
|
| 3782 |
- ff_init_block_index(s); |
|
| 3783 |
- for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
|
|
| 3784 |
- const int xy= s->mb_x + s->mb_y*s->mb_stride; |
|
| 3785 |
- |
|
| 3786 |
- mb_num++; |
|
| 3787 |
- ff_update_block_index(s); |
|
| 3788 |
- if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1) |
|
| 3789 |
- s->first_slice_line=0; |
|
| 3790 |
- |
|
| 3791 |
- if(s->pict_type==FF_I_TYPE){
|
|
| 3792 |
- int ac_pred= get_bits1(&s->gb); |
|
| 3793 |
- int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
|
| 3794 |
- if(cbpy<0){
|
|
| 3795 |
- av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 3796 |
- return -1; |
|
| 3797 |
- } |
|
| 3798 |
- |
|
| 3799 |
- s->cbp_table[xy]|= cbpy<<2; |
|
| 3800 |
- s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED; |
|
| 3801 |
- }else{ /* P || S_TYPE */
|
|
| 3802 |
- if(IS_INTRA(s->current_picture.mb_type[xy])){
|
|
| 3803 |
- int dir=0,i; |
|
| 3804 |
- int ac_pred = get_bits1(&s->gb); |
|
| 3805 |
- int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
|
| 3806 |
- |
|
| 3807 |
- if(cbpy<0){
|
|
| 3808 |
- av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 3809 |
- return -1; |
|
| 3810 |
- } |
|
| 3811 |
- |
|
| 3812 |
- if(s->cbp_table[xy] & 8) {
|
|
| 3813 |
- ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
| 3814 |
- } |
|
| 3815 |
- s->current_picture.qscale_table[xy]= s->qscale; |
|
| 3816 |
- |
|
| 3817 |
- for(i=0; i<6; i++){
|
|
| 3818 |
- int dc_pred_dir; |
|
| 3819 |
- int dc= mpeg4_decode_dc(s, i, &dc_pred_dir); |
|
| 3820 |
- if(dc < 0){
|
|
| 3821 |
- av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 3822 |
- return -1; |
|
| 3823 |
- } |
|
| 3824 |
- dir<<=1; |
|
| 3825 |
- if(dc_pred_dir) dir|=1; |
|
| 3826 |
- } |
|
| 3827 |
- s->cbp_table[xy]&= 3; //remove dquant |
|
| 3828 |
- s->cbp_table[xy]|= cbpy<<2; |
|
| 3829 |
- s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED; |
|
| 3830 |
- s->pred_dir_table[xy]= dir; |
|
| 3831 |
- }else if(IS_SKIP(s->current_picture.mb_type[xy])){
|
|
| 3832 |
- s->current_picture.qscale_table[xy]= s->qscale; |
|
| 3833 |
- s->cbp_table[xy]= 0; |
|
| 3834 |
- }else{
|
|
| 3835 |
- int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
|
| 3836 |
- |
|
| 3837 |
- if(cbpy<0){
|
|
| 3838 |
- av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 3839 |
- return -1; |
|
| 3840 |
- } |
|
| 3841 |
- |
|
| 3842 |
- if(s->cbp_table[xy] & 8) {
|
|
| 3843 |
- ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
| 3844 |
- } |
|
| 3845 |
- s->current_picture.qscale_table[xy]= s->qscale; |
|
| 3846 |
- |
|
| 3847 |
- s->cbp_table[xy]&= 3; //remove dquant |
|
| 3848 |
- s->cbp_table[xy]|= (cbpy^0xf)<<2; |
|
| 3849 |
- } |
|
| 3850 |
- } |
|
| 3851 |
- } |
|
| 3852 |
- if(mb_num >= mb_count) return 0; |
|
| 3853 |
- s->mb_x= 0; |
|
| 3854 |
- } |
|
| 3855 |
- return 0; |
|
| 3856 |
-} |
|
| 3857 |
- |
|
| 3858 |
-/** |
|
| 3859 |
- * decodes the first & second partition |
|
| 3860 |
- * @return <0 if error (and sets error type in the error_status_table) |
|
| 3861 |
- */ |
|
| 3862 |
-int ff_mpeg4_decode_partitions(MpegEncContext *s) |
|
| 3863 |
-{
|
|
| 3864 |
- int mb_num; |
|
| 3865 |
- const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR; |
|
| 3866 |
- const int part_a_end = s->pict_type==FF_I_TYPE ? (DC_END |MV_END) : MV_END; |
|
| 3867 |
- |
|
| 3868 |
- mb_num= mpeg4_decode_partition_a(s); |
|
| 3869 |
- if(mb_num<0){
|
|
| 3870 |
- ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error); |
|
| 3871 |
- return -1; |
|
| 3872 |
- } |
|
| 3873 |
- |
|
| 3874 |
- if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
|
|
| 3875 |
- av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n"); |
|
| 3876 |
- ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error); |
|
| 3877 |
- return -1; |
|
| 3878 |
- } |
|
| 3879 |
- |
|
| 3880 |
- s->mb_num_left= mb_num; |
|
| 3881 |
- |
|
| 3882 |
- if(s->pict_type==FF_I_TYPE){
|
|
| 3883 |
- while(show_bits(&s->gb, 9) == 1) |
|
| 3884 |
- skip_bits(&s->gb, 9); |
|
| 3885 |
- if(get_bits_long(&s->gb, 19)!=DC_MARKER){
|
|
| 3886 |
- av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y); |
|
| 3887 |
- return -1; |
|
| 3888 |
- } |
|
| 3889 |
- }else{
|
|
| 3890 |
- while(show_bits(&s->gb, 10) == 1) |
|
| 3891 |
- skip_bits(&s->gb, 10); |
|
| 3892 |
- if(get_bits(&s->gb, 17)!=MOTION_MARKER){
|
|
| 3893 |
- av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y); |
|
| 3894 |
- return -1; |
|
| 3895 |
- } |
|
| 3896 |
- } |
|
| 3897 |
- ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end); |
|
| 3898 |
- |
|
| 3899 |
- if( mpeg4_decode_partition_b(s, mb_num) < 0){
|
|
| 3900 |
- if(s->pict_type==FF_P_TYPE) |
|
| 3901 |
- ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR); |
|
| 3902 |
- return -1; |
|
| 3903 |
- }else{
|
|
| 3904 |
- if(s->pict_type==FF_P_TYPE) |
|
| 3905 |
- ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END); |
|
| 3906 |
- } |
|
| 3907 |
- |
|
| 3908 |
- return 0; |
|
| 3909 |
-} |
|
| 3910 |
- |
|
| 3911 |
-/** |
|
| 3912 |
- * decodes a block. |
|
| 3913 |
- * @return <0 if an error occurred |
|
| 3914 |
- */ |
|
| 3915 |
-static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
|
| 3916 |
- int n, int coded, int intra, int rvlc) |
|
| 3917 |
-{
|
|
| 3918 |
- int level, i, last, run; |
|
| 3919 |
- int dc_pred_dir; |
|
| 3920 |
- RLTable * rl; |
|
| 3921 |
- RL_VLC_ELEM * rl_vlc; |
|
| 3922 |
- const uint8_t * scan_table; |
|
| 3923 |
- int qmul, qadd; |
|
| 3924 |
- |
|
| 3925 |
- //Note intra & rvlc should be optimized away if this is inlined |
|
| 3926 |
- |
|
| 3927 |
- if(intra) {
|
|
| 3928 |
- if(s->use_intra_dc_vlc){
|
|
| 3929 |
- /* DC coef */ |
|
| 3930 |
- if(s->partitioned_frame){
|
|
| 3931 |
- level = s->dc_val[0][ s->block_index[n] ]; |
|
| 3932 |
- if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale); |
|
| 3933 |
- else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale); |
|
| 3934 |
- dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; |
|
| 3935 |
- }else{
|
|
| 3936 |
- level = mpeg4_decode_dc(s, n, &dc_pred_dir); |
|
| 3937 |
- if (level < 0) |
|
| 3938 |
- return -1; |
|
| 3939 |
- } |
|
| 3940 |
- block[0] = level; |
|
| 3941 |
- i = 0; |
|
| 3942 |
- }else{
|
|
| 3943 |
- i = -1; |
|
| 3944 |
- ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0); |
|
| 3945 |
- } |
|
| 3946 |
- if (!coded) |
|
| 3947 |
- goto not_coded; |
|
| 3948 |
- |
|
| 3949 |
- if(rvlc){
|
|
| 3950 |
- rl = &rvlc_rl_intra; |
|
| 3951 |
- rl_vlc = rvlc_rl_intra.rl_vlc[0]; |
|
| 3952 |
- }else{
|
|
| 3953 |
- rl = &rl_intra; |
|
| 3954 |
- rl_vlc = rl_intra.rl_vlc[0]; |
|
| 3955 |
- } |
|
| 3956 |
- if (s->ac_pred) {
|
|
| 3957 |
- if (dc_pred_dir == 0) |
|
| 3958 |
- scan_table = s->intra_v_scantable.permutated; /* left */ |
|
| 3959 |
- else |
|
| 3960 |
- scan_table = s->intra_h_scantable.permutated; /* top */ |
|
| 3961 |
- } else {
|
|
| 3962 |
- scan_table = s->intra_scantable.permutated; |
|
| 3963 |
- } |
|
| 3964 |
- qmul=1; |
|
| 3965 |
- qadd=0; |
|
| 3966 |
- } else {
|
|
| 3967 |
- i = -1; |
|
| 3968 |
- if (!coded) {
|
|
| 3969 |
- s->block_last_index[n] = i; |
|
| 3970 |
- return 0; |
|
| 3971 |
- } |
|
| 3972 |
- if(rvlc) rl = &rvlc_rl_inter; |
|
| 3973 |
- else rl = &rl_inter; |
|
| 3974 |
- |
|
| 3975 |
- scan_table = s->intra_scantable.permutated; |
|
| 3976 |
- |
|
| 3977 |
- if(s->mpeg_quant){
|
|
| 3978 |
- qmul=1; |
|
| 3979 |
- qadd=0; |
|
| 3980 |
- if(rvlc){
|
|
| 3981 |
- rl_vlc = rvlc_rl_inter.rl_vlc[0]; |
|
| 3982 |
- }else{
|
|
| 3983 |
- rl_vlc = rl_inter.rl_vlc[0]; |
|
| 3984 |
- } |
|
| 3985 |
- }else{
|
|
| 3986 |
- qmul = s->qscale << 1; |
|
| 3987 |
- qadd = (s->qscale - 1) | 1; |
|
| 3988 |
- if(rvlc){
|
|
| 3989 |
- rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; |
|
| 3990 |
- }else{
|
|
| 3991 |
- rl_vlc = rl_inter.rl_vlc[s->qscale]; |
|
| 3992 |
- } |
|
| 3993 |
- } |
|
| 3994 |
- } |
|
| 3995 |
- {
|
|
| 3996 |
- OPEN_READER(re, &s->gb); |
|
| 3997 |
- for(;;) {
|
|
| 3998 |
- UPDATE_CACHE(re, &s->gb); |
|
| 3999 |
- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0); |
|
| 4000 |
- if (level==0) {
|
|
| 4001 |
- /* escape */ |
|
| 4002 |
- if(rvlc){
|
|
| 4003 |
- if(SHOW_UBITS(re, &s->gb, 1)==0){
|
|
| 4004 |
- av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n"); |
|
| 4005 |
- return -1; |
|
| 4006 |
- }; SKIP_CACHE(re, &s->gb, 1); |
|
| 4007 |
- |
|
| 4008 |
- last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); |
|
| 4009 |
- run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); |
|
| 4010 |
- SKIP_COUNTER(re, &s->gb, 1+1+6); |
|
| 4011 |
- UPDATE_CACHE(re, &s->gb); |
|
| 4012 |
- |
|
| 4013 |
- if(SHOW_UBITS(re, &s->gb, 1)==0){
|
|
| 4014 |
- av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n"); |
|
| 4015 |
- return -1; |
|
| 4016 |
- }; SKIP_CACHE(re, &s->gb, 1); |
|
| 4017 |
- |
|
| 4018 |
- level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); |
|
| 4019 |
- |
|
| 4020 |
- if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
|
|
| 4021 |
- av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n"); |
|
| 4022 |
- return -1; |
|
| 4023 |
- }; SKIP_CACHE(re, &s->gb, 5); |
|
| 4024 |
- |
|
| 4025 |
- level= level * qmul + qadd; |
|
| 4026 |
- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); |
|
| 4027 |
- SKIP_COUNTER(re, &s->gb, 1+11+5+1); |
|
| 4028 |
- |
|
| 4029 |
- i+= run + 1; |
|
| 4030 |
- if(last) i+=192; |
|
| 4031 |
- }else{
|
|
| 4032 |
- int cache; |
|
| 4033 |
- cache= GET_CACHE(re, &s->gb); |
|
| 4034 |
- |
|
| 4035 |
- if(IS_3IV1) |
|
| 4036 |
- cache ^= 0xC0000000; |
|
| 4037 |
- |
|
| 4038 |
- if (cache&0x80000000) {
|
|
| 4039 |
- if (cache&0x40000000) {
|
|
| 4040 |
- /* third escape */ |
|
| 4041 |
- SKIP_CACHE(re, &s->gb, 2); |
|
| 4042 |
- last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); |
|
| 4043 |
- run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); |
|
| 4044 |
- SKIP_COUNTER(re, &s->gb, 2+1+6); |
|
| 4045 |
- UPDATE_CACHE(re, &s->gb); |
|
| 4046 |
- |
|
| 4047 |
- if(IS_3IV1){
|
|
| 4048 |
- level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12); |
|
| 4049 |
- }else{
|
|
| 4050 |
- if(SHOW_UBITS(re, &s->gb, 1)==0){
|
|
| 4051 |
- av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n"); |
|
| 4052 |
- return -1; |
|
| 4053 |
- }; SKIP_CACHE(re, &s->gb, 1); |
|
| 4054 |
- |
|
| 4055 |
- level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12); |
|
| 4056 |
- |
|
| 4057 |
- if(SHOW_UBITS(re, &s->gb, 1)==0){
|
|
| 4058 |
- av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n"); |
|
| 4059 |
- return -1; |
|
| 4060 |
- }; LAST_SKIP_CACHE(re, &s->gb, 1); |
|
| 4061 |
- |
|
| 4062 |
- SKIP_COUNTER(re, &s->gb, 1+12+1); |
|
| 4063 |
- } |
|
| 4064 |
- |
|
| 4065 |
-#if 0 |
|
| 4066 |
- if(s->error_recognition >= FF_ER_COMPLIANT){
|
|
| 4067 |
- const int abs_level= FFABS(level); |
|
| 4068 |
- if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
|
|
| 4069 |
- const int run1= run - rl->max_run[last][abs_level] - 1; |
|
| 4070 |
- if(abs_level <= rl->max_level[last][run]){
|
|
| 4071 |
- av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n"); |
|
| 4072 |
- return -1; |
|
| 4073 |
- } |
|
| 4074 |
- if(s->error_recognition > FF_ER_COMPLIANT){
|
|
| 4075 |
- if(abs_level <= rl->max_level[last][run]*2){
|
|
| 4076 |
- av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n"); |
|
| 4077 |
- return -1; |
|
| 4078 |
- } |
|
| 4079 |
- if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
|
|
| 4080 |
- av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n"); |
|
| 4081 |
- return -1; |
|
| 4082 |
- } |
|
| 4083 |
- } |
|
| 4084 |
- } |
|
| 4085 |
- } |
|
| 4086 |
-#endif |
|
| 4087 |
- if (level>0) level= level * qmul + qadd; |
|
| 4088 |
- else level= level * qmul - qadd; |
|
| 4089 |
- |
|
| 4090 |
- if((unsigned)(level + 2048) > 4095){
|
|
| 4091 |
- if(s->error_recognition > FF_ER_COMPLIANT){
|
|
| 4092 |
- if(level > 2560 || level<-2560){
|
|
| 4093 |
- av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale); |
|
| 4094 |
- return -1; |
|
| 4095 |
- } |
|
| 4096 |
- } |
|
| 4097 |
- level= level<0 ? -2048 : 2047; |
|
| 4098 |
- } |
|
| 4099 |
- |
|
| 4100 |
- i+= run + 1; |
|
| 4101 |
- if(last) i+=192; |
|
| 4102 |
- } else {
|
|
| 4103 |
- /* second escape */ |
|
| 4104 |
-#if MIN_CACHE_BITS < 20 |
|
| 4105 |
- LAST_SKIP_BITS(re, &s->gb, 2); |
|
| 4106 |
- UPDATE_CACHE(re, &s->gb); |
|
| 4107 |
-#else |
|
| 4108 |
- SKIP_BITS(re, &s->gb, 2); |
|
| 4109 |
-#endif |
|
| 4110 |
- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); |
|
| 4111 |
- i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing |
|
| 4112 |
- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); |
|
| 4113 |
- LAST_SKIP_BITS(re, &s->gb, 1); |
|
| 4114 |
- } |
|
| 4115 |
- } else {
|
|
| 4116 |
- /* first escape */ |
|
| 4117 |
-#if MIN_CACHE_BITS < 19 |
|
| 4118 |
- LAST_SKIP_BITS(re, &s->gb, 1); |
|
| 4119 |
- UPDATE_CACHE(re, &s->gb); |
|
| 4120 |
-#else |
|
| 4121 |
- SKIP_BITS(re, &s->gb, 1); |
|
| 4122 |
-#endif |
|
| 4123 |
- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); |
|
| 4124 |
- i+= run; |
|
| 4125 |
- level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing |
|
| 4126 |
- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); |
|
| 4127 |
- LAST_SKIP_BITS(re, &s->gb, 1); |
|
| 4128 |
- } |
|
| 4129 |
- } |
|
| 4130 |
- } else {
|
|
| 4131 |
- i+= run; |
|
| 4132 |
- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); |
|
| 4133 |
- LAST_SKIP_BITS(re, &s->gb, 1); |
|
| 4134 |
- } |
|
| 4135 |
- if (i > 62){
|
|
| 4136 |
- i-= 192; |
|
| 4137 |
- if(i&(~63)){
|
|
| 4138 |
- av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); |
|
| 4139 |
- return -1; |
|
| 4140 |
- } |
|
| 4141 |
- |
|
| 4142 |
- block[scan_table[i]] = level; |
|
| 4143 |
- break; |
|
| 4144 |
- } |
|
| 4145 |
- |
|
| 4146 |
- block[scan_table[i]] = level; |
|
| 4147 |
- } |
|
| 4148 |
- CLOSE_READER(re, &s->gb); |
|
| 4149 |
- } |
|
| 4150 |
- not_coded: |
|
| 4151 |
- if (intra) {
|
|
| 4152 |
- if(!s->use_intra_dc_vlc){
|
|
| 4153 |
- block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); |
|
| 4154 |
- |
|
| 4155 |
- i -= i>>31; //if(i == -1) i=0; |
|
| 4156 |
- } |
|
| 4157 |
- |
|
| 4158 |
- mpeg4_pred_ac(s, block, n, dc_pred_dir); |
|
| 4159 |
- if (s->ac_pred) {
|
|
| 4160 |
- i = 63; /* XXX: not optimal */ |
|
| 4161 |
- } |
|
| 4162 |
- } |
|
| 4163 |
- s->block_last_index[n] = i; |
|
| 4164 |
- return 0; |
|
| 4165 |
-} |
|
| 4166 |
- |
|
| 4167 |
-/** |
|
| 4168 |
- * decode partition C of one MB. |
|
| 4169 |
- * @return <0 if an error occurred |
|
| 4170 |
- */ |
|
| 4171 |
-static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) |
|
| 4172 |
-{
|
|
| 4173 |
- int cbp, mb_type; |
|
| 4174 |
- const int xy= s->mb_x + s->mb_y*s->mb_stride; |
|
| 4175 |
- |
|
| 4176 |
- mb_type= s->current_picture.mb_type[xy]; |
|
| 4177 |
- cbp = s->cbp_table[xy]; |
|
| 4178 |
- |
|
| 4179 |
- s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold; |
|
| 4180 |
- |
|
| 4181 |
- if(s->current_picture.qscale_table[xy] != s->qscale){
|
|
| 4182 |
- ff_set_qscale(s, s->current_picture.qscale_table[xy] ); |
|
| 4183 |
- } |
|
| 4184 |
- |
|
| 4185 |
- if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
|
|
| 4186 |
- int i; |
|
| 4187 |
- for(i=0; i<4; i++){
|
|
| 4188 |
- s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0]; |
|
| 4189 |
- s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1]; |
|
| 4190 |
- } |
|
| 4191 |
- s->mb_intra = IS_INTRA(mb_type); |
|
| 4192 |
- |
|
| 4193 |
- if (IS_SKIP(mb_type)) {
|
|
| 4194 |
- /* skip mb */ |
|
| 4195 |
- for(i=0;i<6;i++) |
|
| 4196 |
- s->block_last_index[i] = -1; |
|
| 4197 |
- s->mv_dir = MV_DIR_FORWARD; |
|
| 4198 |
- s->mv_type = MV_TYPE_16X16; |
|
| 4199 |
- if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
|
|
| 4200 |
- s->mcsel=1; |
|
| 4201 |
- s->mb_skipped = 0; |
|
| 4202 |
- }else{
|
|
| 4203 |
- s->mcsel=0; |
|
| 4204 |
- s->mb_skipped = 1; |
|
| 4205 |
- } |
|
| 4206 |
- }else if(s->mb_intra){
|
|
| 4207 |
- s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); |
|
| 4208 |
- }else if(!s->mb_intra){
|
|
| 4209 |
-// s->mcsel= 0; //FIXME do we need to init that |
|
| 4210 |
- |
|
| 4211 |
- s->mv_dir = MV_DIR_FORWARD; |
|
| 4212 |
- if (IS_8X8(mb_type)) {
|
|
| 4213 |
- s->mv_type = MV_TYPE_8X8; |
|
| 4214 |
- } else {
|
|
| 4215 |
- s->mv_type = MV_TYPE_16X16; |
|
| 4216 |
- } |
|
| 4217 |
- } |
|
| 4218 |
- } else { /* I-Frame */
|
|
| 4219 |
- s->mb_intra = 1; |
|
| 4220 |
- s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); |
|
| 4221 |
- } |
|
| 4222 |
- |
|
| 4223 |
- if (!IS_SKIP(mb_type)) {
|
|
| 4224 |
- int i; |
|
| 4225 |
- s->dsp.clear_blocks(s->block[0]); |
|
| 4226 |
- /* decode each block */ |
|
| 4227 |
- for (i = 0; i < 6; i++) {
|
|
| 4228 |
- if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
|
|
| 4229 |
- av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); |
|
| 4230 |
- return -1; |
|
| 4231 |
- } |
|
| 4232 |
- cbp+=cbp; |
|
| 4233 |
- } |
|
| 4234 |
- } |
|
| 4235 |
- |
|
| 4236 |
- /* per-MB end of slice check */ |
|
| 4237 |
- |
|
| 4238 |
- if(--s->mb_num_left <= 0){
|
|
| 4239 |
- if(mpeg4_is_resync(s)) |
|
| 4240 |
- return SLICE_END; |
|
| 4241 |
- else |
|
| 4242 |
- return SLICE_NOEND; |
|
| 4243 |
- }else{
|
|
| 4244 |
- if(mpeg4_is_resync(s)){
|
|
| 4245 |
- const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; |
|
| 4246 |
- if(s->cbp_table[xy+delta]) |
|
| 4247 |
- return SLICE_END; |
|
| 4248 |
- } |
|
| 4249 |
- return SLICE_OK; |
|
| 4250 |
- } |
|
| 4251 |
-} |
|
| 4252 | 3513 |
|
| 4253 | 3514 |
/* Decodes RVLC of H.263+ UMV */ |
| 4254 | 3515 |
static int h263p_decode_umotion(MpegEncContext * s, int pred) |
| ... | ... |
@@ -4807,335 +2108,6 @@ end: |
| 4807 | 4807 |
return SLICE_OK; |
| 4808 | 4808 |
} |
| 4809 | 4809 |
|
| 4810 |
-int ff_mpeg4_decode_mb(MpegEncContext *s, |
|
| 4811 |
- DCTELEM block[6][64]) |
|
| 4812 |
-{
|
|
| 4813 |
- int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; |
|
| 4814 |
- int16_t *mot_val; |
|
| 4815 |
- static int8_t quant_tab[4] = { -1, -2, 1, 2 };
|
|
| 4816 |
- const int xy= s->mb_x + s->mb_y * s->mb_stride; |
|
| 4817 |
- |
|
| 4818 |
- assert(s->h263_pred); |
|
| 4819 |
- |
|
| 4820 |
- if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
|
|
| 4821 |
- do{
|
|
| 4822 |
- if (get_bits1(&s->gb)) {
|
|
| 4823 |
- /* skip mb */ |
|
| 4824 |
- s->mb_intra = 0; |
|
| 4825 |
- for(i=0;i<6;i++) |
|
| 4826 |
- s->block_last_index[i] = -1; |
|
| 4827 |
- s->mv_dir = MV_DIR_FORWARD; |
|
| 4828 |
- s->mv_type = MV_TYPE_16X16; |
|
| 4829 |
- if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
|
|
| 4830 |
- s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 4831 |
- s->mcsel=1; |
|
| 4832 |
- s->mv[0][0][0]= get_amv(s, 0); |
|
| 4833 |
- s->mv[0][0][1]= get_amv(s, 1); |
|
| 4834 |
- |
|
| 4835 |
- s->mb_skipped = 0; |
|
| 4836 |
- }else{
|
|
| 4837 |
- s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 4838 |
- s->mcsel=0; |
|
| 4839 |
- s->mv[0][0][0] = 0; |
|
| 4840 |
- s->mv[0][0][1] = 0; |
|
| 4841 |
- s->mb_skipped = 1; |
|
| 4842 |
- } |
|
| 4843 |
- goto end; |
|
| 4844 |
- } |
|
| 4845 |
- cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); |
|
| 4846 |
- if (cbpc < 0){
|
|
| 4847 |
- av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y); |
|
| 4848 |
- return -1; |
|
| 4849 |
- } |
|
| 4850 |
- }while(cbpc == 20); |
|
| 4851 |
- |
|
| 4852 |
- s->dsp.clear_blocks(s->block[0]); |
|
| 4853 |
- dquant = cbpc & 8; |
|
| 4854 |
- s->mb_intra = ((cbpc & 4) != 0); |
|
| 4855 |
- if (s->mb_intra) goto intra; |
|
| 4856 |
- |
|
| 4857 |
- if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0) |
|
| 4858 |
- s->mcsel= get_bits1(&s->gb); |
|
| 4859 |
- else s->mcsel= 0; |
|
| 4860 |
- cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F; |
|
| 4861 |
- |
|
| 4862 |
- cbp = (cbpc & 3) | (cbpy << 2); |
|
| 4863 |
- if (dquant) {
|
|
| 4864 |
- ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
| 4865 |
- } |
|
| 4866 |
- if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE))) |
|
| 4867 |
- s->interlaced_dct= get_bits1(&s->gb); |
|
| 4868 |
- |
|
| 4869 |
- s->mv_dir = MV_DIR_FORWARD; |
|
| 4870 |
- if ((cbpc & 16) == 0) {
|
|
| 4871 |
- if(s->mcsel){
|
|
| 4872 |
- s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 4873 |
- /* 16x16 global motion prediction */ |
|
| 4874 |
- s->mv_type = MV_TYPE_16X16; |
|
| 4875 |
- mx= get_amv(s, 0); |
|
| 4876 |
- my= get_amv(s, 1); |
|
| 4877 |
- s->mv[0][0][0] = mx; |
|
| 4878 |
- s->mv[0][0][1] = my; |
|
| 4879 |
- }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
|
|
| 4880 |
- s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED; |
|
| 4881 |
- /* 16x8 field motion prediction */ |
|
| 4882 |
- s->mv_type= MV_TYPE_FIELD; |
|
| 4883 |
- |
|
| 4884 |
- s->field_select[0][0]= get_bits1(&s->gb); |
|
| 4885 |
- s->field_select[0][1]= get_bits1(&s->gb); |
|
| 4886 |
- |
|
| 4887 |
- h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
|
| 4888 |
- |
|
| 4889 |
- for(i=0; i<2; i++){
|
|
| 4890 |
- mx = h263_decode_motion(s, pred_x, s->f_code); |
|
| 4891 |
- if (mx >= 0xffff) |
|
| 4892 |
- return -1; |
|
| 4893 |
- |
|
| 4894 |
- my = h263_decode_motion(s, pred_y/2, s->f_code); |
|
| 4895 |
- if (my >= 0xffff) |
|
| 4896 |
- return -1; |
|
| 4897 |
- |
|
| 4898 |
- s->mv[0][i][0] = mx; |
|
| 4899 |
- s->mv[0][i][1] = my; |
|
| 4900 |
- } |
|
| 4901 |
- }else{
|
|
| 4902 |
- s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 4903 |
- /* 16x16 motion prediction */ |
|
| 4904 |
- s->mv_type = MV_TYPE_16X16; |
|
| 4905 |
- h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
|
| 4906 |
- mx = h263_decode_motion(s, pred_x, s->f_code); |
|
| 4907 |
- |
|
| 4908 |
- if (mx >= 0xffff) |
|
| 4909 |
- return -1; |
|
| 4910 |
- |
|
| 4911 |
- my = h263_decode_motion(s, pred_y, s->f_code); |
|
| 4912 |
- |
|
| 4913 |
- if (my >= 0xffff) |
|
| 4914 |
- return -1; |
|
| 4915 |
- s->mv[0][0][0] = mx; |
|
| 4916 |
- s->mv[0][0][1] = my; |
|
| 4917 |
- } |
|
| 4918 |
- } else {
|
|
| 4919 |
- s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0; |
|
| 4920 |
- s->mv_type = MV_TYPE_8X8; |
|
| 4921 |
- for(i=0;i<4;i++) {
|
|
| 4922 |
- mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
|
| 4923 |
- mx = h263_decode_motion(s, pred_x, s->f_code); |
|
| 4924 |
- if (mx >= 0xffff) |
|
| 4925 |
- return -1; |
|
| 4926 |
- |
|
| 4927 |
- my = h263_decode_motion(s, pred_y, s->f_code); |
|
| 4928 |
- if (my >= 0xffff) |
|
| 4929 |
- return -1; |
|
| 4930 |
- s->mv[0][i][0] = mx; |
|
| 4931 |
- s->mv[0][i][1] = my; |
|
| 4932 |
- mot_val[0] = mx; |
|
| 4933 |
- mot_val[1] = my; |
|
| 4934 |
- } |
|
| 4935 |
- } |
|
| 4936 |
- } else if(s->pict_type==FF_B_TYPE) {
|
|
| 4937 |
- int modb1; // first bit of modb |
|
| 4938 |
- int modb2; // second bit of modb |
|
| 4939 |
- int mb_type; |
|
| 4940 |
- |
|
| 4941 |
- s->mb_intra = 0; //B-frames never contain intra blocks |
|
| 4942 |
- s->mcsel=0; // ... true gmc blocks |
|
| 4943 |
- |
|
| 4944 |
- if(s->mb_x==0){
|
|
| 4945 |
- for(i=0; i<2; i++){
|
|
| 4946 |
- s->last_mv[i][0][0]= |
|
| 4947 |
- s->last_mv[i][0][1]= |
|
| 4948 |
- s->last_mv[i][1][0]= |
|
| 4949 |
- s->last_mv[i][1][1]= 0; |
|
| 4950 |
- } |
|
| 4951 |
- } |
|
| 4952 |
- |
|
| 4953 |
- /* if we skipped it in the future P Frame than skip it now too */ |
|
| 4954 |
- s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC |
|
| 4955 |
- |
|
| 4956 |
- if(s->mb_skipped){
|
|
| 4957 |
- /* skip mb */ |
|
| 4958 |
- for(i=0;i<6;i++) |
|
| 4959 |
- s->block_last_index[i] = -1; |
|
| 4960 |
- |
|
| 4961 |
- s->mv_dir = MV_DIR_FORWARD; |
|
| 4962 |
- s->mv_type = MV_TYPE_16X16; |
|
| 4963 |
- s->mv[0][0][0] = 0; |
|
| 4964 |
- s->mv[0][0][1] = 0; |
|
| 4965 |
- s->mv[1][0][0] = 0; |
|
| 4966 |
- s->mv[1][0][1] = 0; |
|
| 4967 |
- s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 4968 |
- goto end; |
|
| 4969 |
- } |
|
| 4970 |
- |
|
| 4971 |
- modb1= get_bits1(&s->gb); |
|
| 4972 |
- if(modb1){
|
|
| 4973 |
- mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded |
|
| 4974 |
- cbp=0; |
|
| 4975 |
- }else{
|
|
| 4976 |
- modb2= get_bits1(&s->gb); |
|
| 4977 |
- mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1); |
|
| 4978 |
- if(mb_type<0){
|
|
| 4979 |
- av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n"); |
|
| 4980 |
- return -1; |
|
| 4981 |
- } |
|
| 4982 |
- mb_type= mb_type_b_map[ mb_type ]; |
|
| 4983 |
- if(modb2) cbp= 0; |
|
| 4984 |
- else{
|
|
| 4985 |
- s->dsp.clear_blocks(s->block[0]); |
|
| 4986 |
- cbp= get_bits(&s->gb, 6); |
|
| 4987 |
- } |
|
| 4988 |
- |
|
| 4989 |
- if ((!IS_DIRECT(mb_type)) && cbp) {
|
|
| 4990 |
- if(get_bits1(&s->gb)){
|
|
| 4991 |
- ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2); |
|
| 4992 |
- } |
|
| 4993 |
- } |
|
| 4994 |
- |
|
| 4995 |
- if(!s->progressive_sequence){
|
|
| 4996 |
- if(cbp) |
|
| 4997 |
- s->interlaced_dct= get_bits1(&s->gb); |
|
| 4998 |
- |
|
| 4999 |
- if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
|
|
| 5000 |
- mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; |
|
| 5001 |
- mb_type &= ~MB_TYPE_16x16; |
|
| 5002 |
- |
|
| 5003 |
- if(USES_LIST(mb_type, 0)){
|
|
| 5004 |
- s->field_select[0][0]= get_bits1(&s->gb); |
|
| 5005 |
- s->field_select[0][1]= get_bits1(&s->gb); |
|
| 5006 |
- } |
|
| 5007 |
- if(USES_LIST(mb_type, 1)){
|
|
| 5008 |
- s->field_select[1][0]= get_bits1(&s->gb); |
|
| 5009 |
- s->field_select[1][1]= get_bits1(&s->gb); |
|
| 5010 |
- } |
|
| 5011 |
- } |
|
| 5012 |
- } |
|
| 5013 |
- |
|
| 5014 |
- s->mv_dir = 0; |
|
| 5015 |
- if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
|
|
| 5016 |
- s->mv_type= MV_TYPE_16X16; |
|
| 5017 |
- |
|
| 5018 |
- if(USES_LIST(mb_type, 0)){
|
|
| 5019 |
- s->mv_dir = MV_DIR_FORWARD; |
|
| 5020 |
- |
|
| 5021 |
- mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code); |
|
| 5022 |
- my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code); |
|
| 5023 |
- s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx; |
|
| 5024 |
- s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my; |
|
| 5025 |
- } |
|
| 5026 |
- |
|
| 5027 |
- if(USES_LIST(mb_type, 1)){
|
|
| 5028 |
- s->mv_dir |= MV_DIR_BACKWARD; |
|
| 5029 |
- |
|
| 5030 |
- mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code); |
|
| 5031 |
- my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code); |
|
| 5032 |
- s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx; |
|
| 5033 |
- s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my; |
|
| 5034 |
- } |
|
| 5035 |
- }else if(!IS_DIRECT(mb_type)){
|
|
| 5036 |
- s->mv_type= MV_TYPE_FIELD; |
|
| 5037 |
- |
|
| 5038 |
- if(USES_LIST(mb_type, 0)){
|
|
| 5039 |
- s->mv_dir = MV_DIR_FORWARD; |
|
| 5040 |
- |
|
| 5041 |
- for(i=0; i<2; i++){
|
|
| 5042 |
- mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code); |
|
| 5043 |
- my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code); |
|
| 5044 |
- s->last_mv[0][i][0]= s->mv[0][i][0] = mx; |
|
| 5045 |
- s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2; |
|
| 5046 |
- } |
|
| 5047 |
- } |
|
| 5048 |
- |
|
| 5049 |
- if(USES_LIST(mb_type, 1)){
|
|
| 5050 |
- s->mv_dir |= MV_DIR_BACKWARD; |
|
| 5051 |
- |
|
| 5052 |
- for(i=0; i<2; i++){
|
|
| 5053 |
- mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code); |
|
| 5054 |
- my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code); |
|
| 5055 |
- s->last_mv[1][i][0]= s->mv[1][i][0] = mx; |
|
| 5056 |
- s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2; |
|
| 5057 |
- } |
|
| 5058 |
- } |
|
| 5059 |
- } |
|
| 5060 |
- } |
|
| 5061 |
- |
|
| 5062 |
- if(IS_DIRECT(mb_type)){
|
|
| 5063 |
- if(IS_SKIP(mb_type)) |
|
| 5064 |
- mx=my=0; |
|
| 5065 |
- else{
|
|
| 5066 |
- mx = h263_decode_motion(s, 0, 1); |
|
| 5067 |
- my = h263_decode_motion(s, 0, 1); |
|
| 5068 |
- } |
|
| 5069 |
- |
|
| 5070 |
- s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; |
|
| 5071 |
- mb_type |= ff_mpeg4_set_direct_mv(s, mx, my); |
|
| 5072 |
- } |
|
| 5073 |
- s->current_picture.mb_type[xy]= mb_type; |
|
| 5074 |
- } else { /* I-Frame */
|
|
| 5075 |
- do{
|
|
| 5076 |
- cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2); |
|
| 5077 |
- if (cbpc < 0){
|
|
| 5078 |
- av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y); |
|
| 5079 |
- return -1; |
|
| 5080 |
- } |
|
| 5081 |
- }while(cbpc == 8); |
|
| 5082 |
- |
|
| 5083 |
- dquant = cbpc & 4; |
|
| 5084 |
- s->mb_intra = 1; |
|
| 5085 |
-intra: |
|
| 5086 |
- s->ac_pred = get_bits1(&s->gb); |
|
| 5087 |
- if(s->ac_pred) |
|
| 5088 |
- s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED; |
|
| 5089 |
- else |
|
| 5090 |
- s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
|
| 5091 |
- |
|
| 5092 |
- cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
|
| 5093 |
- if(cbpy<0){
|
|
| 5094 |
- av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y); |
|
| 5095 |
- return -1; |
|
| 5096 |
- } |
|
| 5097 |
- cbp = (cbpc & 3) | (cbpy << 2); |
|
| 5098 |
- |
|
| 5099 |
- s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold; |
|
| 5100 |
- |
|
| 5101 |
- if (dquant) {
|
|
| 5102 |
- ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
| 5103 |
- } |
|
| 5104 |
- |
|
| 5105 |
- if(!s->progressive_sequence) |
|
| 5106 |
- s->interlaced_dct= get_bits1(&s->gb); |
|
| 5107 |
- |
|
| 5108 |
- s->dsp.clear_blocks(s->block[0]); |
|
| 5109 |
- /* decode each block */ |
|
| 5110 |
- for (i = 0; i < 6; i++) {
|
|
| 5111 |
- if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0) |
|
| 5112 |
- return -1; |
|
| 5113 |
- cbp+=cbp; |
|
| 5114 |
- } |
|
| 5115 |
- goto end; |
|
| 5116 |
- } |
|
| 5117 |
- |
|
| 5118 |
- /* decode each block */ |
|
| 5119 |
- for (i = 0; i < 6; i++) {
|
|
| 5120 |
- if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0) |
|
| 5121 |
- return -1; |
|
| 5122 |
- cbp+=cbp; |
|
| 5123 |
- } |
|
| 5124 |
-end: |
|
| 5125 |
- |
|
| 5126 |
- /* per-MB end of slice check */ |
|
| 5127 |
- if(s->codec_id==CODEC_ID_MPEG4){
|
|
| 5128 |
- if(mpeg4_is_resync(s)){
|
|
| 5129 |
- const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; |
|
| 5130 |
- if(s->pict_type==FF_B_TYPE && s->next_picture.mbskip_table[xy + delta]) |
|
| 5131 |
- return SLICE_OK; |
|
| 5132 |
- return SLICE_END; |
|
| 5133 |
- } |
|
| 5134 |
- } |
|
| 5135 |
- |
|
| 5136 |
- return SLICE_OK; |
|
| 5137 |
-} |
|
| 5138 |
- |
|
| 5139 | 4810 |
/* most is hardcoded. should extend to handle all h263 streams */ |
| 5140 | 4811 |
int h263_decode_picture_header(MpegEncContext *s) |
| 5141 | 4812 |
{
|
| ... | ... |
@@ -5294,7 +2266,7 @@ int h263_decode_picture_header(MpegEncContext *s) |
| 5294 | 5294 |
s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8); |
| 5295 | 5295 |
s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8); |
| 5296 | 5296 |
}else{
|
| 5297 |
- s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info]; |
|
| 5297 |
+ s->avctx->sample_aspect_ratio= ff_h263_pixel_aspect[s->aspect_ratio_info]; |
|
| 5298 | 5298 |
} |
| 5299 | 5299 |
} else {
|
| 5300 | 5300 |
width = h263_format[format][0]; |
| ... | ... |
@@ -5403,688 +2375,4 @@ int h263_decode_picture_header(MpegEncContext *s) |
| 5403 | 5403 |
return 0; |
| 5404 | 5404 |
} |
| 5405 | 5405 |
|
| 5406 |
-static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
|
|
| 5407 |
- int hours, minutes, seconds; |
|
| 5408 |
- |
|
| 5409 |
- hours= get_bits(gb, 5); |
|
| 5410 |
- minutes= get_bits(gb, 6); |
|
| 5411 |
- skip_bits1(gb); |
|
| 5412 |
- seconds= get_bits(gb, 6); |
|
| 5413 |
- |
|
| 5414 |
- s->time_base= seconds + 60*(minutes + 60*hours); |
|
| 5415 |
- |
|
| 5416 |
- skip_bits1(gb); |
|
| 5417 |
- skip_bits1(gb); |
|
| 5418 |
- |
|
| 5419 |
- return 0; |
|
| 5420 |
-} |
|
| 5421 |
- |
|
| 5422 |
-static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
|
|
| 5423 |
- int width, height, vo_ver_id; |
|
| 5424 |
- |
|
| 5425 |
- /* vol header */ |
|
| 5426 |
- skip_bits(gb, 1); /* random access */ |
|
| 5427 |
- s->vo_type= get_bits(gb, 8); |
|
| 5428 |
- if (get_bits1(gb) != 0) { /* is_ol_id */
|
|
| 5429 |
- vo_ver_id = get_bits(gb, 4); /* vo_ver_id */ |
|
| 5430 |
- skip_bits(gb, 3); /* vo_priority */ |
|
| 5431 |
- } else {
|
|
| 5432 |
- vo_ver_id = 1; |
|
| 5433 |
- } |
|
| 5434 |
- s->aspect_ratio_info= get_bits(gb, 4); |
|
| 5435 |
- if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
|
|
| 5436 |
- s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width |
|
| 5437 |
- s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height |
|
| 5438 |
- }else{
|
|
| 5439 |
- s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info]; |
|
| 5440 |
- } |
|
| 5441 |
- |
|
| 5442 |
- if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
|
|
| 5443 |
- int chroma_format= get_bits(gb, 2); |
|
| 5444 |
- if(chroma_format!=CHROMA_420){
|
|
| 5445 |
- av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n"); |
|
| 5446 |
- } |
|
| 5447 |
- s->low_delay= get_bits1(gb); |
|
| 5448 |
- if(get_bits1(gb)){ /* vbv parameters */
|
|
| 5449 |
- get_bits(gb, 15); /* first_half_bitrate */ |
|
| 5450 |
- skip_bits1(gb); /* marker */ |
|
| 5451 |
- get_bits(gb, 15); /* latter_half_bitrate */ |
|
| 5452 |
- skip_bits1(gb); /* marker */ |
|
| 5453 |
- get_bits(gb, 15); /* first_half_vbv_buffer_size */ |
|
| 5454 |
- skip_bits1(gb); /* marker */ |
|
| 5455 |
- get_bits(gb, 3); /* latter_half_vbv_buffer_size */ |
|
| 5456 |
- get_bits(gb, 11); /* first_half_vbv_occupancy */ |
|
| 5457 |
- skip_bits1(gb); /* marker */ |
|
| 5458 |
- get_bits(gb, 15); /* latter_half_vbv_occupancy */ |
|
| 5459 |
- skip_bits1(gb); /* marker */ |
|
| 5460 |
- } |
|
| 5461 |
- }else{
|
|
| 5462 |
- // set low delay flag only once the smartest? low delay detection won't be overriden |
|
| 5463 |
- if(s->picture_number==0) |
|
| 5464 |
- s->low_delay=0; |
|
| 5465 |
- } |
|
| 5466 | 5406 |
|
| 5467 |
- s->shape = get_bits(gb, 2); /* vol shape */ |
|
| 5468 |
- if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n"); |
|
| 5469 |
- if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
|
|
| 5470 |
- av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n"); |
|
| 5471 |
- skip_bits(gb, 4); //video_object_layer_shape_extension |
|
| 5472 |
- } |
|
| 5473 |
- |
|
| 5474 |
- check_marker(gb, "before time_increment_resolution"); |
|
| 5475 |
- |
|
| 5476 |
- s->avctx->time_base.den = get_bits(gb, 16); |
|
| 5477 |
- if(!s->avctx->time_base.den){
|
|
| 5478 |
- av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n"); |
|
| 5479 |
- return -1; |
|
| 5480 |
- } |
|
| 5481 |
- |
|
| 5482 |
- s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1; |
|
| 5483 |
- if (s->time_increment_bits < 1) |
|
| 5484 |
- s->time_increment_bits = 1; |
|
| 5485 |
- |
|
| 5486 |
- check_marker(gb, "before fixed_vop_rate"); |
|
| 5487 |
- |
|
| 5488 |
- if (get_bits1(gb) != 0) { /* fixed_vop_rate */
|
|
| 5489 |
- s->avctx->time_base.num = get_bits(gb, s->time_increment_bits); |
|
| 5490 |
- }else |
|
| 5491 |
- s->avctx->time_base.num = 1; |
|
| 5492 |
- |
|
| 5493 |
- s->t_frame=0; |
|
| 5494 |
- |
|
| 5495 |
- if (s->shape != BIN_ONLY_SHAPE) {
|
|
| 5496 |
- if (s->shape == RECT_SHAPE) {
|
|
| 5497 |
- skip_bits1(gb); /* marker */ |
|
| 5498 |
- width = get_bits(gb, 13); |
|
| 5499 |
- skip_bits1(gb); /* marker */ |
|
| 5500 |
- height = get_bits(gb, 13); |
|
| 5501 |
- skip_bits1(gb); /* marker */ |
|
| 5502 |
- if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */
|
|
| 5503 |
- s->width = width; |
|
| 5504 |
- s->height = height; |
|
| 5505 |
- } |
|
| 5506 |
- } |
|
| 5507 |
- |
|
| 5508 |
- s->progressive_sequence= |
|
| 5509 |
- s->progressive_frame= get_bits1(gb)^1; |
|
| 5510 |
- s->interlaced_dct=0; |
|
| 5511 |
- if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO)) |
|
| 5512 |
- av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */ |
|
| 5513 |
- if (vo_ver_id == 1) {
|
|
| 5514 |
- s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */ |
|
| 5515 |
- } else {
|
|
| 5516 |
- s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */ |
|
| 5517 |
- } |
|
| 5518 |
- if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n"); |
|
| 5519 |
- if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
|
|
| 5520 |
- if(s->vol_sprite_usage==STATIC_SPRITE){
|
|
| 5521 |
- s->sprite_width = get_bits(gb, 13); |
|
| 5522 |
- skip_bits1(gb); /* marker */ |
|
| 5523 |
- s->sprite_height= get_bits(gb, 13); |
|
| 5524 |
- skip_bits1(gb); /* marker */ |
|
| 5525 |
- s->sprite_left = get_bits(gb, 13); |
|
| 5526 |
- skip_bits1(gb); /* marker */ |
|
| 5527 |
- s->sprite_top = get_bits(gb, 13); |
|
| 5528 |
- skip_bits1(gb); /* marker */ |
|
| 5529 |
- } |
|
| 5530 |
- s->num_sprite_warping_points= get_bits(gb, 6); |
|
| 5531 |
- if(s->num_sprite_warping_points > 3){
|
|
| 5532 |
- av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points); |
|
| 5533 |
- s->num_sprite_warping_points= 0; |
|
| 5534 |
- return -1; |
|
| 5535 |
- } |
|
| 5536 |
- s->sprite_warping_accuracy = get_bits(gb, 2); |
|
| 5537 |
- s->sprite_brightness_change= get_bits1(gb); |
|
| 5538 |
- if(s->vol_sprite_usage==STATIC_SPRITE) |
|
| 5539 |
- s->low_latency_sprite= get_bits1(gb); |
|
| 5540 |
- } |
|
| 5541 |
- // FIXME sadct disable bit if verid!=1 && shape not rect |
|
| 5542 |
- |
|
| 5543 |
- if (get_bits1(gb) == 1) { /* not_8_bit */
|
|
| 5544 |
- s->quant_precision = get_bits(gb, 4); /* quant_precision */ |
|
| 5545 |
- if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */ |
|
| 5546 |
- if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision); |
|
| 5547 |
- } else {
|
|
| 5548 |
- s->quant_precision = 5; |
|
| 5549 |
- } |
|
| 5550 |
- |
|
| 5551 |
- // FIXME a bunch of grayscale shape things |
|
| 5552 |
- |
|
| 5553 |
- if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
|
|
| 5554 |
- int i, v; |
|
| 5555 |
- |
|
| 5556 |
- /* load default matrixes */ |
|
| 5557 |
- for(i=0; i<64; i++){
|
|
| 5558 |
- int j= s->dsp.idct_permutation[i]; |
|
| 5559 |
- v= ff_mpeg4_default_intra_matrix[i]; |
|
| 5560 |
- s->intra_matrix[j]= v; |
|
| 5561 |
- s->chroma_intra_matrix[j]= v; |
|
| 5562 |
- |
|
| 5563 |
- v= ff_mpeg4_default_non_intra_matrix[i]; |
|
| 5564 |
- s->inter_matrix[j]= v; |
|
| 5565 |
- s->chroma_inter_matrix[j]= v; |
|
| 5566 |
- } |
|
| 5567 |
- |
|
| 5568 |
- /* load custom intra matrix */ |
|
| 5569 |
- if(get_bits1(gb)){
|
|
| 5570 |
- int last=0; |
|
| 5571 |
- for(i=0; i<64; i++){
|
|
| 5572 |
- int j; |
|
| 5573 |
- v= get_bits(gb, 8); |
|
| 5574 |
- if(v==0) break; |
|
| 5575 |
- |
|
| 5576 |
- last= v; |
|
| 5577 |
- j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
| 5578 |
- s->intra_matrix[j]= v; |
|
| 5579 |
- s->chroma_intra_matrix[j]= v; |
|
| 5580 |
- } |
|
| 5581 |
- |
|
| 5582 |
- /* replicate last value */ |
|
| 5583 |
- for(; i<64; i++){
|
|
| 5584 |
- int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
| 5585 |
- s->intra_matrix[j]= last; |
|
| 5586 |
- s->chroma_intra_matrix[j]= last; |
|
| 5587 |
- } |
|
| 5588 |
- } |
|
| 5589 |
- |
|
| 5590 |
- /* load custom non intra matrix */ |
|
| 5591 |
- if(get_bits1(gb)){
|
|
| 5592 |
- int last=0; |
|
| 5593 |
- for(i=0; i<64; i++){
|
|
| 5594 |
- int j; |
|
| 5595 |
- v= get_bits(gb, 8); |
|
| 5596 |
- if(v==0) break; |
|
| 5597 |
- |
|
| 5598 |
- last= v; |
|
| 5599 |
- j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
| 5600 |
- s->inter_matrix[j]= v; |
|
| 5601 |
- s->chroma_inter_matrix[j]= v; |
|
| 5602 |
- } |
|
| 5603 |
- |
|
| 5604 |
- /* replicate last value */ |
|
| 5605 |
- for(; i<64; i++){
|
|
| 5606 |
- int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
| 5607 |
- s->inter_matrix[j]= last; |
|
| 5608 |
- s->chroma_inter_matrix[j]= last; |
|
| 5609 |
- } |
|
| 5610 |
- } |
|
| 5611 |
- |
|
| 5612 |
- // FIXME a bunch of grayscale shape things |
|
| 5613 |
- } |
|
| 5614 |
- |
|
| 5615 |
- if(vo_ver_id != 1) |
|
| 5616 |
- s->quarter_sample= get_bits1(gb); |
|
| 5617 |
- else s->quarter_sample=0; |
|
| 5618 |
- |
|
| 5619 |
- if(!get_bits1(gb)){
|
|
| 5620 |
- int pos= get_bits_count(gb); |
|
| 5621 |
- int estimation_method= get_bits(gb, 2); |
|
| 5622 |
- if(estimation_method<2){
|
|
| 5623 |
- if(!get_bits1(gb)){
|
|
| 5624 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque |
|
| 5625 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent |
|
| 5626 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae |
|
| 5627 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae |
|
| 5628 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update |
|
| 5629 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling |
|
| 5630 |
- } |
|
| 5631 |
- if(!get_bits1(gb)){
|
|
| 5632 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks |
|
| 5633 |
- s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks |
|
| 5634 |
- s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks |
|
| 5635 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks |
|
| 5636 |
- } |
|
| 5637 |
- if(!check_marker(gb, "in complexity estimation part 1")){
|
|
| 5638 |
- skip_bits_long(gb, pos - get_bits_count(gb)); |
|
| 5639 |
- goto no_cplx_est; |
|
| 5640 |
- } |
|
| 5641 |
- if(!get_bits1(gb)){
|
|
| 5642 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs |
|
| 5643 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines |
|
| 5644 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms |
|
| 5645 |
- s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits |
|
| 5646 |
- } |
|
| 5647 |
- if(!get_bits1(gb)){
|
|
| 5648 |
- s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm |
|
| 5649 |
- s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm |
|
| 5650 |
- s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q |
|
| 5651 |
- s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q |
|
| 5652 |
- s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2 |
|
| 5653 |
- s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4 |
|
| 5654 |
- } |
|
| 5655 |
- if(!check_marker(gb, "in complexity estimation part 2")){
|
|
| 5656 |
- skip_bits_long(gb, pos - get_bits_count(gb)); |
|
| 5657 |
- goto no_cplx_est; |
|
| 5658 |
- } |
|
| 5659 |
- if(estimation_method==1){
|
|
| 5660 |
- s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct |
|
| 5661 |
- s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel |
|
| 5662 |
- } |
|
| 5663 |
- }else |
|
| 5664 |
- av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method); |
|
| 5665 |
- }else{
|
|
| 5666 |
-no_cplx_est: |
|
| 5667 |
- s->cplx_estimation_trash_i= |
|
| 5668 |
- s->cplx_estimation_trash_p= |
|
| 5669 |
- s->cplx_estimation_trash_b= 0; |
|
| 5670 |
- } |
|
| 5671 |
- |
|
| 5672 |
- s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */ |
|
| 5673 |
- |
|
| 5674 |
- s->data_partitioning= get_bits1(gb); |
|
| 5675 |
- if(s->data_partitioning){
|
|
| 5676 |
- s->rvlc= get_bits1(gb); |
|
| 5677 |
- } |
|
| 5678 |
- |
|
| 5679 |
- if(vo_ver_id != 1) {
|
|
| 5680 |
- s->new_pred= get_bits1(gb); |
|
| 5681 |
- if(s->new_pred){
|
|
| 5682 |
- av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n"); |
|
| 5683 |
- skip_bits(gb, 2); /* requested upstream message type */ |
|
| 5684 |
- skip_bits1(gb); /* newpred segment type */ |
|
| 5685 |
- } |
|
| 5686 |
- s->reduced_res_vop= get_bits1(gb); |
|
| 5687 |
- if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n"); |
|
| 5688 |
- } |
|
| 5689 |
- else{
|
|
| 5690 |
- s->new_pred=0; |
|
| 5691 |
- s->reduced_res_vop= 0; |
|
| 5692 |
- } |
|
| 5693 |
- |
|
| 5694 |
- s->scalability= get_bits1(gb); |
|
| 5695 |
- |
|
| 5696 |
- if (s->scalability) {
|
|
| 5697 |
- GetBitContext bak= *gb; |
|
| 5698 |
- int ref_layer_id; |
|
| 5699 |
- int ref_layer_sampling_dir; |
|
| 5700 |
- int h_sampling_factor_n; |
|
| 5701 |
- int h_sampling_factor_m; |
|
| 5702 |
- int v_sampling_factor_n; |
|
| 5703 |
- int v_sampling_factor_m; |
|
| 5704 |
- |
|
| 5705 |
- s->hierachy_type= get_bits1(gb); |
|
| 5706 |
- ref_layer_id= get_bits(gb, 4); |
|
| 5707 |
- ref_layer_sampling_dir= get_bits1(gb); |
|
| 5708 |
- h_sampling_factor_n= get_bits(gb, 5); |
|
| 5709 |
- h_sampling_factor_m= get_bits(gb, 5); |
|
| 5710 |
- v_sampling_factor_n= get_bits(gb, 5); |
|
| 5711 |
- v_sampling_factor_m= get_bits(gb, 5); |
|
| 5712 |
- s->enhancement_type= get_bits1(gb); |
|
| 5713 |
- |
|
| 5714 |
- if( h_sampling_factor_n==0 || h_sampling_factor_m==0 |
|
| 5715 |
- || v_sampling_factor_n==0 || v_sampling_factor_m==0){
|
|
| 5716 |
- /* illegal scalability header (VERY broken encoder), |
|
| 5717 |
- * trying to workaround */ |
|
| 5718 |
- s->scalability=0; |
|
| 5719 |
- *gb= bak; |
|
| 5720 |
- }else |
|
| 5721 |
- av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n"); |
|
| 5722 |
- |
|
| 5723 |
- // bin shape stuff FIXME |
|
| 5724 |
- } |
|
| 5725 |
- } |
|
| 5726 |
- return 0; |
|
| 5727 |
-} |
|
| 5728 |
- |
|
| 5729 |
-/** |
|
| 5730 |
- * decodes the user data stuff in the header. |
|
| 5731 |
- * Also initializes divx/xvid/lavc_version/build. |
|
| 5732 |
- */ |
|
| 5733 |
-static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
|
|
| 5734 |
- char buf[256]; |
|
| 5735 |
- int i; |
|
| 5736 |
- int e; |
|
| 5737 |
- int ver = 0, build = 0, ver2 = 0, ver3 = 0; |
|
| 5738 |
- char last; |
|
| 5739 |
- |
|
| 5740 |
- for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){
|
|
| 5741 |
- if(show_bits(gb, 23) == 0) break; |
|
| 5742 |
- buf[i]= get_bits(gb, 8); |
|
| 5743 |
- } |
|
| 5744 |
- buf[i]=0; |
|
| 5745 |
- |
|
| 5746 |
- /* divx detection */ |
|
| 5747 |
- e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last); |
|
| 5748 |
- if(e<2) |
|
| 5749 |
- e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last); |
|
| 5750 |
- if(e>=2){
|
|
| 5751 |
- s->divx_version= ver; |
|
| 5752 |
- s->divx_build= build; |
|
| 5753 |
- s->divx_packed= e==3 && last=='p'; |
|
| 5754 |
- if(s->divx_packed && !s->showed_packed_warning) {
|
|
| 5755 |
- av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n"); |
|
| 5756 |
- s->showed_packed_warning=1; |
|
| 5757 |
- } |
|
| 5758 |
- } |
|
| 5759 |
- |
|
| 5760 |
- /* ffmpeg detection */ |
|
| 5761 |
- e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3; |
|
| 5762 |
- if(e!=4) |
|
| 5763 |
- e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build); |
|
| 5764 |
- if(e!=4){
|
|
| 5765 |
- e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1; |
|
| 5766 |
- if (e>1) |
|
| 5767 |
- build= (ver<<16) + (ver2<<8) + ver3; |
|
| 5768 |
- } |
|
| 5769 |
- if(e!=4){
|
|
| 5770 |
- if(strcmp(buf, "ffmpeg")==0){
|
|
| 5771 |
- s->lavc_build= 4600; |
|
| 5772 |
- } |
|
| 5773 |
- } |
|
| 5774 |
- if(e==4){
|
|
| 5775 |
- s->lavc_build= build; |
|
| 5776 |
- } |
|
| 5777 |
- |
|
| 5778 |
- /* Xvid detection */ |
|
| 5779 |
- e=sscanf(buf, "XviD%d", &build); |
|
| 5780 |
- if(e==1){
|
|
| 5781 |
- s->xvid_build= build; |
|
| 5782 |
- } |
|
| 5783 |
- |
|
| 5784 |
- return 0; |
|
| 5785 |
-} |
|
| 5786 |
- |
|
| 5787 |
-static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
|
|
| 5788 |
- int time_incr, time_increment; |
|
| 5789 |
- |
|
| 5790 |
- s->pict_type = get_bits(gb, 2) + FF_I_TYPE; /* pict type: I = 0 , P = 1 */ |
|
| 5791 |
- if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
|
|
| 5792 |
- av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n"); |
|
| 5793 |
- s->low_delay=0; |
|
| 5794 |
- } |
|
| 5795 |
- |
|
| 5796 |
- s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE; |
|
| 5797 |
- if(s->partitioned_frame) |
|
| 5798 |
- s->decode_mb= mpeg4_decode_partitioned_mb; |
|
| 5799 |
- else |
|
| 5800 |
- s->decode_mb= ff_mpeg4_decode_mb; |
|
| 5801 |
- |
|
| 5802 |
- time_incr=0; |
|
| 5803 |
- while (get_bits1(gb) != 0) |
|
| 5804 |
- time_incr++; |
|
| 5805 |
- |
|
| 5806 |
- check_marker(gb, "before time_increment"); |
|
| 5807 |
- |
|
| 5808 |
- if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
|
|
| 5809 |
- av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n"); |
|
| 5810 |
- |
|
| 5811 |
- for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
|
|
| 5812 |
- if ( s->pict_type == FF_P_TYPE |
|
| 5813 |
- || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
|
|
| 5814 |
- if((show_bits(gb, s->time_increment_bits+6)&0x37) == 0x30) break; |
|
| 5815 |
- }else |
|
| 5816 |
- if((show_bits(gb, s->time_increment_bits+5)&0x1F) == 0x18) break; |
|
| 5817 |
- } |
|
| 5818 |
- |
|
| 5819 |
- av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits); |
|
| 5820 |
- } |
|
| 5821 |
- |
|
| 5822 |
- if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further |
|
| 5823 |
- else time_increment= get_bits(gb, s->time_increment_bits); |
|
| 5824 |
- |
|
| 5825 |
- if(s->pict_type!=FF_B_TYPE){
|
|
| 5826 |
- s->last_time_base= s->time_base; |
|
| 5827 |
- s->time_base+= time_incr; |
|
| 5828 |
- s->time= s->time_base*s->avctx->time_base.den + time_increment; |
|
| 5829 |
- if(s->workaround_bugs&FF_BUG_UMP4){
|
|
| 5830 |
- if(s->time < s->last_non_b_time){
|
|
| 5831 |
- /* header is not mpeg-4-compatible, broken encoder, |
|
| 5832 |
- * trying to workaround */ |
|
| 5833 |
- s->time_base++; |
|
| 5834 |
- s->time+= s->avctx->time_base.den; |
|
| 5835 |
- } |
|
| 5836 |
- } |
|
| 5837 |
- s->pp_time= s->time - s->last_non_b_time; |
|
| 5838 |
- s->last_non_b_time= s->time; |
|
| 5839 |
- }else{
|
|
| 5840 |
- s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment; |
|
| 5841 |
- s->pb_time= s->pp_time - (s->last_non_b_time - s->time); |
|
| 5842 |
- if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
|
|
| 5843 |
- /* messed up order, maybe after seeking? skipping current b-frame */ |
|
| 5844 |
- return FRAME_SKIPPED; |
|
| 5845 |
- } |
|
| 5846 |
- ff_mpeg4_init_direct_mv(s); |
|
| 5847 |
- |
|
| 5848 |
- if(s->t_frame==0) s->t_frame= s->pb_time; |
|
| 5849 |
- if(s->t_frame==0) s->t_frame=1; // 1/0 protection |
|
| 5850 |
- s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame) |
|
| 5851 |
- - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2; |
|
| 5852 |
- s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame) |
|
| 5853 |
- - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2; |
|
| 5854 |
- if(!s->progressive_sequence){
|
|
| 5855 |
- if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1) |
|
| 5856 |
- return FRAME_SKIPPED; |
|
| 5857 |
- } |
|
| 5858 |
- } |
|
| 5859 |
- |
|
| 5860 |
- if(s->avctx->time_base.num) |
|
| 5861 |
- s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num; |
|
| 5862 |
- else |
|
| 5863 |
- s->current_picture_ptr->pts= AV_NOPTS_VALUE; |
|
| 5864 |
- if(s->avctx->debug&FF_DEBUG_PTS) |
|
| 5865 |
- av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts); |
|
| 5866 |
- |
|
| 5867 |
- check_marker(gb, "before vop_coded"); |
|
| 5868 |
- |
|
| 5869 |
- /* vop coded */ |
|
| 5870 |
- if (get_bits1(gb) != 1){
|
|
| 5871 |
- if(s->avctx->debug&FF_DEBUG_PICT_INFO) |
|
| 5872 |
- av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n"); |
|
| 5873 |
- return FRAME_SKIPPED; |
|
| 5874 |
- } |
|
| 5875 |
- if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE |
|
| 5876 |
- || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
|
|
| 5877 |
- /* rounding type for motion estimation */ |
|
| 5878 |
- s->no_rounding = get_bits1(gb); |
|
| 5879 |
- } else {
|
|
| 5880 |
- s->no_rounding = 0; |
|
| 5881 |
- } |
|
| 5882 |
-//FIXME reduced res stuff |
|
| 5883 |
- |
|
| 5884 |
- if (s->shape != RECT_SHAPE) {
|
|
| 5885 |
- if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) {
|
|
| 5886 |
- int width, height, hor_spat_ref, ver_spat_ref; |
|
| 5887 |
- |
|
| 5888 |
- width = get_bits(gb, 13); |
|
| 5889 |
- skip_bits1(gb); /* marker */ |
|
| 5890 |
- height = get_bits(gb, 13); |
|
| 5891 |
- skip_bits1(gb); /* marker */ |
|
| 5892 |
- hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */ |
|
| 5893 |
- skip_bits1(gb); /* marker */ |
|
| 5894 |
- ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */ |
|
| 5895 |
- } |
|
| 5896 |
- skip_bits1(gb); /* change_CR_disable */ |
|
| 5897 |
- |
|
| 5898 |
- if (get_bits1(gb) != 0) {
|
|
| 5899 |
- skip_bits(gb, 8); /* constant_alpha_value */ |
|
| 5900 |
- } |
|
| 5901 |
- } |
|
| 5902 |
-//FIXME complexity estimation stuff |
|
| 5903 |
- |
|
| 5904 |
- if (s->shape != BIN_ONLY_SHAPE) {
|
|
| 5905 |
- skip_bits_long(gb, s->cplx_estimation_trash_i); |
|
| 5906 |
- if(s->pict_type != FF_I_TYPE) |
|
| 5907 |
- skip_bits_long(gb, s->cplx_estimation_trash_p); |
|
| 5908 |
- if(s->pict_type == FF_B_TYPE) |
|
| 5909 |
- skip_bits_long(gb, s->cplx_estimation_trash_b); |
|
| 5910 |
- |
|
| 5911 |
- s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ]; |
|
| 5912 |
- if(!s->progressive_sequence){
|
|
| 5913 |
- s->top_field_first= get_bits1(gb); |
|
| 5914 |
- s->alternate_scan= get_bits1(gb); |
|
| 5915 |
- }else |
|
| 5916 |
- s->alternate_scan= 0; |
|
| 5917 |
- } |
|
| 5918 |
- |
|
| 5919 |
- if(s->alternate_scan){
|
|
| 5920 |
- ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan); |
|
| 5921 |
- ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan); |
|
| 5922 |
- ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan); |
|
| 5923 |
- ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); |
|
| 5924 |
- } else{
|
|
| 5925 |
- ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct); |
|
| 5926 |
- ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct); |
|
| 5927 |
- ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); |
|
| 5928 |
- ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); |
|
| 5929 |
- } |
|
| 5930 |
- |
|
| 5931 |
- if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
|
|
| 5932 |
- mpeg4_decode_sprite_trajectory(s, gb); |
|
| 5933 |
- if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n"); |
|
| 5934 |
- if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n"); |
|
| 5935 |
- } |
|
| 5936 |
- |
|
| 5937 |
- if (s->shape != BIN_ONLY_SHAPE) {
|
|
| 5938 |
- s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision); |
|
| 5939 |
- if(s->qscale==0){
|
|
| 5940 |
- av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n"); |
|
| 5941 |
- return -1; // makes no sense to continue, as there is nothing left from the image then |
|
| 5942 |
- } |
|
| 5943 |
- |
|
| 5944 |
- if (s->pict_type != FF_I_TYPE) {
|
|
| 5945 |
- s->f_code = get_bits(gb, 3); /* fcode_for */ |
|
| 5946 |
- if(s->f_code==0){
|
|
| 5947 |
- av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n"); |
|
| 5948 |
- return -1; // makes no sense to continue, as the MV decoding will break very quickly |
|
| 5949 |
- } |
|
| 5950 |
- }else |
|
| 5951 |
- s->f_code=1; |
|
| 5952 |
- |
|
| 5953 |
- if (s->pict_type == FF_B_TYPE) {
|
|
| 5954 |
- s->b_code = get_bits(gb, 3); |
|
| 5955 |
- }else |
|
| 5956 |
- s->b_code=1; |
|
| 5957 |
- |
|
| 5958 |
- if(s->avctx->debug&FF_DEBUG_PICT_INFO){
|
|
| 5959 |
- av_log(s->avctx, AV_LOG_DEBUG, "qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d rnd:%d vot:%d%s dc:%d ce:%d/%d/%d\n", |
|
| 5960 |
- s->qscale, s->f_code, s->b_code, |
|
| 5961 |
- s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")), |
|
| 5962 |
- gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first, |
|
| 5963 |
- s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points, |
|
| 5964 |
- s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold, s->cplx_estimation_trash_i, s->cplx_estimation_trash_p, s->cplx_estimation_trash_b); |
|
| 5965 |
- } |
|
| 5966 |
- |
|
| 5967 |
- if(!s->scalability){
|
|
| 5968 |
- if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) {
|
|
| 5969 |
- skip_bits1(gb); // vop shape coding type |
|
| 5970 |
- } |
|
| 5971 |
- }else{
|
|
| 5972 |
- if(s->enhancement_type){
|
|
| 5973 |
- int load_backward_shape= get_bits1(gb); |
|
| 5974 |
- if(load_backward_shape){
|
|
| 5975 |
- av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n"); |
|
| 5976 |
- } |
|
| 5977 |
- } |
|
| 5978 |
- skip_bits(gb, 2); //ref_select_code |
|
| 5979 |
- } |
|
| 5980 |
- } |
|
| 5981 |
- /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/ |
|
| 5982 |
- // note we cannot detect divx5 without b-frames easily (although it's buggy too) |
|
| 5983 |
- if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
|
|
| 5984 |
- av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n"); |
|
| 5985 |
- s->low_delay=1; |
|
| 5986 |
- } |
|
| 5987 |
- |
|
| 5988 |
- s->picture_number++; // better than pic number==0 always ;) |
|
| 5989 |
- |
|
| 5990 |
- s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support |
|
| 5991 |
- s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; |
|
| 5992 |
- |
|
| 5993 |
- if(s->workaround_bugs&FF_BUG_EDGE){
|
|
| 5994 |
- s->h_edge_pos= s->width; |
|
| 5995 |
- s->v_edge_pos= s->height; |
|
| 5996 |
- } |
|
| 5997 |
- return 0; |
|
| 5998 |
-} |
|
| 5999 |
- |
|
| 6000 |
-/** |
|
| 6001 |
- * decode mpeg4 headers |
|
| 6002 |
- * @return <0 if no VOP found (or a damaged one) |
|
| 6003 |
- * FRAME_SKIPPED if a not coded VOP is found |
|
| 6004 |
- * 0 if a VOP is found |
|
| 6005 |
- */ |
|
| 6006 |
-int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb) |
|
| 6007 |
-{
|
|
| 6008 |
- int startcode, v; |
|
| 6009 |
- |
|
| 6010 |
- /* search next start code */ |
|
| 6011 |
- align_get_bits(gb); |
|
| 6012 |
- |
|
| 6013 |
- if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){
|
|
| 6014 |
- skip_bits(gb, 24); |
|
| 6015 |
- if(get_bits(gb, 8) == 0xF0) |
|
| 6016 |
- goto end; |
|
| 6017 |
- } |
|
| 6018 |
- |
|
| 6019 |
- startcode = 0xff; |
|
| 6020 |
- for(;;) {
|
|
| 6021 |
- if(get_bits_count(gb) >= gb->size_in_bits){
|
|
| 6022 |
- if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
|
|
| 6023 |
- av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits); |
|
| 6024 |
- return FRAME_SKIPPED; //divx bug |
|
| 6025 |
- }else |
|
| 6026 |
- return -1; //end of stream |
|
| 6027 |
- } |
|
| 6028 |
- |
|
| 6029 |
- /* use the bits after the test */ |
|
| 6030 |
- v = get_bits(gb, 8); |
|
| 6031 |
- startcode = ((startcode << 8) | v) & 0xffffffff; |
|
| 6032 |
- |
|
| 6033 |
- if((startcode&0xFFFFFF00) != 0x100) |
|
| 6034 |
- continue; //no startcode |
|
| 6035 |
- |
|
| 6036 |
- if(s->avctx->debug&FF_DEBUG_STARTCODE){
|
|
| 6037 |
- av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode); |
|
| 6038 |
- if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start"); |
|
| 6039 |
- else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start"); |
|
| 6040 |
- else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved"); |
|
| 6041 |
- else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start"); |
|
| 6042 |
- else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved"); |
|
| 6043 |
- else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start"); |
|
| 6044 |
- else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End"); |
|
| 6045 |
- else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data"); |
|
| 6046 |
- else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start"); |
|
| 6047 |
- else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error"); |
|
| 6048 |
- else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start"); |
|
| 6049 |
- else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start"); |
|
| 6050 |
- else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start"); |
|
| 6051 |
- else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start"); |
|
| 6052 |
- else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start"); |
|
| 6053 |
- else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start"); |
|
| 6054 |
- else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start"); |
|
| 6055 |
- else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start"); |
|
| 6056 |
- else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start"); |
|
| 6057 |
- else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start"); |
|
| 6058 |
- else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start"); |
|
| 6059 |
- else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start"); |
|
| 6060 |
- else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start"); |
|
| 6061 |
- else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start"); |
|
| 6062 |
- else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start"); |
|
| 6063 |
- else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved"); |
|
| 6064 |
- else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start"); |
|
| 6065 |
- av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb)); |
|
| 6066 |
- } |
|
| 6067 |
- |
|
| 6068 |
- if(startcode >= 0x120 && startcode <= 0x12F){
|
|
| 6069 |
- if(decode_vol_header(s, gb) < 0) |
|
| 6070 |
- return -1; |
|
| 6071 |
- } |
|
| 6072 |
- else if(startcode == USER_DATA_STARTCODE){
|
|
| 6073 |
- decode_user_data(s, gb); |
|
| 6074 |
- } |
|
| 6075 |
- else if(startcode == GOP_STARTCODE){
|
|
| 6076 |
- mpeg4_decode_gop_header(s, gb); |
|
| 6077 |
- } |
|
| 6078 |
- else if(startcode == VOP_STARTCODE){
|
|
| 6079 |
- break; |
|
| 6080 |
- } |
|
| 6081 |
- |
|
| 6082 |
- align_get_bits(gb); |
|
| 6083 |
- startcode = 0xff; |
|
| 6084 |
- } |
|
| 6085 |
-end: |
|
| 6086 |
- if(s->flags& CODEC_FLAG_LOW_DELAY) |
|
| 6087 |
- s->low_delay=1; |
|
| 6088 |
- s->avctx->has_b_frames= !s->low_delay; |
|
| 6089 |
- return decode_vop_header(s, gb); |
|
| 6090 |
-} |
| 6091 | 5407 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,178 @@ |
| 0 |
+/* |
|
| 1 |
+ * H263 internal header |
|
| 2 |
+ * |
|
| 3 |
+ * This file is part of FFmpeg. |
|
| 4 |
+ * |
|
| 5 |
+ * FFmpeg is free software; you can redistribute it and/or |
|
| 6 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 7 |
+ * License as published by the Free Software Foundation; either |
|
| 8 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 9 |
+ * |
|
| 10 |
+ * FFmpeg is distributed in the hope that it will be useful, |
|
| 11 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 12 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 13 |
+ * Lesser General Public License for more details. |
|
| 14 |
+ * |
|
| 15 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 16 |
+ * License along with FFmpeg; if not, write to the Free Software |
|
| 17 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 18 |
+ */ |
|
| 19 |
+#ifndef AVCODEC_H263_H |
|
| 20 |
+#define AVCODEC_H263_H |
|
| 21 |
+ |
|
| 22 |
+// The defines below define the number of bits that are read at once for |
|
| 23 |
+// reading vlc values. Changing these may improve speed and data cache needs |
|
| 24 |
+// be aware though that decreasing them may need the number of stages that is |
|
| 25 |
+// passed to get_vlc* to be increased. |
|
| 26 |
+#define INTRA_MCBPC_VLC_BITS 6 |
|
| 27 |
+#define INTER_MCBPC_VLC_BITS 7 |
|
| 28 |
+#define CBPY_VLC_BITS 6 |
|
| 29 |
+#define TEX_VLC_BITS 9 |
|
| 30 |
+ |
|
| 31 |
+extern const AVRational ff_h263_pixel_aspect[16]; |
|
| 32 |
+extern const uint8_t cbpy_tab[16][2]; |
|
| 33 |
+ |
|
| 34 |
+extern const uint8_t mvtab[33][2]; |
|
| 35 |
+ |
|
| 36 |
+extern const uint8_t intra_MCBPC_code[9]; |
|
| 37 |
+extern const uint8_t intra_MCBPC_bits[9]; |
|
| 38 |
+ |
|
| 39 |
+extern const uint8_t inter_MCBPC_code[28]; |
|
| 40 |
+extern const uint8_t inter_MCBPC_bits[28]; |
|
| 41 |
+ |
|
| 42 |
+extern VLC intra_MCBPC_vlc; |
|
| 43 |
+extern VLC inter_MCBPC_vlc; |
|
| 44 |
+extern VLC cbpy_vlc; |
|
| 45 |
+ |
|
| 46 |
+extern RLTable rl_inter; |
|
| 47 |
+ |
|
| 48 |
+int h263_decode_motion(MpegEncContext * s, int pred, int f_code); |
|
| 49 |
+av_const int ff_h263_aspect_to_info(AVRational aspect); |
|
| 50 |
+ |
|
| 51 |
+static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
|
|
| 52 |
+ int l, bit_size, code; |
|
| 53 |
+ |
|
| 54 |
+ if (val == 0) {
|
|
| 55 |
+ return mvtab[0][1]; |
|
| 56 |
+ } else {
|
|
| 57 |
+ bit_size = f_code - 1; |
|
| 58 |
+ /* modulo encoding */ |
|
| 59 |
+ l= INT_BIT - 6 - bit_size; |
|
| 60 |
+ val = (val<<l)>>l; |
|
| 61 |
+ val--; |
|
| 62 |
+ code = (val >> bit_size) + 1; |
|
| 63 |
+ |
|
| 64 |
+ return mvtab[code][1] + 1 + bit_size; |
|
| 65 |
+ } |
|
| 66 |
+} |
|
| 67 |
+ |
|
| 68 |
+static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
|
|
| 69 |
+ if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
|
|
| 70 |
+ skip_put_bits(&s->pb, |
|
| 71 |
+ h263_get_motion_length(s, x, f_code) |
|
| 72 |
+ +h263_get_motion_length(s, y, f_code)); |
|
| 73 |
+ }else{
|
|
| 74 |
+ ff_h263_encode_motion(s, x, f_code); |
|
| 75 |
+ ff_h263_encode_motion(s, y, f_code); |
|
| 76 |
+ } |
|
| 77 |
+} |
|
| 78 |
+ |
|
| 79 |
+static inline int get_p_cbp(MpegEncContext * s, |
|
| 80 |
+ DCTELEM block[6][64], |
|
| 81 |
+ int motion_x, int motion_y){
|
|
| 82 |
+ int cbp, i; |
|
| 83 |
+ |
|
| 84 |
+ if(s->flags & CODEC_FLAG_CBP_RD){
|
|
| 85 |
+ int best_cbpy_score= INT_MAX; |
|
| 86 |
+ int best_cbpc_score= INT_MAX; |
|
| 87 |
+ int cbpc = (-1), cbpy= (-1); |
|
| 88 |
+ const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0); |
|
| 89 |
+ const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); |
|
| 90 |
+ |
|
| 91 |
+ for(i=0; i<4; i++){
|
|
| 92 |
+ int score= inter_MCBPC_bits[i + offset] * lambda; |
|
| 93 |
+ if(i&1) score += s->coded_score[5]; |
|
| 94 |
+ if(i&2) score += s->coded_score[4]; |
|
| 95 |
+ |
|
| 96 |
+ if(score < best_cbpc_score){
|
|
| 97 |
+ best_cbpc_score= score; |
|
| 98 |
+ cbpc= i; |
|
| 99 |
+ } |
|
| 100 |
+ } |
|
| 101 |
+ |
|
| 102 |
+ for(i=0; i<16; i++){
|
|
| 103 |
+ int score= cbpy_tab[i ^ 0xF][1] * lambda; |
|
| 104 |
+ if(i&1) score += s->coded_score[3]; |
|
| 105 |
+ if(i&2) score += s->coded_score[2]; |
|
| 106 |
+ if(i&4) score += s->coded_score[1]; |
|
| 107 |
+ if(i&8) score += s->coded_score[0]; |
|
| 108 |
+ |
|
| 109 |
+ if(score < best_cbpy_score){
|
|
| 110 |
+ best_cbpy_score= score; |
|
| 111 |
+ cbpy= i; |
|
| 112 |
+ } |
|
| 113 |
+ } |
|
| 114 |
+ cbp= cbpc + 4*cbpy; |
|
| 115 |
+ if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
|
|
| 116 |
+ if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0) |
|
| 117 |
+ cbp= 0; |
|
| 118 |
+ } |
|
| 119 |
+ |
|
| 120 |
+ for (i = 0; i < 6; i++) {
|
|
| 121 |
+ if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
|
|
| 122 |
+ s->block_last_index[i]= -1; |
|
| 123 |
+ s->dsp.clear_block(s->block[i]); |
|
| 124 |
+ } |
|
| 125 |
+ } |
|
| 126 |
+ }else{
|
|
| 127 |
+ cbp= 0; |
|
| 128 |
+ for (i = 0; i < 6; i++) {
|
|
| 129 |
+ if (s->block_last_index[i] >= 0) |
|
| 130 |
+ cbp |= 1 << (5 - i); |
|
| 131 |
+ } |
|
| 132 |
+ } |
|
| 133 |
+ return cbp; |
|
| 134 |
+} |
|
| 135 |
+ |
|
| 136 |
+static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64], |
|
| 137 |
+ int motion_x, int motion_y, int mb_type){
|
|
| 138 |
+ int cbp=0, i; |
|
| 139 |
+ |
|
| 140 |
+ if(s->flags & CODEC_FLAG_CBP_RD){
|
|
| 141 |
+ int score=0; |
|
| 142 |
+ const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); |
|
| 143 |
+ |
|
| 144 |
+ for(i=0; i<6; i++){
|
|
| 145 |
+ if(s->coded_score[i] < 0){
|
|
| 146 |
+ score += s->coded_score[i]; |
|
| 147 |
+ cbp |= 1 << (5 - i); |
|
| 148 |
+ } |
|
| 149 |
+ } |
|
| 150 |
+ |
|
| 151 |
+ if(cbp){
|
|
| 152 |
+ int zero_score= -6; |
|
| 153 |
+ if ((motion_x | motion_y | s->dquant | mb_type) == 0){
|
|
| 154 |
+ zero_score-= 4; //2*MV + mb_type + cbp bit |
|
| 155 |
+ } |
|
| 156 |
+ |
|
| 157 |
+ zero_score*= lambda; |
|
| 158 |
+ if(zero_score <= score){
|
|
| 159 |
+ cbp=0; |
|
| 160 |
+ } |
|
| 161 |
+ } |
|
| 162 |
+ |
|
| 163 |
+ for (i = 0; i < 6; i++) {
|
|
| 164 |
+ if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
|
|
| 165 |
+ s->block_last_index[i]= -1; |
|
| 166 |
+ s->dsp.clear_block(s->block[i]); |
|
| 167 |
+ } |
|
| 168 |
+ } |
|
| 169 |
+ }else{
|
|
| 170 |
+ for (i = 0; i < 6; i++) {
|
|
| 171 |
+ if (s->block_last_index[i] >= 0) |
|
| 172 |
+ cbp |= 1 << (5 - i); |
|
| 173 |
+ } |
|
| 174 |
+ } |
|
| 175 |
+ return cbp; |
|
| 176 |
+} |
|
| 177 |
+#endif |
| ... | ... |
@@ -177,7 +177,7 @@ const int8_t inter_run[102] = {
|
| 177 | 177 |
35, 36, 37, 38, 39, 40, |
| 178 | 178 |
}; |
| 179 | 179 |
|
| 180 |
-static RLTable rl_inter = {
|
|
| 180 |
+RLTable rl_inter = {
|
|
| 181 | 181 |
102, |
| 182 | 182 |
58, |
| 183 | 183 |
inter_vlc, |
| ... | ... |
@@ -313,4 +313,23 @@ const uint8_t ff_h263_loop_filter_strength[32]={
|
| 313 | 313 |
0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9,10,10,10,11,11,11,12,12,12 |
| 314 | 314 |
}; |
| 315 | 315 |
|
| 316 |
+const AVRational ff_h263_pixel_aspect[16]={
|
|
| 317 |
+ {0, 1},
|
|
| 318 |
+ {1, 1},
|
|
| 319 |
+ {12, 11},
|
|
| 320 |
+ {10, 11},
|
|
| 321 |
+ {16, 11},
|
|
| 322 |
+ {40, 33},
|
|
| 323 |
+ {0, 1},
|
|
| 324 |
+ {0, 1},
|
|
| 325 |
+ {0, 1},
|
|
| 326 |
+ {0, 1},
|
|
| 327 |
+ {0, 1},
|
|
| 328 |
+ {0, 1},
|
|
| 329 |
+ {0, 1},
|
|
| 330 |
+ {0, 1},
|
|
| 331 |
+ {0, 1},
|
|
| 332 |
+ {0, 1},
|
|
| 333 |
+}; |
|
| 334 |
+ |
|
| 316 | 335 |
#endif /* AVCODEC_H263DATA_H */ |
| ... | ... |
@@ -34,6 +34,7 @@ |
| 34 | 34 |
#include "msmpeg4.h" |
| 35 | 35 |
#include "vdpau_internal.h" |
| 36 | 36 |
#include "flv.h" |
| 37 |
+#include "mpeg4video.h" |
|
| 37 | 38 |
|
| 38 | 39 |
//#define DEBUG |
| 39 | 40 |
//#define PRINT_FRAME_TIME |
| ... | ... |
@@ -64,11 +65,6 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx) |
| 64 | 64 |
avctx->chroma_sample_location = AVCHROMA_LOC_CENTER; |
| 65 | 65 |
break; |
| 66 | 66 |
case CODEC_ID_MPEG4: |
| 67 |
- s->decode_mb= ff_mpeg4_decode_mb; |
|
| 68 |
- s->time_increment_bits = 4; /* default value for broken headers */ |
|
| 69 |
- s->h263_pred = 1; |
|
| 70 |
- s->low_delay = 0; //default, might be overriden in the vol header during header parsing |
|
| 71 |
- avctx->chroma_sample_location = AVCHROMA_LOC_LEFT; |
|
| 72 | 67 |
break; |
| 73 | 68 |
case CODEC_ID_MSMPEG4V1: |
| 74 | 69 |
s->h263_msmpeg4 = 1; |
| ... | ... |
@@ -731,21 +727,6 @@ av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time); |
| 731 | 731 |
return get_consumed_bytes(s, buf_size); |
| 732 | 732 |
} |
| 733 | 733 |
|
| 734 |
-AVCodec mpeg4_decoder = {
|
|
| 735 |
- "mpeg4", |
|
| 736 |
- CODEC_TYPE_VIDEO, |
|
| 737 |
- CODEC_ID_MPEG4, |
|
| 738 |
- sizeof(MpegEncContext), |
|
| 739 |
- ff_h263_decode_init, |
|
| 740 |
- NULL, |
|
| 741 |
- ff_h263_decode_end, |
|
| 742 |
- ff_h263_decode_frame, |
|
| 743 |
- CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, |
|
| 744 |
- .flush= ff_mpeg_flush, |
|
| 745 |
- .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
|
|
| 746 |
- .pix_fmts= ff_hwaccel_pixfmt_list_420, |
|
| 747 |
-}; |
|
| 748 |
- |
|
| 749 | 734 |
AVCodec h263_decoder = {
|
| 750 | 735 |
"h263", |
| 751 | 736 |
CODEC_TYPE_VIDEO, |
| ... | ... |
@@ -816,19 +797,3 @@ AVCodec wmv1_decoder = {
|
| 816 | 816 |
.long_name= NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
|
| 817 | 817 |
.pix_fmts= ff_pixfmt_list_420, |
| 818 | 818 |
}; |
| 819 |
- |
|
| 820 |
-#if CONFIG_MPEG4_VDPAU_DECODER |
|
| 821 |
-AVCodec mpeg4_vdpau_decoder = {
|
|
| 822 |
- "mpeg4_vdpau", |
|
| 823 |
- CODEC_TYPE_VIDEO, |
|
| 824 |
- CODEC_ID_MPEG4, |
|
| 825 |
- sizeof(MpegEncContext), |
|
| 826 |
- ff_h263_decode_init, |
|
| 827 |
- NULL, |
|
| 828 |
- ff_h263_decode_end, |
|
| 829 |
- ff_h263_decode_frame, |
|
| 830 |
- CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, |
|
| 831 |
- .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 (VDPAU)"),
|
|
| 832 |
- .pix_fmts= (const enum PixelFormat[]){PIX_FMT_VDPAU_MPEG4, PIX_FMT_NONE},
|
|
| 833 |
-}; |
|
| 834 |
-#endif |
| ... | ... |
@@ -31,43 +31,6 @@ |
| 31 | 31 |
#include <stdint.h> |
| 32 | 32 |
#include "mpegvideo.h" |
| 33 | 33 |
|
| 34 |
-// shapes |
|
| 35 |
-#define RECT_SHAPE 0 |
|
| 36 |
-#define BIN_SHAPE 1 |
|
| 37 |
-#define BIN_ONLY_SHAPE 2 |
|
| 38 |
-#define GRAY_SHAPE 3 |
|
| 39 |
- |
|
| 40 |
-#define SIMPLE_VO_TYPE 1 |
|
| 41 |
-#define CORE_VO_TYPE 3 |
|
| 42 |
-#define MAIN_VO_TYPE 4 |
|
| 43 |
-#define NBIT_VO_TYPE 5 |
|
| 44 |
-#define ARTS_VO_TYPE 10 |
|
| 45 |
-#define ACE_VO_TYPE 12 |
|
| 46 |
-#define ADV_SIMPLE_VO_TYPE 17 |
|
| 47 |
- |
|
| 48 |
-// aspect_ratio_info |
|
| 49 |
-#define EXTENDED_PAR 15 |
|
| 50 |
- |
|
| 51 |
-//vol_sprite_usage / sprite_enable |
|
| 52 |
-#define STATIC_SPRITE 1 |
|
| 53 |
-#define GMC_SPRITE 2 |
|
| 54 |
- |
|
| 55 |
-#define MOTION_MARKER 0x1F001 |
|
| 56 |
-#define DC_MARKER 0x6B001 |
|
| 57 |
- |
|
| 58 |
-static const int mb_type_b_map[4]= {
|
|
| 59 |
- MB_TYPE_DIRECT2 | MB_TYPE_L0L1, |
|
| 60 |
- MB_TYPE_L0L1 | MB_TYPE_16x16, |
|
| 61 |
- MB_TYPE_L1 | MB_TYPE_16x16, |
|
| 62 |
- MB_TYPE_L0 | MB_TYPE_16x16, |
|
| 63 |
-}; |
|
| 64 |
- |
|
| 65 |
-#define VOS_STARTCODE 0x1B0 |
|
| 66 |
-#define USER_DATA_STARTCODE 0x1B2 |
|
| 67 |
-#define GOP_STARTCODE 0x1B3 |
|
| 68 |
-#define VISUAL_OBJ_STARTCODE 0x1B5 |
|
| 69 |
-#define VOP_STARTCODE 0x1B6 |
|
| 70 |
- |
|
| 71 | 34 |
/* dc encoding for mpeg4 */ |
| 72 | 35 |
const uint8_t DCtab_lum[13][2] = |
| 73 | 36 |
{
|
| ... | ... |
@@ -143,7 +106,7 @@ const int8_t intra_run[102] = {
|
| 143 | 143 |
15, 16, 17, 18, 19, 20, |
| 144 | 144 |
}; |
| 145 | 145 |
|
| 146 |
-static RLTable rl_intra = {
|
|
| 146 |
+RLTable rl_intra = {
|
|
| 147 | 147 |
102, |
| 148 | 148 |
67, |
| 149 | 149 |
intra_vlc, |
| ... | ... |
@@ -152,7 +115,7 @@ static RLTable rl_intra = {
|
| 152 | 152 |
}; |
| 153 | 153 |
|
| 154 | 154 |
/* Note this is identical to the intra rvlc except that it is reordered. */ |
| 155 |
-static const uint16_t inter_rvlc[170][2]={
|
|
| 155 |
+const uint16_t inter_rvlc[170][2]={
|
|
| 156 | 156 |
{0x0006, 3},{0x0001, 4},{0x0004, 5},{0x001C, 7},
|
| 157 | 157 |
{0x003C, 8},{0x003D, 8},{0x007C, 9},{0x00FC, 10},
|
| 158 | 158 |
{0x00FD, 10},{0x01FC, 11},{0x01FD, 11},{0x03FC, 12},
|
| ... | ... |
@@ -198,7 +161,7 @@ static const uint16_t inter_rvlc[170][2]={
|
| 198 | 198 |
{0x3F7C, 15},{0x3F7D, 15},{0x0000, 4}
|
| 199 | 199 |
}; |
| 200 | 200 |
|
| 201 |
-static const int8_t inter_rvlc_run[169]={
|
|
| 201 |
+const int8_t inter_rvlc_run[169]={
|
|
| 202 | 202 |
0, 0, 0, 0, 0, 0, 0, 0, |
| 203 | 203 |
0, 0, 0, 0, 0, 0, 0, 0, |
| 204 | 204 |
0, 0, 0, 1, 1, 1, 1, 1, |
| ... | ... |
@@ -223,7 +186,7 @@ static const int8_t inter_rvlc_run[169]={
|
| 223 | 223 |
43, 44, |
| 224 | 224 |
}; |
| 225 | 225 |
|
| 226 |
-static const int8_t inter_rvlc_level[169]={
|
|
| 226 |
+const int8_t inter_rvlc_level[169]={
|
|
| 227 | 227 |
1, 2, 3, 4, 5, 6, 7, 8, |
| 228 | 228 |
9, 10, 11, 12, 13, 14, 15, 16, |
| 229 | 229 |
17, 18, 19, 1, 2, 3, 4, 5, |
| ... | ... |
@@ -248,7 +211,7 @@ static const int8_t inter_rvlc_level[169]={
|
| 248 | 248 |
1, 1, |
| 249 | 249 |
}; |
| 250 | 250 |
|
| 251 |
-static RLTable rvlc_rl_inter = {
|
|
| 251 |
+RLTable rvlc_rl_inter = {
|
|
| 252 | 252 |
169, |
| 253 | 253 |
103, |
| 254 | 254 |
inter_rvlc, |
| ... | ... |
@@ -256,7 +219,7 @@ static RLTable rvlc_rl_inter = {
|
| 256 | 256 |
inter_rvlc_level, |
| 257 | 257 |
}; |
| 258 | 258 |
|
| 259 |
-static const uint16_t intra_rvlc[170][2]={
|
|
| 259 |
+const uint16_t intra_rvlc[170][2]={
|
|
| 260 | 260 |
{0x0006, 3},{0x0007, 3},{0x000A, 4},{0x0009, 5},
|
| 261 | 261 |
{0x0014, 6},{0x0015, 6},{0x0034, 7},{0x0074, 8},
|
| 262 | 262 |
{0x0075, 8},{0x00DD, 9},{0x00EC, 9},{0x01EC, 10},
|
| ... | ... |
@@ -302,7 +265,7 @@ static const uint16_t intra_rvlc[170][2]={
|
| 302 | 302 |
{0x3F7C, 15},{0x3F7D, 15},{0x0000, 4}
|
| 303 | 303 |
}; |
| 304 | 304 |
|
| 305 |
-static const int8_t intra_rvlc_run[169]={
|
|
| 305 |
+const int8_t intra_rvlc_run[169]={
|
|
| 306 | 306 |
0, 0, 0, 0, 0, 0, 0, 0, |
| 307 | 307 |
0, 0, 0, 0, 0, 0, 0, 0, |
| 308 | 308 |
0, 0, 0, 0, 0, 0, 0, 0, |
| ... | ... |
@@ -327,7 +290,7 @@ static const int8_t intra_rvlc_run[169]={
|
| 327 | 327 |
43, 44, |
| 328 | 328 |
}; |
| 329 | 329 |
|
| 330 |
-static const int8_t intra_rvlc_level[169]={
|
|
| 330 |
+const int8_t intra_rvlc_level[169]={
|
|
| 331 | 331 |
1, 2, 3, 4, 5, 6, 7, 8, |
| 332 | 332 |
9, 10, 11, 12, 13, 14, 15, 16, |
| 333 | 333 |
17, 18, 19, 20, 21, 22, 23, 24, |
| ... | ... |
@@ -352,7 +315,7 @@ static const int8_t intra_rvlc_level[169]={
|
| 352 | 352 |
1, 1, |
| 353 | 353 |
}; |
| 354 | 354 |
|
| 355 |
-static RLTable rvlc_rl_intra = {
|
|
| 355 |
+RLTable rvlc_rl_intra = {
|
|
| 356 | 356 |
169, |
| 357 | 357 |
103, |
| 358 | 358 |
intra_rvlc, |
| ... | ... |
@@ -360,35 +323,16 @@ static RLTable rvlc_rl_intra = {
|
| 360 | 360 |
intra_rvlc_level, |
| 361 | 361 |
}; |
| 362 | 362 |
|
| 363 |
-static const uint16_t sprite_trajectory_tab[15][2] = {
|
|
| 363 |
+const uint16_t sprite_trajectory_tab[15][2] = {
|
|
| 364 | 364 |
{0x00, 2}, {0x02, 3}, {0x03, 3}, {0x04, 3}, {0x05, 3}, {0x06, 3},
|
| 365 | 365 |
{0x0E, 4}, {0x1E, 5}, {0x3E, 6}, {0x7E, 7}, {0xFE, 8},
|
| 366 | 366 |
{0x1FE, 9},{0x3FE, 10},{0x7FE, 11},{0xFFE, 12},
|
| 367 | 367 |
}; |
| 368 | 368 |
|
| 369 |
-static const uint8_t mb_type_b_tab[4][2] = {
|
|
| 369 |
+const uint8_t mb_type_b_tab[4][2] = {
|
|
| 370 | 370 |
{1, 1}, {1, 2}, {1, 3}, {1, 4},
|
| 371 | 371 |
}; |
| 372 | 372 |
|
| 373 |
-static const AVRational pixel_aspect[16]={
|
|
| 374 |
- {0, 1},
|
|
| 375 |
- {1, 1},
|
|
| 376 |
- {12, 11},
|
|
| 377 |
- {10, 11},
|
|
| 378 |
- {16, 11},
|
|
| 379 |
- {40, 33},
|
|
| 380 |
- {0, 1},
|
|
| 381 |
- {0, 1},
|
|
| 382 |
- {0, 1},
|
|
| 383 |
- {0, 1},
|
|
| 384 |
- {0, 1},
|
|
| 385 |
- {0, 1},
|
|
| 386 |
- {0, 1},
|
|
| 387 |
- {0, 1},
|
|
| 388 |
- {0, 1},
|
|
| 389 |
- {0, 1},
|
|
| 390 |
-}; |
|
| 391 |
- |
|
| 392 | 373 |
/* these matrixes will be permuted for the idct */ |
| 393 | 374 |
const int16_t ff_mpeg4_default_intra_matrix[64] = {
|
| 394 | 375 |
8, 17, 18, 19, 21, 23, 25, 27, |
| ... | ... |
@@ -425,7 +369,7 @@ const uint16_t ff_mpeg4_resync_prefix[8]={
|
| 425 | 425 |
0x7F00, 0x7E00, 0x7C00, 0x7800, 0x7000, 0x6000, 0x4000, 0x0000 |
| 426 | 426 |
}; |
| 427 | 427 |
|
| 428 |
-static const uint8_t mpeg4_dc_threshold[8]={
|
|
| 428 |
+const uint8_t mpeg4_dc_threshold[8]={
|
|
| 429 | 429 |
99, 13, 15, 17, 19, 21, 23, 0 |
| 430 | 430 |
}; |
| 431 | 431 |
|
| 432 | 432 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,72 @@ |
| 0 |
+/* |
|
| 1 |
+ * MPEG4 decoder / encoder common code. |
|
| 2 |
+ * Copyright (c) 2000,2001 Fabrice Bellard |
|
| 3 |
+ * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at> |
|
| 4 |
+ * |
|
| 5 |
+ * This file is part of FFmpeg. |
|
| 6 |
+ * |
|
| 7 |
+ * FFmpeg is free software; you can redistribute it and/or |
|
| 8 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 9 |
+ * License as published by the Free Software Foundation; either |
|
| 10 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 11 |
+ * |
|
| 12 |
+ * FFmpeg is distributed in the hope that it will be useful, |
|
| 13 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 14 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 15 |
+ * Lesser General Public License for more details. |
|
| 16 |
+ * |
|
| 17 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 18 |
+ * License along with FFmpeg; if not, write to the Free Software |
|
| 19 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 20 |
+ */ |
|
| 21 |
+ |
|
| 22 |
+#include "mpegvideo.h" |
|
| 23 |
+#include "mpeg4video.h" |
|
| 24 |
+#include "mpeg4data.h" |
|
| 25 |
+ |
|
| 26 |
+uint8_t ff_mpeg4_static_rl_table_store[3][2][2*MAX_RUN + MAX_LEVEL + 3]; |
|
| 27 |
+ |
|
| 28 |
+int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
|
|
| 29 |
+ switch(s->pict_type){
|
|
| 30 |
+ case FF_I_TYPE: |
|
| 31 |
+ return 16; |
|
| 32 |
+ case FF_P_TYPE: |
|
| 33 |
+ case FF_S_TYPE: |
|
| 34 |
+ return s->f_code+15; |
|
| 35 |
+ case FF_B_TYPE: |
|
| 36 |
+ return FFMAX3(s->f_code, s->b_code, 2) + 15; |
|
| 37 |
+ default: |
|
| 38 |
+ return -1; |
|
| 39 |
+ } |
|
| 40 |
+} |
|
| 41 |
+ |
|
| 42 |
+void ff_mpeg4_clean_buffers(MpegEncContext *s) |
|
| 43 |
+{
|
|
| 44 |
+ int c_wrap, c_xy, l_wrap, l_xy; |
|
| 45 |
+ |
|
| 46 |
+ l_wrap= s->b8_stride; |
|
| 47 |
+ l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1; |
|
| 48 |
+ c_wrap= s->mb_stride; |
|
| 49 |
+ c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1; |
|
| 50 |
+ |
|
| 51 |
+#if 0 |
|
| 52 |
+ /* clean DC */ |
|
| 53 |
+ memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1); |
|
| 54 |
+ memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1); |
|
| 55 |
+ memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1); |
|
| 56 |
+#endif |
|
| 57 |
+ |
|
| 58 |
+ /* clean AC */ |
|
| 59 |
+ memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t)); |
|
| 60 |
+ memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); |
|
| 61 |
+ memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); |
|
| 62 |
+ |
|
| 63 |
+ /* clean MV */ |
|
| 64 |
+ // we can't clear the MVs as they might be needed by a b frame |
|
| 65 |
+// memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t)); |
|
| 66 |
+// memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2)); |
|
| 67 |
+ s->last_mv[0][0][0]= |
|
| 68 |
+ s->last_mv[0][0][1]= |
|
| 69 |
+ s->last_mv[1][0][0]= |
|
| 70 |
+ s->last_mv[1][0][1]= 0; |
|
| 71 |
+} |
| 0 | 72 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,197 @@ |
| 0 |
+/* |
|
| 1 |
+ * MPEG4 encoder/decoder internal header. |
|
| 2 |
+ * Copyright (c) 2000,2001 Fabrice Bellard |
|
| 3 |
+ * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at> |
|
| 4 |
+ * |
|
| 5 |
+ * This file is part of FFmpeg. |
|
| 6 |
+ * |
|
| 7 |
+ * FFmpeg is free software; you can redistribute it and/or |
|
| 8 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 9 |
+ * License as published by the Free Software Foundation; either |
|
| 10 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 11 |
+ * |
|
| 12 |
+ * FFmpeg is distributed in the hope that it will be useful, |
|
| 13 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 14 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 15 |
+ * Lesser General Public License for more details. |
|
| 16 |
+ * |
|
| 17 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 18 |
+ * License along with FFmpeg; if not, write to the Free Software |
|
| 19 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 20 |
+ */ |
|
| 21 |
+ |
|
| 22 |
+#ifndef AVCODEC_MPEG4VIDEO_H |
|
| 23 |
+#define AVCODEC_MPEG4VIDEO_H |
|
| 24 |
+ |
|
| 25 |
+// shapes |
|
| 26 |
+#define RECT_SHAPE 0 |
|
| 27 |
+#define BIN_SHAPE 1 |
|
| 28 |
+#define BIN_ONLY_SHAPE 2 |
|
| 29 |
+#define GRAY_SHAPE 3 |
|
| 30 |
+ |
|
| 31 |
+#define SIMPLE_VO_TYPE 1 |
|
| 32 |
+#define CORE_VO_TYPE 3 |
|
| 33 |
+#define MAIN_VO_TYPE 4 |
|
| 34 |
+#define NBIT_VO_TYPE 5 |
|
| 35 |
+#define ARTS_VO_TYPE 10 |
|
| 36 |
+#define ACE_VO_TYPE 12 |
|
| 37 |
+#define ADV_SIMPLE_VO_TYPE 17 |
|
| 38 |
+ |
|
| 39 |
+// aspect_ratio_info |
|
| 40 |
+#define EXTENDED_PAR 15 |
|
| 41 |
+ |
|
| 42 |
+//vol_sprite_usage / sprite_enable |
|
| 43 |
+#define STATIC_SPRITE 1 |
|
| 44 |
+#define GMC_SPRITE 2 |
|
| 45 |
+ |
|
| 46 |
+#define MOTION_MARKER 0x1F001 |
|
| 47 |
+#define DC_MARKER 0x6B001 |
|
| 48 |
+ |
|
| 49 |
+#define VOS_STARTCODE 0x1B0 |
|
| 50 |
+#define USER_DATA_STARTCODE 0x1B2 |
|
| 51 |
+#define GOP_STARTCODE 0x1B3 |
|
| 52 |
+#define VISUAL_OBJ_STARTCODE 0x1B5 |
|
| 53 |
+#define VOP_STARTCODE 0x1B6 |
|
| 54 |
+ |
|
| 55 |
+/* dc encoding for mpeg4 */ |
|
| 56 |
+extern const uint8_t DCtab_lum[13][2]; |
|
| 57 |
+extern const uint8_t DCtab_chrom[13][2]; |
|
| 58 |
+ |
|
| 59 |
+extern const uint16_t intra_vlc[103][2]; |
|
| 60 |
+extern const int8_t intra_level[102]; |
|
| 61 |
+extern const int8_t intra_run[102]; |
|
| 62 |
+extern RLTable rl_intra; |
|
| 63 |
+ |
|
| 64 |
+/* Note this is identical to the intra rvlc except that it is reordered. */ |
|
| 65 |
+extern const uint16_t inter_rvlc[170][2]; |
|
| 66 |
+extern const int8_t inter_rvlc_run[169]; |
|
| 67 |
+extern const int8_t inter_rvlc_level[169]; |
|
| 68 |
+extern RLTable rvlc_rl_inter; |
|
| 69 |
+ |
|
| 70 |
+extern const uint16_t intra_rvlc[170][2]; |
|
| 71 |
+extern const int8_t intra_rvlc_run[169]; |
|
| 72 |
+extern const int8_t intra_rvlc_level[169]; |
|
| 73 |
+extern RLTable rvlc_rl_intra; |
|
| 74 |
+ |
|
| 75 |
+extern const uint16_t sprite_trajectory_tab[15][2]; |
|
| 76 |
+extern const uint8_t mb_type_b_tab[4][2]; |
|
| 77 |
+extern const AVRational pixel_aspect[16]; |
|
| 78 |
+ |
|
| 79 |
+/* these matrixes will be permuted for the idct */ |
|
| 80 |
+extern const int16_t ff_mpeg4_default_intra_matrix[64]; |
|
| 81 |
+extern const int16_t ff_mpeg4_default_non_intra_matrix[64]; |
|
| 82 |
+ |
|
| 83 |
+extern const uint8_t ff_mpeg4_y_dc_scale_table[32]; |
|
| 84 |
+extern const uint8_t ff_mpeg4_c_dc_scale_table[32]; |
|
| 85 |
+extern const uint16_t ff_mpeg4_resync_prefix[8]; |
|
| 86 |
+ |
|
| 87 |
+extern const uint8_t mpeg4_dc_threshold[8]; |
|
| 88 |
+ |
|
| 89 |
+void mpeg4_encode_mb(MpegEncContext *s, |
|
| 90 |
+ DCTELEM block[6][64], |
|
| 91 |
+ int motion_x, int motion_y); |
|
| 92 |
+void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
|
| 93 |
+ int dir); |
|
| 94 |
+void ff_set_mpeg4_time(MpegEncContext * s); |
|
| 95 |
+void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number); |
|
| 96 |
+ |
|
| 97 |
+int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb); |
|
| 98 |
+void ff_mpeg4_encode_video_packet_header(MpegEncContext *s); |
|
| 99 |
+void ff_mpeg4_clean_buffers(MpegEncContext *s); |
|
| 100 |
+void ff_mpeg4_stuffing(PutBitContext * pbc); |
|
| 101 |
+void ff_mpeg4_init_partitions(MpegEncContext *s); |
|
| 102 |
+void ff_mpeg4_merge_partitions(MpegEncContext *s); |
|
| 103 |
+void ff_clean_mpeg4_qscales(MpegEncContext *s); |
|
| 104 |
+int ff_mpeg4_decode_partitions(MpegEncContext *s); |
|
| 105 |
+int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s); |
|
| 106 |
+int mpeg4_decode_video_packet_header(MpegEncContext *s); |
|
| 107 |
+ |
|
| 108 |
+extern uint8_t ff_mpeg4_static_rl_table_store[3][2][2*MAX_RUN + MAX_LEVEL + 3]; |
|
| 109 |
+ |
|
| 110 |
+ |
|
| 111 |
+#if 0 //3IV1 is quite rare and it slows things down a tiny bit |
|
| 112 |
+#define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
|
|
| 113 |
+#else |
|
| 114 |
+#define IS_3IV1 0 |
|
| 115 |
+#endif |
|
| 116 |
+ |
|
| 117 |
+ |
|
| 118 |
+/** |
|
| 119 |
+ * predicts the dc. |
|
| 120 |
+ * encoding quantized level -> quantized diff |
|
| 121 |
+ * decoding quantized diff -> quantized level |
|
| 122 |
+ * @param n block index (0-3 are luma, 4-5 are chroma) |
|
| 123 |
+ * @param dir_ptr pointer to an integer where the prediction direction will be stored |
|
| 124 |
+ */ |
|
| 125 |
+static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding) |
|
| 126 |
+{
|
|
| 127 |
+ int a, b, c, wrap, pred, scale, ret; |
|
| 128 |
+ int16_t *dc_val; |
|
| 129 |
+ |
|
| 130 |
+ /* find prediction */ |
|
| 131 |
+ if (n < 4) {
|
|
| 132 |
+ scale = s->y_dc_scale; |
|
| 133 |
+ } else {
|
|
| 134 |
+ scale = s->c_dc_scale; |
|
| 135 |
+ } |
|
| 136 |
+ if(IS_3IV1) |
|
| 137 |
+ scale= 8; |
|
| 138 |
+ |
|
| 139 |
+ wrap= s->block_wrap[n]; |
|
| 140 |
+ dc_val = s->dc_val[0] + s->block_index[n]; |
|
| 141 |
+ |
|
| 142 |
+ /* B C |
|
| 143 |
+ * A X |
|
| 144 |
+ */ |
|
| 145 |
+ a = dc_val[ - 1]; |
|
| 146 |
+ b = dc_val[ - 1 - wrap]; |
|
| 147 |
+ c = dc_val[ - wrap]; |
|
| 148 |
+ |
|
| 149 |
+ /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */ |
|
| 150 |
+ if(s->first_slice_line && n!=3){
|
|
| 151 |
+ if(n!=2) b=c= 1024; |
|
| 152 |
+ if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024; |
|
| 153 |
+ } |
|
| 154 |
+ if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
|
|
| 155 |
+ if(n==0 || n==4 || n==5) |
|
| 156 |
+ b=1024; |
|
| 157 |
+ } |
|
| 158 |
+ |
|
| 159 |
+ if (abs(a - b) < abs(b - c)) {
|
|
| 160 |
+ pred = c; |
|
| 161 |
+ *dir_ptr = 1; /* top */ |
|
| 162 |
+ } else {
|
|
| 163 |
+ pred = a; |
|
| 164 |
+ *dir_ptr = 0; /* left */ |
|
| 165 |
+ } |
|
| 166 |
+ /* we assume pred is positive */ |
|
| 167 |
+ pred = FASTDIV((pred + (scale >> 1)), scale); |
|
| 168 |
+ |
|
| 169 |
+ if(encoding){
|
|
| 170 |
+ ret = level - pred; |
|
| 171 |
+ }else{
|
|
| 172 |
+ level += pred; |
|
| 173 |
+ ret= level; |
|
| 174 |
+ if(s->error_recognition>=3){
|
|
| 175 |
+ if(level<0){
|
|
| 176 |
+ av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y); |
|
| 177 |
+ return -1; |
|
| 178 |
+ } |
|
| 179 |
+ if(level*scale > 2048 + scale){
|
|
| 180 |
+ av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y); |
|
| 181 |
+ return -1; |
|
| 182 |
+ } |
|
| 183 |
+ } |
|
| 184 |
+ } |
|
| 185 |
+ level *=scale; |
|
| 186 |
+ if(level&(~2047)){
|
|
| 187 |
+ if(level<0) |
|
| 188 |
+ level=0; |
|
| 189 |
+ else if(!(s->workaround_bugs&FF_BUG_DC_CLIP)) |
|
| 190 |
+ level=2047; |
|
| 191 |
+ } |
|
| 192 |
+ dc_val[0]= level; |
|
| 193 |
+ |
|
| 194 |
+ return ret; |
|
| 195 |
+} |
|
| 196 |
+#endif |
| 0 | 197 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,2262 @@ |
| 0 |
+/* |
|
| 1 |
+ * MPEG4 decoder. |
|
| 2 |
+ * Copyright (c) 2000,2001 Fabrice Bellard |
|
| 3 |
+ * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at> |
|
| 4 |
+ * |
|
| 5 |
+ * This file is part of FFmpeg. |
|
| 6 |
+ * |
|
| 7 |
+ * FFmpeg is free software; you can redistribute it and/or |
|
| 8 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 9 |
+ * License as published by the Free Software Foundation; either |
|
| 10 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 11 |
+ * |
|
| 12 |
+ * FFmpeg is distributed in the hope that it will be useful, |
|
| 13 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 14 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 15 |
+ * Lesser General Public License for more details. |
|
| 16 |
+ * |
|
| 17 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 18 |
+ * License along with FFmpeg; if not, write to the Free Software |
|
| 19 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 20 |
+ */ |
|
| 21 |
+ |
|
| 22 |
+#include "mpegvideo.h" |
|
| 23 |
+#include "mpeg4video.h" |
|
| 24 |
+#include "h263.h" |
|
| 25 |
+ |
|
| 26 |
+// The defines below define the number of bits that are read at once for |
|
| 27 |
+// reading vlc values. Changing these may improve speed and data cache needs |
|
| 28 |
+// be aware though that decreasing them may need the number of stages that is |
|
| 29 |
+// passed to get_vlc* to be increased. |
|
| 30 |
+#define SPRITE_TRAJ_VLC_BITS 6 |
|
| 31 |
+#define DC_VLC_BITS 9 |
|
| 32 |
+#define MB_TYPE_B_VLC_BITS 4 |
|
| 33 |
+ |
|
| 34 |
+ |
|
| 35 |
+static VLC dc_lum, dc_chrom; |
|
| 36 |
+static VLC sprite_trajectory; |
|
| 37 |
+static VLC mb_type_b_vlc; |
|
| 38 |
+ |
|
| 39 |
+static const int mb_type_b_map[4]= {
|
|
| 40 |
+ MB_TYPE_DIRECT2 | MB_TYPE_L0L1, |
|
| 41 |
+ MB_TYPE_L0L1 | MB_TYPE_16x16, |
|
| 42 |
+ MB_TYPE_L1 | MB_TYPE_16x16, |
|
| 43 |
+ MB_TYPE_L0 | MB_TYPE_16x16, |
|
| 44 |
+}; |
|
| 45 |
+ |
|
| 46 |
+/** |
|
| 47 |
+ * predicts the ac. |
|
| 48 |
+ * @param n block index (0-3 are luma, 4-5 are chroma) |
|
| 49 |
+ * @param dir the ac prediction direction |
|
| 50 |
+ */ |
|
| 51 |
+void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
|
| 52 |
+ int dir) |
|
| 53 |
+{
|
|
| 54 |
+ int i; |
|
| 55 |
+ int16_t *ac_val, *ac_val1; |
|
| 56 |
+ int8_t * const qscale_table= s->current_picture.qscale_table; |
|
| 57 |
+ |
|
| 58 |
+ /* find prediction */ |
|
| 59 |
+ ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
|
| 60 |
+ ac_val1 = ac_val; |
|
| 61 |
+ if (s->ac_pred) {
|
|
| 62 |
+ if (dir == 0) {
|
|
| 63 |
+ const int xy= s->mb_x-1 + s->mb_y*s->mb_stride; |
|
| 64 |
+ /* left prediction */ |
|
| 65 |
+ ac_val -= 16; |
|
| 66 |
+ |
|
| 67 |
+ if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
|
|
| 68 |
+ /* same qscale */ |
|
| 69 |
+ for(i=1;i<8;i++) {
|
|
| 70 |
+ block[s->dsp.idct_permutation[i<<3]] += ac_val[i]; |
|
| 71 |
+ } |
|
| 72 |
+ }else{
|
|
| 73 |
+ /* different qscale, we must rescale */ |
|
| 74 |
+ for(i=1;i<8;i++) {
|
|
| 75 |
+ block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); |
|
| 76 |
+ } |
|
| 77 |
+ } |
|
| 78 |
+ } else {
|
|
| 79 |
+ const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride; |
|
| 80 |
+ /* top prediction */ |
|
| 81 |
+ ac_val -= 16 * s->block_wrap[n]; |
|
| 82 |
+ |
|
| 83 |
+ if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
|
|
| 84 |
+ /* same qscale */ |
|
| 85 |
+ for(i=1;i<8;i++) {
|
|
| 86 |
+ block[s->dsp.idct_permutation[i]] += ac_val[i + 8]; |
|
| 87 |
+ } |
|
| 88 |
+ }else{
|
|
| 89 |
+ /* different qscale, we must rescale */ |
|
| 90 |
+ for(i=1;i<8;i++) {
|
|
| 91 |
+ block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); |
|
| 92 |
+ } |
|
| 93 |
+ } |
|
| 94 |
+ } |
|
| 95 |
+ } |
|
| 96 |
+ /* left copy */ |
|
| 97 |
+ for(i=1;i<8;i++) |
|
| 98 |
+ ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]]; |
|
| 99 |
+ |
|
| 100 |
+ /* top copy */ |
|
| 101 |
+ for(i=1;i<8;i++) |
|
| 102 |
+ ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]]; |
|
| 103 |
+ |
|
| 104 |
+} |
|
| 105 |
+ |
|
| 106 |
+/** |
|
| 107 |
+ * check if the next stuff is a resync marker or the end. |
|
| 108 |
+ * @return 0 if not |
|
| 109 |
+ */ |
|
| 110 |
+static inline int mpeg4_is_resync(MpegEncContext *s){
|
|
| 111 |
+ int bits_count= get_bits_count(&s->gb); |
|
| 112 |
+ int v= show_bits(&s->gb, 16); |
|
| 113 |
+ |
|
| 114 |
+ if(s->workaround_bugs&FF_BUG_NO_PADDING){
|
|
| 115 |
+ return 0; |
|
| 116 |
+ } |
|
| 117 |
+ |
|
| 118 |
+ while(v<=0xFF){
|
|
| 119 |
+ if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame) |
|
| 120 |
+ break; |
|
| 121 |
+ skip_bits(&s->gb, 8+s->pict_type); |
|
| 122 |
+ bits_count+= 8+s->pict_type; |
|
| 123 |
+ v= show_bits(&s->gb, 16); |
|
| 124 |
+ } |
|
| 125 |
+ |
|
| 126 |
+ if(bits_count + 8 >= s->gb.size_in_bits){
|
|
| 127 |
+ v>>=8; |
|
| 128 |
+ v|= 0x7F >> (7-(bits_count&7)); |
|
| 129 |
+ |
|
| 130 |
+ if(v==0x7F) |
|
| 131 |
+ return 1; |
|
| 132 |
+ }else{
|
|
| 133 |
+ if(v == ff_mpeg4_resync_prefix[bits_count&7]){
|
|
| 134 |
+ int len; |
|
| 135 |
+ GetBitContext gb= s->gb; |
|
| 136 |
+ |
|
| 137 |
+ skip_bits(&s->gb, 1); |
|
| 138 |
+ align_get_bits(&s->gb); |
|
| 139 |
+ |
|
| 140 |
+ for(len=0; len<32; len++){
|
|
| 141 |
+ if(get_bits1(&s->gb)) break; |
|
| 142 |
+ } |
|
| 143 |
+ |
|
| 144 |
+ s->gb= gb; |
|
| 145 |
+ |
|
| 146 |
+ if(len>=ff_mpeg4_get_video_packet_prefix_length(s)) |
|
| 147 |
+ return 1; |
|
| 148 |
+ } |
|
| 149 |
+ } |
|
| 150 |
+ return 0; |
|
| 151 |
+} |
|
| 152 |
+ |
|
| 153 |
+static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb) |
|
| 154 |
+{
|
|
| 155 |
+ int i; |
|
| 156 |
+ int a= 2<<s->sprite_warping_accuracy; |
|
| 157 |
+ int rho= 3-s->sprite_warping_accuracy; |
|
| 158 |
+ int r=16/a; |
|
| 159 |
+ const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
|
|
| 160 |
+ int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
|
|
| 161 |
+ int sprite_ref[4][2]; |
|
| 162 |
+ int virtual_ref[2][2]; |
|
| 163 |
+ int w2, h2, w3, h3; |
|
| 164 |
+ int alpha=0, beta=0; |
|
| 165 |
+ int w= s->width; |
|
| 166 |
+ int h= s->height; |
|
| 167 |
+ int min_ab; |
|
| 168 |
+ |
|
| 169 |
+ for(i=0; i<s->num_sprite_warping_points; i++){
|
|
| 170 |
+ int length; |
|
| 171 |
+ int x=0, y=0; |
|
| 172 |
+ |
|
| 173 |
+ length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3); |
|
| 174 |
+ if(length){
|
|
| 175 |
+ x= get_xbits(gb, length); |
|
| 176 |
+ } |
|
| 177 |
+ if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */ |
|
| 178 |
+ |
|
| 179 |
+ length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3); |
|
| 180 |
+ if(length){
|
|
| 181 |
+ y=get_xbits(gb, length); |
|
| 182 |
+ } |
|
| 183 |
+ skip_bits1(gb); /* marker bit */ |
|
| 184 |
+ s->sprite_traj[i][0]= d[i][0]= x; |
|
| 185 |
+ s->sprite_traj[i][1]= d[i][1]= y; |
|
| 186 |
+ } |
|
| 187 |
+ for(; i<4; i++) |
|
| 188 |
+ s->sprite_traj[i][0]= s->sprite_traj[i][1]= 0; |
|
| 189 |
+ |
|
| 190 |
+ while((1<<alpha)<w) alpha++; |
|
| 191 |
+ while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h' |
|
| 192 |
+ w2= 1<<alpha; |
|
| 193 |
+ h2= 1<<beta; |
|
| 194 |
+ |
|
| 195 |
+// Note, the 4th point isn't used for GMC |
|
| 196 |
+ if(s->divx_version==500 && s->divx_build==413){
|
|
| 197 |
+ sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0]; |
|
| 198 |
+ sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1]; |
|
| 199 |
+ sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0]; |
|
| 200 |
+ sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1]; |
|
| 201 |
+ sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0]; |
|
| 202 |
+ sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1]; |
|
| 203 |
+ } else {
|
|
| 204 |
+ sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]); |
|
| 205 |
+ sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]); |
|
| 206 |
+ sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]); |
|
| 207 |
+ sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]); |
|
| 208 |
+ sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]); |
|
| 209 |
+ sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]); |
|
| 210 |
+ } |
|
| 211 |
+/* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]); |
|
| 212 |
+ sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */ |
|
| 213 |
+ |
|
| 214 |
+// this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...) |
|
| 215 |
+// perhaps it should be reordered to be more readable ... |
|
| 216 |
+// the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides |
|
| 217 |
+// so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form |
|
| 218 |
+ virtual_ref[0][0]= 16*(vop_ref[0][0] + w2) |
|
| 219 |
+ + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w); |
|
| 220 |
+ virtual_ref[0][1]= 16*vop_ref[0][1] |
|
| 221 |
+ + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w); |
|
| 222 |
+ virtual_ref[1][0]= 16*vop_ref[0][0] |
|
| 223 |
+ + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h); |
|
| 224 |
+ virtual_ref[1][1]= 16*(vop_ref[0][1] + h2) |
|
| 225 |
+ + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h); |
|
| 226 |
+ |
|
| 227 |
+ switch(s->num_sprite_warping_points) |
|
| 228 |
+ {
|
|
| 229 |
+ case 0: |
|
| 230 |
+ s->sprite_offset[0][0]= 0; |
|
| 231 |
+ s->sprite_offset[0][1]= 0; |
|
| 232 |
+ s->sprite_offset[1][0]= 0; |
|
| 233 |
+ s->sprite_offset[1][1]= 0; |
|
| 234 |
+ s->sprite_delta[0][0]= a; |
|
| 235 |
+ s->sprite_delta[0][1]= 0; |
|
| 236 |
+ s->sprite_delta[1][0]= 0; |
|
| 237 |
+ s->sprite_delta[1][1]= a; |
|
| 238 |
+ s->sprite_shift[0]= 0; |
|
| 239 |
+ s->sprite_shift[1]= 0; |
|
| 240 |
+ break; |
|
| 241 |
+ case 1: //GMC only |
|
| 242 |
+ s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0]; |
|
| 243 |
+ s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1]; |
|
| 244 |
+ s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2); |
|
| 245 |
+ s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2); |
|
| 246 |
+ s->sprite_delta[0][0]= a; |
|
| 247 |
+ s->sprite_delta[0][1]= 0; |
|
| 248 |
+ s->sprite_delta[1][0]= 0; |
|
| 249 |
+ s->sprite_delta[1][1]= a; |
|
| 250 |
+ s->sprite_shift[0]= 0; |
|
| 251 |
+ s->sprite_shift[1]= 0; |
|
| 252 |
+ break; |
|
| 253 |
+ case 2: |
|
| 254 |
+ s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho)) |
|
| 255 |
+ + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0]) |
|
| 256 |
+ + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1]) |
|
| 257 |
+ + (1<<(alpha+rho-1)); |
|
| 258 |
+ s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho)) |
|
| 259 |
+ + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0]) |
|
| 260 |
+ + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1]) |
|
| 261 |
+ + (1<<(alpha+rho-1)); |
|
| 262 |
+ s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1) |
|
| 263 |
+ +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1) |
|
| 264 |
+ +2*w2*r*sprite_ref[0][0] |
|
| 265 |
+ - 16*w2 |
|
| 266 |
+ + (1<<(alpha+rho+1))); |
|
| 267 |
+ s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1) |
|
| 268 |
+ +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1) |
|
| 269 |
+ +2*w2*r*sprite_ref[0][1] |
|
| 270 |
+ - 16*w2 |
|
| 271 |
+ + (1<<(alpha+rho+1))); |
|
| 272 |
+ s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); |
|
| 273 |
+ s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]); |
|
| 274 |
+ s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]); |
|
| 275 |
+ s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); |
|
| 276 |
+ |
|
| 277 |
+ s->sprite_shift[0]= alpha+rho; |
|
| 278 |
+ s->sprite_shift[1]= alpha+rho+2; |
|
| 279 |
+ break; |
|
| 280 |
+ case 3: |
|
| 281 |
+ min_ab= FFMIN(alpha, beta); |
|
| 282 |
+ w3= w2>>min_ab; |
|
| 283 |
+ h3= h2>>min_ab; |
|
| 284 |
+ s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab)) |
|
| 285 |
+ + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0]) |
|
| 286 |
+ + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1]) |
|
| 287 |
+ + (1<<(alpha+beta+rho-min_ab-1)); |
|
| 288 |
+ s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab)) |
|
| 289 |
+ + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0]) |
|
| 290 |
+ + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1]) |
|
| 291 |
+ + (1<<(alpha+beta+rho-min_ab-1)); |
|
| 292 |
+ s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1) |
|
| 293 |
+ + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1) |
|
| 294 |
+ + 2*w2*h3*r*sprite_ref[0][0] |
|
| 295 |
+ - 16*w2*h3 |
|
| 296 |
+ + (1<<(alpha+beta+rho-min_ab+1)); |
|
| 297 |
+ s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1) |
|
| 298 |
+ + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1) |
|
| 299 |
+ + 2*w2*h3*r*sprite_ref[0][1] |
|
| 300 |
+ - 16*w2*h3 |
|
| 301 |
+ + (1<<(alpha+beta+rho-min_ab+1)); |
|
| 302 |
+ s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3; |
|
| 303 |
+ s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3; |
|
| 304 |
+ s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3; |
|
| 305 |
+ s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3; |
|
| 306 |
+ |
|
| 307 |
+ s->sprite_shift[0]= alpha + beta + rho - min_ab; |
|
| 308 |
+ s->sprite_shift[1]= alpha + beta + rho - min_ab + 2; |
|
| 309 |
+ break; |
|
| 310 |
+ } |
|
| 311 |
+ /* try to simplify the situation */ |
|
| 312 |
+ if( s->sprite_delta[0][0] == a<<s->sprite_shift[0] |
|
| 313 |
+ && s->sprite_delta[0][1] == 0 |
|
| 314 |
+ && s->sprite_delta[1][0] == 0 |
|
| 315 |
+ && s->sprite_delta[1][1] == a<<s->sprite_shift[0]) |
|
| 316 |
+ {
|
|
| 317 |
+ s->sprite_offset[0][0]>>=s->sprite_shift[0]; |
|
| 318 |
+ s->sprite_offset[0][1]>>=s->sprite_shift[0]; |
|
| 319 |
+ s->sprite_offset[1][0]>>=s->sprite_shift[1]; |
|
| 320 |
+ s->sprite_offset[1][1]>>=s->sprite_shift[1]; |
|
| 321 |
+ s->sprite_delta[0][0]= a; |
|
| 322 |
+ s->sprite_delta[0][1]= 0; |
|
| 323 |
+ s->sprite_delta[1][0]= 0; |
|
| 324 |
+ s->sprite_delta[1][1]= a; |
|
| 325 |
+ s->sprite_shift[0]= 0; |
|
| 326 |
+ s->sprite_shift[1]= 0; |
|
| 327 |
+ s->real_sprite_warping_points=1; |
|
| 328 |
+ } |
|
| 329 |
+ else{
|
|
| 330 |
+ int shift_y= 16 - s->sprite_shift[0]; |
|
| 331 |
+ int shift_c= 16 - s->sprite_shift[1]; |
|
| 332 |
+ for(i=0; i<2; i++){
|
|
| 333 |
+ s->sprite_offset[0][i]<<= shift_y; |
|
| 334 |
+ s->sprite_offset[1][i]<<= shift_c; |
|
| 335 |
+ s->sprite_delta[0][i]<<= shift_y; |
|
| 336 |
+ s->sprite_delta[1][i]<<= shift_y; |
|
| 337 |
+ s->sprite_shift[i]= 16; |
|
| 338 |
+ } |
|
| 339 |
+ s->real_sprite_warping_points= s->num_sprite_warping_points; |
|
| 340 |
+ } |
|
| 341 |
+} |
|
| 342 |
+ |
|
| 343 |
+/** |
|
| 344 |
+ * decodes the next video packet. |
|
| 345 |
+ * @return <0 if something went wrong |
|
| 346 |
+ */ |
|
| 347 |
+int mpeg4_decode_video_packet_header(MpegEncContext *s) |
|
| 348 |
+{
|
|
| 349 |
+ int mb_num_bits= av_log2(s->mb_num - 1) + 1; |
|
| 350 |
+ int header_extension=0, mb_num, len; |
|
| 351 |
+ |
|
| 352 |
+ /* is there enough space left for a video packet + header */ |
|
| 353 |
+ if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1; |
|
| 354 |
+ |
|
| 355 |
+ for(len=0; len<32; len++){
|
|
| 356 |
+ if(get_bits1(&s->gb)) break; |
|
| 357 |
+ } |
|
| 358 |
+ |
|
| 359 |
+ if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
|
|
| 360 |
+ av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n"); |
|
| 361 |
+ return -1; |
|
| 362 |
+ } |
|
| 363 |
+ |
|
| 364 |
+ if(s->shape != RECT_SHAPE){
|
|
| 365 |
+ header_extension= get_bits1(&s->gb); |
|
| 366 |
+ //FIXME more stuff here |
|
| 367 |
+ } |
|
| 368 |
+ |
|
| 369 |
+ mb_num= get_bits(&s->gb, mb_num_bits); |
|
| 370 |
+ if(mb_num>=s->mb_num){
|
|
| 371 |
+ av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num); |
|
| 372 |
+ return -1; |
|
| 373 |
+ } |
|
| 374 |
+ if(s->pict_type == FF_B_TYPE){
|
|
| 375 |
+ while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++; |
|
| 376 |
+ if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded |
|
| 377 |
+ } |
|
| 378 |
+ |
|
| 379 |
+ s->mb_x= mb_num % s->mb_width; |
|
| 380 |
+ s->mb_y= mb_num / s->mb_width; |
|
| 381 |
+ |
|
| 382 |
+ if(s->shape != BIN_ONLY_SHAPE){
|
|
| 383 |
+ int qscale= get_bits(&s->gb, s->quant_precision); |
|
| 384 |
+ if(qscale) |
|
| 385 |
+ s->chroma_qscale=s->qscale= qscale; |
|
| 386 |
+ } |
|
| 387 |
+ |
|
| 388 |
+ if(s->shape == RECT_SHAPE){
|
|
| 389 |
+ header_extension= get_bits1(&s->gb); |
|
| 390 |
+ } |
|
| 391 |
+ if(header_extension){
|
|
| 392 |
+ int time_increment; |
|
| 393 |
+ int time_incr=0; |
|
| 394 |
+ |
|
| 395 |
+ while (get_bits1(&s->gb) != 0) |
|
| 396 |
+ time_incr++; |
|
| 397 |
+ |
|
| 398 |
+ check_marker(&s->gb, "before time_increment in video packed header"); |
|
| 399 |
+ time_increment= get_bits(&s->gb, s->time_increment_bits); |
|
| 400 |
+ check_marker(&s->gb, "before vop_coding_type in video packed header"); |
|
| 401 |
+ |
|
| 402 |
+ skip_bits(&s->gb, 2); /* vop coding type */ |
|
| 403 |
+ //FIXME not rect stuff here |
|
| 404 |
+ |
|
| 405 |
+ if(s->shape != BIN_ONLY_SHAPE){
|
|
| 406 |
+ skip_bits(&s->gb, 3); /* intra dc vlc threshold */ |
|
| 407 |
+//FIXME don't just ignore everything |
|
| 408 |
+ if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
|
|
| 409 |
+ mpeg4_decode_sprite_trajectory(s, &s->gb); |
|
| 410 |
+ av_log(s->avctx, AV_LOG_ERROR, "untested\n"); |
|
| 411 |
+ } |
|
| 412 |
+ |
|
| 413 |
+ //FIXME reduced res stuff here |
|
| 414 |
+ |
|
| 415 |
+ if (s->pict_type != FF_I_TYPE) {
|
|
| 416 |
+ int f_code = get_bits(&s->gb, 3); /* fcode_for */ |
|
| 417 |
+ if(f_code==0){
|
|
| 418 |
+ av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n"); |
|
| 419 |
+ } |
|
| 420 |
+ } |
|
| 421 |
+ if (s->pict_type == FF_B_TYPE) {
|
|
| 422 |
+ int b_code = get_bits(&s->gb, 3); |
|
| 423 |
+ if(b_code==0){
|
|
| 424 |
+ av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n"); |
|
| 425 |
+ } |
|
| 426 |
+ } |
|
| 427 |
+ } |
|
| 428 |
+ } |
|
| 429 |
+ //FIXME new-pred stuff |
|
| 430 |
+ |
|
| 431 |
+ return 0; |
|
| 432 |
+} |
|
| 433 |
+ |
|
| 434 |
+/** |
|
| 435 |
+ * gets the average motion vector for a GMC MB. |
|
| 436 |
+ * @param n either 0 for the x component or 1 for y |
|
| 437 |
+ * @returns the average MV for a GMC MB |
|
| 438 |
+ */ |
|
| 439 |
+static inline int get_amv(MpegEncContext *s, int n){
|
|
| 440 |
+ int x, y, mb_v, sum, dx, dy, shift; |
|
| 441 |
+ int len = 1 << (s->f_code + 4); |
|
| 442 |
+ const int a= s->sprite_warping_accuracy; |
|
| 443 |
+ |
|
| 444 |
+ if(s->workaround_bugs & FF_BUG_AMV) |
|
| 445 |
+ len >>= s->quarter_sample; |
|
| 446 |
+ |
|
| 447 |
+ if(s->real_sprite_warping_points==1){
|
|
| 448 |
+ if(s->divx_version==500 && s->divx_build==413) |
|
| 449 |
+ sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample)); |
|
| 450 |
+ else |
|
| 451 |
+ sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a); |
|
| 452 |
+ }else{
|
|
| 453 |
+ dx= s->sprite_delta[n][0]; |
|
| 454 |
+ dy= s->sprite_delta[n][1]; |
|
| 455 |
+ shift= s->sprite_shift[0]; |
|
| 456 |
+ if(n) dy -= 1<<(shift + a + 1); |
|
| 457 |
+ else dx -= 1<<(shift + a + 1); |
|
| 458 |
+ mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16; |
|
| 459 |
+ |
|
| 460 |
+ sum=0; |
|
| 461 |
+ for(y=0; y<16; y++){
|
|
| 462 |
+ int v; |
|
| 463 |
+ |
|
| 464 |
+ v= mb_v + dy*y; |
|
| 465 |
+ //XXX FIXME optimize |
|
| 466 |
+ for(x=0; x<16; x++){
|
|
| 467 |
+ sum+= v>>shift; |
|
| 468 |
+ v+= dx; |
|
| 469 |
+ } |
|
| 470 |
+ } |
|
| 471 |
+ sum= RSHIFT(sum, a+8-s->quarter_sample); |
|
| 472 |
+ } |
|
| 473 |
+ |
|
| 474 |
+ if (sum < -len) sum= -len; |
|
| 475 |
+ else if (sum >= len) sum= len-1; |
|
| 476 |
+ |
|
| 477 |
+ return sum; |
|
| 478 |
+} |
|
| 479 |
+ |
|
| 480 |
+/** |
|
| 481 |
+ * decodes the dc value. |
|
| 482 |
+ * @param n block index (0-3 are luma, 4-5 are chroma) |
|
| 483 |
+ * @param dir_ptr the prediction direction will be stored here |
|
| 484 |
+ * @return the quantized dc |
|
| 485 |
+ */ |
|
| 486 |
+static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) |
|
| 487 |
+{
|
|
| 488 |
+ int level, code; |
|
| 489 |
+ |
|
| 490 |
+ if (n < 4) |
|
| 491 |
+ code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); |
|
| 492 |
+ else |
|
| 493 |
+ code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); |
|
| 494 |
+ if (code < 0 || code > 9 /* && s->nbit<9 */){
|
|
| 495 |
+ av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); |
|
| 496 |
+ return -1; |
|
| 497 |
+ } |
|
| 498 |
+ if (code == 0) {
|
|
| 499 |
+ level = 0; |
|
| 500 |
+ } else {
|
|
| 501 |
+ if(IS_3IV1){
|
|
| 502 |
+ if(code==1) |
|
| 503 |
+ level= 2*get_bits1(&s->gb)-1; |
|
| 504 |
+ else{
|
|
| 505 |
+ if(get_bits1(&s->gb)) |
|
| 506 |
+ level = get_bits(&s->gb, code-1) + (1<<(code-1)); |
|
| 507 |
+ else |
|
| 508 |
+ level = -get_bits(&s->gb, code-1) - (1<<(code-1)); |
|
| 509 |
+ } |
|
| 510 |
+ }else{
|
|
| 511 |
+ level = get_xbits(&s->gb, code); |
|
| 512 |
+ } |
|
| 513 |
+ |
|
| 514 |
+ if (code > 8){
|
|
| 515 |
+ if(get_bits1(&s->gb)==0){ /* marker */
|
|
| 516 |
+ if(s->error_recognition>=2){
|
|
| 517 |
+ av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n"); |
|
| 518 |
+ return -1; |
|
| 519 |
+ } |
|
| 520 |
+ } |
|
| 521 |
+ } |
|
| 522 |
+ } |
|
| 523 |
+ |
|
| 524 |
+ return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0); |
|
| 525 |
+} |
|
| 526 |
+ |
|
| 527 |
+/** |
|
| 528 |
+ * decodes first partition. |
|
| 529 |
+ * @return number of MBs decoded or <0 if an error occurred |
|
| 530 |
+ */ |
|
| 531 |
+static int mpeg4_decode_partition_a(MpegEncContext *s){
|
|
| 532 |
+ int mb_num; |
|
| 533 |
+ static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
|
|
| 534 |
+ |
|
| 535 |
+ /* decode first partition */ |
|
| 536 |
+ mb_num=0; |
|
| 537 |
+ s->first_slice_line=1; |
|
| 538 |
+ for(; s->mb_y<s->mb_height; s->mb_y++){
|
|
| 539 |
+ ff_init_block_index(s); |
|
| 540 |
+ for(; s->mb_x<s->mb_width; s->mb_x++){
|
|
| 541 |
+ const int xy= s->mb_x + s->mb_y*s->mb_stride; |
|
| 542 |
+ int cbpc; |
|
| 543 |
+ int dir=0; |
|
| 544 |
+ |
|
| 545 |
+ mb_num++; |
|
| 546 |
+ ff_update_block_index(s); |
|
| 547 |
+ if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1) |
|
| 548 |
+ s->first_slice_line=0; |
|
| 549 |
+ |
|
| 550 |
+ if(s->pict_type==FF_I_TYPE){
|
|
| 551 |
+ int i; |
|
| 552 |
+ |
|
| 553 |
+ do{
|
|
| 554 |
+ if(show_bits_long(&s->gb, 19)==DC_MARKER){
|
|
| 555 |
+ return mb_num-1; |
|
| 556 |
+ } |
|
| 557 |
+ |
|
| 558 |
+ cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2); |
|
| 559 |
+ if (cbpc < 0){
|
|
| 560 |
+ av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 561 |
+ return -1; |
|
| 562 |
+ } |
|
| 563 |
+ }while(cbpc == 8); |
|
| 564 |
+ |
|
| 565 |
+ s->cbp_table[xy]= cbpc & 3; |
|
| 566 |
+ s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
|
| 567 |
+ s->mb_intra = 1; |
|
| 568 |
+ |
|
| 569 |
+ if(cbpc & 4) {
|
|
| 570 |
+ ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
| 571 |
+ } |
|
| 572 |
+ s->current_picture.qscale_table[xy]= s->qscale; |
|
| 573 |
+ |
|
| 574 |
+ s->mbintra_table[xy]= 1; |
|
| 575 |
+ for(i=0; i<6; i++){
|
|
| 576 |
+ int dc_pred_dir; |
|
| 577 |
+ int dc= mpeg4_decode_dc(s, i, &dc_pred_dir); |
|
| 578 |
+ if(dc < 0){
|
|
| 579 |
+ av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 580 |
+ return -1; |
|
| 581 |
+ } |
|
| 582 |
+ dir<<=1; |
|
| 583 |
+ if(dc_pred_dir) dir|=1; |
|
| 584 |
+ } |
|
| 585 |
+ s->pred_dir_table[xy]= dir; |
|
| 586 |
+ }else{ /* P/S_TYPE */
|
|
| 587 |
+ int mx, my, pred_x, pred_y, bits; |
|
| 588 |
+ int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]]; |
|
| 589 |
+ const int stride= s->b8_stride*2; |
|
| 590 |
+ |
|
| 591 |
+try_again: |
|
| 592 |
+ bits= show_bits(&s->gb, 17); |
|
| 593 |
+ if(bits==MOTION_MARKER){
|
|
| 594 |
+ return mb_num-1; |
|
| 595 |
+ } |
|
| 596 |
+ skip_bits1(&s->gb); |
|
| 597 |
+ if(bits&0x10000){
|
|
| 598 |
+ /* skip mb */ |
|
| 599 |
+ if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
|
|
| 600 |
+ s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0; |
|
| 601 |
+ mx= get_amv(s, 0); |
|
| 602 |
+ my= get_amv(s, 1); |
|
| 603 |
+ }else{
|
|
| 604 |
+ s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 605 |
+ mx=my=0; |
|
| 606 |
+ } |
|
| 607 |
+ mot_val[0 ]= mot_val[2 ]= |
|
| 608 |
+ mot_val[0+stride]= mot_val[2+stride]= mx; |
|
| 609 |
+ mot_val[1 ]= mot_val[3 ]= |
|
| 610 |
+ mot_val[1+stride]= mot_val[3+stride]= my; |
|
| 611 |
+ |
|
| 612 |
+ if(s->mbintra_table[xy]) |
|
| 613 |
+ ff_clean_intra_table_entries(s); |
|
| 614 |
+ continue; |
|
| 615 |
+ } |
|
| 616 |
+ |
|
| 617 |
+ cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); |
|
| 618 |
+ if (cbpc < 0){
|
|
| 619 |
+ av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 620 |
+ return -1; |
|
| 621 |
+ } |
|
| 622 |
+ if(cbpc == 20) |
|
| 623 |
+ goto try_again; |
|
| 624 |
+ |
|
| 625 |
+ s->cbp_table[xy]= cbpc&(8+3); //8 is dquant |
|
| 626 |
+ |
|
| 627 |
+ s->mb_intra = ((cbpc & 4) != 0); |
|
| 628 |
+ |
|
| 629 |
+ if(s->mb_intra){
|
|
| 630 |
+ s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
|
| 631 |
+ s->mbintra_table[xy]= 1; |
|
| 632 |
+ mot_val[0 ]= mot_val[2 ]= |
|
| 633 |
+ mot_val[0+stride]= mot_val[2+stride]= 0; |
|
| 634 |
+ mot_val[1 ]= mot_val[3 ]= |
|
| 635 |
+ mot_val[1+stride]= mot_val[3+stride]= 0; |
|
| 636 |
+ }else{
|
|
| 637 |
+ if(s->mbintra_table[xy]) |
|
| 638 |
+ ff_clean_intra_table_entries(s); |
|
| 639 |
+ |
|
| 640 |
+ if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0) |
|
| 641 |
+ s->mcsel= get_bits1(&s->gb); |
|
| 642 |
+ else s->mcsel= 0; |
|
| 643 |
+ |
|
| 644 |
+ if ((cbpc & 16) == 0) {
|
|
| 645 |
+ /* 16x16 motion prediction */ |
|
| 646 |
+ |
|
| 647 |
+ h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
|
| 648 |
+ if(!s->mcsel){
|
|
| 649 |
+ mx = h263_decode_motion(s, pred_x, s->f_code); |
|
| 650 |
+ if (mx >= 0xffff) |
|
| 651 |
+ return -1; |
|
| 652 |
+ |
|
| 653 |
+ my = h263_decode_motion(s, pred_y, s->f_code); |
|
| 654 |
+ if (my >= 0xffff) |
|
| 655 |
+ return -1; |
|
| 656 |
+ s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 657 |
+ } else {
|
|
| 658 |
+ mx = get_amv(s, 0); |
|
| 659 |
+ my = get_amv(s, 1); |
|
| 660 |
+ s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0; |
|
| 661 |
+ } |
|
| 662 |
+ |
|
| 663 |
+ mot_val[0 ]= mot_val[2 ] = |
|
| 664 |
+ mot_val[0+stride]= mot_val[2+stride]= mx; |
|
| 665 |
+ mot_val[1 ]= mot_val[3 ]= |
|
| 666 |
+ mot_val[1+stride]= mot_val[3+stride]= my; |
|
| 667 |
+ } else {
|
|
| 668 |
+ int i; |
|
| 669 |
+ s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0; |
|
| 670 |
+ for(i=0;i<4;i++) {
|
|
| 671 |
+ int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
|
| 672 |
+ mx = h263_decode_motion(s, pred_x, s->f_code); |
|
| 673 |
+ if (mx >= 0xffff) |
|
| 674 |
+ return -1; |
|
| 675 |
+ |
|
| 676 |
+ my = h263_decode_motion(s, pred_y, s->f_code); |
|
| 677 |
+ if (my >= 0xffff) |
|
| 678 |
+ return -1; |
|
| 679 |
+ mot_val[0] = mx; |
|
| 680 |
+ mot_val[1] = my; |
|
| 681 |
+ } |
|
| 682 |
+ } |
|
| 683 |
+ } |
|
| 684 |
+ } |
|
| 685 |
+ } |
|
| 686 |
+ s->mb_x= 0; |
|
| 687 |
+ } |
|
| 688 |
+ |
|
| 689 |
+ return mb_num; |
|
| 690 |
+} |
|
| 691 |
+ |
|
| 692 |
+/** |
|
| 693 |
+ * decode second partition. |
|
| 694 |
+ * @return <0 if an error occurred |
|
| 695 |
+ */ |
|
| 696 |
+static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
|
|
| 697 |
+ int mb_num=0; |
|
| 698 |
+ static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
|
|
| 699 |
+ |
|
| 700 |
+ s->mb_x= s->resync_mb_x; |
|
| 701 |
+ s->first_slice_line=1; |
|
| 702 |
+ for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
|
|
| 703 |
+ ff_init_block_index(s); |
|
| 704 |
+ for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
|
|
| 705 |
+ const int xy= s->mb_x + s->mb_y*s->mb_stride; |
|
| 706 |
+ |
|
| 707 |
+ mb_num++; |
|
| 708 |
+ ff_update_block_index(s); |
|
| 709 |
+ if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1) |
|
| 710 |
+ s->first_slice_line=0; |
|
| 711 |
+ |
|
| 712 |
+ if(s->pict_type==FF_I_TYPE){
|
|
| 713 |
+ int ac_pred= get_bits1(&s->gb); |
|
| 714 |
+ int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
|
| 715 |
+ if(cbpy<0){
|
|
| 716 |
+ av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 717 |
+ return -1; |
|
| 718 |
+ } |
|
| 719 |
+ |
|
| 720 |
+ s->cbp_table[xy]|= cbpy<<2; |
|
| 721 |
+ s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED; |
|
| 722 |
+ }else{ /* P || S_TYPE */
|
|
| 723 |
+ if(IS_INTRA(s->current_picture.mb_type[xy])){
|
|
| 724 |
+ int dir=0,i; |
|
| 725 |
+ int ac_pred = get_bits1(&s->gb); |
|
| 726 |
+ int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
|
| 727 |
+ |
|
| 728 |
+ if(cbpy<0){
|
|
| 729 |
+ av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 730 |
+ return -1; |
|
| 731 |
+ } |
|
| 732 |
+ |
|
| 733 |
+ if(s->cbp_table[xy] & 8) {
|
|
| 734 |
+ ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
| 735 |
+ } |
|
| 736 |
+ s->current_picture.qscale_table[xy]= s->qscale; |
|
| 737 |
+ |
|
| 738 |
+ for(i=0; i<6; i++){
|
|
| 739 |
+ int dc_pred_dir; |
|
| 740 |
+ int dc= mpeg4_decode_dc(s, i, &dc_pred_dir); |
|
| 741 |
+ if(dc < 0){
|
|
| 742 |
+ av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 743 |
+ return -1; |
|
| 744 |
+ } |
|
| 745 |
+ dir<<=1; |
|
| 746 |
+ if(dc_pred_dir) dir|=1; |
|
| 747 |
+ } |
|
| 748 |
+ s->cbp_table[xy]&= 3; //remove dquant |
|
| 749 |
+ s->cbp_table[xy]|= cbpy<<2; |
|
| 750 |
+ s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED; |
|
| 751 |
+ s->pred_dir_table[xy]= dir; |
|
| 752 |
+ }else if(IS_SKIP(s->current_picture.mb_type[xy])){
|
|
| 753 |
+ s->current_picture.qscale_table[xy]= s->qscale; |
|
| 754 |
+ s->cbp_table[xy]= 0; |
|
| 755 |
+ }else{
|
|
| 756 |
+ int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
|
| 757 |
+ |
|
| 758 |
+ if(cbpy<0){
|
|
| 759 |
+ av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
| 760 |
+ return -1; |
|
| 761 |
+ } |
|
| 762 |
+ |
|
| 763 |
+ if(s->cbp_table[xy] & 8) {
|
|
| 764 |
+ ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
| 765 |
+ } |
|
| 766 |
+ s->current_picture.qscale_table[xy]= s->qscale; |
|
| 767 |
+ |
|
| 768 |
+ s->cbp_table[xy]&= 3; //remove dquant |
|
| 769 |
+ s->cbp_table[xy]|= (cbpy^0xf)<<2; |
|
| 770 |
+ } |
|
| 771 |
+ } |
|
| 772 |
+ } |
|
| 773 |
+ if(mb_num >= mb_count) return 0; |
|
| 774 |
+ s->mb_x= 0; |
|
| 775 |
+ } |
|
| 776 |
+ return 0; |
|
| 777 |
+} |
|
| 778 |
+ |
|
| 779 |
+/** |
|
| 780 |
+ * decodes the first & second partition |
|
| 781 |
+ * @return <0 if error (and sets error type in the error_status_table) |
|
| 782 |
+ */ |
|
| 783 |
+int ff_mpeg4_decode_partitions(MpegEncContext *s) |
|
| 784 |
+{
|
|
| 785 |
+ int mb_num; |
|
| 786 |
+ const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR; |
|
| 787 |
+ const int part_a_end = s->pict_type==FF_I_TYPE ? (DC_END |MV_END) : MV_END; |
|
| 788 |
+ |
|
| 789 |
+ mb_num= mpeg4_decode_partition_a(s); |
|
| 790 |
+ if(mb_num<0){
|
|
| 791 |
+ ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error); |
|
| 792 |
+ return -1; |
|
| 793 |
+ } |
|
| 794 |
+ |
|
| 795 |
+ if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
|
|
| 796 |
+ av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n"); |
|
| 797 |
+ ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error); |
|
| 798 |
+ return -1; |
|
| 799 |
+ } |
|
| 800 |
+ |
|
| 801 |
+ s->mb_num_left= mb_num; |
|
| 802 |
+ |
|
| 803 |
+ if(s->pict_type==FF_I_TYPE){
|
|
| 804 |
+ while(show_bits(&s->gb, 9) == 1) |
|
| 805 |
+ skip_bits(&s->gb, 9); |
|
| 806 |
+ if(get_bits_long(&s->gb, 19)!=DC_MARKER){
|
|
| 807 |
+ av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y); |
|
| 808 |
+ return -1; |
|
| 809 |
+ } |
|
| 810 |
+ }else{
|
|
| 811 |
+ while(show_bits(&s->gb, 10) == 1) |
|
| 812 |
+ skip_bits(&s->gb, 10); |
|
| 813 |
+ if(get_bits(&s->gb, 17)!=MOTION_MARKER){
|
|
| 814 |
+ av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y); |
|
| 815 |
+ return -1; |
|
| 816 |
+ } |
|
| 817 |
+ } |
|
| 818 |
+ ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end); |
|
| 819 |
+ |
|
| 820 |
+ if( mpeg4_decode_partition_b(s, mb_num) < 0){
|
|
| 821 |
+ if(s->pict_type==FF_P_TYPE) |
|
| 822 |
+ ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR); |
|
| 823 |
+ return -1; |
|
| 824 |
+ }else{
|
|
| 825 |
+ if(s->pict_type==FF_P_TYPE) |
|
| 826 |
+ ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END); |
|
| 827 |
+ } |
|
| 828 |
+ |
|
| 829 |
+ return 0; |
|
| 830 |
+} |
|
| 831 |
+ |
|
| 832 |
+/** |
|
| 833 |
+ * decodes a block. |
|
| 834 |
+ * @return <0 if an error occurred |
|
| 835 |
+ */ |
|
| 836 |
+static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
|
| 837 |
+ int n, int coded, int intra, int rvlc) |
|
| 838 |
+{
|
|
| 839 |
+ int level, i, last, run; |
|
| 840 |
+ int dc_pred_dir; |
|
| 841 |
+ RLTable * rl; |
|
| 842 |
+ RL_VLC_ELEM * rl_vlc; |
|
| 843 |
+ const uint8_t * scan_table; |
|
| 844 |
+ int qmul, qadd; |
|
| 845 |
+ |
|
| 846 |
+ //Note intra & rvlc should be optimized away if this is inlined |
|
| 847 |
+ |
|
| 848 |
+ if(intra) {
|
|
| 849 |
+ if(s->use_intra_dc_vlc){
|
|
| 850 |
+ /* DC coef */ |
|
| 851 |
+ if(s->partitioned_frame){
|
|
| 852 |
+ level = s->dc_val[0][ s->block_index[n] ]; |
|
| 853 |
+ if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale); |
|
| 854 |
+ else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale); |
|
| 855 |
+ dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; |
|
| 856 |
+ }else{
|
|
| 857 |
+ level = mpeg4_decode_dc(s, n, &dc_pred_dir); |
|
| 858 |
+ if (level < 0) |
|
| 859 |
+ return -1; |
|
| 860 |
+ } |
|
| 861 |
+ block[0] = level; |
|
| 862 |
+ i = 0; |
|
| 863 |
+ }else{
|
|
| 864 |
+ i = -1; |
|
| 865 |
+ ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0); |
|
| 866 |
+ } |
|
| 867 |
+ if (!coded) |
|
| 868 |
+ goto not_coded; |
|
| 869 |
+ |
|
| 870 |
+ if(rvlc){
|
|
| 871 |
+ rl = &rvlc_rl_intra; |
|
| 872 |
+ rl_vlc = rvlc_rl_intra.rl_vlc[0]; |
|
| 873 |
+ }else{
|
|
| 874 |
+ rl = &rl_intra; |
|
| 875 |
+ rl_vlc = rl_intra.rl_vlc[0]; |
|
| 876 |
+ } |
|
| 877 |
+ if (s->ac_pred) {
|
|
| 878 |
+ if (dc_pred_dir == 0) |
|
| 879 |
+ scan_table = s->intra_v_scantable.permutated; /* left */ |
|
| 880 |
+ else |
|
| 881 |
+ scan_table = s->intra_h_scantable.permutated; /* top */ |
|
| 882 |
+ } else {
|
|
| 883 |
+ scan_table = s->intra_scantable.permutated; |
|
| 884 |
+ } |
|
| 885 |
+ qmul=1; |
|
| 886 |
+ qadd=0; |
|
| 887 |
+ } else {
|
|
| 888 |
+ i = -1; |
|
| 889 |
+ if (!coded) {
|
|
| 890 |
+ s->block_last_index[n] = i; |
|
| 891 |
+ return 0; |
|
| 892 |
+ } |
|
| 893 |
+ if(rvlc) rl = &rvlc_rl_inter; |
|
| 894 |
+ else rl = &rl_inter; |
|
| 895 |
+ |
|
| 896 |
+ scan_table = s->intra_scantable.permutated; |
|
| 897 |
+ |
|
| 898 |
+ if(s->mpeg_quant){
|
|
| 899 |
+ qmul=1; |
|
| 900 |
+ qadd=0; |
|
| 901 |
+ if(rvlc){
|
|
| 902 |
+ rl_vlc = rvlc_rl_inter.rl_vlc[0]; |
|
| 903 |
+ }else{
|
|
| 904 |
+ rl_vlc = rl_inter.rl_vlc[0]; |
|
| 905 |
+ } |
|
| 906 |
+ }else{
|
|
| 907 |
+ qmul = s->qscale << 1; |
|
| 908 |
+ qadd = (s->qscale - 1) | 1; |
|
| 909 |
+ if(rvlc){
|
|
| 910 |
+ rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; |
|
| 911 |
+ }else{
|
|
| 912 |
+ rl_vlc = rl_inter.rl_vlc[s->qscale]; |
|
| 913 |
+ } |
|
| 914 |
+ } |
|
| 915 |
+ } |
|
| 916 |
+ {
|
|
| 917 |
+ OPEN_READER(re, &s->gb); |
|
| 918 |
+ for(;;) {
|
|
| 919 |
+ UPDATE_CACHE(re, &s->gb); |
|
| 920 |
+ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0); |
|
| 921 |
+ if (level==0) {
|
|
| 922 |
+ /* escape */ |
|
| 923 |
+ if(rvlc){
|
|
| 924 |
+ if(SHOW_UBITS(re, &s->gb, 1)==0){
|
|
| 925 |
+ av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n"); |
|
| 926 |
+ return -1; |
|
| 927 |
+ }; SKIP_CACHE(re, &s->gb, 1); |
|
| 928 |
+ |
|
| 929 |
+ last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); |
|
| 930 |
+ run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); |
|
| 931 |
+ SKIP_COUNTER(re, &s->gb, 1+1+6); |
|
| 932 |
+ UPDATE_CACHE(re, &s->gb); |
|
| 933 |
+ |
|
| 934 |
+ if(SHOW_UBITS(re, &s->gb, 1)==0){
|
|
| 935 |
+ av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n"); |
|
| 936 |
+ return -1; |
|
| 937 |
+ }; SKIP_CACHE(re, &s->gb, 1); |
|
| 938 |
+ |
|
| 939 |
+ level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); |
|
| 940 |
+ |
|
| 941 |
+ if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
|
|
| 942 |
+ av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n"); |
|
| 943 |
+ return -1; |
|
| 944 |
+ }; SKIP_CACHE(re, &s->gb, 5); |
|
| 945 |
+ |
|
| 946 |
+ level= level * qmul + qadd; |
|
| 947 |
+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); |
|
| 948 |
+ SKIP_COUNTER(re, &s->gb, 1+11+5+1); |
|
| 949 |
+ |
|
| 950 |
+ i+= run + 1; |
|
| 951 |
+ if(last) i+=192; |
|
| 952 |
+ }else{
|
|
| 953 |
+ int cache; |
|
| 954 |
+ cache= GET_CACHE(re, &s->gb); |
|
| 955 |
+ |
|
| 956 |
+ if(IS_3IV1) |
|
| 957 |
+ cache ^= 0xC0000000; |
|
| 958 |
+ |
|
| 959 |
+ if (cache&0x80000000) {
|
|
| 960 |
+ if (cache&0x40000000) {
|
|
| 961 |
+ /* third escape */ |
|
| 962 |
+ SKIP_CACHE(re, &s->gb, 2); |
|
| 963 |
+ last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); |
|
| 964 |
+ run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); |
|
| 965 |
+ SKIP_COUNTER(re, &s->gb, 2+1+6); |
|
| 966 |
+ UPDATE_CACHE(re, &s->gb); |
|
| 967 |
+ |
|
| 968 |
+ if(IS_3IV1){
|
|
| 969 |
+ level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12); |
|
| 970 |
+ }else{
|
|
| 971 |
+ if(SHOW_UBITS(re, &s->gb, 1)==0){
|
|
| 972 |
+ av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n"); |
|
| 973 |
+ return -1; |
|
| 974 |
+ }; SKIP_CACHE(re, &s->gb, 1); |
|
| 975 |
+ |
|
| 976 |
+ level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12); |
|
| 977 |
+ |
|
| 978 |
+ if(SHOW_UBITS(re, &s->gb, 1)==0){
|
|
| 979 |
+ av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n"); |
|
| 980 |
+ return -1; |
|
| 981 |
+ }; LAST_SKIP_CACHE(re, &s->gb, 1); |
|
| 982 |
+ |
|
| 983 |
+ SKIP_COUNTER(re, &s->gb, 1+12+1); |
|
| 984 |
+ } |
|
| 985 |
+ |
|
| 986 |
+#if 0 |
|
| 987 |
+ if(s->error_recognition >= FF_ER_COMPLIANT){
|
|
| 988 |
+ const int abs_level= FFABS(level); |
|
| 989 |
+ if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
|
|
| 990 |
+ const int run1= run - rl->max_run[last][abs_level] - 1; |
|
| 991 |
+ if(abs_level <= rl->max_level[last][run]){
|
|
| 992 |
+ av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n"); |
|
| 993 |
+ return -1; |
|
| 994 |
+ } |
|
| 995 |
+ if(s->error_recognition > FF_ER_COMPLIANT){
|
|
| 996 |
+ if(abs_level <= rl->max_level[last][run]*2){
|
|
| 997 |
+ av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n"); |
|
| 998 |
+ return -1; |
|
| 999 |
+ } |
|
| 1000 |
+ if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
|
|
| 1001 |
+ av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n"); |
|
| 1002 |
+ return -1; |
|
| 1003 |
+ } |
|
| 1004 |
+ } |
|
| 1005 |
+ } |
|
| 1006 |
+ } |
|
| 1007 |
+#endif |
|
| 1008 |
+ if (level>0) level= level * qmul + qadd; |
|
| 1009 |
+ else level= level * qmul - qadd; |
|
| 1010 |
+ |
|
| 1011 |
+ if((unsigned)(level + 2048) > 4095){
|
|
| 1012 |
+ if(s->error_recognition > FF_ER_COMPLIANT){
|
|
| 1013 |
+ if(level > 2560 || level<-2560){
|
|
| 1014 |
+ av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale); |
|
| 1015 |
+ return -1; |
|
| 1016 |
+ } |
|
| 1017 |
+ } |
|
| 1018 |
+ level= level<0 ? -2048 : 2047; |
|
| 1019 |
+ } |
|
| 1020 |
+ |
|
| 1021 |
+ i+= run + 1; |
|
| 1022 |
+ if(last) i+=192; |
|
| 1023 |
+ } else {
|
|
| 1024 |
+ /* second escape */ |
|
| 1025 |
+#if MIN_CACHE_BITS < 20 |
|
| 1026 |
+ LAST_SKIP_BITS(re, &s->gb, 2); |
|
| 1027 |
+ UPDATE_CACHE(re, &s->gb); |
|
| 1028 |
+#else |
|
| 1029 |
+ SKIP_BITS(re, &s->gb, 2); |
|
| 1030 |
+#endif |
|
| 1031 |
+ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); |
|
| 1032 |
+ i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing |
|
| 1033 |
+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); |
|
| 1034 |
+ LAST_SKIP_BITS(re, &s->gb, 1); |
|
| 1035 |
+ } |
|
| 1036 |
+ } else {
|
|
| 1037 |
+ /* first escape */ |
|
| 1038 |
+#if MIN_CACHE_BITS < 19 |
|
| 1039 |
+ LAST_SKIP_BITS(re, &s->gb, 1); |
|
| 1040 |
+ UPDATE_CACHE(re, &s->gb); |
|
| 1041 |
+#else |
|
| 1042 |
+ SKIP_BITS(re, &s->gb, 1); |
|
| 1043 |
+#endif |
|
| 1044 |
+ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); |
|
| 1045 |
+ i+= run; |
|
| 1046 |
+ level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing |
|
| 1047 |
+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); |
|
| 1048 |
+ LAST_SKIP_BITS(re, &s->gb, 1); |
|
| 1049 |
+ } |
|
| 1050 |
+ } |
|
| 1051 |
+ } else {
|
|
| 1052 |
+ i+= run; |
|
| 1053 |
+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); |
|
| 1054 |
+ LAST_SKIP_BITS(re, &s->gb, 1); |
|
| 1055 |
+ } |
|
| 1056 |
+ if (i > 62){
|
|
| 1057 |
+ i-= 192; |
|
| 1058 |
+ if(i&(~63)){
|
|
| 1059 |
+ av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); |
|
| 1060 |
+ return -1; |
|
| 1061 |
+ } |
|
| 1062 |
+ |
|
| 1063 |
+ block[scan_table[i]] = level; |
|
| 1064 |
+ break; |
|
| 1065 |
+ } |
|
| 1066 |
+ |
|
| 1067 |
+ block[scan_table[i]] = level; |
|
| 1068 |
+ } |
|
| 1069 |
+ CLOSE_READER(re, &s->gb); |
|
| 1070 |
+ } |
|
| 1071 |
+ not_coded: |
|
| 1072 |
+ if (intra) {
|
|
| 1073 |
+ if(!s->use_intra_dc_vlc){
|
|
| 1074 |
+ block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); |
|
| 1075 |
+ |
|
| 1076 |
+ i -= i>>31; //if(i == -1) i=0; |
|
| 1077 |
+ } |
|
| 1078 |
+ |
|
| 1079 |
+ mpeg4_pred_ac(s, block, n, dc_pred_dir); |
|
| 1080 |
+ if (s->ac_pred) {
|
|
| 1081 |
+ i = 63; /* XXX: not optimal */ |
|
| 1082 |
+ } |
|
| 1083 |
+ } |
|
| 1084 |
+ s->block_last_index[n] = i; |
|
| 1085 |
+ return 0; |
|
| 1086 |
+} |
|
| 1087 |
+ |
|
| 1088 |
+/** |
|
| 1089 |
+ * decode partition C of one MB. |
|
| 1090 |
+ * @return <0 if an error occurred |
|
| 1091 |
+ */ |
|
| 1092 |
+static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) |
|
| 1093 |
+{
|
|
| 1094 |
+ int cbp, mb_type; |
|
| 1095 |
+ const int xy= s->mb_x + s->mb_y*s->mb_stride; |
|
| 1096 |
+ |
|
| 1097 |
+ mb_type= s->current_picture.mb_type[xy]; |
|
| 1098 |
+ cbp = s->cbp_table[xy]; |
|
| 1099 |
+ |
|
| 1100 |
+ s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold; |
|
| 1101 |
+ |
|
| 1102 |
+ if(s->current_picture.qscale_table[xy] != s->qscale){
|
|
| 1103 |
+ ff_set_qscale(s, s->current_picture.qscale_table[xy] ); |
|
| 1104 |
+ } |
|
| 1105 |
+ |
|
| 1106 |
+ if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
|
|
| 1107 |
+ int i; |
|
| 1108 |
+ for(i=0; i<4; i++){
|
|
| 1109 |
+ s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0]; |
|
| 1110 |
+ s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1]; |
|
| 1111 |
+ } |
|
| 1112 |
+ s->mb_intra = IS_INTRA(mb_type); |
|
| 1113 |
+ |
|
| 1114 |
+ if (IS_SKIP(mb_type)) {
|
|
| 1115 |
+ /* skip mb */ |
|
| 1116 |
+ for(i=0;i<6;i++) |
|
| 1117 |
+ s->block_last_index[i] = -1; |
|
| 1118 |
+ s->mv_dir = MV_DIR_FORWARD; |
|
| 1119 |
+ s->mv_type = MV_TYPE_16X16; |
|
| 1120 |
+ if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
|
|
| 1121 |
+ s->mcsel=1; |
|
| 1122 |
+ s->mb_skipped = 0; |
|
| 1123 |
+ }else{
|
|
| 1124 |
+ s->mcsel=0; |
|
| 1125 |
+ s->mb_skipped = 1; |
|
| 1126 |
+ } |
|
| 1127 |
+ }else if(s->mb_intra){
|
|
| 1128 |
+ s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); |
|
| 1129 |
+ }else if(!s->mb_intra){
|
|
| 1130 |
+// s->mcsel= 0; //FIXME do we need to init that |
|
| 1131 |
+ |
|
| 1132 |
+ s->mv_dir = MV_DIR_FORWARD; |
|
| 1133 |
+ if (IS_8X8(mb_type)) {
|
|
| 1134 |
+ s->mv_type = MV_TYPE_8X8; |
|
| 1135 |
+ } else {
|
|
| 1136 |
+ s->mv_type = MV_TYPE_16X16; |
|
| 1137 |
+ } |
|
| 1138 |
+ } |
|
| 1139 |
+ } else { /* I-Frame */
|
|
| 1140 |
+ s->mb_intra = 1; |
|
| 1141 |
+ s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); |
|
| 1142 |
+ } |
|
| 1143 |
+ |
|
| 1144 |
+ if (!IS_SKIP(mb_type)) {
|
|
| 1145 |
+ int i; |
|
| 1146 |
+ s->dsp.clear_blocks(s->block[0]); |
|
| 1147 |
+ /* decode each block */ |
|
| 1148 |
+ for (i = 0; i < 6; i++) {
|
|
| 1149 |
+ if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
|
|
| 1150 |
+ av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); |
|
| 1151 |
+ return -1; |
|
| 1152 |
+ } |
|
| 1153 |
+ cbp+=cbp; |
|
| 1154 |
+ } |
|
| 1155 |
+ } |
|
| 1156 |
+ |
|
| 1157 |
+ /* per-MB end of slice check */ |
|
| 1158 |
+ |
|
| 1159 |
+ if(--s->mb_num_left <= 0){
|
|
| 1160 |
+ if(mpeg4_is_resync(s)) |
|
| 1161 |
+ return SLICE_END; |
|
| 1162 |
+ else |
|
| 1163 |
+ return SLICE_NOEND; |
|
| 1164 |
+ }else{
|
|
| 1165 |
+ if(mpeg4_is_resync(s)){
|
|
| 1166 |
+ const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; |
|
| 1167 |
+ if(s->cbp_table[xy+delta]) |
|
| 1168 |
+ return SLICE_END; |
|
| 1169 |
+ } |
|
| 1170 |
+ return SLICE_OK; |
|
| 1171 |
+ } |
|
| 1172 |
+} |
|
| 1173 |
+ |
|
| 1174 |
+static int mpeg4_decode_mb(MpegEncContext *s, |
|
| 1175 |
+ DCTELEM block[6][64]) |
|
| 1176 |
+{
|
|
| 1177 |
+ int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; |
|
| 1178 |
+ int16_t *mot_val; |
|
| 1179 |
+ static int8_t quant_tab[4] = { -1, -2, 1, 2 };
|
|
| 1180 |
+ const int xy= s->mb_x + s->mb_y * s->mb_stride; |
|
| 1181 |
+ |
|
| 1182 |
+ assert(s->h263_pred); |
|
| 1183 |
+ |
|
| 1184 |
+ if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
|
|
| 1185 |
+ do{
|
|
| 1186 |
+ if (get_bits1(&s->gb)) {
|
|
| 1187 |
+ /* skip mb */ |
|
| 1188 |
+ s->mb_intra = 0; |
|
| 1189 |
+ for(i=0;i<6;i++) |
|
| 1190 |
+ s->block_last_index[i] = -1; |
|
| 1191 |
+ s->mv_dir = MV_DIR_FORWARD; |
|
| 1192 |
+ s->mv_type = MV_TYPE_16X16; |
|
| 1193 |
+ if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
|
|
| 1194 |
+ s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 1195 |
+ s->mcsel=1; |
|
| 1196 |
+ s->mv[0][0][0]= get_amv(s, 0); |
|
| 1197 |
+ s->mv[0][0][1]= get_amv(s, 1); |
|
| 1198 |
+ |
|
| 1199 |
+ s->mb_skipped = 0; |
|
| 1200 |
+ }else{
|
|
| 1201 |
+ s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 1202 |
+ s->mcsel=0; |
|
| 1203 |
+ s->mv[0][0][0] = 0; |
|
| 1204 |
+ s->mv[0][0][1] = 0; |
|
| 1205 |
+ s->mb_skipped = 1; |
|
| 1206 |
+ } |
|
| 1207 |
+ goto end; |
|
| 1208 |
+ } |
|
| 1209 |
+ cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); |
|
| 1210 |
+ if (cbpc < 0){
|
|
| 1211 |
+ av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y); |
|
| 1212 |
+ return -1; |
|
| 1213 |
+ } |
|
| 1214 |
+ }while(cbpc == 20); |
|
| 1215 |
+ |
|
| 1216 |
+ s->dsp.clear_blocks(s->block[0]); |
|
| 1217 |
+ dquant = cbpc & 8; |
|
| 1218 |
+ s->mb_intra = ((cbpc & 4) != 0); |
|
| 1219 |
+ if (s->mb_intra) goto intra; |
|
| 1220 |
+ |
|
| 1221 |
+ if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0) |
|
| 1222 |
+ s->mcsel= get_bits1(&s->gb); |
|
| 1223 |
+ else s->mcsel= 0; |
|
| 1224 |
+ cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F; |
|
| 1225 |
+ |
|
| 1226 |
+ cbp = (cbpc & 3) | (cbpy << 2); |
|
| 1227 |
+ if (dquant) {
|
|
| 1228 |
+ ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
| 1229 |
+ } |
|
| 1230 |
+ if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE))) |
|
| 1231 |
+ s->interlaced_dct= get_bits1(&s->gb); |
|
| 1232 |
+ |
|
| 1233 |
+ s->mv_dir = MV_DIR_FORWARD; |
|
| 1234 |
+ if ((cbpc & 16) == 0) {
|
|
| 1235 |
+ if(s->mcsel){
|
|
| 1236 |
+ s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 1237 |
+ /* 16x16 global motion prediction */ |
|
| 1238 |
+ s->mv_type = MV_TYPE_16X16; |
|
| 1239 |
+ mx= get_amv(s, 0); |
|
| 1240 |
+ my= get_amv(s, 1); |
|
| 1241 |
+ s->mv[0][0][0] = mx; |
|
| 1242 |
+ s->mv[0][0][1] = my; |
|
| 1243 |
+ }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
|
|
| 1244 |
+ s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED; |
|
| 1245 |
+ /* 16x8 field motion prediction */ |
|
| 1246 |
+ s->mv_type= MV_TYPE_FIELD; |
|
| 1247 |
+ |
|
| 1248 |
+ s->field_select[0][0]= get_bits1(&s->gb); |
|
| 1249 |
+ s->field_select[0][1]= get_bits1(&s->gb); |
|
| 1250 |
+ |
|
| 1251 |
+ h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
|
| 1252 |
+ |
|
| 1253 |
+ for(i=0; i<2; i++){
|
|
| 1254 |
+ mx = h263_decode_motion(s, pred_x, s->f_code); |
|
| 1255 |
+ if (mx >= 0xffff) |
|
| 1256 |
+ return -1; |
|
| 1257 |
+ |
|
| 1258 |
+ my = h263_decode_motion(s, pred_y/2, s->f_code); |
|
| 1259 |
+ if (my >= 0xffff) |
|
| 1260 |
+ return -1; |
|
| 1261 |
+ |
|
| 1262 |
+ s->mv[0][i][0] = mx; |
|
| 1263 |
+ s->mv[0][i][1] = my; |
|
| 1264 |
+ } |
|
| 1265 |
+ }else{
|
|
| 1266 |
+ s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 1267 |
+ /* 16x16 motion prediction */ |
|
| 1268 |
+ s->mv_type = MV_TYPE_16X16; |
|
| 1269 |
+ h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
|
| 1270 |
+ mx = h263_decode_motion(s, pred_x, s->f_code); |
|
| 1271 |
+ |
|
| 1272 |
+ if (mx >= 0xffff) |
|
| 1273 |
+ return -1; |
|
| 1274 |
+ |
|
| 1275 |
+ my = h263_decode_motion(s, pred_y, s->f_code); |
|
| 1276 |
+ |
|
| 1277 |
+ if (my >= 0xffff) |
|
| 1278 |
+ return -1; |
|
| 1279 |
+ s->mv[0][0][0] = mx; |
|
| 1280 |
+ s->mv[0][0][1] = my; |
|
| 1281 |
+ } |
|
| 1282 |
+ } else {
|
|
| 1283 |
+ s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0; |
|
| 1284 |
+ s->mv_type = MV_TYPE_8X8; |
|
| 1285 |
+ for(i=0;i<4;i++) {
|
|
| 1286 |
+ mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
|
| 1287 |
+ mx = h263_decode_motion(s, pred_x, s->f_code); |
|
| 1288 |
+ if (mx >= 0xffff) |
|
| 1289 |
+ return -1; |
|
| 1290 |
+ |
|
| 1291 |
+ my = h263_decode_motion(s, pred_y, s->f_code); |
|
| 1292 |
+ if (my >= 0xffff) |
|
| 1293 |
+ return -1; |
|
| 1294 |
+ s->mv[0][i][0] = mx; |
|
| 1295 |
+ s->mv[0][i][1] = my; |
|
| 1296 |
+ mot_val[0] = mx; |
|
| 1297 |
+ mot_val[1] = my; |
|
| 1298 |
+ } |
|
| 1299 |
+ } |
|
| 1300 |
+ } else if(s->pict_type==FF_B_TYPE) {
|
|
| 1301 |
+ int modb1; // first bit of modb |
|
| 1302 |
+ int modb2; // second bit of modb |
|
| 1303 |
+ int mb_type; |
|
| 1304 |
+ |
|
| 1305 |
+ s->mb_intra = 0; //B-frames never contain intra blocks |
|
| 1306 |
+ s->mcsel=0; // ... true gmc blocks |
|
| 1307 |
+ |
|
| 1308 |
+ if(s->mb_x==0){
|
|
| 1309 |
+ for(i=0; i<2; i++){
|
|
| 1310 |
+ s->last_mv[i][0][0]= |
|
| 1311 |
+ s->last_mv[i][0][1]= |
|
| 1312 |
+ s->last_mv[i][1][0]= |
|
| 1313 |
+ s->last_mv[i][1][1]= 0; |
|
| 1314 |
+ } |
|
| 1315 |
+ } |
|
| 1316 |
+ |
|
| 1317 |
+ /* if we skipped it in the future P Frame than skip it now too */ |
|
| 1318 |
+ s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC |
|
| 1319 |
+ |
|
| 1320 |
+ if(s->mb_skipped){
|
|
| 1321 |
+ /* skip mb */ |
|
| 1322 |
+ for(i=0;i<6;i++) |
|
| 1323 |
+ s->block_last_index[i] = -1; |
|
| 1324 |
+ |
|
| 1325 |
+ s->mv_dir = MV_DIR_FORWARD; |
|
| 1326 |
+ s->mv_type = MV_TYPE_16X16; |
|
| 1327 |
+ s->mv[0][0][0] = 0; |
|
| 1328 |
+ s->mv[0][0][1] = 0; |
|
| 1329 |
+ s->mv[1][0][0] = 0; |
|
| 1330 |
+ s->mv[1][0][1] = 0; |
|
| 1331 |
+ s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
|
| 1332 |
+ goto end; |
|
| 1333 |
+ } |
|
| 1334 |
+ |
|
| 1335 |
+ modb1= get_bits1(&s->gb); |
|
| 1336 |
+ if(modb1){
|
|
| 1337 |
+ mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded |
|
| 1338 |
+ cbp=0; |
|
| 1339 |
+ }else{
|
|
| 1340 |
+ modb2= get_bits1(&s->gb); |
|
| 1341 |
+ mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1); |
|
| 1342 |
+ if(mb_type<0){
|
|
| 1343 |
+ av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n"); |
|
| 1344 |
+ return -1; |
|
| 1345 |
+ } |
|
| 1346 |
+ mb_type= mb_type_b_map[ mb_type ]; |
|
| 1347 |
+ if(modb2) cbp= 0; |
|
| 1348 |
+ else{
|
|
| 1349 |
+ s->dsp.clear_blocks(s->block[0]); |
|
| 1350 |
+ cbp= get_bits(&s->gb, 6); |
|
| 1351 |
+ } |
|
| 1352 |
+ |
|
| 1353 |
+ if ((!IS_DIRECT(mb_type)) && cbp) {
|
|
| 1354 |
+ if(get_bits1(&s->gb)){
|
|
| 1355 |
+ ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2); |
|
| 1356 |
+ } |
|
| 1357 |
+ } |
|
| 1358 |
+ |
|
| 1359 |
+ if(!s->progressive_sequence){
|
|
| 1360 |
+ if(cbp) |
|
| 1361 |
+ s->interlaced_dct= get_bits1(&s->gb); |
|
| 1362 |
+ |
|
| 1363 |
+ if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
|
|
| 1364 |
+ mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; |
|
| 1365 |
+ mb_type &= ~MB_TYPE_16x16; |
|
| 1366 |
+ |
|
| 1367 |
+ if(USES_LIST(mb_type, 0)){
|
|
| 1368 |
+ s->field_select[0][0]= get_bits1(&s->gb); |
|
| 1369 |
+ s->field_select[0][1]= get_bits1(&s->gb); |
|
| 1370 |
+ } |
|
| 1371 |
+ if(USES_LIST(mb_type, 1)){
|
|
| 1372 |
+ s->field_select[1][0]= get_bits1(&s->gb); |
|
| 1373 |
+ s->field_select[1][1]= get_bits1(&s->gb); |
|
| 1374 |
+ } |
|
| 1375 |
+ } |
|
| 1376 |
+ } |
|
| 1377 |
+ |
|
| 1378 |
+ s->mv_dir = 0; |
|
| 1379 |
+ if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
|
|
| 1380 |
+ s->mv_type= MV_TYPE_16X16; |
|
| 1381 |
+ |
|
| 1382 |
+ if(USES_LIST(mb_type, 0)){
|
|
| 1383 |
+ s->mv_dir = MV_DIR_FORWARD; |
|
| 1384 |
+ |
|
| 1385 |
+ mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code); |
|
| 1386 |
+ my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code); |
|
| 1387 |
+ s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx; |
|
| 1388 |
+ s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my; |
|
| 1389 |
+ } |
|
| 1390 |
+ |
|
| 1391 |
+ if(USES_LIST(mb_type, 1)){
|
|
| 1392 |
+ s->mv_dir |= MV_DIR_BACKWARD; |
|
| 1393 |
+ |
|
| 1394 |
+ mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code); |
|
| 1395 |
+ my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code); |
|
| 1396 |
+ s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx; |
|
| 1397 |
+ s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my; |
|
| 1398 |
+ } |
|
| 1399 |
+ }else if(!IS_DIRECT(mb_type)){
|
|
| 1400 |
+ s->mv_type= MV_TYPE_FIELD; |
|
| 1401 |
+ |
|
| 1402 |
+ if(USES_LIST(mb_type, 0)){
|
|
| 1403 |
+ s->mv_dir = MV_DIR_FORWARD; |
|
| 1404 |
+ |
|
| 1405 |
+ for(i=0; i<2; i++){
|
|
| 1406 |
+ mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code); |
|
| 1407 |
+ my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code); |
|
| 1408 |
+ s->last_mv[0][i][0]= s->mv[0][i][0] = mx; |
|
| 1409 |
+ s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2; |
|
| 1410 |
+ } |
|
| 1411 |
+ } |
|
| 1412 |
+ |
|
| 1413 |
+ if(USES_LIST(mb_type, 1)){
|
|
| 1414 |
+ s->mv_dir |= MV_DIR_BACKWARD; |
|
| 1415 |
+ |
|
| 1416 |
+ for(i=0; i<2; i++){
|
|
| 1417 |
+ mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code); |
|
| 1418 |
+ my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code); |
|
| 1419 |
+ s->last_mv[1][i][0]= s->mv[1][i][0] = mx; |
|
| 1420 |
+ s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2; |
|
| 1421 |
+ } |
|
| 1422 |
+ } |
|
| 1423 |
+ } |
|
| 1424 |
+ } |
|
| 1425 |
+ |
|
| 1426 |
+ if(IS_DIRECT(mb_type)){
|
|
| 1427 |
+ if(IS_SKIP(mb_type)) |
|
| 1428 |
+ mx=my=0; |
|
| 1429 |
+ else{
|
|
| 1430 |
+ mx = h263_decode_motion(s, 0, 1); |
|
| 1431 |
+ my = h263_decode_motion(s, 0, 1); |
|
| 1432 |
+ } |
|
| 1433 |
+ |
|
| 1434 |
+ s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; |
|
| 1435 |
+ mb_type |= ff_mpeg4_set_direct_mv(s, mx, my); |
|
| 1436 |
+ } |
|
| 1437 |
+ s->current_picture.mb_type[xy]= mb_type; |
|
| 1438 |
+ } else { /* I-Frame */
|
|
| 1439 |
+ do{
|
|
| 1440 |
+ cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2); |
|
| 1441 |
+ if (cbpc < 0){
|
|
| 1442 |
+ av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y); |
|
| 1443 |
+ return -1; |
|
| 1444 |
+ } |
|
| 1445 |
+ }while(cbpc == 8); |
|
| 1446 |
+ |
|
| 1447 |
+ dquant = cbpc & 4; |
|
| 1448 |
+ s->mb_intra = 1; |
|
| 1449 |
+intra: |
|
| 1450 |
+ s->ac_pred = get_bits1(&s->gb); |
|
| 1451 |
+ if(s->ac_pred) |
|
| 1452 |
+ s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED; |
|
| 1453 |
+ else |
|
| 1454 |
+ s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
|
| 1455 |
+ |
|
| 1456 |
+ cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
|
| 1457 |
+ if(cbpy<0){
|
|
| 1458 |
+ av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y); |
|
| 1459 |
+ return -1; |
|
| 1460 |
+ } |
|
| 1461 |
+ cbp = (cbpc & 3) | (cbpy << 2); |
|
| 1462 |
+ |
|
| 1463 |
+ s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold; |
|
| 1464 |
+ |
|
| 1465 |
+ if (dquant) {
|
|
| 1466 |
+ ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
| 1467 |
+ } |
|
| 1468 |
+ |
|
| 1469 |
+ if(!s->progressive_sequence) |
|
| 1470 |
+ s->interlaced_dct= get_bits1(&s->gb); |
|
| 1471 |
+ |
|
| 1472 |
+ s->dsp.clear_blocks(s->block[0]); |
|
| 1473 |
+ /* decode each block */ |
|
| 1474 |
+ for (i = 0; i < 6; i++) {
|
|
| 1475 |
+ if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0) |
|
| 1476 |
+ return -1; |
|
| 1477 |
+ cbp+=cbp; |
|
| 1478 |
+ } |
|
| 1479 |
+ goto end; |
|
| 1480 |
+ } |
|
| 1481 |
+ |
|
| 1482 |
+ /* decode each block */ |
|
| 1483 |
+ for (i = 0; i < 6; i++) {
|
|
| 1484 |
+ if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0) |
|
| 1485 |
+ return -1; |
|
| 1486 |
+ cbp+=cbp; |
|
| 1487 |
+ } |
|
| 1488 |
+end: |
|
| 1489 |
+ |
|
| 1490 |
+ /* per-MB end of slice check */ |
|
| 1491 |
+ if(s->codec_id==CODEC_ID_MPEG4){
|
|
| 1492 |
+ if(mpeg4_is_resync(s)){
|
|
| 1493 |
+ const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; |
|
| 1494 |
+ if(s->pict_type==FF_B_TYPE && s->next_picture.mbskip_table[xy + delta]) |
|
| 1495 |
+ return SLICE_OK; |
|
| 1496 |
+ return SLICE_END; |
|
| 1497 |
+ } |
|
| 1498 |
+ } |
|
| 1499 |
+ |
|
| 1500 |
+ return SLICE_OK; |
|
| 1501 |
+} |
|
| 1502 |
+ |
|
| 1503 |
+ |
|
| 1504 |
+static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
|
|
| 1505 |
+ int hours, minutes, seconds; |
|
| 1506 |
+ |
|
| 1507 |
+ hours= get_bits(gb, 5); |
|
| 1508 |
+ minutes= get_bits(gb, 6); |
|
| 1509 |
+ skip_bits1(gb); |
|
| 1510 |
+ seconds= get_bits(gb, 6); |
|
| 1511 |
+ |
|
| 1512 |
+ s->time_base= seconds + 60*(minutes + 60*hours); |
|
| 1513 |
+ |
|
| 1514 |
+ skip_bits1(gb); |
|
| 1515 |
+ skip_bits1(gb); |
|
| 1516 |
+ |
|
| 1517 |
+ return 0; |
|
| 1518 |
+} |
|
| 1519 |
+ |
|
| 1520 |
+static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
|
|
| 1521 |
+ int width, height, vo_ver_id; |
|
| 1522 |
+ |
|
| 1523 |
+ /* vol header */ |
|
| 1524 |
+ skip_bits(gb, 1); /* random access */ |
|
| 1525 |
+ s->vo_type= get_bits(gb, 8); |
|
| 1526 |
+ if (get_bits1(gb) != 0) { /* is_ol_id */
|
|
| 1527 |
+ vo_ver_id = get_bits(gb, 4); /* vo_ver_id */ |
|
| 1528 |
+ skip_bits(gb, 3); /* vo_priority */ |
|
| 1529 |
+ } else {
|
|
| 1530 |
+ vo_ver_id = 1; |
|
| 1531 |
+ } |
|
| 1532 |
+ s->aspect_ratio_info= get_bits(gb, 4); |
|
| 1533 |
+ if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
|
|
| 1534 |
+ s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width |
|
| 1535 |
+ s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height |
|
| 1536 |
+ }else{
|
|
| 1537 |
+ s->avctx->sample_aspect_ratio= ff_h263_pixel_aspect[s->aspect_ratio_info]; |
|
| 1538 |
+ } |
|
| 1539 |
+ |
|
| 1540 |
+ if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
|
|
| 1541 |
+ int chroma_format= get_bits(gb, 2); |
|
| 1542 |
+ if(chroma_format!=CHROMA_420){
|
|
| 1543 |
+ av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n"); |
|
| 1544 |
+ } |
|
| 1545 |
+ s->low_delay= get_bits1(gb); |
|
| 1546 |
+ if(get_bits1(gb)){ /* vbv parameters */
|
|
| 1547 |
+ get_bits(gb, 15); /* first_half_bitrate */ |
|
| 1548 |
+ skip_bits1(gb); /* marker */ |
|
| 1549 |
+ get_bits(gb, 15); /* latter_half_bitrate */ |
|
| 1550 |
+ skip_bits1(gb); /* marker */ |
|
| 1551 |
+ get_bits(gb, 15); /* first_half_vbv_buffer_size */ |
|
| 1552 |
+ skip_bits1(gb); /* marker */ |
|
| 1553 |
+ get_bits(gb, 3); /* latter_half_vbv_buffer_size */ |
|
| 1554 |
+ get_bits(gb, 11); /* first_half_vbv_occupancy */ |
|
| 1555 |
+ skip_bits1(gb); /* marker */ |
|
| 1556 |
+ get_bits(gb, 15); /* latter_half_vbv_occupancy */ |
|
| 1557 |
+ skip_bits1(gb); /* marker */ |
|
| 1558 |
+ } |
|
| 1559 |
+ }else{
|
|
| 1560 |
+ // set low delay flag only once the smartest? low delay detection won't be overriden |
|
| 1561 |
+ if(s->picture_number==0) |
|
| 1562 |
+ s->low_delay=0; |
|
| 1563 |
+ } |
|
| 1564 |
+ |
|
| 1565 |
+ s->shape = get_bits(gb, 2); /* vol shape */ |
|
| 1566 |
+ if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n"); |
|
| 1567 |
+ if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
|
|
| 1568 |
+ av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n"); |
|
| 1569 |
+ skip_bits(gb, 4); //video_object_layer_shape_extension |
|
| 1570 |
+ } |
|
| 1571 |
+ |
|
| 1572 |
+ check_marker(gb, "before time_increment_resolution"); |
|
| 1573 |
+ |
|
| 1574 |
+ s->avctx->time_base.den = get_bits(gb, 16); |
|
| 1575 |
+ if(!s->avctx->time_base.den){
|
|
| 1576 |
+ av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n"); |
|
| 1577 |
+ return -1; |
|
| 1578 |
+ } |
|
| 1579 |
+ |
|
| 1580 |
+ s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1; |
|
| 1581 |
+ if (s->time_increment_bits < 1) |
|
| 1582 |
+ s->time_increment_bits = 1; |
|
| 1583 |
+ |
|
| 1584 |
+ check_marker(gb, "before fixed_vop_rate"); |
|
| 1585 |
+ |
|
| 1586 |
+ if (get_bits1(gb) != 0) { /* fixed_vop_rate */
|
|
| 1587 |
+ s->avctx->time_base.num = get_bits(gb, s->time_increment_bits); |
|
| 1588 |
+ }else |
|
| 1589 |
+ s->avctx->time_base.num = 1; |
|
| 1590 |
+ |
|
| 1591 |
+ s->t_frame=0; |
|
| 1592 |
+ |
|
| 1593 |
+ if (s->shape != BIN_ONLY_SHAPE) {
|
|
| 1594 |
+ if (s->shape == RECT_SHAPE) {
|
|
| 1595 |
+ skip_bits1(gb); /* marker */ |
|
| 1596 |
+ width = get_bits(gb, 13); |
|
| 1597 |
+ skip_bits1(gb); /* marker */ |
|
| 1598 |
+ height = get_bits(gb, 13); |
|
| 1599 |
+ skip_bits1(gb); /* marker */ |
|
| 1600 |
+ if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */
|
|
| 1601 |
+ s->width = width; |
|
| 1602 |
+ s->height = height; |
|
| 1603 |
+ } |
|
| 1604 |
+ } |
|
| 1605 |
+ |
|
| 1606 |
+ s->progressive_sequence= |
|
| 1607 |
+ s->progressive_frame= get_bits1(gb)^1; |
|
| 1608 |
+ s->interlaced_dct=0; |
|
| 1609 |
+ if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO)) |
|
| 1610 |
+ av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */ |
|
| 1611 |
+ if (vo_ver_id == 1) {
|
|
| 1612 |
+ s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */ |
|
| 1613 |
+ } else {
|
|
| 1614 |
+ s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */ |
|
| 1615 |
+ } |
|
| 1616 |
+ if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n"); |
|
| 1617 |
+ if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
|
|
| 1618 |
+ if(s->vol_sprite_usage==STATIC_SPRITE){
|
|
| 1619 |
+ s->sprite_width = get_bits(gb, 13); |
|
| 1620 |
+ skip_bits1(gb); /* marker */ |
|
| 1621 |
+ s->sprite_height= get_bits(gb, 13); |
|
| 1622 |
+ skip_bits1(gb); /* marker */ |
|
| 1623 |
+ s->sprite_left = get_bits(gb, 13); |
|
| 1624 |
+ skip_bits1(gb); /* marker */ |
|
| 1625 |
+ s->sprite_top = get_bits(gb, 13); |
|
| 1626 |
+ skip_bits1(gb); /* marker */ |
|
| 1627 |
+ } |
|
| 1628 |
+ s->num_sprite_warping_points= get_bits(gb, 6); |
|
| 1629 |
+ if(s->num_sprite_warping_points > 3){
|
|
| 1630 |
+ av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points); |
|
| 1631 |
+ s->num_sprite_warping_points= 0; |
|
| 1632 |
+ return -1; |
|
| 1633 |
+ } |
|
| 1634 |
+ s->sprite_warping_accuracy = get_bits(gb, 2); |
|
| 1635 |
+ s->sprite_brightness_change= get_bits1(gb); |
|
| 1636 |
+ if(s->vol_sprite_usage==STATIC_SPRITE) |
|
| 1637 |
+ s->low_latency_sprite= get_bits1(gb); |
|
| 1638 |
+ } |
|
| 1639 |
+ // FIXME sadct disable bit if verid!=1 && shape not rect |
|
| 1640 |
+ |
|
| 1641 |
+ if (get_bits1(gb) == 1) { /* not_8_bit */
|
|
| 1642 |
+ s->quant_precision = get_bits(gb, 4); /* quant_precision */ |
|
| 1643 |
+ if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */ |
|
| 1644 |
+ if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision); |
|
| 1645 |
+ } else {
|
|
| 1646 |
+ s->quant_precision = 5; |
|
| 1647 |
+ } |
|
| 1648 |
+ |
|
| 1649 |
+ // FIXME a bunch of grayscale shape things |
|
| 1650 |
+ |
|
| 1651 |
+ if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
|
|
| 1652 |
+ int i, v; |
|
| 1653 |
+ |
|
| 1654 |
+ /* load default matrixes */ |
|
| 1655 |
+ for(i=0; i<64; i++){
|
|
| 1656 |
+ int j= s->dsp.idct_permutation[i]; |
|
| 1657 |
+ v= ff_mpeg4_default_intra_matrix[i]; |
|
| 1658 |
+ s->intra_matrix[j]= v; |
|
| 1659 |
+ s->chroma_intra_matrix[j]= v; |
|
| 1660 |
+ |
|
| 1661 |
+ v= ff_mpeg4_default_non_intra_matrix[i]; |
|
| 1662 |
+ s->inter_matrix[j]= v; |
|
| 1663 |
+ s->chroma_inter_matrix[j]= v; |
|
| 1664 |
+ } |
|
| 1665 |
+ |
|
| 1666 |
+ /* load custom intra matrix */ |
|
| 1667 |
+ if(get_bits1(gb)){
|
|
| 1668 |
+ int last=0; |
|
| 1669 |
+ for(i=0; i<64; i++){
|
|
| 1670 |
+ int j; |
|
| 1671 |
+ v= get_bits(gb, 8); |
|
| 1672 |
+ if(v==0) break; |
|
| 1673 |
+ |
|
| 1674 |
+ last= v; |
|
| 1675 |
+ j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
| 1676 |
+ s->intra_matrix[j]= v; |
|
| 1677 |
+ s->chroma_intra_matrix[j]= v; |
|
| 1678 |
+ } |
|
| 1679 |
+ |
|
| 1680 |
+ /* replicate last value */ |
|
| 1681 |
+ for(; i<64; i++){
|
|
| 1682 |
+ int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
| 1683 |
+ s->intra_matrix[j]= last; |
|
| 1684 |
+ s->chroma_intra_matrix[j]= last; |
|
| 1685 |
+ } |
|
| 1686 |
+ } |
|
| 1687 |
+ |
|
| 1688 |
+ /* load custom non intra matrix */ |
|
| 1689 |
+ if(get_bits1(gb)){
|
|
| 1690 |
+ int last=0; |
|
| 1691 |
+ for(i=0; i<64; i++){
|
|
| 1692 |
+ int j; |
|
| 1693 |
+ v= get_bits(gb, 8); |
|
| 1694 |
+ if(v==0) break; |
|
| 1695 |
+ |
|
| 1696 |
+ last= v; |
|
| 1697 |
+ j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
| 1698 |
+ s->inter_matrix[j]= v; |
|
| 1699 |
+ s->chroma_inter_matrix[j]= v; |
|
| 1700 |
+ } |
|
| 1701 |
+ |
|
| 1702 |
+ /* replicate last value */ |
|
| 1703 |
+ for(; i<64; i++){
|
|
| 1704 |
+ int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
| 1705 |
+ s->inter_matrix[j]= last; |
|
| 1706 |
+ s->chroma_inter_matrix[j]= last; |
|
| 1707 |
+ } |
|
| 1708 |
+ } |
|
| 1709 |
+ |
|
| 1710 |
+ // FIXME a bunch of grayscale shape things |
|
| 1711 |
+ } |
|
| 1712 |
+ |
|
| 1713 |
+ if(vo_ver_id != 1) |
|
| 1714 |
+ s->quarter_sample= get_bits1(gb); |
|
| 1715 |
+ else s->quarter_sample=0; |
|
| 1716 |
+ |
|
| 1717 |
+ if(!get_bits1(gb)){
|
|
| 1718 |
+ int pos= get_bits_count(gb); |
|
| 1719 |
+ int estimation_method= get_bits(gb, 2); |
|
| 1720 |
+ if(estimation_method<2){
|
|
| 1721 |
+ if(!get_bits1(gb)){
|
|
| 1722 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque |
|
| 1723 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent |
|
| 1724 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae |
|
| 1725 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae |
|
| 1726 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update |
|
| 1727 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling |
|
| 1728 |
+ } |
|
| 1729 |
+ if(!get_bits1(gb)){
|
|
| 1730 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks |
|
| 1731 |
+ s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks |
|
| 1732 |
+ s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks |
|
| 1733 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks |
|
| 1734 |
+ } |
|
| 1735 |
+ if(!check_marker(gb, "in complexity estimation part 1")){
|
|
| 1736 |
+ skip_bits_long(gb, pos - get_bits_count(gb)); |
|
| 1737 |
+ goto no_cplx_est; |
|
| 1738 |
+ } |
|
| 1739 |
+ if(!get_bits1(gb)){
|
|
| 1740 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs |
|
| 1741 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines |
|
| 1742 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms |
|
| 1743 |
+ s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits |
|
| 1744 |
+ } |
|
| 1745 |
+ if(!get_bits1(gb)){
|
|
| 1746 |
+ s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm |
|
| 1747 |
+ s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm |
|
| 1748 |
+ s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q |
|
| 1749 |
+ s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q |
|
| 1750 |
+ s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2 |
|
| 1751 |
+ s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4 |
|
| 1752 |
+ } |
|
| 1753 |
+ if(!check_marker(gb, "in complexity estimation part 2")){
|
|
| 1754 |
+ skip_bits_long(gb, pos - get_bits_count(gb)); |
|
| 1755 |
+ goto no_cplx_est; |
|
| 1756 |
+ } |
|
| 1757 |
+ if(estimation_method==1){
|
|
| 1758 |
+ s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct |
|
| 1759 |
+ s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel |
|
| 1760 |
+ } |
|
| 1761 |
+ }else |
|
| 1762 |
+ av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method); |
|
| 1763 |
+ }else{
|
|
| 1764 |
+no_cplx_est: |
|
| 1765 |
+ s->cplx_estimation_trash_i= |
|
| 1766 |
+ s->cplx_estimation_trash_p= |
|
| 1767 |
+ s->cplx_estimation_trash_b= 0; |
|
| 1768 |
+ } |
|
| 1769 |
+ |
|
| 1770 |
+ s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */ |
|
| 1771 |
+ |
|
| 1772 |
+ s->data_partitioning= get_bits1(gb); |
|
| 1773 |
+ if(s->data_partitioning){
|
|
| 1774 |
+ s->rvlc= get_bits1(gb); |
|
| 1775 |
+ } |
|
| 1776 |
+ |
|
| 1777 |
+ if(vo_ver_id != 1) {
|
|
| 1778 |
+ s->new_pred= get_bits1(gb); |
|
| 1779 |
+ if(s->new_pred){
|
|
| 1780 |
+ av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n"); |
|
| 1781 |
+ skip_bits(gb, 2); /* requested upstream message type */ |
|
| 1782 |
+ skip_bits1(gb); /* newpred segment type */ |
|
| 1783 |
+ } |
|
| 1784 |
+ s->reduced_res_vop= get_bits1(gb); |
|
| 1785 |
+ if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n"); |
|
| 1786 |
+ } |
|
| 1787 |
+ else{
|
|
| 1788 |
+ s->new_pred=0; |
|
| 1789 |
+ s->reduced_res_vop= 0; |
|
| 1790 |
+ } |
|
| 1791 |
+ |
|
| 1792 |
+ s->scalability= get_bits1(gb); |
|
| 1793 |
+ |
|
| 1794 |
+ if (s->scalability) {
|
|
| 1795 |
+ GetBitContext bak= *gb; |
|
| 1796 |
+ int ref_layer_id; |
|
| 1797 |
+ int ref_layer_sampling_dir; |
|
| 1798 |
+ int h_sampling_factor_n; |
|
| 1799 |
+ int h_sampling_factor_m; |
|
| 1800 |
+ int v_sampling_factor_n; |
|
| 1801 |
+ int v_sampling_factor_m; |
|
| 1802 |
+ |
|
| 1803 |
+ s->hierachy_type= get_bits1(gb); |
|
| 1804 |
+ ref_layer_id= get_bits(gb, 4); |
|
| 1805 |
+ ref_layer_sampling_dir= get_bits1(gb); |
|
| 1806 |
+ h_sampling_factor_n= get_bits(gb, 5); |
|
| 1807 |
+ h_sampling_factor_m= get_bits(gb, 5); |
|
| 1808 |
+ v_sampling_factor_n= get_bits(gb, 5); |
|
| 1809 |
+ v_sampling_factor_m= get_bits(gb, 5); |
|
| 1810 |
+ s->enhancement_type= get_bits1(gb); |
|
| 1811 |
+ |
|
| 1812 |
+ if( h_sampling_factor_n==0 || h_sampling_factor_m==0 |
|
| 1813 |
+ || v_sampling_factor_n==0 || v_sampling_factor_m==0){
|
|
| 1814 |
+ /* illegal scalability header (VERY broken encoder), |
|
| 1815 |
+ * trying to workaround */ |
|
| 1816 |
+ s->scalability=0; |
|
| 1817 |
+ *gb= bak; |
|
| 1818 |
+ }else |
|
| 1819 |
+ av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n"); |
|
| 1820 |
+ |
|
| 1821 |
+ // bin shape stuff FIXME |
|
| 1822 |
+ } |
|
| 1823 |
+ } |
|
| 1824 |
+ return 0; |
|
| 1825 |
+} |
|
| 1826 |
+ |
|
| 1827 |
+/** |
|
| 1828 |
+ * decodes the user data stuff in the header. |
|
| 1829 |
+ * Also initializes divx/xvid/lavc_version/build. |
|
| 1830 |
+ */ |
|
| 1831 |
+static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
|
|
| 1832 |
+ char buf[256]; |
|
| 1833 |
+ int i; |
|
| 1834 |
+ int e; |
|
| 1835 |
+ int ver = 0, build = 0, ver2 = 0, ver3 = 0; |
|
| 1836 |
+ char last; |
|
| 1837 |
+ |
|
| 1838 |
+ for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){
|
|
| 1839 |
+ if(show_bits(gb, 23) == 0) break; |
|
| 1840 |
+ buf[i]= get_bits(gb, 8); |
|
| 1841 |
+ } |
|
| 1842 |
+ buf[i]=0; |
|
| 1843 |
+ |
|
| 1844 |
+ /* divx detection */ |
|
| 1845 |
+ e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last); |
|
| 1846 |
+ if(e<2) |
|
| 1847 |
+ e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last); |
|
| 1848 |
+ if(e>=2){
|
|
| 1849 |
+ s->divx_version= ver; |
|
| 1850 |
+ s->divx_build= build; |
|
| 1851 |
+ s->divx_packed= e==3 && last=='p'; |
|
| 1852 |
+ if(s->divx_packed && !s->showed_packed_warning) {
|
|
| 1853 |
+ av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n"); |
|
| 1854 |
+ s->showed_packed_warning=1; |
|
| 1855 |
+ } |
|
| 1856 |
+ } |
|
| 1857 |
+ |
|
| 1858 |
+ /* ffmpeg detection */ |
|
| 1859 |
+ e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3; |
|
| 1860 |
+ if(e!=4) |
|
| 1861 |
+ e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build); |
|
| 1862 |
+ if(e!=4){
|
|
| 1863 |
+ e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1; |
|
| 1864 |
+ if (e>1) |
|
| 1865 |
+ build= (ver<<16) + (ver2<<8) + ver3; |
|
| 1866 |
+ } |
|
| 1867 |
+ if(e!=4){
|
|
| 1868 |
+ if(strcmp(buf, "ffmpeg")==0){
|
|
| 1869 |
+ s->lavc_build= 4600; |
|
| 1870 |
+ } |
|
| 1871 |
+ } |
|
| 1872 |
+ if(e==4){
|
|
| 1873 |
+ s->lavc_build= build; |
|
| 1874 |
+ } |
|
| 1875 |
+ |
|
| 1876 |
+ /* Xvid detection */ |
|
| 1877 |
+ e=sscanf(buf, "XviD%d", &build); |
|
| 1878 |
+ if(e==1){
|
|
| 1879 |
+ s->xvid_build= build; |
|
| 1880 |
+ } |
|
| 1881 |
+ |
|
| 1882 |
+ return 0; |
|
| 1883 |
+} |
|
| 1884 |
+ |
|
| 1885 |
+static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
|
|
| 1886 |
+ int time_incr, time_increment; |
|
| 1887 |
+ |
|
| 1888 |
+ s->pict_type = get_bits(gb, 2) + FF_I_TYPE; /* pict type: I = 0 , P = 1 */ |
|
| 1889 |
+ if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
|
|
| 1890 |
+ av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n"); |
|
| 1891 |
+ s->low_delay=0; |
|
| 1892 |
+ } |
|
| 1893 |
+ |
|
| 1894 |
+ s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE; |
|
| 1895 |
+ if(s->partitioned_frame) |
|
| 1896 |
+ s->decode_mb= mpeg4_decode_partitioned_mb; |
|
| 1897 |
+ else |
|
| 1898 |
+ s->decode_mb= mpeg4_decode_mb; |
|
| 1899 |
+ |
|
| 1900 |
+ time_incr=0; |
|
| 1901 |
+ while (get_bits1(gb) != 0) |
|
| 1902 |
+ time_incr++; |
|
| 1903 |
+ |
|
| 1904 |
+ check_marker(gb, "before time_increment"); |
|
| 1905 |
+ |
|
| 1906 |
+ if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
|
|
| 1907 |
+ av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n"); |
|
| 1908 |
+ |
|
| 1909 |
+ for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
|
|
| 1910 |
+ if ( s->pict_type == FF_P_TYPE |
|
| 1911 |
+ || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
|
|
| 1912 |
+ if((show_bits(gb, s->time_increment_bits+6)&0x37) == 0x30) break; |
|
| 1913 |
+ }else |
|
| 1914 |
+ if((show_bits(gb, s->time_increment_bits+5)&0x1F) == 0x18) break; |
|
| 1915 |
+ } |
|
| 1916 |
+ |
|
| 1917 |
+ av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits); |
|
| 1918 |
+ } |
|
| 1919 |
+ |
|
| 1920 |
+ if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further |
|
| 1921 |
+ else time_increment= get_bits(gb, s->time_increment_bits); |
|
| 1922 |
+ |
|
| 1923 |
+ if(s->pict_type!=FF_B_TYPE){
|
|
| 1924 |
+ s->last_time_base= s->time_base; |
|
| 1925 |
+ s->time_base+= time_incr; |
|
| 1926 |
+ s->time= s->time_base*s->avctx->time_base.den + time_increment; |
|
| 1927 |
+ if(s->workaround_bugs&FF_BUG_UMP4){
|
|
| 1928 |
+ if(s->time < s->last_non_b_time){
|
|
| 1929 |
+ /* header is not mpeg-4-compatible, broken encoder, |
|
| 1930 |
+ * trying to workaround */ |
|
| 1931 |
+ s->time_base++; |
|
| 1932 |
+ s->time+= s->avctx->time_base.den; |
|
| 1933 |
+ } |
|
| 1934 |
+ } |
|
| 1935 |
+ s->pp_time= s->time - s->last_non_b_time; |
|
| 1936 |
+ s->last_non_b_time= s->time; |
|
| 1937 |
+ }else{
|
|
| 1938 |
+ s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment; |
|
| 1939 |
+ s->pb_time= s->pp_time - (s->last_non_b_time - s->time); |
|
| 1940 |
+ if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
|
|
| 1941 |
+ /* messed up order, maybe after seeking? skipping current b-frame */ |
|
| 1942 |
+ return FRAME_SKIPPED; |
|
| 1943 |
+ } |
|
| 1944 |
+ ff_mpeg4_init_direct_mv(s); |
|
| 1945 |
+ |
|
| 1946 |
+ if(s->t_frame==0) s->t_frame= s->pb_time; |
|
| 1947 |
+ if(s->t_frame==0) s->t_frame=1; // 1/0 protection |
|
| 1948 |
+ s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame) |
|
| 1949 |
+ - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2; |
|
| 1950 |
+ s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame) |
|
| 1951 |
+ - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2; |
|
| 1952 |
+ if(!s->progressive_sequence){
|
|
| 1953 |
+ if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1) |
|
| 1954 |
+ return FRAME_SKIPPED; |
|
| 1955 |
+ } |
|
| 1956 |
+ } |
|
| 1957 |
+ |
|
| 1958 |
+ if(s->avctx->time_base.num) |
|
| 1959 |
+ s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num; |
|
| 1960 |
+ else |
|
| 1961 |
+ s->current_picture_ptr->pts= AV_NOPTS_VALUE; |
|
| 1962 |
+ if(s->avctx->debug&FF_DEBUG_PTS) |
|
| 1963 |
+ av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts); |
|
| 1964 |
+ |
|
| 1965 |
+ check_marker(gb, "before vop_coded"); |
|
| 1966 |
+ |
|
| 1967 |
+ /* vop coded */ |
|
| 1968 |
+ if (get_bits1(gb) != 1){
|
|
| 1969 |
+ if(s->avctx->debug&FF_DEBUG_PICT_INFO) |
|
| 1970 |
+ av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n"); |
|
| 1971 |
+ return FRAME_SKIPPED; |
|
| 1972 |
+ } |
|
| 1973 |
+ if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE |
|
| 1974 |
+ || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
|
|
| 1975 |
+ /* rounding type for motion estimation */ |
|
| 1976 |
+ s->no_rounding = get_bits1(gb); |
|
| 1977 |
+ } else {
|
|
| 1978 |
+ s->no_rounding = 0; |
|
| 1979 |
+ } |
|
| 1980 |
+//FIXME reduced res stuff |
|
| 1981 |
+ |
|
| 1982 |
+ if (s->shape != RECT_SHAPE) {
|
|
| 1983 |
+ if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) {
|
|
| 1984 |
+ int width, height, hor_spat_ref, ver_spat_ref; |
|
| 1985 |
+ |
|
| 1986 |
+ width = get_bits(gb, 13); |
|
| 1987 |
+ skip_bits1(gb); /* marker */ |
|
| 1988 |
+ height = get_bits(gb, 13); |
|
| 1989 |
+ skip_bits1(gb); /* marker */ |
|
| 1990 |
+ hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */ |
|
| 1991 |
+ skip_bits1(gb); /* marker */ |
|
| 1992 |
+ ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */ |
|
| 1993 |
+ } |
|
| 1994 |
+ skip_bits1(gb); /* change_CR_disable */ |
|
| 1995 |
+ |
|
| 1996 |
+ if (get_bits1(gb) != 0) {
|
|
| 1997 |
+ skip_bits(gb, 8); /* constant_alpha_value */ |
|
| 1998 |
+ } |
|
| 1999 |
+ } |
|
| 2000 |
+//FIXME complexity estimation stuff |
|
| 2001 |
+ |
|
| 2002 |
+ if (s->shape != BIN_ONLY_SHAPE) {
|
|
| 2003 |
+ skip_bits_long(gb, s->cplx_estimation_trash_i); |
|
| 2004 |
+ if(s->pict_type != FF_I_TYPE) |
|
| 2005 |
+ skip_bits_long(gb, s->cplx_estimation_trash_p); |
|
| 2006 |
+ if(s->pict_type == FF_B_TYPE) |
|
| 2007 |
+ skip_bits_long(gb, s->cplx_estimation_trash_b); |
|
| 2008 |
+ |
|
| 2009 |
+ s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ]; |
|
| 2010 |
+ if(!s->progressive_sequence){
|
|
| 2011 |
+ s->top_field_first= get_bits1(gb); |
|
| 2012 |
+ s->alternate_scan= get_bits1(gb); |
|
| 2013 |
+ }else |
|
| 2014 |
+ s->alternate_scan= 0; |
|
| 2015 |
+ } |
|
| 2016 |
+ |
|
| 2017 |
+ if(s->alternate_scan){
|
|
| 2018 |
+ ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan); |
|
| 2019 |
+ ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan); |
|
| 2020 |
+ ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan); |
|
| 2021 |
+ ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); |
|
| 2022 |
+ } else{
|
|
| 2023 |
+ ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct); |
|
| 2024 |
+ ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct); |
|
| 2025 |
+ ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); |
|
| 2026 |
+ ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); |
|
| 2027 |
+ } |
|
| 2028 |
+ |
|
| 2029 |
+ if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
|
|
| 2030 |
+ mpeg4_decode_sprite_trajectory(s, gb); |
|
| 2031 |
+ if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n"); |
|
| 2032 |
+ if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n"); |
|
| 2033 |
+ } |
|
| 2034 |
+ |
|
| 2035 |
+ if (s->shape != BIN_ONLY_SHAPE) {
|
|
| 2036 |
+ s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision); |
|
| 2037 |
+ if(s->qscale==0){
|
|
| 2038 |
+ av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n"); |
|
| 2039 |
+ return -1; // makes no sense to continue, as there is nothing left from the image then |
|
| 2040 |
+ } |
|
| 2041 |
+ |
|
| 2042 |
+ if (s->pict_type != FF_I_TYPE) {
|
|
| 2043 |
+ s->f_code = get_bits(gb, 3); /* fcode_for */ |
|
| 2044 |
+ if(s->f_code==0){
|
|
| 2045 |
+ av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n"); |
|
| 2046 |
+ return -1; // makes no sense to continue, as the MV decoding will break very quickly |
|
| 2047 |
+ } |
|
| 2048 |
+ }else |
|
| 2049 |
+ s->f_code=1; |
|
| 2050 |
+ |
|
| 2051 |
+ if (s->pict_type == FF_B_TYPE) {
|
|
| 2052 |
+ s->b_code = get_bits(gb, 3); |
|
| 2053 |
+ }else |
|
| 2054 |
+ s->b_code=1; |
|
| 2055 |
+ |
|
| 2056 |
+ if(s->avctx->debug&FF_DEBUG_PICT_INFO){
|
|
| 2057 |
+ av_log(s->avctx, AV_LOG_DEBUG, "qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d rnd:%d vot:%d%s dc:%d ce:%d/%d/%d\n", |
|
| 2058 |
+ s->qscale, s->f_code, s->b_code, |
|
| 2059 |
+ s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")), |
|
| 2060 |
+ gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first, |
|
| 2061 |
+ s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points, |
|
| 2062 |
+ s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold, s->cplx_estimation_trash_i, s->cplx_estimation_trash_p, s->cplx_estimation_trash_b); |
|
| 2063 |
+ } |
|
| 2064 |
+ |
|
| 2065 |
+ if(!s->scalability){
|
|
| 2066 |
+ if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) {
|
|
| 2067 |
+ skip_bits1(gb); // vop shape coding type |
|
| 2068 |
+ } |
|
| 2069 |
+ }else{
|
|
| 2070 |
+ if(s->enhancement_type){
|
|
| 2071 |
+ int load_backward_shape= get_bits1(gb); |
|
| 2072 |
+ if(load_backward_shape){
|
|
| 2073 |
+ av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n"); |
|
| 2074 |
+ } |
|
| 2075 |
+ } |
|
| 2076 |
+ skip_bits(gb, 2); //ref_select_code |
|
| 2077 |
+ } |
|
| 2078 |
+ } |
|
| 2079 |
+ /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/ |
|
| 2080 |
+ // note we cannot detect divx5 without b-frames easily (although it's buggy too) |
|
| 2081 |
+ if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
|
|
| 2082 |
+ av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n"); |
|
| 2083 |
+ s->low_delay=1; |
|
| 2084 |
+ } |
|
| 2085 |
+ |
|
| 2086 |
+ s->picture_number++; // better than pic number==0 always ;) |
|
| 2087 |
+ |
|
| 2088 |
+ s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support |
|
| 2089 |
+ s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; |
|
| 2090 |
+ |
|
| 2091 |
+ if(s->workaround_bugs&FF_BUG_EDGE){
|
|
| 2092 |
+ s->h_edge_pos= s->width; |
|
| 2093 |
+ s->v_edge_pos= s->height; |
|
| 2094 |
+ } |
|
| 2095 |
+ return 0; |
|
| 2096 |
+} |
|
| 2097 |
+ |
|
| 2098 |
+/** |
|
| 2099 |
+ * decode mpeg4 headers |
|
| 2100 |
+ * @return <0 if no VOP found (or a damaged one) |
|
| 2101 |
+ * FRAME_SKIPPED if a not coded VOP is found |
|
| 2102 |
+ * 0 if a VOP is found |
|
| 2103 |
+ */ |
|
| 2104 |
+int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb) |
|
| 2105 |
+{
|
|
| 2106 |
+ int startcode, v; |
|
| 2107 |
+ |
|
| 2108 |
+ /* search next start code */ |
|
| 2109 |
+ align_get_bits(gb); |
|
| 2110 |
+ |
|
| 2111 |
+ if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){
|
|
| 2112 |
+ skip_bits(gb, 24); |
|
| 2113 |
+ if(get_bits(gb, 8) == 0xF0) |
|
| 2114 |
+ goto end; |
|
| 2115 |
+ } |
|
| 2116 |
+ |
|
| 2117 |
+ startcode = 0xff; |
|
| 2118 |
+ for(;;) {
|
|
| 2119 |
+ if(get_bits_count(gb) >= gb->size_in_bits){
|
|
| 2120 |
+ if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
|
|
| 2121 |
+ av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits); |
|
| 2122 |
+ return FRAME_SKIPPED; //divx bug |
|
| 2123 |
+ }else |
|
| 2124 |
+ return -1; //end of stream |
|
| 2125 |
+ } |
|
| 2126 |
+ |
|
| 2127 |
+ /* use the bits after the test */ |
|
| 2128 |
+ v = get_bits(gb, 8); |
|
| 2129 |
+ startcode = ((startcode << 8) | v) & 0xffffffff; |
|
| 2130 |
+ |
|
| 2131 |
+ if((startcode&0xFFFFFF00) != 0x100) |
|
| 2132 |
+ continue; //no startcode |
|
| 2133 |
+ |
|
| 2134 |
+ if(s->avctx->debug&FF_DEBUG_STARTCODE){
|
|
| 2135 |
+ av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode); |
|
| 2136 |
+ if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start"); |
|
| 2137 |
+ else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start"); |
|
| 2138 |
+ else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved"); |
|
| 2139 |
+ else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start"); |
|
| 2140 |
+ else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved"); |
|
| 2141 |
+ else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start"); |
|
| 2142 |
+ else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End"); |
|
| 2143 |
+ else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data"); |
|
| 2144 |
+ else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start"); |
|
| 2145 |
+ else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error"); |
|
| 2146 |
+ else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start"); |
|
| 2147 |
+ else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start"); |
|
| 2148 |
+ else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start"); |
|
| 2149 |
+ else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start"); |
|
| 2150 |
+ else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start"); |
|
| 2151 |
+ else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start"); |
|
| 2152 |
+ else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start"); |
|
| 2153 |
+ else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start"); |
|
| 2154 |
+ else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start"); |
|
| 2155 |
+ else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start"); |
|
| 2156 |
+ else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start"); |
|
| 2157 |
+ else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start"); |
|
| 2158 |
+ else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start"); |
|
| 2159 |
+ else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start"); |
|
| 2160 |
+ else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start"); |
|
| 2161 |
+ else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved"); |
|
| 2162 |
+ else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start"); |
|
| 2163 |
+ av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb)); |
|
| 2164 |
+ } |
|
| 2165 |
+ |
|
| 2166 |
+ if(startcode >= 0x120 && startcode <= 0x12F){
|
|
| 2167 |
+ if(decode_vol_header(s, gb) < 0) |
|
| 2168 |
+ return -1; |
|
| 2169 |
+ } |
|
| 2170 |
+ else if(startcode == USER_DATA_STARTCODE){
|
|
| 2171 |
+ decode_user_data(s, gb); |
|
| 2172 |
+ } |
|
| 2173 |
+ else if(startcode == GOP_STARTCODE){
|
|
| 2174 |
+ mpeg4_decode_gop_header(s, gb); |
|
| 2175 |
+ } |
|
| 2176 |
+ else if(startcode == VOP_STARTCODE){
|
|
| 2177 |
+ break; |
|
| 2178 |
+ } |
|
| 2179 |
+ |
|
| 2180 |
+ align_get_bits(gb); |
|
| 2181 |
+ startcode = 0xff; |
|
| 2182 |
+ } |
|
| 2183 |
+end: |
|
| 2184 |
+ if(s->flags& CODEC_FLAG_LOW_DELAY) |
|
| 2185 |
+ s->low_delay=1; |
|
| 2186 |
+ s->avctx->has_b_frames= !s->low_delay; |
|
| 2187 |
+ return decode_vop_header(s, gb); |
|
| 2188 |
+} |
|
| 2189 |
+ |
|
| 2190 |
+static av_cold int decode_init(AVCodecContext *avctx) |
|
| 2191 |
+{
|
|
| 2192 |
+ MpegEncContext *s = avctx->priv_data; |
|
| 2193 |
+ int ret; |
|
| 2194 |
+ static int done = 0; |
|
| 2195 |
+ |
|
| 2196 |
+ if((ret=ff_h263_decode_init(avctx)) < 0) |
|
| 2197 |
+ return ret; |
|
| 2198 |
+ |
|
| 2199 |
+ if (!done) {
|
|
| 2200 |
+ done = 1; |
|
| 2201 |
+ |
|
| 2202 |
+ init_rl(&rl_intra, ff_mpeg4_static_rl_table_store[0]); |
|
| 2203 |
+ init_rl(&rvlc_rl_inter, ff_mpeg4_static_rl_table_store[1]); |
|
| 2204 |
+ init_rl(&rvlc_rl_intra, ff_mpeg4_static_rl_table_store[2]); |
|
| 2205 |
+ INIT_VLC_RL(rl_intra, 554); |
|
| 2206 |
+ INIT_VLC_RL(rvlc_rl_inter, 1072); |
|
| 2207 |
+ INIT_VLC_RL(rvlc_rl_intra, 1072); |
|
| 2208 |
+ INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */, |
|
| 2209 |
+ &DCtab_lum[0][1], 2, 1, |
|
| 2210 |
+ &DCtab_lum[0][0], 2, 1, 512); |
|
| 2211 |
+ INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */, |
|
| 2212 |
+ &DCtab_chrom[0][1], 2, 1, |
|
| 2213 |
+ &DCtab_chrom[0][0], 2, 1, 512); |
|
| 2214 |
+ INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15, |
|
| 2215 |
+ &sprite_trajectory_tab[0][1], 4, 2, |
|
| 2216 |
+ &sprite_trajectory_tab[0][0], 4, 2, 128); |
|
| 2217 |
+ INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4, |
|
| 2218 |
+ &mb_type_b_tab[0][1], 2, 1, |
|
| 2219 |
+ &mb_type_b_tab[0][0], 2, 1, 16); |
|
| 2220 |
+ } |
|
| 2221 |
+ |
|
| 2222 |
+ s->h263_pred = 1; |
|
| 2223 |
+ s->low_delay = 0; //default, might be overriden in the vol header during header parsing |
|
| 2224 |
+ s->decode_mb= mpeg4_decode_mb; |
|
| 2225 |
+ s->time_increment_bits = 4; /* default value for broken headers */ |
|
| 2226 |
+ avctx->chroma_sample_location = AVCHROMA_LOC_LEFT; |
|
| 2227 |
+ |
|
| 2228 |
+ return 0; |
|
| 2229 |
+} |
|
| 2230 |
+ |
|
| 2231 |
+AVCodec mpeg4_decoder = {
|
|
| 2232 |
+ "mpeg4", |
|
| 2233 |
+ CODEC_TYPE_VIDEO, |
|
| 2234 |
+ CODEC_ID_MPEG4, |
|
| 2235 |
+ sizeof(MpegEncContext), |
|
| 2236 |
+ decode_init, |
|
| 2237 |
+ NULL, |
|
| 2238 |
+ ff_h263_decode_end, |
|
| 2239 |
+ ff_h263_decode_frame, |
|
| 2240 |
+ CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, |
|
| 2241 |
+ .flush= ff_mpeg_flush, |
|
| 2242 |
+ .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
|
|
| 2243 |
+ .pix_fmts= ff_hwaccel_pixfmt_list_420, |
|
| 2244 |
+}; |
|
| 2245 |
+ |
|
| 2246 |
+ |
|
| 2247 |
+#if CONFIG_MPEG4_VDPAU_DECODER |
|
| 2248 |
+AVCodec mpeg4_vdpau_decoder = {
|
|
| 2249 |
+ "mpeg4_vdpau", |
|
| 2250 |
+ CODEC_TYPE_VIDEO, |
|
| 2251 |
+ CODEC_ID_MPEG4, |
|
| 2252 |
+ sizeof(MpegEncContext), |
|
| 2253 |
+ decode_init, |
|
| 2254 |
+ NULL, |
|
| 2255 |
+ ff_h263_decode_end, |
|
| 2256 |
+ ff_h263_decode_frame, |
|
| 2257 |
+ CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, |
|
| 2258 |
+ .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 (VDPAU)"),
|
|
| 2259 |
+ .pix_fmts= (const enum PixelFormat[]){PIX_FMT_VDPAU_MPEG4, PIX_FMT_NONE},
|
|
| 2260 |
+}; |
|
| 2261 |
+#endif |
| 0 | 2262 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,1351 @@ |
| 0 |
+/* |
|
| 1 |
+ * MPEG4 encoder. |
|
| 2 |
+ * Copyright (c) 2000,2001 Fabrice Bellard |
|
| 3 |
+ * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at> |
|
| 4 |
+ * |
|
| 5 |
+ * This file is part of FFmpeg. |
|
| 6 |
+ * |
|
| 7 |
+ * FFmpeg is free software; you can redistribute it and/or |
|
| 8 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 9 |
+ * License as published by the Free Software Foundation; either |
|
| 10 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 11 |
+ * |
|
| 12 |
+ * FFmpeg is distributed in the hope that it will be useful, |
|
| 13 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 14 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 15 |
+ * Lesser General Public License for more details. |
|
| 16 |
+ * |
|
| 17 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 18 |
+ * License along with FFmpeg; if not, write to the Free Software |
|
| 19 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 20 |
+ */ |
|
| 21 |
+ |
|
| 22 |
+#include "mpegvideo.h" |
|
| 23 |
+#include "h263.h" |
|
| 24 |
+#include "mpeg4video.h" |
|
| 25 |
+ |
|
| 26 |
+//The uni_DCtab_* tables below contain unified bits+length tables to encode DC |
|
| 27 |
+//differences in mpeg4. Unified in the sense that the specification specifies |
|
| 28 |
+//this encoding in several steps. |
|
| 29 |
+static uint8_t uni_DCtab_lum_len[512]; |
|
| 30 |
+static uint8_t uni_DCtab_chrom_len[512]; |
|
| 31 |
+static uint16_t uni_DCtab_lum_bits[512]; |
|
| 32 |
+static uint16_t uni_DCtab_chrom_bits[512]; |
|
| 33 |
+ |
|
| 34 |
+//unified encoding tables for run length encoding of coefficients |
|
| 35 |
+//unified in the sense that the specification specifies the encoding in several steps. |
|
| 36 |
+static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2]; |
|
| 37 |
+static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2]; |
|
| 38 |
+static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2]; |
|
| 39 |
+static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2]; |
|
| 40 |
+//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level)) |
|
| 41 |
+//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64) |
|
| 42 |
+#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level)) |
|
| 43 |
+ |
|
| 44 |
+/* mpeg4 |
|
| 45 |
+inter |
|
| 46 |
+max level: 24/6 |
|
| 47 |
+max run: 53/63 |
|
| 48 |
+ |
|
| 49 |
+intra |
|
| 50 |
+max level: 53/16 |
|
| 51 |
+max run: 29/41 |
|
| 52 |
+*/ |
|
| 53 |
+ |
|
| 54 |
+ |
|
| 55 |
+/** |
|
| 56 |
+ * Returns the number of bits that encoding the 8x8 block in block would need. |
|
| 57 |
+ * @param[in] block_last_index last index in scantable order that refers to a non zero element in block. |
|
| 58 |
+ */ |
|
| 59 |
+static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
|
|
| 60 |
+ int last=0; |
|
| 61 |
+ int j; |
|
| 62 |
+ int rate=0; |
|
| 63 |
+ |
|
| 64 |
+ for(j=1; j<=block_last_index; j++){
|
|
| 65 |
+ const int index= scantable[j]; |
|
| 66 |
+ int level= block[index]; |
|
| 67 |
+ if(level){
|
|
| 68 |
+ level+= 64; |
|
| 69 |
+ if((level&(~127)) == 0){
|
|
| 70 |
+ if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)]; |
|
| 71 |
+ else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)]; |
|
| 72 |
+ }else |
|
| 73 |
+ rate += s->ac_esc_length; |
|
| 74 |
+ |
|
| 75 |
+ last= j; |
|
| 76 |
+ } |
|
| 77 |
+ } |
|
| 78 |
+ |
|
| 79 |
+ return rate; |
|
| 80 |
+} |
|
| 81 |
+ |
|
| 82 |
+ |
|
| 83 |
+/** |
|
| 84 |
+ * Restores the ac coefficients in block that have been changed by decide_ac_pred(). |
|
| 85 |
+ * This function also restores s->block_last_index. |
|
| 86 |
+ * @param[in,out] block MB coefficients, these will be restored |
|
| 87 |
+ * @param[in] dir ac prediction direction for each 8x8 block |
|
| 88 |
+ * @param[out] st scantable for each 8x8 block |
|
| 89 |
+ * @param[in] zigzag_last_index index refering to the last non zero coefficient in zigzag order |
|
| 90 |
+ */ |
|
| 91 |
+static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], const int dir[6], uint8_t *st[6], const int zigzag_last_index[6]) |
|
| 92 |
+{
|
|
| 93 |
+ int i, n; |
|
| 94 |
+ memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6); |
|
| 95 |
+ |
|
| 96 |
+ for(n=0; n<6; n++){
|
|
| 97 |
+ int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
|
| 98 |
+ |
|
| 99 |
+ st[n]= s->intra_scantable.permutated; |
|
| 100 |
+ if(dir[n]){
|
|
| 101 |
+ /* top prediction */ |
|
| 102 |
+ for(i=1; i<8; i++){
|
|
| 103 |
+ block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8]; |
|
| 104 |
+ } |
|
| 105 |
+ }else{
|
|
| 106 |
+ /* left prediction */ |
|
| 107 |
+ for(i=1; i<8; i++){
|
|
| 108 |
+ block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ]; |
|
| 109 |
+ } |
|
| 110 |
+ } |
|
| 111 |
+ } |
|
| 112 |
+} |
|
| 113 |
+ |
|
| 114 |
+/** |
|
| 115 |
+ * Returns the optimal value (0 or 1) for the ac_pred element for the given MB in mpeg4. |
|
| 116 |
+ * This function will also update s->block_last_index and s->ac_val. |
|
| 117 |
+ * @param[in,out] block MB coefficients, these will be updated if 1 is returned |
|
| 118 |
+ * @param[in] dir ac prediction direction for each 8x8 block |
|
| 119 |
+ * @param[out] st scantable for each 8x8 block |
|
| 120 |
+ * @param[out] zigzag_last_index index refering to the last non zero coefficient in zigzag order |
|
| 121 |
+ */ |
|
| 122 |
+static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], const int dir[6], uint8_t *st[6], int zigzag_last_index[6]) |
|
| 123 |
+{
|
|
| 124 |
+ int score= 0; |
|
| 125 |
+ int i, n; |
|
| 126 |
+ int8_t * const qscale_table= s->current_picture.qscale_table; |
|
| 127 |
+ |
|
| 128 |
+ memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6); |
|
| 129 |
+ |
|
| 130 |
+ for(n=0; n<6; n++){
|
|
| 131 |
+ int16_t *ac_val, *ac_val1; |
|
| 132 |
+ |
|
| 133 |
+ score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated); |
|
| 134 |
+ |
|
| 135 |
+ ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
|
| 136 |
+ ac_val1= ac_val; |
|
| 137 |
+ if(dir[n]){
|
|
| 138 |
+ const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride; |
|
| 139 |
+ /* top prediction */ |
|
| 140 |
+ ac_val-= s->block_wrap[n]*16; |
|
| 141 |
+ if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
|
|
| 142 |
+ /* same qscale */ |
|
| 143 |
+ for(i=1; i<8; i++){
|
|
| 144 |
+ const int level= block[n][s->dsp.idct_permutation[i ]]; |
|
| 145 |
+ block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8]; |
|
| 146 |
+ ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]]; |
|
| 147 |
+ ac_val1[i+8]= level; |
|
| 148 |
+ } |
|
| 149 |
+ }else{
|
|
| 150 |
+ /* different qscale, we must rescale */ |
|
| 151 |
+ for(i=1; i<8; i++){
|
|
| 152 |
+ const int level= block[n][s->dsp.idct_permutation[i ]]; |
|
| 153 |
+ block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); |
|
| 154 |
+ ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]]; |
|
| 155 |
+ ac_val1[i+8]= level; |
|
| 156 |
+ } |
|
| 157 |
+ } |
|
| 158 |
+ st[n]= s->intra_h_scantable.permutated; |
|
| 159 |
+ }else{
|
|
| 160 |
+ const int xy= s->mb_x-1 + s->mb_y*s->mb_stride; |
|
| 161 |
+ /* left prediction */ |
|
| 162 |
+ ac_val-= 16; |
|
| 163 |
+ if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
|
|
| 164 |
+ /* same qscale */ |
|
| 165 |
+ for(i=1; i<8; i++){
|
|
| 166 |
+ const int level= block[n][s->dsp.idct_permutation[i<<3]]; |
|
| 167 |
+ block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i]; |
|
| 168 |
+ ac_val1[i ]= level; |
|
| 169 |
+ ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]]; |
|
| 170 |
+ } |
|
| 171 |
+ }else{
|
|
| 172 |
+ /* different qscale, we must rescale */ |
|
| 173 |
+ for(i=1; i<8; i++){
|
|
| 174 |
+ const int level= block[n][s->dsp.idct_permutation[i<<3]]; |
|
| 175 |
+ block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); |
|
| 176 |
+ ac_val1[i ]= level; |
|
| 177 |
+ ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]]; |
|
| 178 |
+ } |
|
| 179 |
+ } |
|
| 180 |
+ st[n]= s->intra_v_scantable.permutated; |
|
| 181 |
+ } |
|
| 182 |
+ |
|
| 183 |
+ for(i=63; i>0; i--) //FIXME optimize |
|
| 184 |
+ if(block[n][ st[n][i] ]) break; |
|
| 185 |
+ s->block_last_index[n]= i; |
|
| 186 |
+ |
|
| 187 |
+ score += get_block_rate(s, block[n], s->block_last_index[n], st[n]); |
|
| 188 |
+ } |
|
| 189 |
+ |
|
| 190 |
+ if(score < 0){
|
|
| 191 |
+ return 1; |
|
| 192 |
+ }else{
|
|
| 193 |
+ restore_ac_coeffs(s, block, dir, st, zigzag_last_index); |
|
| 194 |
+ return 0; |
|
| 195 |
+ } |
|
| 196 |
+} |
|
| 197 |
+ |
|
| 198 |
+/** |
|
| 199 |
+ * modify mb_type & qscale so that encoding is acually possible in mpeg4 |
|
| 200 |
+ */ |
|
| 201 |
+void ff_clean_mpeg4_qscales(MpegEncContext *s){
|
|
| 202 |
+ int i; |
|
| 203 |
+ int8_t * const qscale_table= s->current_picture.qscale_table; |
|
| 204 |
+ |
|
| 205 |
+ ff_clean_h263_qscales(s); |
|
| 206 |
+ |
|
| 207 |
+ if(s->pict_type== FF_B_TYPE){
|
|
| 208 |
+ int odd=0; |
|
| 209 |
+ /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */ |
|
| 210 |
+ |
|
| 211 |
+ for(i=0; i<s->mb_num; i++){
|
|
| 212 |
+ int mb_xy= s->mb_index2xy[i]; |
|
| 213 |
+ odd += qscale_table[mb_xy]&1; |
|
| 214 |
+ } |
|
| 215 |
+ |
|
| 216 |
+ if(2*odd > s->mb_num) odd=1; |
|
| 217 |
+ else odd=0; |
|
| 218 |
+ |
|
| 219 |
+ for(i=0; i<s->mb_num; i++){
|
|
| 220 |
+ int mb_xy= s->mb_index2xy[i]; |
|
| 221 |
+ if((qscale_table[mb_xy]&1) != odd) |
|
| 222 |
+ qscale_table[mb_xy]++; |
|
| 223 |
+ if(qscale_table[mb_xy] > 31) |
|
| 224 |
+ qscale_table[mb_xy]= 31; |
|
| 225 |
+ } |
|
| 226 |
+ |
|
| 227 |
+ for(i=1; i<s->mb_num; i++){
|
|
| 228 |
+ int mb_xy= s->mb_index2xy[i]; |
|
| 229 |
+ if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
|
|
| 230 |
+ s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR; |
|
| 231 |
+ } |
|
| 232 |
+ } |
|
| 233 |
+ } |
|
| 234 |
+} |
|
| 235 |
+ |
|
| 236 |
+ |
|
| 237 |
+/** |
|
| 238 |
+ * encodes the dc value. |
|
| 239 |
+ * @param n block index (0-3 are luma, 4-5 are chroma) |
|
| 240 |
+ */ |
|
| 241 |
+static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) |
|
| 242 |
+{
|
|
| 243 |
+#if 1 |
|
| 244 |
+ level+=256; |
|
| 245 |
+ if (n < 4) {
|
|
| 246 |
+ /* luminance */ |
|
| 247 |
+ put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]); |
|
| 248 |
+ } else {
|
|
| 249 |
+ /* chrominance */ |
|
| 250 |
+ put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]); |
|
| 251 |
+ } |
|
| 252 |
+#else |
|
| 253 |
+ int size, v; |
|
| 254 |
+ /* find number of bits */ |
|
| 255 |
+ size = 0; |
|
| 256 |
+ v = abs(level); |
|
| 257 |
+ while (v) {
|
|
| 258 |
+ v >>= 1; |
|
| 259 |
+ size++; |
|
| 260 |
+ } |
|
| 261 |
+ |
|
| 262 |
+ if (n < 4) {
|
|
| 263 |
+ /* luminance */ |
|
| 264 |
+ put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]); |
|
| 265 |
+ } else {
|
|
| 266 |
+ /* chrominance */ |
|
| 267 |
+ put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]); |
|
| 268 |
+ } |
|
| 269 |
+ |
|
| 270 |
+ /* encode remaining bits */ |
|
| 271 |
+ if (size > 0) {
|
|
| 272 |
+ if (level < 0) |
|
| 273 |
+ level = (-level) ^ ((1 << size) - 1); |
|
| 274 |
+ put_bits(&s->pb, size, level); |
|
| 275 |
+ if (size > 8) |
|
| 276 |
+ put_bits(&s->pb, 1, 1); |
|
| 277 |
+ } |
|
| 278 |
+#endif |
|
| 279 |
+} |
|
| 280 |
+ |
|
| 281 |
+static inline int mpeg4_get_dc_length(int level, int n){
|
|
| 282 |
+ if (n < 4) {
|
|
| 283 |
+ return uni_DCtab_lum_len[level + 256]; |
|
| 284 |
+ } else {
|
|
| 285 |
+ return uni_DCtab_chrom_len[level + 256]; |
|
| 286 |
+ } |
|
| 287 |
+} |
|
| 288 |
+ |
|
| 289 |
+/** |
|
| 290 |
+ * encodes a 8x8 block |
|
| 291 |
+ * @param n block index (0-3 are luma, 4-5 are chroma) |
|
| 292 |
+ */ |
|
| 293 |
+static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, |
|
| 294 |
+ uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) |
|
| 295 |
+{
|
|
| 296 |
+ int i, last_non_zero; |
|
| 297 |
+#if 0 //variables for the outcommented version |
|
| 298 |
+ int code, sign, last; |
|
| 299 |
+#endif |
|
| 300 |
+ const RLTable *rl; |
|
| 301 |
+ uint32_t *bits_tab; |
|
| 302 |
+ uint8_t *len_tab; |
|
| 303 |
+ const int last_index = s->block_last_index[n]; |
|
| 304 |
+ |
|
| 305 |
+ if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
|
|
| 306 |
+ /* mpeg4 based DC predictor */ |
|
| 307 |
+ mpeg4_encode_dc(dc_pb, intra_dc, n); |
|
| 308 |
+ if(last_index<1) return; |
|
| 309 |
+ i = 1; |
|
| 310 |
+ rl = &rl_intra; |
|
| 311 |
+ bits_tab= uni_mpeg4_intra_rl_bits; |
|
| 312 |
+ len_tab = uni_mpeg4_intra_rl_len; |
|
| 313 |
+ } else {
|
|
| 314 |
+ if(last_index<0) return; |
|
| 315 |
+ i = 0; |
|
| 316 |
+ rl = &rl_inter; |
|
| 317 |
+ bits_tab= uni_mpeg4_inter_rl_bits; |
|
| 318 |
+ len_tab = uni_mpeg4_inter_rl_len; |
|
| 319 |
+ } |
|
| 320 |
+ |
|
| 321 |
+ /* AC coefs */ |
|
| 322 |
+ last_non_zero = i - 1; |
|
| 323 |
+#if 1 |
|
| 324 |
+ for (; i < last_index; i++) {
|
|
| 325 |
+ int level = block[ scan_table[i] ]; |
|
| 326 |
+ if (level) {
|
|
| 327 |
+ int run = i - last_non_zero - 1; |
|
| 328 |
+ level+=64; |
|
| 329 |
+ if((level&(~127)) == 0){
|
|
| 330 |
+ const int index= UNI_MPEG4_ENC_INDEX(0, run, level); |
|
| 331 |
+ put_bits(ac_pb, len_tab[index], bits_tab[index]); |
|
| 332 |
+ }else{ //ESC3
|
|
| 333 |
+ put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(0<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1); |
|
| 334 |
+ } |
|
| 335 |
+ last_non_zero = i; |
|
| 336 |
+ } |
|
| 337 |
+ } |
|
| 338 |
+ /*if(i<=last_index)*/{
|
|
| 339 |
+ int level = block[ scan_table[i] ]; |
|
| 340 |
+ int run = i - last_non_zero - 1; |
|
| 341 |
+ level+=64; |
|
| 342 |
+ if((level&(~127)) == 0){
|
|
| 343 |
+ const int index= UNI_MPEG4_ENC_INDEX(1, run, level); |
|
| 344 |
+ put_bits(ac_pb, len_tab[index], bits_tab[index]); |
|
| 345 |
+ }else{ //ESC3
|
|
| 346 |
+ put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(1<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1); |
|
| 347 |
+ } |
|
| 348 |
+ } |
|
| 349 |
+#else |
|
| 350 |
+ for (; i <= last_index; i++) {
|
|
| 351 |
+ const int slevel = block[ scan_table[i] ]; |
|
| 352 |
+ if (slevel) {
|
|
| 353 |
+ int level; |
|
| 354 |
+ int run = i - last_non_zero - 1; |
|
| 355 |
+ last = (i == last_index); |
|
| 356 |
+ sign = 0; |
|
| 357 |
+ level = slevel; |
|
| 358 |
+ if (level < 0) {
|
|
| 359 |
+ sign = 1; |
|
| 360 |
+ level = -level; |
|
| 361 |
+ } |
|
| 362 |
+ code = get_rl_index(rl, last, run, level); |
|
| 363 |
+ put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); |
|
| 364 |
+ if (code == rl->n) {
|
|
| 365 |
+ int level1, run1; |
|
| 366 |
+ level1 = level - rl->max_level[last][run]; |
|
| 367 |
+ if (level1 < 1) |
|
| 368 |
+ goto esc2; |
|
| 369 |
+ code = get_rl_index(rl, last, run, level1); |
|
| 370 |
+ if (code == rl->n) {
|
|
| 371 |
+ esc2: |
|
| 372 |
+ put_bits(ac_pb, 1, 1); |
|
| 373 |
+ if (level > MAX_LEVEL) |
|
| 374 |
+ goto esc3; |
|
| 375 |
+ run1 = run - rl->max_run[last][level] - 1; |
|
| 376 |
+ if (run1 < 0) |
|
| 377 |
+ goto esc3; |
|
| 378 |
+ code = get_rl_index(rl, last, run1, level); |
|
| 379 |
+ if (code == rl->n) {
|
|
| 380 |
+ esc3: |
|
| 381 |
+ /* third escape */ |
|
| 382 |
+ put_bits(ac_pb, 1, 1); |
|
| 383 |
+ put_bits(ac_pb, 1, last); |
|
| 384 |
+ put_bits(ac_pb, 6, run); |
|
| 385 |
+ put_bits(ac_pb, 1, 1); |
|
| 386 |
+ put_sbits(ac_pb, 12, slevel); |
|
| 387 |
+ put_bits(ac_pb, 1, 1); |
|
| 388 |
+ } else {
|
|
| 389 |
+ /* second escape */ |
|
| 390 |
+ put_bits(ac_pb, 1, 0); |
|
| 391 |
+ put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); |
|
| 392 |
+ put_bits(ac_pb, 1, sign); |
|
| 393 |
+ } |
|
| 394 |
+ } else {
|
|
| 395 |
+ /* first escape */ |
|
| 396 |
+ put_bits(ac_pb, 1, 0); |
|
| 397 |
+ put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); |
|
| 398 |
+ put_bits(ac_pb, 1, sign); |
|
| 399 |
+ } |
|
| 400 |
+ } else {
|
|
| 401 |
+ put_bits(ac_pb, 1, sign); |
|
| 402 |
+ } |
|
| 403 |
+ last_non_zero = i; |
|
| 404 |
+ } |
|
| 405 |
+ } |
|
| 406 |
+#endif |
|
| 407 |
+} |
|
| 408 |
+ |
|
| 409 |
+static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, |
|
| 410 |
+ uint8_t *scan_table) |
|
| 411 |
+{
|
|
| 412 |
+ int i, last_non_zero; |
|
| 413 |
+ uint8_t *len_tab; |
|
| 414 |
+ const int last_index = s->block_last_index[n]; |
|
| 415 |
+ int len=0; |
|
| 416 |
+ |
|
| 417 |
+ if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
|
|
| 418 |
+ /* mpeg4 based DC predictor */ |
|
| 419 |
+ len += mpeg4_get_dc_length(intra_dc, n); |
|
| 420 |
+ if(last_index<1) return len; |
|
| 421 |
+ i = 1; |
|
| 422 |
+ len_tab = uni_mpeg4_intra_rl_len; |
|
| 423 |
+ } else {
|
|
| 424 |
+ if(last_index<0) return 0; |
|
| 425 |
+ i = 0; |
|
| 426 |
+ len_tab = uni_mpeg4_inter_rl_len; |
|
| 427 |
+ } |
|
| 428 |
+ |
|
| 429 |
+ /* AC coefs */ |
|
| 430 |
+ last_non_zero = i - 1; |
|
| 431 |
+ for (; i < last_index; i++) {
|
|
| 432 |
+ int level = block[ scan_table[i] ]; |
|
| 433 |
+ if (level) {
|
|
| 434 |
+ int run = i - last_non_zero - 1; |
|
| 435 |
+ level+=64; |
|
| 436 |
+ if((level&(~127)) == 0){
|
|
| 437 |
+ const int index= UNI_MPEG4_ENC_INDEX(0, run, level); |
|
| 438 |
+ len += len_tab[index]; |
|
| 439 |
+ }else{ //ESC3
|
|
| 440 |
+ len += 7+2+1+6+1+12+1; |
|
| 441 |
+ } |
|
| 442 |
+ last_non_zero = i; |
|
| 443 |
+ } |
|
| 444 |
+ } |
|
| 445 |
+ /*if(i<=last_index)*/{
|
|
| 446 |
+ int level = block[ scan_table[i] ]; |
|
| 447 |
+ int run = i - last_non_zero - 1; |
|
| 448 |
+ level+=64; |
|
| 449 |
+ if((level&(~127)) == 0){
|
|
| 450 |
+ const int index= UNI_MPEG4_ENC_INDEX(1, run, level); |
|
| 451 |
+ len += len_tab[index]; |
|
| 452 |
+ }else{ //ESC3
|
|
| 453 |
+ len += 7+2+1+6+1+12+1; |
|
| 454 |
+ } |
|
| 455 |
+ } |
|
| 456 |
+ |
|
| 457 |
+ return len; |
|
| 458 |
+} |
|
| 459 |
+ |
|
| 460 |
+static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6], |
|
| 461 |
+ uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
|
|
| 462 |
+ int i; |
|
| 463 |
+ |
|
| 464 |
+ if(scan_table){
|
|
| 465 |
+ if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
|
|
| 466 |
+ for (i = 0; i < 6; i++) {
|
|
| 467 |
+ skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i])); |
|
| 468 |
+ } |
|
| 469 |
+ }else{
|
|
| 470 |
+ /* encode each block */ |
|
| 471 |
+ for (i = 0; i < 6; i++) {
|
|
| 472 |
+ mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb); |
|
| 473 |
+ } |
|
| 474 |
+ } |
|
| 475 |
+ }else{
|
|
| 476 |
+ if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
|
|
| 477 |
+ for (i = 0; i < 6; i++) {
|
|
| 478 |
+ skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated)); |
|
| 479 |
+ } |
|
| 480 |
+ }else{
|
|
| 481 |
+ /* encode each block */ |
|
| 482 |
+ for (i = 0; i < 6; i++) {
|
|
| 483 |
+ mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb); |
|
| 484 |
+ } |
|
| 485 |
+ } |
|
| 486 |
+ } |
|
| 487 |
+} |
|
| 488 |
+ |
|
| 489 |
+//FIXME this is duplicated to h263.c |
|
| 490 |
+static const int dquant_code[5]= {1,0,9,2,3};
|
|
| 491 |
+ |
|
| 492 |
+void mpeg4_encode_mb(MpegEncContext * s, |
|
| 493 |
+ DCTELEM block[6][64], |
|
| 494 |
+ int motion_x, int motion_y) |
|
| 495 |
+{
|
|
| 496 |
+ int cbpc, cbpy, pred_x, pred_y; |
|
| 497 |
+ PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb; |
|
| 498 |
+ PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb; |
|
| 499 |
+ PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2 : &s->pb; |
|
| 500 |
+ const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0; |
|
| 501 |
+ |
|
| 502 |
+ if (!s->mb_intra) {
|
|
| 503 |
+ int i, cbp; |
|
| 504 |
+ |
|
| 505 |
+ if(s->pict_type==FF_B_TYPE){
|
|
| 506 |
+ static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
|
|
| 507 |
+ int mb_type= mb_type_table[s->mv_dir]; |
|
| 508 |
+ |
|
| 509 |
+ if(s->mb_x==0){
|
|
| 510 |
+ for(i=0; i<2; i++){
|
|
| 511 |
+ s->last_mv[i][0][0]= |
|
| 512 |
+ s->last_mv[i][0][1]= |
|
| 513 |
+ s->last_mv[i][1][0]= |
|
| 514 |
+ s->last_mv[i][1][1]= 0; |
|
| 515 |
+ } |
|
| 516 |
+ } |
|
| 517 |
+ |
|
| 518 |
+ assert(s->dquant>=-2 && s->dquant<=2); |
|
| 519 |
+ assert((s->dquant&1)==0); |
|
| 520 |
+ assert(mb_type>=0); |
|
| 521 |
+ |
|
| 522 |
+ /* nothing to do if this MB was skipped in the next P Frame */ |
|
| 523 |
+ if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
|
|
| 524 |
+ s->skip_count++; |
|
| 525 |
+ s->mv[0][0][0]= |
|
| 526 |
+ s->mv[0][0][1]= |
|
| 527 |
+ s->mv[1][0][0]= |
|
| 528 |
+ s->mv[1][0][1]= 0; |
|
| 529 |
+ s->mv_dir= MV_DIR_FORWARD; //doesn't matter |
|
| 530 |
+ s->qscale -= s->dquant; |
|
| 531 |
+// s->mb_skipped=1; |
|
| 532 |
+ |
|
| 533 |
+ return; |
|
| 534 |
+ } |
|
| 535 |
+ |
|
| 536 |
+ cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type); |
|
| 537 |
+ |
|
| 538 |
+ if ((cbp | motion_x | motion_y | mb_type) ==0) {
|
|
| 539 |
+ /* direct MB with MV={0,0} */
|
|
| 540 |
+ assert(s->dquant==0); |
|
| 541 |
+ |
|
| 542 |
+ put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */ |
|
| 543 |
+ |
|
| 544 |
+ if(interleaved_stats){
|
|
| 545 |
+ s->misc_bits++; |
|
| 546 |
+ s->last_bits++; |
|
| 547 |
+ } |
|
| 548 |
+ s->skip_count++; |
|
| 549 |
+ return; |
|
| 550 |
+ } |
|
| 551 |
+ |
|
| 552 |
+ put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */ |
|
| 553 |
+ put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge |
|
| 554 |
+ put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :) |
|
| 555 |
+ if(cbp) put_bits(&s->pb, 6, cbp); |
|
| 556 |
+ |
|
| 557 |
+ if(cbp && mb_type){
|
|
| 558 |
+ if(s->dquant) |
|
| 559 |
+ put_bits(&s->pb, 2, (s->dquant>>2)+3); |
|
| 560 |
+ else |
|
| 561 |
+ put_bits(&s->pb, 1, 0); |
|
| 562 |
+ }else |
|
| 563 |
+ s->qscale -= s->dquant; |
|
| 564 |
+ |
|
| 565 |
+ if(!s->progressive_sequence){
|
|
| 566 |
+ if(cbp) |
|
| 567 |
+ put_bits(&s->pb, 1, s->interlaced_dct); |
|
| 568 |
+ if(mb_type) // not direct mode |
|
| 569 |
+ put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD); |
|
| 570 |
+ } |
|
| 571 |
+ |
|
| 572 |
+ if(interleaved_stats){
|
|
| 573 |
+ s->misc_bits+= get_bits_diff(s); |
|
| 574 |
+ } |
|
| 575 |
+ |
|
| 576 |
+ if(mb_type == 0){
|
|
| 577 |
+ assert(s->mv_dir & MV_DIRECT); |
|
| 578 |
+ ff_h263_encode_motion_vector(s, motion_x, motion_y, 1); |
|
| 579 |
+ s->b_count++; |
|
| 580 |
+ s->f_count++; |
|
| 581 |
+ }else{
|
|
| 582 |
+ assert(mb_type > 0 && mb_type < 4); |
|
| 583 |
+ if(s->mv_type != MV_TYPE_FIELD){
|
|
| 584 |
+ if(s->mv_dir & MV_DIR_FORWARD){
|
|
| 585 |
+ ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0], |
|
| 586 |
+ s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code); |
|
| 587 |
+ s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0]; |
|
| 588 |
+ s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1]; |
|
| 589 |
+ s->f_count++; |
|
| 590 |
+ } |
|
| 591 |
+ if(s->mv_dir & MV_DIR_BACKWARD){
|
|
| 592 |
+ ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0], |
|
| 593 |
+ s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code); |
|
| 594 |
+ s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0]; |
|
| 595 |
+ s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1]; |
|
| 596 |
+ s->b_count++; |
|
| 597 |
+ } |
|
| 598 |
+ }else{
|
|
| 599 |
+ if(s->mv_dir & MV_DIR_FORWARD){
|
|
| 600 |
+ put_bits(&s->pb, 1, s->field_select[0][0]); |
|
| 601 |
+ put_bits(&s->pb, 1, s->field_select[0][1]); |
|
| 602 |
+ } |
|
| 603 |
+ if(s->mv_dir & MV_DIR_BACKWARD){
|
|
| 604 |
+ put_bits(&s->pb, 1, s->field_select[1][0]); |
|
| 605 |
+ put_bits(&s->pb, 1, s->field_select[1][1]); |
|
| 606 |
+ } |
|
| 607 |
+ if(s->mv_dir & MV_DIR_FORWARD){
|
|
| 608 |
+ for(i=0; i<2; i++){
|
|
| 609 |
+ ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0] , |
|
| 610 |
+ s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code); |
|
| 611 |
+ s->last_mv[0][i][0]= s->mv[0][i][0]; |
|
| 612 |
+ s->last_mv[0][i][1]= s->mv[0][i][1]*2; |
|
| 613 |
+ } |
|
| 614 |
+ s->f_count++; |
|
| 615 |
+ } |
|
| 616 |
+ if(s->mv_dir & MV_DIR_BACKWARD){
|
|
| 617 |
+ for(i=0; i<2; i++){
|
|
| 618 |
+ ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0] , |
|
| 619 |
+ s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code); |
|
| 620 |
+ s->last_mv[1][i][0]= s->mv[1][i][0]; |
|
| 621 |
+ s->last_mv[1][i][1]= s->mv[1][i][1]*2; |
|
| 622 |
+ } |
|
| 623 |
+ s->b_count++; |
|
| 624 |
+ } |
|
| 625 |
+ } |
|
| 626 |
+ } |
|
| 627 |
+ |
|
| 628 |
+ if(interleaved_stats){
|
|
| 629 |
+ s->mv_bits+= get_bits_diff(s); |
|
| 630 |
+ } |
|
| 631 |
+ |
|
| 632 |
+ mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb); |
|
| 633 |
+ |
|
| 634 |
+ if(interleaved_stats){
|
|
| 635 |
+ s->p_tex_bits+= get_bits_diff(s); |
|
| 636 |
+ } |
|
| 637 |
+ |
|
| 638 |
+ }else{ /* s->pict_type==FF_B_TYPE */
|
|
| 639 |
+ cbp= get_p_cbp(s, block, motion_x, motion_y); |
|
| 640 |
+ |
|
| 641 |
+ if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
|
|
| 642 |
+ /* check if the B frames can skip it too, as we must skip it if we skip here |
|
| 643 |
+ why didn't they just compress the skip-mb bits instead of reusing them ?! */ |
|
| 644 |
+ if(s->max_b_frames>0){
|
|
| 645 |
+ int i; |
|
| 646 |
+ int x,y, offset; |
|
| 647 |
+ uint8_t *p_pic; |
|
| 648 |
+ |
|
| 649 |
+ x= s->mb_x*16; |
|
| 650 |
+ y= s->mb_y*16; |
|
| 651 |
+ if(x+16 > s->width) x= s->width-16; |
|
| 652 |
+ if(y+16 > s->height) y= s->height-16; |
|
| 653 |
+ |
|
| 654 |
+ offset= x + y*s->linesize; |
|
| 655 |
+ p_pic= s->new_picture.data[0] + offset; |
|
| 656 |
+ |
|
| 657 |
+ s->mb_skipped=1; |
|
| 658 |
+ for(i=0; i<s->max_b_frames; i++){
|
|
| 659 |
+ uint8_t *b_pic; |
|
| 660 |
+ int diff; |
|
| 661 |
+ Picture *pic= s->reordered_input_picture[i+1]; |
|
| 662 |
+ |
|
| 663 |
+ if(pic==NULL || pic->pict_type!=FF_B_TYPE) break; |
|
| 664 |
+ |
|
| 665 |
+ b_pic= pic->data[0] + offset; |
|
| 666 |
+ if(pic->type != FF_BUFFER_TYPE_SHARED) |
|
| 667 |
+ b_pic+= INPLACE_OFFSET; |
|
| 668 |
+ diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16); |
|
| 669 |
+ if(diff>s->qscale*70){ //FIXME check that 70 is optimal
|
|
| 670 |
+ s->mb_skipped=0; |
|
| 671 |
+ break; |
|
| 672 |
+ } |
|
| 673 |
+ } |
|
| 674 |
+ }else |
|
| 675 |
+ s->mb_skipped=1; |
|
| 676 |
+ |
|
| 677 |
+ if(s->mb_skipped==1){
|
|
| 678 |
+ /* skip macroblock */ |
|
| 679 |
+ put_bits(&s->pb, 1, 1); |
|
| 680 |
+ |
|
| 681 |
+ if(interleaved_stats){
|
|
| 682 |
+ s->misc_bits++; |
|
| 683 |
+ s->last_bits++; |
|
| 684 |
+ } |
|
| 685 |
+ s->skip_count++; |
|
| 686 |
+ |
|
| 687 |
+ return; |
|
| 688 |
+ } |
|
| 689 |
+ } |
|
| 690 |
+ |
|
| 691 |
+ put_bits(&s->pb, 1, 0); /* mb coded */ |
|
| 692 |
+ cbpc = cbp & 3; |
|
| 693 |
+ cbpy = cbp >> 2; |
|
| 694 |
+ cbpy ^= 0xf; |
|
| 695 |
+ if(s->mv_type==MV_TYPE_16X16){
|
|
| 696 |
+ if(s->dquant) cbpc+= 8; |
|
| 697 |
+ put_bits(&s->pb, |
|
| 698 |
+ inter_MCBPC_bits[cbpc], |
|
| 699 |
+ inter_MCBPC_code[cbpc]); |
|
| 700 |
+ |
|
| 701 |
+ put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
|
| 702 |
+ if(s->dquant) |
|
| 703 |
+ put_bits(pb2, 2, dquant_code[s->dquant+2]); |
|
| 704 |
+ |
|
| 705 |
+ if(!s->progressive_sequence){
|
|
| 706 |
+ if(cbp) |
|
| 707 |
+ put_bits(pb2, 1, s->interlaced_dct); |
|
| 708 |
+ put_bits(pb2, 1, 0); |
|
| 709 |
+ } |
|
| 710 |
+ |
|
| 711 |
+ if(interleaved_stats){
|
|
| 712 |
+ s->misc_bits+= get_bits_diff(s); |
|
| 713 |
+ } |
|
| 714 |
+ |
|
| 715 |
+ /* motion vectors: 16x16 mode */ |
|
| 716 |
+ h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
|
| 717 |
+ |
|
| 718 |
+ ff_h263_encode_motion_vector(s, motion_x - pred_x, |
|
| 719 |
+ motion_y - pred_y, s->f_code); |
|
| 720 |
+ }else if(s->mv_type==MV_TYPE_FIELD){
|
|
| 721 |
+ if(s->dquant) cbpc+= 8; |
|
| 722 |
+ put_bits(&s->pb, |
|
| 723 |
+ inter_MCBPC_bits[cbpc], |
|
| 724 |
+ inter_MCBPC_code[cbpc]); |
|
| 725 |
+ |
|
| 726 |
+ put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
|
| 727 |
+ if(s->dquant) |
|
| 728 |
+ put_bits(pb2, 2, dquant_code[s->dquant+2]); |
|
| 729 |
+ |
|
| 730 |
+ assert(!s->progressive_sequence); |
|
| 731 |
+ if(cbp) |
|
| 732 |
+ put_bits(pb2, 1, s->interlaced_dct); |
|
| 733 |
+ put_bits(pb2, 1, 1); |
|
| 734 |
+ |
|
| 735 |
+ if(interleaved_stats){
|
|
| 736 |
+ s->misc_bits+= get_bits_diff(s); |
|
| 737 |
+ } |
|
| 738 |
+ |
|
| 739 |
+ /* motion vectors: 16x8 interlaced mode */ |
|
| 740 |
+ h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
|
| 741 |
+ pred_y /=2; |
|
| 742 |
+ |
|
| 743 |
+ put_bits(&s->pb, 1, s->field_select[0][0]); |
|
| 744 |
+ put_bits(&s->pb, 1, s->field_select[0][1]); |
|
| 745 |
+ |
|
| 746 |
+ ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x, |
|
| 747 |
+ s->mv[0][0][1] - pred_y, s->f_code); |
|
| 748 |
+ ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x, |
|
| 749 |
+ s->mv[0][1][1] - pred_y, s->f_code); |
|
| 750 |
+ }else{
|
|
| 751 |
+ assert(s->mv_type==MV_TYPE_8X8); |
|
| 752 |
+ put_bits(&s->pb, |
|
| 753 |
+ inter_MCBPC_bits[cbpc+16], |
|
| 754 |
+ inter_MCBPC_code[cbpc+16]); |
|
| 755 |
+ put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
|
| 756 |
+ |
|
| 757 |
+ if(!s->progressive_sequence){
|
|
| 758 |
+ if(cbp) |
|
| 759 |
+ put_bits(pb2, 1, s->interlaced_dct); |
|
| 760 |
+ } |
|
| 761 |
+ |
|
| 762 |
+ if(interleaved_stats){
|
|
| 763 |
+ s->misc_bits+= get_bits_diff(s); |
|
| 764 |
+ } |
|
| 765 |
+ |
|
| 766 |
+ for(i=0; i<4; i++){
|
|
| 767 |
+ /* motion vectors: 8x8 mode*/ |
|
| 768 |
+ h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
|
| 769 |
+ |
|
| 770 |
+ ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x, |
|
| 771 |
+ s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code); |
|
| 772 |
+ } |
|
| 773 |
+ } |
|
| 774 |
+ |
|
| 775 |
+ if(interleaved_stats){
|
|
| 776 |
+ s->mv_bits+= get_bits_diff(s); |
|
| 777 |
+ } |
|
| 778 |
+ |
|
| 779 |
+ mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb); |
|
| 780 |
+ |
|
| 781 |
+ if(interleaved_stats){
|
|
| 782 |
+ s->p_tex_bits+= get_bits_diff(s); |
|
| 783 |
+ } |
|
| 784 |
+ s->f_count++; |
|
| 785 |
+ } |
|
| 786 |
+ } else {
|
|
| 787 |
+ int cbp; |
|
| 788 |
+ int dc_diff[6]; //dc values with the dc prediction subtracted |
|
| 789 |
+ int dir[6]; //prediction direction |
|
| 790 |
+ int zigzag_last_index[6]; |
|
| 791 |
+ uint8_t *scan_table[6]; |
|
| 792 |
+ int i; |
|
| 793 |
+ |
|
| 794 |
+ for(i=0; i<6; i++){
|
|
| 795 |
+ dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1); |
|
| 796 |
+ } |
|
| 797 |
+ |
|
| 798 |
+ if(s->flags & CODEC_FLAG_AC_PRED){
|
|
| 799 |
+ s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index); |
|
| 800 |
+ }else{
|
|
| 801 |
+ for(i=0; i<6; i++) |
|
| 802 |
+ scan_table[i]= s->intra_scantable.permutated; |
|
| 803 |
+ } |
|
| 804 |
+ |
|
| 805 |
+ /* compute cbp */ |
|
| 806 |
+ cbp = 0; |
|
| 807 |
+ for (i = 0; i < 6; i++) {
|
|
| 808 |
+ if (s->block_last_index[i] >= 1) |
|
| 809 |
+ cbp |= 1 << (5 - i); |
|
| 810 |
+ } |
|
| 811 |
+ |
|
| 812 |
+ cbpc = cbp & 3; |
|
| 813 |
+ if (s->pict_type == FF_I_TYPE) {
|
|
| 814 |
+ if(s->dquant) cbpc+=4; |
|
| 815 |
+ put_bits(&s->pb, |
|
| 816 |
+ intra_MCBPC_bits[cbpc], |
|
| 817 |
+ intra_MCBPC_code[cbpc]); |
|
| 818 |
+ } else {
|
|
| 819 |
+ if(s->dquant) cbpc+=8; |
|
| 820 |
+ put_bits(&s->pb, 1, 0); /* mb coded */ |
|
| 821 |
+ put_bits(&s->pb, |
|
| 822 |
+ inter_MCBPC_bits[cbpc + 4], |
|
| 823 |
+ inter_MCBPC_code[cbpc + 4]); |
|
| 824 |
+ } |
|
| 825 |
+ put_bits(pb2, 1, s->ac_pred); |
|
| 826 |
+ cbpy = cbp >> 2; |
|
| 827 |
+ put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
|
| 828 |
+ if(s->dquant) |
|
| 829 |
+ put_bits(dc_pb, 2, dquant_code[s->dquant+2]); |
|
| 830 |
+ |
|
| 831 |
+ if(!s->progressive_sequence){
|
|
| 832 |
+ put_bits(dc_pb, 1, s->interlaced_dct); |
|
| 833 |
+ } |
|
| 834 |
+ |
|
| 835 |
+ if(interleaved_stats){
|
|
| 836 |
+ s->misc_bits+= get_bits_diff(s); |
|
| 837 |
+ } |
|
| 838 |
+ |
|
| 839 |
+ mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb); |
|
| 840 |
+ |
|
| 841 |
+ if(interleaved_stats){
|
|
| 842 |
+ s->i_tex_bits+= get_bits_diff(s); |
|
| 843 |
+ } |
|
| 844 |
+ s->i_count++; |
|
| 845 |
+ |
|
| 846 |
+ /* restore ac coeffs & last_index stuff if we messed them up with the prediction */ |
|
| 847 |
+ if(s->ac_pred) |
|
| 848 |
+ restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index); |
|
| 849 |
+ } |
|
| 850 |
+} |
|
| 851 |
+ |
|
| 852 |
+/** |
|
| 853 |
+ * add mpeg4 stuffing bits (01...1) |
|
| 854 |
+ */ |
|
| 855 |
+void ff_mpeg4_stuffing(PutBitContext * pbc) |
|
| 856 |
+{
|
|
| 857 |
+ int length; |
|
| 858 |
+ put_bits(pbc, 1, 0); |
|
| 859 |
+ length= (-put_bits_count(pbc))&7; |
|
| 860 |
+ if(length) put_bits(pbc, length, (1<<length)-1); |
|
| 861 |
+} |
|
| 862 |
+ |
|
| 863 |
+/* must be called before writing the header */ |
|
| 864 |
+void ff_set_mpeg4_time(MpegEncContext * s){
|
|
| 865 |
+ if(s->pict_type==FF_B_TYPE){
|
|
| 866 |
+ ff_mpeg4_init_direct_mv(s); |
|
| 867 |
+ }else{
|
|
| 868 |
+ s->last_time_base= s->time_base; |
|
| 869 |
+ s->time_base= s->time/s->avctx->time_base.den; |
|
| 870 |
+ } |
|
| 871 |
+} |
|
| 872 |
+ |
|
| 873 |
+static void mpeg4_encode_gop_header(MpegEncContext * s){
|
|
| 874 |
+ int hours, minutes, seconds; |
|
| 875 |
+ int64_t time; |
|
| 876 |
+ |
|
| 877 |
+ put_bits(&s->pb, 16, 0); |
|
| 878 |
+ put_bits(&s->pb, 16, GOP_STARTCODE); |
|
| 879 |
+ |
|
| 880 |
+ time= s->current_picture_ptr->pts; |
|
| 881 |
+ if(s->reordered_input_picture[1]) |
|
| 882 |
+ time= FFMIN(time, s->reordered_input_picture[1]->pts); |
|
| 883 |
+ time= time*s->avctx->time_base.num; |
|
| 884 |
+ |
|
| 885 |
+ seconds= time/s->avctx->time_base.den; |
|
| 886 |
+ minutes= seconds/60; seconds %= 60; |
|
| 887 |
+ hours= minutes/60; minutes %= 60; |
|
| 888 |
+ hours%=24; |
|
| 889 |
+ |
|
| 890 |
+ put_bits(&s->pb, 5, hours); |
|
| 891 |
+ put_bits(&s->pb, 6, minutes); |
|
| 892 |
+ put_bits(&s->pb, 1, 1); |
|
| 893 |
+ put_bits(&s->pb, 6, seconds); |
|
| 894 |
+ |
|
| 895 |
+ put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP)); |
|
| 896 |
+ put_bits(&s->pb, 1, 0); //broken link == NO |
|
| 897 |
+ |
|
| 898 |
+ s->last_time_base= time / s->avctx->time_base.den; |
|
| 899 |
+ |
|
| 900 |
+ ff_mpeg4_stuffing(&s->pb); |
|
| 901 |
+} |
|
| 902 |
+ |
|
| 903 |
+static void mpeg4_encode_visual_object_header(MpegEncContext * s){
|
|
| 904 |
+ int profile_and_level_indication; |
|
| 905 |
+ int vo_ver_id; |
|
| 906 |
+ |
|
| 907 |
+ if(s->avctx->profile != FF_PROFILE_UNKNOWN){
|
|
| 908 |
+ profile_and_level_indication = s->avctx->profile << 4; |
|
| 909 |
+ }else if(s->max_b_frames || s->quarter_sample){
|
|
| 910 |
+ profile_and_level_indication= 0xF0; // adv simple |
|
| 911 |
+ }else{
|
|
| 912 |
+ profile_and_level_indication= 0x00; // simple |
|
| 913 |
+ } |
|
| 914 |
+ |
|
| 915 |
+ if(s->avctx->level != FF_LEVEL_UNKNOWN){
|
|
| 916 |
+ profile_and_level_indication |= s->avctx->level; |
|
| 917 |
+ }else{
|
|
| 918 |
+ profile_and_level_indication |= 1; //level 1 |
|
| 919 |
+ } |
|
| 920 |
+ |
|
| 921 |
+ if(profile_and_level_indication>>4 == 0xF){
|
|
| 922 |
+ vo_ver_id= 5; |
|
| 923 |
+ }else{
|
|
| 924 |
+ vo_ver_id= 1; |
|
| 925 |
+ } |
|
| 926 |
+ |
|
| 927 |
+ //FIXME levels |
|
| 928 |
+ |
|
| 929 |
+ put_bits(&s->pb, 16, 0); |
|
| 930 |
+ put_bits(&s->pb, 16, VOS_STARTCODE); |
|
| 931 |
+ |
|
| 932 |
+ put_bits(&s->pb, 8, profile_and_level_indication); |
|
| 933 |
+ |
|
| 934 |
+ put_bits(&s->pb, 16, 0); |
|
| 935 |
+ put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE); |
|
| 936 |
+ |
|
| 937 |
+ put_bits(&s->pb, 1, 1); |
|
| 938 |
+ put_bits(&s->pb, 4, vo_ver_id); |
|
| 939 |
+ put_bits(&s->pb, 3, 1); //priority |
|
| 940 |
+ |
|
| 941 |
+ put_bits(&s->pb, 4, 1); //visual obj type== video obj |
|
| 942 |
+ |
|
| 943 |
+ put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME |
|
| 944 |
+ |
|
| 945 |
+ ff_mpeg4_stuffing(&s->pb); |
|
| 946 |
+} |
|
| 947 |
+ |
|
| 948 |
+static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number) |
|
| 949 |
+{
|
|
| 950 |
+ int vo_ver_id; |
|
| 951 |
+ |
|
| 952 |
+ if (!CONFIG_MPEG4_ENCODER) return; |
|
| 953 |
+ |
|
| 954 |
+ if(s->max_b_frames || s->quarter_sample){
|
|
| 955 |
+ vo_ver_id= 5; |
|
| 956 |
+ s->vo_type= ADV_SIMPLE_VO_TYPE; |
|
| 957 |
+ }else{
|
|
| 958 |
+ vo_ver_id= 1; |
|
| 959 |
+ s->vo_type= SIMPLE_VO_TYPE; |
|
| 960 |
+ } |
|
| 961 |
+ |
|
| 962 |
+ put_bits(&s->pb, 16, 0); |
|
| 963 |
+ put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */ |
|
| 964 |
+ put_bits(&s->pb, 16, 0); |
|
| 965 |
+ put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */ |
|
| 966 |
+ |
|
| 967 |
+ put_bits(&s->pb, 1, 0); /* random access vol */ |
|
| 968 |
+ put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */ |
|
| 969 |
+ if(s->workaround_bugs & FF_BUG_MS) {
|
|
| 970 |
+ put_bits(&s->pb, 1, 0); /* is obj layer id= no */ |
|
| 971 |
+ } else {
|
|
| 972 |
+ put_bits(&s->pb, 1, 1); /* is obj layer id= yes */ |
|
| 973 |
+ put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */ |
|
| 974 |
+ put_bits(&s->pb, 3, 1); /* is obj layer priority */ |
|
| 975 |
+ } |
|
| 976 |
+ |
|
| 977 |
+ s->aspect_ratio_info= ff_h263_aspect_to_info(s->avctx->sample_aspect_ratio); |
|
| 978 |
+ |
|
| 979 |
+ put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */ |
|
| 980 |
+ if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
|
|
| 981 |
+ put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num); |
|
| 982 |
+ put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den); |
|
| 983 |
+ } |
|
| 984 |
+ |
|
| 985 |
+ if(s->workaround_bugs & FF_BUG_MS) { //
|
|
| 986 |
+ put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */ |
|
| 987 |
+ } else {
|
|
| 988 |
+ put_bits(&s->pb, 1, 1); /* vol control parameters= yes */ |
|
| 989 |
+ put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */ |
|
| 990 |
+ put_bits(&s->pb, 1, s->low_delay); |
|
| 991 |
+ put_bits(&s->pb, 1, 0); /* vbv parameters= no */ |
|
| 992 |
+ } |
|
| 993 |
+ |
|
| 994 |
+ put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */ |
|
| 995 |
+ put_bits(&s->pb, 1, 1); /* marker bit */ |
|
| 996 |
+ |
|
| 997 |
+ put_bits(&s->pb, 16, s->avctx->time_base.den); |
|
| 998 |
+ if (s->time_increment_bits < 1) |
|
| 999 |
+ s->time_increment_bits = 1; |
|
| 1000 |
+ put_bits(&s->pb, 1, 1); /* marker bit */ |
|
| 1001 |
+ put_bits(&s->pb, 1, 0); /* fixed vop rate=no */ |
|
| 1002 |
+ put_bits(&s->pb, 1, 1); /* marker bit */ |
|
| 1003 |
+ put_bits(&s->pb, 13, s->width); /* vol width */ |
|
| 1004 |
+ put_bits(&s->pb, 1, 1); /* marker bit */ |
|
| 1005 |
+ put_bits(&s->pb, 13, s->height); /* vol height */ |
|
| 1006 |
+ put_bits(&s->pb, 1, 1); /* marker bit */ |
|
| 1007 |
+ put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1); |
|
| 1008 |
+ put_bits(&s->pb, 1, 1); /* obmc disable */ |
|
| 1009 |
+ if (vo_ver_id == 1) {
|
|
| 1010 |
+ put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */ |
|
| 1011 |
+ }else{
|
|
| 1012 |
+ put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */ |
|
| 1013 |
+ } |
|
| 1014 |
+ |
|
| 1015 |
+ put_bits(&s->pb, 1, 0); /* not 8 bit == false */ |
|
| 1016 |
+ put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/ |
|
| 1017 |
+ |
|
| 1018 |
+ if(s->mpeg_quant){
|
|
| 1019 |
+ ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix); |
|
| 1020 |
+ ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix); |
|
| 1021 |
+ } |
|
| 1022 |
+ |
|
| 1023 |
+ if (vo_ver_id != 1) |
|
| 1024 |
+ put_bits(&s->pb, 1, s->quarter_sample); |
|
| 1025 |
+ put_bits(&s->pb, 1, 1); /* complexity estimation disable */ |
|
| 1026 |
+ s->resync_marker= s->rtp_mode; |
|
| 1027 |
+ put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */ |
|
| 1028 |
+ put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0); |
|
| 1029 |
+ if(s->data_partitioning){
|
|
| 1030 |
+ put_bits(&s->pb, 1, 0); /* no rvlc */ |
|
| 1031 |
+ } |
|
| 1032 |
+ |
|
| 1033 |
+ if (vo_ver_id != 1){
|
|
| 1034 |
+ put_bits(&s->pb, 1, 0); /* newpred */ |
|
| 1035 |
+ put_bits(&s->pb, 1, 0); /* reduced res vop */ |
|
| 1036 |
+ } |
|
| 1037 |
+ put_bits(&s->pb, 1, 0); /* scalability */ |
|
| 1038 |
+ |
|
| 1039 |
+ ff_mpeg4_stuffing(&s->pb); |
|
| 1040 |
+ |
|
| 1041 |
+ /* user data */ |
|
| 1042 |
+ if(!(s->flags & CODEC_FLAG_BITEXACT)){
|
|
| 1043 |
+ put_bits(&s->pb, 16, 0); |
|
| 1044 |
+ put_bits(&s->pb, 16, 0x1B2); /* user_data */ |
|
| 1045 |
+ ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0); |
|
| 1046 |
+ } |
|
| 1047 |
+} |
|
| 1048 |
+ |
|
| 1049 |
+/* write mpeg4 VOP header */ |
|
| 1050 |
+void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number) |
|
| 1051 |
+{
|
|
| 1052 |
+ int time_incr; |
|
| 1053 |
+ int time_div, time_mod; |
|
| 1054 |
+ |
|
| 1055 |
+ if(s->pict_type==FF_I_TYPE){
|
|
| 1056 |
+ if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
|
|
| 1057 |
+ if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy |
|
| 1058 |
+ mpeg4_encode_visual_object_header(s); |
|
| 1059 |
+ if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy |
|
| 1060 |
+ mpeg4_encode_vol_header(s, 0, 0); |
|
| 1061 |
+ } |
|
| 1062 |
+ if(!(s->workaround_bugs & FF_BUG_MS)) |
|
| 1063 |
+ mpeg4_encode_gop_header(s); |
|
| 1064 |
+ } |
|
| 1065 |
+ |
|
| 1066 |
+ s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE; |
|
| 1067 |
+ |
|
| 1068 |
+ put_bits(&s->pb, 16, 0); /* vop header */ |
|
| 1069 |
+ put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */ |
|
| 1070 |
+ put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */ |
|
| 1071 |
+ |
|
| 1072 |
+ assert(s->time>=0); |
|
| 1073 |
+ time_div= s->time/s->avctx->time_base.den; |
|
| 1074 |
+ time_mod= s->time%s->avctx->time_base.den; |
|
| 1075 |
+ time_incr= time_div - s->last_time_base; |
|
| 1076 |
+ assert(time_incr >= 0); |
|
| 1077 |
+ while(time_incr--) |
|
| 1078 |
+ put_bits(&s->pb, 1, 1); |
|
| 1079 |
+ |
|
| 1080 |
+ put_bits(&s->pb, 1, 0); |
|
| 1081 |
+ |
|
| 1082 |
+ put_bits(&s->pb, 1, 1); /* marker */ |
|
| 1083 |
+ put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */ |
|
| 1084 |
+ put_bits(&s->pb, 1, 1); /* marker */ |
|
| 1085 |
+ put_bits(&s->pb, 1, 1); /* vop coded */ |
|
| 1086 |
+ if ( s->pict_type == FF_P_TYPE |
|
| 1087 |
+ || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
|
|
| 1088 |
+ put_bits(&s->pb, 1, s->no_rounding); /* rounding type */ |
|
| 1089 |
+ } |
|
| 1090 |
+ put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */ |
|
| 1091 |
+ if(!s->progressive_sequence){
|
|
| 1092 |
+ put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first); |
|
| 1093 |
+ put_bits(&s->pb, 1, s->alternate_scan); |
|
| 1094 |
+ } |
|
| 1095 |
+ //FIXME sprite stuff |
|
| 1096 |
+ |
|
| 1097 |
+ put_bits(&s->pb, 5, s->qscale); |
|
| 1098 |
+ |
|
| 1099 |
+ if (s->pict_type != FF_I_TYPE) |
|
| 1100 |
+ put_bits(&s->pb, 3, s->f_code); /* fcode_for */ |
|
| 1101 |
+ if (s->pict_type == FF_B_TYPE) |
|
| 1102 |
+ put_bits(&s->pb, 3, s->b_code); /* fcode_back */ |
|
| 1103 |
+} |
|
| 1104 |
+ |
|
| 1105 |
+ |
|
| 1106 |
+static void init_uni_dc_tab(void) |
|
| 1107 |
+{
|
|
| 1108 |
+ int level, uni_code, uni_len; |
|
| 1109 |
+ |
|
| 1110 |
+ for(level=-256; level<256; level++){
|
|
| 1111 |
+ int size, v, l; |
|
| 1112 |
+ /* find number of bits */ |
|
| 1113 |
+ size = 0; |
|
| 1114 |
+ v = abs(level); |
|
| 1115 |
+ while (v) {
|
|
| 1116 |
+ v >>= 1; |
|
| 1117 |
+ size++; |
|
| 1118 |
+ } |
|
| 1119 |
+ |
|
| 1120 |
+ if (level < 0) |
|
| 1121 |
+ l= (-level) ^ ((1 << size) - 1); |
|
| 1122 |
+ else |
|
| 1123 |
+ l= level; |
|
| 1124 |
+ |
|
| 1125 |
+ /* luminance */ |
|
| 1126 |
+ uni_code= DCtab_lum[size][0]; |
|
| 1127 |
+ uni_len = DCtab_lum[size][1]; |
|
| 1128 |
+ |
|
| 1129 |
+ if (size > 0) {
|
|
| 1130 |
+ uni_code<<=size; uni_code|=l; |
|
| 1131 |
+ uni_len+=size; |
|
| 1132 |
+ if (size > 8){
|
|
| 1133 |
+ uni_code<<=1; uni_code|=1; |
|
| 1134 |
+ uni_len++; |
|
| 1135 |
+ } |
|
| 1136 |
+ } |
|
| 1137 |
+ uni_DCtab_lum_bits[level+256]= uni_code; |
|
| 1138 |
+ uni_DCtab_lum_len [level+256]= uni_len; |
|
| 1139 |
+ |
|
| 1140 |
+ /* chrominance */ |
|
| 1141 |
+ uni_code= DCtab_chrom[size][0]; |
|
| 1142 |
+ uni_len = DCtab_chrom[size][1]; |
|
| 1143 |
+ |
|
| 1144 |
+ if (size > 0) {
|
|
| 1145 |
+ uni_code<<=size; uni_code|=l; |
|
| 1146 |
+ uni_len+=size; |
|
| 1147 |
+ if (size > 8){
|
|
| 1148 |
+ uni_code<<=1; uni_code|=1; |
|
| 1149 |
+ uni_len++; |
|
| 1150 |
+ } |
|
| 1151 |
+ } |
|
| 1152 |
+ uni_DCtab_chrom_bits[level+256]= uni_code; |
|
| 1153 |
+ uni_DCtab_chrom_len [level+256]= uni_len; |
|
| 1154 |
+ |
|
| 1155 |
+ } |
|
| 1156 |
+} |
|
| 1157 |
+ |
|
| 1158 |
+static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
|
|
| 1159 |
+ int slevel, run, last; |
|
| 1160 |
+ |
|
| 1161 |
+ assert(MAX_LEVEL >= 64); |
|
| 1162 |
+ assert(MAX_RUN >= 63); |
|
| 1163 |
+ |
|
| 1164 |
+ for(slevel=-64; slevel<64; slevel++){
|
|
| 1165 |
+ if(slevel==0) continue; |
|
| 1166 |
+ for(run=0; run<64; run++){
|
|
| 1167 |
+ for(last=0; last<=1; last++){
|
|
| 1168 |
+ const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64); |
|
| 1169 |
+ int level= slevel < 0 ? -slevel : slevel; |
|
| 1170 |
+ int sign= slevel < 0 ? 1 : 0; |
|
| 1171 |
+ int bits, len, code; |
|
| 1172 |
+ int level1, run1; |
|
| 1173 |
+ |
|
| 1174 |
+ len_tab[index]= 100; |
|
| 1175 |
+ |
|
| 1176 |
+ /* ESC0 */ |
|
| 1177 |
+ code= get_rl_index(rl, last, run, level); |
|
| 1178 |
+ bits= rl->table_vlc[code][0]; |
|
| 1179 |
+ len= rl->table_vlc[code][1]; |
|
| 1180 |
+ bits=bits*2+sign; len++; |
|
| 1181 |
+ |
|
| 1182 |
+ if(code!=rl->n && len < len_tab[index]){
|
|
| 1183 |
+ bits_tab[index]= bits; |
|
| 1184 |
+ len_tab [index]= len; |
|
| 1185 |
+ } |
|
| 1186 |
+ /* ESC1 */ |
|
| 1187 |
+ bits= rl->table_vlc[rl->n][0]; |
|
| 1188 |
+ len= rl->table_vlc[rl->n][1]; |
|
| 1189 |
+ bits=bits*2; len++; //esc1 |
|
| 1190 |
+ level1= level - rl->max_level[last][run]; |
|
| 1191 |
+ if(level1>0){
|
|
| 1192 |
+ code= get_rl_index(rl, last, run, level1); |
|
| 1193 |
+ bits<<= rl->table_vlc[code][1]; |
|
| 1194 |
+ len += rl->table_vlc[code][1]; |
|
| 1195 |
+ bits += rl->table_vlc[code][0]; |
|
| 1196 |
+ bits=bits*2+sign; len++; |
|
| 1197 |
+ |
|
| 1198 |
+ if(code!=rl->n && len < len_tab[index]){
|
|
| 1199 |
+ bits_tab[index]= bits; |
|
| 1200 |
+ len_tab [index]= len; |
|
| 1201 |
+ } |
|
| 1202 |
+ } |
|
| 1203 |
+ /* ESC2 */ |
|
| 1204 |
+ bits= rl->table_vlc[rl->n][0]; |
|
| 1205 |
+ len= rl->table_vlc[rl->n][1]; |
|
| 1206 |
+ bits=bits*4+2; len+=2; //esc2 |
|
| 1207 |
+ run1 = run - rl->max_run[last][level] - 1; |
|
| 1208 |
+ if(run1>=0){
|
|
| 1209 |
+ code= get_rl_index(rl, last, run1, level); |
|
| 1210 |
+ bits<<= rl->table_vlc[code][1]; |
|
| 1211 |
+ len += rl->table_vlc[code][1]; |
|
| 1212 |
+ bits += rl->table_vlc[code][0]; |
|
| 1213 |
+ bits=bits*2+sign; len++; |
|
| 1214 |
+ |
|
| 1215 |
+ if(code!=rl->n && len < len_tab[index]){
|
|
| 1216 |
+ bits_tab[index]= bits; |
|
| 1217 |
+ len_tab [index]= len; |
|
| 1218 |
+ } |
|
| 1219 |
+ } |
|
| 1220 |
+ /* ESC3 */ |
|
| 1221 |
+ bits= rl->table_vlc[rl->n][0]; |
|
| 1222 |
+ len = rl->table_vlc[rl->n][1]; |
|
| 1223 |
+ bits=bits*4+3; len+=2; //esc3 |
|
| 1224 |
+ bits=bits*2+last; len++; |
|
| 1225 |
+ bits=bits*64+run; len+=6; |
|
| 1226 |
+ bits=bits*2+1; len++; //marker |
|
| 1227 |
+ bits=bits*4096+(slevel&0xfff); len+=12; |
|
| 1228 |
+ bits=bits*2+1; len++; //marker |
|
| 1229 |
+ |
|
| 1230 |
+ if(len < len_tab[index]){
|
|
| 1231 |
+ bits_tab[index]= bits; |
|
| 1232 |
+ len_tab [index]= len; |
|
| 1233 |
+ } |
|
| 1234 |
+ } |
|
| 1235 |
+ } |
|
| 1236 |
+ } |
|
| 1237 |
+} |
|
| 1238 |
+ |
|
| 1239 |
+static av_cold int encode_init(AVCodecContext *avctx) |
|
| 1240 |
+{
|
|
| 1241 |
+ MpegEncContext *s = avctx->priv_data; |
|
| 1242 |
+ int ret; |
|
| 1243 |
+ static int done = 0; |
|
| 1244 |
+ |
|
| 1245 |
+ if((ret=MPV_encode_init(avctx)) < 0) |
|
| 1246 |
+ return ret; |
|
| 1247 |
+ |
|
| 1248 |
+ if (!done) {
|
|
| 1249 |
+ done = 1; |
|
| 1250 |
+ |
|
| 1251 |
+ init_uni_dc_tab(); |
|
| 1252 |
+ |
|
| 1253 |
+ init_rl(&rl_intra, ff_mpeg4_static_rl_table_store[0]); |
|
| 1254 |
+ |
|
| 1255 |
+ init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len); |
|
| 1256 |
+ init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len); |
|
| 1257 |
+ } |
|
| 1258 |
+ |
|
| 1259 |
+ s->min_qcoeff= -2048; |
|
| 1260 |
+ s->max_qcoeff= 2047; |
|
| 1261 |
+ s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len; |
|
| 1262 |
+ s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64; |
|
| 1263 |
+ s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len; |
|
| 1264 |
+ s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64; |
|
| 1265 |
+ s->luma_dc_vlc_length= uni_DCtab_lum_len; |
|
| 1266 |
+ s->chroma_dc_vlc_length= uni_DCtab_chrom_len; |
|
| 1267 |
+ s->ac_esc_length= 7+2+1+6+1+12+1; |
|
| 1268 |
+ s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; |
|
| 1269 |
+ s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; |
|
| 1270 |
+ |
|
| 1271 |
+ if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
|
|
| 1272 |
+ |
|
| 1273 |
+ s->avctx->extradata= av_malloc(1024); |
|
| 1274 |
+ init_put_bits(&s->pb, s->avctx->extradata, 1024); |
|
| 1275 |
+ |
|
| 1276 |
+ if(!(s->workaround_bugs & FF_BUG_MS)) |
|
| 1277 |
+ mpeg4_encode_visual_object_header(s); |
|
| 1278 |
+ mpeg4_encode_vol_header(s, 0, 0); |
|
| 1279 |
+ |
|
| 1280 |
+// ff_mpeg4_stuffing(&s->pb); ? |
|
| 1281 |
+ flush_put_bits(&s->pb); |
|
| 1282 |
+ s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3; |
|
| 1283 |
+ } |
|
| 1284 |
+ return 0; |
|
| 1285 |
+} |
|
| 1286 |
+ |
|
| 1287 |
+void ff_mpeg4_init_partitions(MpegEncContext *s) |
|
| 1288 |
+{
|
|
| 1289 |
+ uint8_t *start= put_bits_ptr(&s->pb); |
|
| 1290 |
+ uint8_t *end= s->pb.buf_end; |
|
| 1291 |
+ int size= end - start; |
|
| 1292 |
+ int pb_size = (((intptr_t)start + size/3)&(~3)) - (intptr_t)start; |
|
| 1293 |
+ int tex_size= (size - 2*pb_size)&(~3); |
|
| 1294 |
+ |
|
| 1295 |
+ set_put_bits_buffer_size(&s->pb, pb_size); |
|
| 1296 |
+ init_put_bits(&s->tex_pb, start + pb_size , tex_size); |
|
| 1297 |
+ init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size); |
|
| 1298 |
+} |
|
| 1299 |
+ |
|
| 1300 |
+void ff_mpeg4_merge_partitions(MpegEncContext *s) |
|
| 1301 |
+{
|
|
| 1302 |
+ const int pb2_len = put_bits_count(&s->pb2 ); |
|
| 1303 |
+ const int tex_pb_len= put_bits_count(&s->tex_pb); |
|
| 1304 |
+ const int bits= put_bits_count(&s->pb); |
|
| 1305 |
+ |
|
| 1306 |
+ if(s->pict_type==FF_I_TYPE){
|
|
| 1307 |
+ put_bits(&s->pb, 19, DC_MARKER); |
|
| 1308 |
+ s->misc_bits+=19 + pb2_len + bits - s->last_bits; |
|
| 1309 |
+ s->i_tex_bits+= tex_pb_len; |
|
| 1310 |
+ }else{
|
|
| 1311 |
+ put_bits(&s->pb, 17, MOTION_MARKER); |
|
| 1312 |
+ s->misc_bits+=17 + pb2_len; |
|
| 1313 |
+ s->mv_bits+= bits - s->last_bits; |
|
| 1314 |
+ s->p_tex_bits+= tex_pb_len; |
|
| 1315 |
+ } |
|
| 1316 |
+ |
|
| 1317 |
+ flush_put_bits(&s->pb2); |
|
| 1318 |
+ flush_put_bits(&s->tex_pb); |
|
| 1319 |
+ |
|
| 1320 |
+ set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf); |
|
| 1321 |
+ ff_copy_bits(&s->pb, s->pb2.buf , pb2_len); |
|
| 1322 |
+ ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len); |
|
| 1323 |
+ s->last_bits= put_bits_count(&s->pb); |
|
| 1324 |
+} |
|
| 1325 |
+ |
|
| 1326 |
+ |
|
| 1327 |
+void ff_mpeg4_encode_video_packet_header(MpegEncContext *s) |
|
| 1328 |
+{
|
|
| 1329 |
+ int mb_num_bits= av_log2(s->mb_num - 1) + 1; |
|
| 1330 |
+ |
|
| 1331 |
+ put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0); |
|
| 1332 |
+ put_bits(&s->pb, 1, 1); |
|
| 1333 |
+ |
|
| 1334 |
+ put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width); |
|
| 1335 |
+ put_bits(&s->pb, s->quant_precision, s->qscale); |
|
| 1336 |
+ put_bits(&s->pb, 1, 0); /* no HEC */ |
|
| 1337 |
+} |
|
| 1338 |
+ |
|
| 1339 |
+AVCodec mpeg4_encoder = {
|
|
| 1340 |
+ "mpeg4", |
|
| 1341 |
+ CODEC_TYPE_VIDEO, |
|
| 1342 |
+ CODEC_ID_MPEG4, |
|
| 1343 |
+ sizeof(MpegEncContext), |
|
| 1344 |
+ encode_init, |
|
| 1345 |
+ MPV_encode_picture, |
|
| 1346 |
+ MPV_encode_end, |
|
| 1347 |
+ .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
|
|
| 1348 |
+ .capabilities= CODEC_CAP_DELAY, |
|
| 1349 |
+ .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
|
|
| 1350 |
+}; |
| ... | ... |
@@ -782,11 +782,7 @@ void ff_mpeg1_encode_slice_header(MpegEncContext *s); |
| 782 | 782 |
void ff_mpeg1_clean_buffers(MpegEncContext *s); |
| 783 | 783 |
int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s); |
| 784 | 784 |
|
| 785 |
-extern const uint8_t ff_mpeg4_y_dc_scale_table[32]; |
|
| 786 |
-extern const uint8_t ff_mpeg4_c_dc_scale_table[32]; |
|
| 787 | 785 |
extern const uint8_t ff_aic_dc_scale_table[32]; |
| 788 |
-extern const int16_t ff_mpeg4_default_intra_matrix[64]; |
|
| 789 |
-extern const int16_t ff_mpeg4_default_non_intra_matrix[64]; |
|
| 790 | 786 |
extern const uint8_t ff_h263_chroma_qscale_table[32]; |
| 791 | 787 |
extern const uint8_t ff_h263_loop_filter_strength[32]; |
| 792 | 788 |
|
| ... | ... |
@@ -810,22 +806,14 @@ int ff_h263_decode_end(AVCodecContext *avctx); |
| 810 | 810 |
void h263_encode_mb(MpegEncContext *s, |
| 811 | 811 |
DCTELEM block[6][64], |
| 812 | 812 |
int motion_x, int motion_y); |
| 813 |
-void mpeg4_encode_mb(MpegEncContext *s, |
|
| 814 |
- DCTELEM block[6][64], |
|
| 815 |
- int motion_x, int motion_y); |
|
| 816 | 813 |
void h263_encode_picture_header(MpegEncContext *s, int picture_number); |
| 817 | 814 |
void h263_encode_gob_header(MpegEncContext * s, int mb_line); |
| 818 | 815 |
int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir, |
| 819 | 816 |
int *px, int *py); |
| 820 |
-void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
|
| 821 |
- int dir); |
|
| 822 |
-void ff_set_mpeg4_time(MpegEncContext * s); |
|
| 823 |
-void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number); |
|
| 824 | 817 |
void h263_encode_init(MpegEncContext *s); |
| 825 | 818 |
void h263_decode_init_vlc(MpegEncContext *s); |
| 826 | 819 |
int h263_decode_picture_header(MpegEncContext *s); |
| 827 | 820 |
int ff_h263_decode_gob_header(MpegEncContext *s); |
| 828 |
-int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb); |
|
| 829 | 821 |
void ff_h263_update_motion_val(MpegEncContext * s); |
| 830 | 822 |
void ff_h263_loop_filter(MpegEncContext * s); |
| 831 | 823 |
void ff_set_qscale(MpegEncContext * s, int qscale); |
| ... | ... |
@@ -840,8 +828,6 @@ void ff_h263_show_pict_info(MpegEncContext *s); |
| 840 | 840 |
int ff_intel_h263_decode_picture_header(MpegEncContext *s); |
| 841 | 841 |
int ff_h263_decode_mb(MpegEncContext *s, |
| 842 | 842 |
DCTELEM block[6][64]); |
| 843 |
-int ff_mpeg4_decode_mb(MpegEncContext *s, |
|
| 844 |
- DCTELEM block[6][64]); |
|
| 845 | 843 |
|
| 846 | 844 |
/** |
| 847 | 845 |
* Returns the value of the 3bit "source format" syntax element. |
| ... | ... |
@@ -850,15 +836,7 @@ int ff_mpeg4_decode_mb(MpegEncContext *s, |
| 850 | 850 |
*/ |
| 851 | 851 |
int av_const h263_get_picture_format(int width, int height); |
| 852 | 852 |
|
| 853 |
-void ff_mpeg4_encode_video_packet_header(MpegEncContext *s); |
|
| 854 |
-void ff_mpeg4_clean_buffers(MpegEncContext *s); |
|
| 855 |
-void ff_mpeg4_stuffing(PutBitContext * pbc); |
|
| 856 |
-void ff_mpeg4_init_partitions(MpegEncContext *s); |
|
| 857 |
-void ff_mpeg4_merge_partitions(MpegEncContext *s); |
|
| 858 |
-void ff_clean_mpeg4_qscales(MpegEncContext *s); |
|
| 859 | 853 |
void ff_clean_h263_qscales(MpegEncContext *s); |
| 860 |
-int ff_mpeg4_decode_partitions(MpegEncContext *s); |
|
| 861 |
-int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s); |
|
| 862 | 854 |
int ff_h263_resync(MpegEncContext *s); |
| 863 | 855 |
const uint8_t *ff_h263_find_resync_marker(const uint8_t *p, const uint8_t *end); |
| 864 | 856 |
int ff_h263_get_gob_height(MpegEncContext *s); |
| ... | ... |
@@ -36,6 +36,7 @@ |
| 36 | 36 |
#include "faandct.h" |
| 37 | 37 |
#include "aandcttab.h" |
| 38 | 38 |
#include "flv.h" |
| 39 |
+#include "mpeg4video.h" |
|
| 39 | 40 |
#include <limits.h> |
| 40 | 41 |
|
| 41 | 42 |
//#undef NDEBUG |
| ... | ... |
@@ -3781,19 +3782,6 @@ AVCodec h263p_encoder = {
|
| 3781 | 3781 |
.long_name= NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
|
| 3782 | 3782 |
}; |
| 3783 | 3783 |
|
| 3784 |
-AVCodec mpeg4_encoder = {
|
|
| 3785 |
- "mpeg4", |
|
| 3786 |
- CODEC_TYPE_VIDEO, |
|
| 3787 |
- CODEC_ID_MPEG4, |
|
| 3788 |
- sizeof(MpegEncContext), |
|
| 3789 |
- MPV_encode_init, |
|
| 3790 |
- MPV_encode_picture, |
|
| 3791 |
- MPV_encode_end, |
|
| 3792 |
- .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
|
|
| 3793 |
- .capabilities= CODEC_CAP_DELAY, |
|
| 3794 |
- .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
|
|
| 3795 |
-}; |
|
| 3796 |
- |
|
| 3797 | 3784 |
AVCodec msmpeg4v1_encoder = {
|
| 3798 | 3785 |
"msmpeg4v1", |
| 3799 | 3786 |
CODEC_TYPE_VIDEO, |
| ... | ... |
@@ -32,6 +32,8 @@ |
| 32 | 32 |
#include "mpegvideo.h" |
| 33 | 33 |
#include "msmpeg4.h" |
| 34 | 34 |
#include "libavutil/x86_cpu.h" |
| 35 |
+#include "h263.h" |
|
| 36 |
+#include "mpeg4video.h" |
|
| 35 | 37 |
|
| 36 | 38 |
/* |
| 37 | 39 |
* You can also call this codec : MPEG4 with a twist ! |
| ... | ... |
@@ -43,7 +45,6 @@ |
| 43 | 43 |
//#define DEBUG |
| 44 | 44 |
|
| 45 | 45 |
#define DC_VLC_BITS 9 |
| 46 |
-#define CBPY_VLC_BITS 6 |
|
| 47 | 46 |
#define V1_INTRA_CBPC_VLC_BITS 6 |
| 48 | 47 |
#define V1_INTER_CBPC_VLC_BITS 6 |
| 49 | 48 |
#define V2_INTRA_CBPC_VLC_BITS 3 |
| ... | ... |
@@ -1059,7 +1060,6 @@ else |
| 1059 | 1059 |
VLC ff_mb_non_intra_vlc[4]; |
| 1060 | 1060 |
static VLC v2_dc_lum_vlc; |
| 1061 | 1061 |
static VLC v2_dc_chroma_vlc; |
| 1062 |
-static VLC cbpy_vlc; |
|
| 1063 | 1062 |
static VLC v2_intra_cbpc_vlc; |
| 1064 | 1063 |
static VLC v2_mb_type_vlc; |
| 1065 | 1064 |
static VLC v2_mv_vlc; |
| ... | ... |
@@ -52,19 +52,6 @@ extern VLC ff_msmp4_dc_chroma_vlc[2]; |
| 52 | 52 |
/* intra picture macroblock coded block pattern */ |
| 53 | 53 |
extern const uint16_t ff_msmp4_mb_i_table[64][2]; |
| 54 | 54 |
|
| 55 |
-extern const uint8_t cbpy_tab[16][2]; |
|
| 56 |
- |
|
| 57 |
-extern const uint8_t DCtab_lum[13][2]; |
|
| 58 |
-extern const uint8_t DCtab_chrom[13][2]; |
|
| 59 |
- |
|
| 60 |
-extern const uint8_t mvtab[33][2]; |
|
| 61 |
- |
|
| 62 |
-extern const uint8_t intra_MCBPC_code[9]; |
|
| 63 |
-extern const uint8_t intra_MCBPC_bits[9]; |
|
| 64 |
- |
|
| 65 |
-extern const uint8_t inter_MCBPC_code[28]; |
|
| 66 |
-extern const uint8_t inter_MCBPC_bits[28]; |
|
| 67 |
- |
|
| 68 | 55 |
#define WMV1_SCANTABLE_COUNT 4 |
| 69 | 56 |
|
| 70 | 57 |
extern const uint8_t wmv1_scantable[WMV1_SCANTABLE_COUNT][64]; |