comparison mpeg12.c @ 59:efd3c19f6d62 libavcodec

fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
author glantau
date Sun, 12 Aug 2001 00:52:01 +0000
parents 0e0a24def67a
children 5aa6292a1660
comparison
equal deleted inserted replaced
58:0e0a24def67a 59:efd3c19f6d62
552 if (s->pict_type == P_TYPE) { 552 if (s->pict_type == P_TYPE) {
553 /* if P type, zero motion vector is implied */ 553 /* if P type, zero motion vector is implied */
554 s->mv_dir = MV_DIR_FORWARD; 554 s->mv_dir = MV_DIR_FORWARD;
555 s->mv[0][0][0] = s->mv[0][0][1] = 0; 555 s->mv[0][0][0] = s->mv[0][0][1] = 0;
556 s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0; 556 s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0;
557 s->last_mv[0][1][0] = s->last_mv[0][1][1] = 0;
557 } else { 558 } else {
558 /* if B type, reuse previous vectors and directions */ 559 /* if B type, reuse previous vectors and directions */
559 s->mv[0][0][0] = s->last_mv[0][0][0]; 560 s->mv[0][0][0] = s->last_mv[0][0][0];
560 s->mv[0][0][1] = s->last_mv[0][0][1]; 561 s->mv[0][0][1] = s->last_mv[0][0][1];
561 s->mv[1][0][0] = s->last_mv[1][0][0]; 562 s->mv[1][0][0] = s->last_mv[1][0][0];
979 if (i >= 64) 980 if (i >= 64)
980 return -1; 981 return -1;
981 add_coef: 982 add_coef:
982 j = scan_table[i]; 983 j = scan_table[i];
983 dprintf("%d: run=%d level=%d\n", n, run, level); 984 dprintf("%d: run=%d level=%d\n", n, run, level);
984 level = ((level * 2 + 1) * s->qscale * matrix[j]) / 32; 985 /* XXX: optimize */
986 if (level > 0) {
987 level = ((level * 2 + 1) * s->qscale * matrix[j]) >> 5;
988 } else {
989 level = ((-level * 2 + 1) * s->qscale * matrix[j]) >> 5;
990 level = -level;
991 }
985 /* XXX: is it really necessary to saturate since the encoder 992 /* XXX: is it really necessary to saturate since the encoder
986 knows whats going on ? */ 993 knows whats going on ? */
987 mismatch ^= level; 994 mismatch ^= level;
988 block[j] = level; 995 block[j] = level;
989 i++; 996 i++;
1027 rl = &rl_mpeg1; 1034 rl = &rl_mpeg1;
1028 if (n < 4) 1035 if (n < 4)
1029 matrix = s->intra_matrix; 1036 matrix = s->intra_matrix;
1030 else 1037 else
1031 matrix = s->chroma_intra_matrix; 1038 matrix = s->chroma_intra_matrix;
1032 1039
1033 /* now quantify & encode AC coefs */ 1040 /* now quantify & encode AC coefs */
1034 for(;;) { 1041 for(;;) {
1035 code = get_vlc(&s->gb, &rl->vlc); 1042 code = get_vlc(&s->gb, &rl->vlc);
1036 if (code < 0) 1043 if (code < 0)
1037 return -1; 1044 return -1;
1181 1188
1182 static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) 1189 static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
1183 { 1190 {
1184 int i, v, j; 1191 int i, v, j;
1185 1192
1193 dprintf("matrix extension\n");
1194
1186 if (get_bits1(&s->gb)) { 1195 if (get_bits1(&s->gb)) {
1187 for(i=0;i<64;i++) { 1196 for(i=0;i<64;i++) {
1188 v = get_bits(&s->gb, 8); 1197 v = get_bits(&s->gb, 8);
1189 j = block_permute_op(i); 1198 j = zigzag_direct[i];
1190 s->intra_matrix[j] = v; 1199 s->intra_matrix[j] = v;
1191 s->chroma_intra_matrix[j] = v; 1200 s->chroma_intra_matrix[j] = v;
1192 } 1201 }
1193 } 1202 }
1194 if (get_bits1(&s->gb)) { 1203 if (get_bits1(&s->gb)) {
1195 for(i=0;i<64;i++) { 1204 for(i=0;i<64;i++) {
1196 v = get_bits(&s->gb, 8); 1205 v = get_bits(&s->gb, 8);
1197 j = block_permute_op(i); 1206 j = zigzag_direct[i];
1198 s->non_intra_matrix[j] = v; 1207 s->non_intra_matrix[j] = v;
1199 s->chroma_non_intra_matrix[j] = v; 1208 s->chroma_non_intra_matrix[j] = v;
1200 } 1209 }
1201 } 1210 }
1202 if (get_bits1(&s->gb)) { 1211 if (get_bits1(&s->gb)) {
1203 for(i=0;i<64;i++) { 1212 for(i=0;i<64;i++) {
1204 v = get_bits(&s->gb, 8); 1213 v = get_bits(&s->gb, 8);
1205 j = block_permute_op(i); 1214 j = zigzag_direct[i];
1206 s->chroma_intra_matrix[j] = v; 1215 s->chroma_intra_matrix[j] = v;
1207 } 1216 }
1208 } 1217 }
1209 if (get_bits1(&s->gb)) { 1218 if (get_bits1(&s->gb)) {
1210 for(i=0;i<64;i++) { 1219 for(i=0;i<64;i++) {
1211 v = get_bits(&s->gb, 8); 1220 v = get_bits(&s->gb, 8);
1212 j = block_permute_op(i); 1221 j = zigzag_direct[i];
1213 s->chroma_non_intra_matrix[j] = v; 1222 s->chroma_non_intra_matrix[j] = v;
1214 } 1223 }
1215 } 1224 }
1216 } 1225 }
1217 1226
1232 s->alternate_scan = get_bits1(&s->gb); 1241 s->alternate_scan = get_bits1(&s->gb);
1233 s->repeat_first_field = get_bits1(&s->gb); 1242 s->repeat_first_field = get_bits1(&s->gb);
1234 s->chroma_420_type = get_bits1(&s->gb); 1243 s->chroma_420_type = get_bits1(&s->gb);
1235 s->progressive_frame = get_bits1(&s->gb); 1244 s->progressive_frame = get_bits1(&s->gb);
1236 /* composite display not parsed */ 1245 /* composite display not parsed */
1237 dprintf("dc_preci=%d\n", s->intra_dc_precision); 1246 dprintf("intra_dc_precion=%d\n", s->intra_dc_precision);
1238 dprintf("pict_structure=%d\n", s->picture_structure); 1247 dprintf("picture_structure=%d\n", s->picture_structure);
1239 dprintf("conceal=%d\n", s->concealment_motion_vectors); 1248 dprintf("conceal=%d\n", s->concealment_motion_vectors);
1240 dprintf("intrafmt=%d\n", s->intra_vlc_format); 1249 dprintf("intra_vlc_format=%d\n", s->intra_vlc_format);
1250 dprintf("alternate_scan=%d\n", s->alternate_scan);
1241 dprintf("frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct); 1251 dprintf("frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct);
1242 } 1252 }
1243 1253
1244 static void mpeg_decode_extension(AVCodecContext *avctx, 1254 static void mpeg_decode_extension(AVCodecContext *avctx,
1245 UINT8 *buf, int buf_size) 1255 UINT8 *buf, int buf_size)
1400 1410
1401 /* get matrix */ 1411 /* get matrix */
1402 if (get_bits1(&s->gb)) { 1412 if (get_bits1(&s->gb)) {
1403 for(i=0;i<64;i++) { 1413 for(i=0;i<64;i++) {
1404 v = get_bits(&s->gb, 8); 1414 v = get_bits(&s->gb, 8);
1405 j = block_permute_op(i); 1415 j = zigzag_direct[i];
1406 s->intra_matrix[j] = v; 1416 s->intra_matrix[j] = v;
1407 s->chroma_intra_matrix[j] = v; 1417 s->chroma_intra_matrix[j] = v;
1408 } 1418 }
1419 #ifdef DEBUG
1420 dprintf("intra matrix present\n");
1421 for(i=0;i<64;i++)
1422 dprintf(" %d", s->intra_matrix[zigzag_direct[i]]);
1423 printf("\n");
1424 #endif
1409 } else { 1425 } else {
1410 for(i=0;i<64;i++) { 1426 for(i=0;i<64;i++) {
1411 v = default_intra_matrix[i]; 1427 v = default_intra_matrix[i];
1412 s->intra_matrix[i] = v; 1428 s->intra_matrix[i] = v;
1413 s->chroma_intra_matrix[i] = v; 1429 s->chroma_intra_matrix[i] = v;
1414 } 1430 }
1415 } 1431 }
1416 if (get_bits1(&s->gb)) { 1432 if (get_bits1(&s->gb)) {
1417 for(i=0;i<64;i++) { 1433 for(i=0;i<64;i++) {
1418 v = get_bits(&s->gb, 8); 1434 v = get_bits(&s->gb, 8);
1419 j = block_permute_op(i); 1435 j = zigzag_direct[i];
1420 s->non_intra_matrix[j] = v; 1436 s->non_intra_matrix[j] = v;
1421 s->chroma_non_intra_matrix[j] = v; 1437 s->chroma_non_intra_matrix[j] = v;
1422 } 1438 }
1439 #ifdef DEBUG
1440 dprintf("non intra matrix present\n");
1441 for(i=0;i<64;i++)
1442 dprintf(" %d", s->non_intra_matrix[zigzag_direct[i]]);
1443 printf("\n");
1444 #endif
1423 } else { 1445 } else {
1424 for(i=0;i<64;i++) { 1446 for(i=0;i<64;i++) {
1425 v = default_non_intra_matrix[i]; 1447 v = default_non_intra_matrix[i];
1426 s->non_intra_matrix[i] = v; 1448 s->non_intra_matrix[i] = v;
1427 s->chroma_non_intra_matrix[i] = v; 1449 s->chroma_non_intra_matrix[i] = v;