Mercurial > libavcodec.hg
comparison msmpeg4.c @ 519:55b4e2248a45 libavcodec
wmv1 slice_height != mb_height support
encoding of slice_height != mb_height
1bit shorter wmv1 headers if bit_rate<50 !? ROTFL M$ is even more stupid than i thought
using dc of non intra blocks for dc prediction of wmv1 if bitrate < 129 && res < 320x240
author | michaelni |
---|---|
date | Sun, 07 Jul 2002 08:34:46 +0000 |
parents | 2241bce35bb9 |
children | f5d7fcc81787 |
comparison
equal
deleted
inserted
replaced
518:70113647b50d | 519:55b4e2248a45 |
---|---|
41 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); | 41 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); |
42 static int msmpeg4_decode_motion(MpegEncContext * s, | 42 static int msmpeg4_decode_motion(MpegEncContext * s, |
43 int *mx_ptr, int *my_ptr); | 43 int *mx_ptr, int *my_ptr); |
44 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val); | 44 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val); |
45 static void init_h263_dc_for_msmpeg4(void); | 45 static void init_h263_dc_for_msmpeg4(void); |
46 static inline void msmpeg4_memsetw(short *tab, int val, int n); | |
47 | |
46 | 48 |
47 | 49 |
48 extern UINT32 inverse[256]; | 50 extern UINT32 inverse[256]; |
49 | 51 |
50 #ifdef DEBUG | 52 #ifdef DEBUG |
343 | 345 |
344 s->dc_table_index = 1; | 346 s->dc_table_index = 1; |
345 s->mv_table_index = 1; /* only if P frame */ | 347 s->mv_table_index = 1; /* only if P frame */ |
346 s->use_skip_mb_code = 1; /* only if P frame */ | 348 s->use_skip_mb_code = 1; /* only if P frame */ |
347 s->per_mb_rl_table = 0; | 349 s->per_mb_rl_table = 0; |
350 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=128 && s->pict_type==P_TYPE); | |
348 | 351 |
349 if (s->pict_type == I_TYPE) { | 352 if (s->pict_type == I_TYPE) { |
350 s->no_rounding = 1; | 353 s->no_rounding = 1; |
351 put_bits(&s->pb, 5, 0x17); /* indicate only one "slice" */ | 354 s->slice_height= s->mb_height/1; |
355 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height); | |
352 | 356 |
353 if(s->msmpeg4_version==4){ | 357 if(s->msmpeg4_version==4){ |
354 msmpeg4_encode_ext_header(s); | 358 msmpeg4_encode_ext_header(s); |
355 put_bits(&s->pb, 1, s->per_mb_rl_table); | 359 if(s->bit_rate>50) |
360 put_bits(&s->pb, 1, s->per_mb_rl_table); | |
356 } | 361 } |
357 | 362 |
358 if(s->msmpeg4_version>2){ | 363 if(s->msmpeg4_version>2){ |
359 if(!s->per_mb_rl_table){ | 364 if(!s->per_mb_rl_table){ |
360 code012(&s->pb, s->rl_chroma_table_index); | 365 code012(&s->pb, s->rl_chroma_table_index); |
364 put_bits(&s->pb, 1, s->dc_table_index); | 369 put_bits(&s->pb, 1, s->dc_table_index); |
365 } | 370 } |
366 } else { | 371 } else { |
367 put_bits(&s->pb, 1, s->use_skip_mb_code); | 372 put_bits(&s->pb, 1, s->use_skip_mb_code); |
368 | 373 |
369 if(s->msmpeg4_version==4) | 374 if(s->msmpeg4_version==4 && s->bit_rate>50) |
370 put_bits(&s->pb, 1, s->per_mb_rl_table); | 375 put_bits(&s->pb, 1, s->per_mb_rl_table); |
371 | 376 |
372 if(s->msmpeg4_version>2){ | 377 if(s->msmpeg4_version>2){ |
373 if(!s->per_mb_rl_table) | 378 if(!s->per_mb_rl_table) |
374 code012(&s->pb, s->rl_table_index); | 379 code012(&s->pb, s->rl_table_index); |
396 | 401 |
397 void msmpeg4_encode_ext_header(MpegEncContext * s) | 402 void msmpeg4_encode_ext_header(MpegEncContext * s) |
398 { | 403 { |
399 put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29 | 404 put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29 |
400 | 405 |
401 put_bits(&s->pb, 11, MIN(s->bit_rate, 2047)); | 406 put_bits(&s->pb, 11, MIN(s->bit_rate, 2047)); |
402 | 407 |
403 if(s->msmpeg4_version<3) | 408 if(s->msmpeg4_version<3) |
404 s->flipflop_rounding=0; | 409 s->flipflop_rounding=0; |
405 else{ | 410 else{ |
406 s->flipflop_rounding=1; | 411 s->flipflop_rounding=1; |
472 put_bits(&s->pb, 6, mx); | 477 put_bits(&s->pb, 6, mx); |
473 put_bits(&s->pb, 6, my); | 478 put_bits(&s->pb, 6, my); |
474 } | 479 } |
475 } | 480 } |
476 | 481 |
482 static inline void handle_slices(MpegEncContext *s){ | |
483 if (s->mb_x == 0) { | |
484 if (s->slice_height && (s->mb_y % s->slice_height) == 0) { | |
485 if(s->msmpeg4_version != 4){ | |
486 int wrap; | |
487 /* reset DC pred (set previous line to 1024) */ | |
488 wrap = 2 * s->mb_width + 2; | |
489 msmpeg4_memsetw(&s->dc_val[0][(1) + (2 * s->mb_y) * wrap], | |
490 1024, 2 * s->mb_width); | |
491 wrap = s->mb_width + 2; | |
492 msmpeg4_memsetw(&s->dc_val[1][(1) + (s->mb_y) * wrap], | |
493 1024, s->mb_width); | |
494 msmpeg4_memsetw(&s->dc_val[2][(1) + (s->mb_y) * wrap], | |
495 1024, s->mb_width); | |
496 | |
497 /* reset AC pred (set previous line to 0) */ | |
498 wrap = s->mb_width * 2 + 2; | |
499 msmpeg4_memsetw(s->ac_val[0][0] + (1 + (2 * s->mb_y) * wrap)*16, | |
500 0, 2 * s->mb_width*16); | |
501 wrap = s->mb_width + 2; | |
502 msmpeg4_memsetw(s->ac_val[1][0] + (1 + (s->mb_y) * wrap)*16, | |
503 0, s->mb_width*16); | |
504 msmpeg4_memsetw(s->ac_val[2][0] + (1 + (s->mb_y) * wrap)*16, | |
505 0, s->mb_width*16); | |
506 } | |
507 s->first_slice_line = 1; | |
508 } else { | |
509 s->first_slice_line = 0; | |
510 } | |
511 } | |
512 } | |
513 | |
477 void msmpeg4_encode_mb(MpegEncContext * s, | 514 void msmpeg4_encode_mb(MpegEncContext * s, |
478 DCTELEM block[6][64], | 515 DCTELEM block[6][64], |
479 int motion_x, int motion_y) | 516 int motion_x, int motion_y) |
480 { | 517 { |
481 int cbp, coded_cbp, i; | 518 int cbp, coded_cbp, i; |
482 int pred_x, pred_y; | 519 int pred_x, pred_y; |
483 UINT8 *coded_block; | 520 UINT8 *coded_block; |
484 | 521 |
522 handle_slices(s); | |
523 | |
485 if (!s->mb_intra) { | 524 if (!s->mb_intra) { |
486 /* compute cbp */ | 525 /* compute cbp */ |
487 set_stat(ST_INTER_MB); | 526 set_stat(ST_INTER_MB); |
488 cbp = 0; | 527 cbp = 0; |
489 for (i = 0; i < 6; i++) { | 528 for (i = 0; i < 6; i++) { |
606 i= n-3; | 645 i= n-3; |
607 } | 646 } |
608 | 647 |
609 *dc_val_ptr= &s->last_dc[i]; | 648 *dc_val_ptr= &s->last_dc[i]; |
610 return s->last_dc[i]; | 649 return s->last_dc[i]; |
650 } | |
651 | |
652 static int get_dc(uint8_t *src, int stride, int scale) | |
653 { | |
654 int y; | |
655 int sum=0; | |
656 for(y=0; y<8; y++){ | |
657 int x; | |
658 for(x=0; x<8; x++){ | |
659 sum+=src[x + y*stride]; | |
660 } | |
661 } | |
662 return (sum + (scale>>1))/scale; | |
611 } | 663 } |
612 | 664 |
613 /* dir = 0: left, dir = 1: top prediction */ | 665 /* dir = 0: left, dir = 1: top prediction */ |
614 static inline int msmpeg4_pred_dc(MpegEncContext * s, int n, | 666 static inline int msmpeg4_pred_dc(MpegEncContext * s, int n, |
615 UINT16 **dc_val_ptr, int *dir_ptr) | 667 UINT16 **dc_val_ptr, int *dir_ptr) |
673 } | 725 } |
674 #endif | 726 #endif |
675 /* XXX: WARNING: they did not choose the same test as MPEG4. This | 727 /* XXX: WARNING: they did not choose the same test as MPEG4. This |
676 is very important ! */ | 728 is very important ! */ |
677 if(s->msmpeg4_version>3){ | 729 if(s->msmpeg4_version>3){ |
678 if (abs(a - b) < abs(b - c)) { | 730 if(s->inter_intra_pred){ |
679 pred = c; | 731 uint8_t *dest; |
680 *dir_ptr = 1; | 732 int wrap; |
681 } else { | 733 |
682 pred = a; | 734 if(n==1){ |
683 *dir_ptr = 0; | 735 pred=a; |
736 *dir_ptr = 0; | |
737 }else if(n==2){ | |
738 pred=c; | |
739 *dir_ptr = 1; | |
740 }else if(n==3){ | |
741 if (abs(a - b) < abs(b - c)) { | |
742 pred = c; | |
743 *dir_ptr = 1; | |
744 } else { | |
745 pred = a; | |
746 *dir_ptr = 0; | |
747 } | |
748 }else{ | |
749 if(n<4){ | |
750 wrap= s->linesize; | |
751 dest= s->current_picture[0] + (((n>>1) + 2*s->mb_y) * 8* wrap ) + ((n&1) + 2*s->mb_x) * 8; | |
752 }else{ | |
753 wrap= s->linesize>>1; | |
754 dest= s->current_picture[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8; | |
755 } | |
756 if(s->mb_x==0) a= (1024 + (scale>>1))/scale; | |
757 else a= get_dc(dest-8, wrap, scale*8); | |
758 if(s->mb_y==0) c= (1024 + (scale>>1))/scale; | |
759 else c= get_dc(dest-8*wrap, wrap, scale*8); | |
760 | |
761 if (s->h263_aic_dir==0) { | |
762 pred= a; | |
763 *dir_ptr = 0; | |
764 }else if (s->h263_aic_dir==1) { | |
765 if(n==0){ | |
766 pred= c; | |
767 *dir_ptr = 1; | |
768 }else{ | |
769 pred= a; | |
770 *dir_ptr = 0; | |
771 } | |
772 }else if (s->h263_aic_dir==2) { | |
773 if(n==0){ | |
774 pred= a; | |
775 *dir_ptr = 0; | |
776 }else{ | |
777 pred= c; | |
778 *dir_ptr = 1; | |
779 } | |
780 } else { | |
781 pred= c; | |
782 *dir_ptr = 1; | |
783 } | |
784 } | |
785 }else{ | |
786 if (abs(a - b) < abs(b - c)) { | |
787 pred = c; | |
788 *dir_ptr = 1; | |
789 } else { | |
790 pred = a; | |
791 *dir_ptr = 0; | |
792 } | |
684 } | 793 } |
685 }else{ | 794 }else{ |
686 if (abs(a - b) <= abs(b - c)) { | 795 if (abs(a - b) <= abs(b - c)) { |
687 pred = c; | 796 pred = c; |
688 *dir_ptr = 1; | 797 *dir_ptr = 1; |
902 static VLC v2_intra_cbpc_vlc; | 1011 static VLC v2_intra_cbpc_vlc; |
903 static VLC v2_mb_type_vlc; | 1012 static VLC v2_mb_type_vlc; |
904 static VLC v2_mv_vlc; | 1013 static VLC v2_mv_vlc; |
905 static VLC v1_intra_cbpc_vlc; | 1014 static VLC v1_intra_cbpc_vlc; |
906 static VLC v1_inter_cbpc_vlc; | 1015 static VLC v1_inter_cbpc_vlc; |
1016 static VLC inter_intra_vlc; | |
907 | 1017 |
908 /* this table is practically identical to the one from h263 except that its inverted */ | 1018 /* this table is practically identical to the one from h263 except that its inverted */ |
909 static void init_h263_dc_for_msmpeg4(void) | 1019 static void init_h263_dc_for_msmpeg4(void) |
910 { | 1020 { |
911 int level, uni_code, uni_len; | 1021 int level, uni_code, uni_len; |
1027 intra_MCBPC_bits, 1, 1, | 1137 intra_MCBPC_bits, 1, 1, |
1028 intra_MCBPC_code, 1, 1); | 1138 intra_MCBPC_code, 1, 1); |
1029 init_vlc(&v1_inter_cbpc_vlc, 6, 25, | 1139 init_vlc(&v1_inter_cbpc_vlc, 6, 25, |
1030 inter_MCBPC_bits, 1, 1, | 1140 inter_MCBPC_bits, 1, 1, |
1031 inter_MCBPC_code, 1, 1); | 1141 inter_MCBPC_code, 1, 1); |
1142 | |
1143 init_vlc(&inter_intra_vlc, 3, 4, | |
1144 &table_inter_intra[0][1], 2, 1, | |
1145 &table_inter_intra[0][0], 2, 1); | |
1032 } | 1146 } |
1033 return 0; | 1147 return 0; |
1034 } | 1148 } |
1035 | 1149 |
1036 static int decode012(GetBitContext *gb) | 1150 static int decode012(GetBitContext *gb) |
1073 if (s->pict_type != I_TYPE && | 1187 if (s->pict_type != I_TYPE && |
1074 s->pict_type != P_TYPE){ | 1188 s->pict_type != P_TYPE){ |
1075 fprintf(stderr, "invalid picture type\n"); | 1189 fprintf(stderr, "invalid picture type\n"); |
1076 return -1; | 1190 return -1; |
1077 } | 1191 } |
1078 | 1192 #if 0 |
1193 { | |
1194 static int had_i=0; | |
1195 if(s->pict_type == I_TYPE) had_i=1; | |
1196 if(!had_i) return -1; | |
1197 } | |
1198 #endif | |
1079 s->qscale = get_bits(&s->gb, 5); | 1199 s->qscale = get_bits(&s->gb, 5); |
1080 | 1200 |
1081 if (s->pict_type == I_TYPE) { | 1201 if (s->pict_type == I_TYPE) { |
1082 code = get_bits(&s->gb, 5); | 1202 code = get_bits(&s->gb, 5); |
1083 if(s->msmpeg4_version==1){ | 1203 if(s->msmpeg4_version==1){ |
1087 } | 1207 } |
1088 | 1208 |
1089 s->slice_height = code; | 1209 s->slice_height = code; |
1090 }else{ | 1210 }else{ |
1091 /* 0x17: one slice, 0x18: two slices, ... */ | 1211 /* 0x17: one slice, 0x18: two slices, ... */ |
1092 if (code < 0x17) | 1212 if (code < 0x17){ |
1213 fprintf(stderr, "error, slice code was %X\n", code); | |
1093 return -1; | 1214 return -1; |
1215 } | |
1094 | 1216 |
1095 s->slice_height = s->mb_height / (code - 0x16); | 1217 s->slice_height = s->mb_height / (code - 0x16); |
1096 } | 1218 } |
1097 | 1219 |
1098 switch(s->msmpeg4_version){ | 1220 switch(s->msmpeg4_version){ |
1110 s->dc_table_index = get_bits1(&s->gb); | 1232 s->dc_table_index = get_bits1(&s->gb); |
1111 break; | 1233 break; |
1112 case 4: | 1234 case 4: |
1113 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8); | 1235 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8); |
1114 | 1236 |
1115 s->per_mb_rl_table= get_bits1(&s->gb); | 1237 if(s->bit_rate > 50) s->per_mb_rl_table= get_bits1(&s->gb); |
1238 else s->per_mb_rl_table= 0; | |
1239 | |
1116 if(!s->per_mb_rl_table){ | 1240 if(!s->per_mb_rl_table){ |
1117 s->rl_chroma_table_index = decode012(&s->gb); | 1241 s->rl_chroma_table_index = decode012(&s->gb); |
1118 s->rl_table_index = decode012(&s->gb); | 1242 s->rl_table_index = decode012(&s->gb); |
1119 } | 1243 } |
1120 | 1244 |
1121 s->dc_table_index = get_bits1(&s->gb); | 1245 s->dc_table_index = get_bits1(&s->gb); |
1246 s->inter_intra_pred= 0; | |
1122 break; | 1247 break; |
1123 } | 1248 } |
1124 s->no_rounding = 1; | 1249 s->no_rounding = 1; |
1125 /* printf(" %d %d %d %d %d \n", | 1250 /* printf("qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n", |
1126 s->qscale, | 1251 s->qscale, |
1127 s->rl_chroma_table_index, | 1252 s->rl_chroma_table_index, |
1128 s->rl_table_index, | 1253 s->rl_table_index, |
1129 s->dc_table_index, | 1254 s->dc_table_index, |
1130 s->per_mb_rl_table);*/ | 1255 s->per_mb_rl_table, |
1256 s->slice_height);*/ | |
1131 } else { | 1257 } else { |
1132 | |
1133 switch(s->msmpeg4_version){ | 1258 switch(s->msmpeg4_version){ |
1134 case 1: | 1259 case 1: |
1135 case 2: | 1260 case 2: |
1136 if(s->msmpeg4_version==1) | 1261 if(s->msmpeg4_version==1) |
1137 s->use_skip_mb_code = 1; | 1262 s->use_skip_mb_code = 1; |
1151 | 1276 |
1152 s->mv_table_index = get_bits1(&s->gb); | 1277 s->mv_table_index = get_bits1(&s->gb); |
1153 break; | 1278 break; |
1154 case 4: | 1279 case 4: |
1155 s->use_skip_mb_code = get_bits1(&s->gb); | 1280 s->use_skip_mb_code = get_bits1(&s->gb); |
1156 s->per_mb_rl_table= get_bits1(&s->gb); | 1281 |
1282 if(s->bit_rate > 50) s->per_mb_rl_table= get_bits1(&s->gb); | |
1283 else s->per_mb_rl_table= 0; | |
1284 | |
1157 if(!s->per_mb_rl_table){ | 1285 if(!s->per_mb_rl_table){ |
1158 s->rl_table_index = decode012(&s->gb); | 1286 s->rl_table_index = decode012(&s->gb); |
1159 s->rl_chroma_table_index = s->rl_table_index; | 1287 s->rl_chroma_table_index = s->rl_table_index; |
1160 } | 1288 } |
1161 | 1289 |
1162 s->dc_table_index = get_bits1(&s->gb); | 1290 s->dc_table_index = get_bits1(&s->gb); |
1163 | 1291 |
1164 s->mv_table_index = get_bits1(&s->gb); | 1292 s->mv_table_index = get_bits1(&s->gb); |
1293 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=128); | |
1165 break; | 1294 break; |
1166 } | 1295 } |
1167 /* printf(" %d %d %d %d %d %d \n", | 1296 /* printf("skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n", |
1168 s->use_skip_mb_code, | 1297 s->use_skip_mb_code, |
1169 s->rl_table_index, | 1298 s->rl_table_index, |
1170 s->rl_chroma_table_index, | 1299 s->rl_chroma_table_index, |
1171 s->dc_table_index, | 1300 s->dc_table_index, |
1172 s->mv_table_index, | 1301 s->mv_table_index, |
1173 s->per_mb_rl_table);*/ | 1302 s->per_mb_rl_table, |
1303 s->qscale);*/ | |
1174 if(s->flipflop_rounding){ | 1304 if(s->flipflop_rounding){ |
1175 s->no_rounding ^= 1; | 1305 s->no_rounding ^= 1; |
1176 }else{ | 1306 }else{ |
1177 s->no_rounding = 0; | 1307 s->no_rounding = 0; |
1178 } | 1308 } |
1385 printf("\n"); | 1515 printf("\n"); |
1386 if(s->mb_y==0) printf("\n"); | 1516 if(s->mb_y==0) printf("\n"); |
1387 } | 1517 } |
1388 #endif | 1518 #endif |
1389 /* special slice handling */ | 1519 /* special slice handling */ |
1390 if (s->mb_x == 0) { | 1520 handle_slices(s); |
1391 if (s->slice_height && (s->mb_y % s->slice_height) == 0) { | |
1392 int wrap; | |
1393 /* reset DC pred (set previous line to 1024) */ | |
1394 wrap = 2 * s->mb_width + 2; | |
1395 msmpeg4_memsetw(&s->dc_val[0][(1) + (2 * s->mb_y) * wrap], | |
1396 1024, 2 * s->mb_width); | |
1397 wrap = s->mb_width + 2; | |
1398 msmpeg4_memsetw(&s->dc_val[1][(1) + (s->mb_y) * wrap], | |
1399 1024, s->mb_width); | |
1400 msmpeg4_memsetw(&s->dc_val[2][(1) + (s->mb_y) * wrap], | |
1401 1024, s->mb_width); | |
1402 | |
1403 /* reset AC pred (set previous line to 0) */ | |
1404 wrap = s->mb_width * 2 + 2; | |
1405 msmpeg4_memsetw(s->ac_val[0][0] + (1 + (2 * s->mb_y) * wrap)*16, | |
1406 0, 2 * s->mb_width*16); | |
1407 wrap = s->mb_width + 2; | |
1408 msmpeg4_memsetw(s->ac_val[1][0] + (1 + (s->mb_y) * wrap)*16, | |
1409 0, s->mb_width*16); | |
1410 msmpeg4_memsetw(s->ac_val[2][0] + (1 + (s->mb_y) * wrap)*16, | |
1411 0, s->mb_width*16); | |
1412 | |
1413 s->first_slice_line = 1; | |
1414 } else { | |
1415 s->first_slice_line = 0; | |
1416 } | |
1417 } | |
1418 | 1521 |
1419 if(s->msmpeg4_version<=2) return msmpeg4v12_decode_mb(s, block); //FIXME export function & call from outside perhaps | 1522 if(s->msmpeg4_version<=2) return msmpeg4v12_decode_mb(s, block); //FIXME export function & call from outside perhaps |
1420 | 1523 |
1421 if (s->pict_type == P_TYPE) { | 1524 if (s->pict_type == P_TYPE) { |
1422 set_stat(ST_INTER_MB); | 1525 set_stat(ST_INTER_MB); |
1487 set_stat(ST_INTRA_MB); | 1590 set_stat(ST_INTRA_MB); |
1488 s->ac_pred = get_bits1(&s->gb); | 1591 s->ac_pred = get_bits1(&s->gb); |
1489 #ifdef PRINT_MB | 1592 #ifdef PRINT_MB |
1490 printf("%c", s->ac_pred ? 'A' : 'I'); | 1593 printf("%c", s->ac_pred ? 'A' : 'I'); |
1491 #endif | 1594 #endif |
1595 if(s->inter_intra_pred){ | |
1596 s->h263_aic_dir= get_vlc(&s->gb, &inter_intra_vlc); | |
1597 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y); | |
1598 } | |
1492 if(s->per_mb_rl_table && cbp){ | 1599 if(s->per_mb_rl_table && cbp){ |
1493 s->rl_table_index = decode012(&s->gb); | 1600 s->rl_table_index = decode012(&s->gb); |
1494 s->rl_chroma_table_index = s->rl_table_index; | 1601 s->rl_chroma_table_index = s->rl_table_index; |
1495 } | 1602 } |
1496 } | 1603 } |
1530 c+= c +dc_pred_dir; | 1637 c+= c +dc_pred_dir; |
1531 } | 1638 } |
1532 #endif | 1639 #endif |
1533 if (level < 0){ | 1640 if (level < 0){ |
1534 fprintf(stderr, "dc overflow- block: %d qscale: %d//\n", n, s->qscale); | 1641 fprintf(stderr, "dc overflow- block: %d qscale: %d//\n", n, s->qscale); |
1535 return -1; | 1642 if(s->inter_intra_pred) level=0; |
1643 else return -1; | |
1536 } | 1644 } |
1537 if (n < 4) { | 1645 if (n < 4) { |
1538 rl = &rl_table[s->rl_table_index]; | 1646 rl = &rl_table[s->rl_table_index]; |
1539 if(level > 256*s->y_dc_scale){ | 1647 if(level > 256*s->y_dc_scale){ |
1540 fprintf(stderr, "dc overflow+ L qscale: %d//\n", s->qscale); | 1648 fprintf(stderr, "dc overflow+ L qscale: %d//\n", s->qscale); |
1541 return -1; | 1649 if(!s->inter_intra_pred) return -1; |
1542 } | 1650 } |
1543 } else { | 1651 } else { |
1544 rl = &rl_table[3 + s->rl_chroma_table_index]; | 1652 rl = &rl_table[3 + s->rl_chroma_table_index]; |
1545 if(level > 256*s->c_dc_scale){ | 1653 if(level > 256*s->c_dc_scale){ |
1546 fprintf(stderr, "dc overflow+ C qscale: %d//\n", s->qscale); | 1654 fprintf(stderr, "dc overflow+ C qscale: %d//\n", s->qscale); |
1547 return -1; | 1655 if(!s->inter_intra_pred) return -1; |
1548 } | 1656 } |
1549 } | 1657 } |
1550 block[0] = level; | 1658 block[0] = level; |
1551 | 1659 |
1552 run_diff = 0; | 1660 run_diff = 0; |