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;