| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2003 The FFmpeg Project | 2 * Copyright (c) 2003 The FFmpeg Project |
| 3 * | 3 * |
| 4 * This file is part of FFmpeg. | 4 * This file is part of FFmpeg. |
| 5 * | 5 * |
| 6 * FFmpeg is free software; you can redistribute it and/or | 6 * FFmpeg is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Lesser General Public | 7 * modify it under the terms of the GNU Lesser General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2.1 of the License, or (at your option) any later version. | 9 * version 2.1 of the License, or (at your option) any later version. |
| 10 * | 10 * |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 /* fill caches */ | 471 /* fill caches */ |
| 472 /* note ref_cache should contain here: | 472 /* note ref_cache should contain here: |
| 473 ???????? | 473 ???????? |
| 474 ???11111 | 474 ???11111 |
| 475 N??11111 | 475 N??11111 |
| 476 N??11111 | 476 N??11111 |
| 477 N??11111 | 477 N??11111 |
| 478 */ | 478 */ |
| 479 | 479 |
| 480 for (m = 0; m < 2; m++) { | 480 for (m = 0; m < 2; m++) { |
| 481 if (s->mb_x > 0 && h->intra4x4_pred_mode[mb_xy - 1][0] != -1) { | 481 if (s->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6] !
= -1) { |
| 482 for (i = 0; i < 4; i++) { | 482 for (i = 0; i < 4; i++) { |
| 483 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = *(uint32_
t *) s->current_picture.motion_val[m][b_xy - 1 + i*h->b_stride]; | 483 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = *(uint32_
t *) s->current_picture.motion_val[m][b_xy - 1 + i*h->b_stride]; |
| 484 } | 484 } |
| 485 } else { | 485 } else { |
| 486 for (i = 0; i < 4; i++) { | 486 for (i = 0; i < 4; i++) { |
| 487 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0; | 487 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0; |
| 488 } | 488 } |
| 489 } | 489 } |
| 490 if (s->mb_y > 0) { | 490 if (s->mb_y > 0) { |
| 491 memcpy(h->mv_cache[m][scan8[0] - 1*8], s->current_picture.motion
_val[m][b_xy - h->b_stride], 4*2*sizeof(int16_t)); | 491 memcpy(h->mv_cache[m][scan8[0] - 1*8], s->current_picture.motion
_val[m][b_xy - h->b_stride], 4*2*sizeof(int16_t)); |
| 492 memset(&h->ref_cache[m][scan8[0] - 1*8], (h->intra4x4_pred_mode[
mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1, 4); | 492 memset(&h->ref_cache[m][scan8[0] - 1*8], (h->intra4x4_pred_mode[
h->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4); |
| 493 | 493 |
| 494 if (s->mb_x < (s->mb_width - 1)) { | 494 if (s->mb_x < (s->mb_width - 1)) { |
| 495 *(uint32_t *) h->mv_cache[m][scan8[0] + 4 - 1*8] = *(uint32_
t *) s->current_picture.motion_val[m][b_xy - h->b_stride + 4]; | 495 *(uint32_t *) h->mv_cache[m][scan8[0] + 4 - 1*8] = *(uint32_
t *) s->current_picture.motion_val[m][b_xy - h->b_stride + 4]; |
| 496 h->ref_cache[m][scan8[0] + 4 - 1*8] = | 496 h->ref_cache[m][scan8[0] + 4 - 1*8] = |
| 497 (h->intra4x4_pred_mode[mb_xy - s->mb_stride + 1][0] == -
1 || | 497 (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride
+ 1]+6] == -1 || |
| 498 h->intra4x4_pred_mode[mb_xy - s->mb_stride ][4] == -
1) ? PART_NOT_AVAILABLE : 1; | 498 h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride
] ] == -1) ? PART_NOT_AVAILABLE : 1; |
| 499 }else | 499 }else |
| 500 h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE; | 500 h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE; |
| 501 if (s->mb_x > 0) { | 501 if (s->mb_x > 0) { |
| 502 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 - 1*8] = *(uint32_
t *) s->current_picture.motion_val[m][b_xy - h->b_stride - 1]; | 502 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 - 1*8] = *(uint32_
t *) s->current_picture.motion_val[m][b_xy - h->b_stride - 1]; |
| 503 h->ref_cache[m][scan8[0] - 1 - 1*8] = (h->intra4x4_pred_mode
[mb_xy - s->mb_stride - 1][3] == -1) ? PART_NOT_AVAILABLE : 1; | 503 h->ref_cache[m][scan8[0] - 1 - 1*8] = (h->intra4x4_pred_mode
[h->mb2br_xy[mb_xy - s->mb_stride - 1]+3] == -1) ? PART_NOT_AVAILABLE : 1; |
| 504 }else | 504 }else |
| 505 h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE; | 505 h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE; |
| 506 }else | 506 }else |
| 507 memset(&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE,
8); | 507 memset(&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE,
8); |
| 508 | 508 |
| 509 if (s->pict_type != FF_B_TYPE) | 509 if (s->pict_type != FF_B_TYPE) |
| 510 break; | 510 break; |
| 511 } | 511 } |
| 512 | 512 |
| 513 /* decode motion vector(s) and form prediction(s) */ | 513 /* decode motion vector(s) and form prediction(s) */ |
| (...skipping 19 matching lines...) Expand all Loading... |
| 533 } | 533 } |
| 534 } | 534 } |
| 535 | 535 |
| 536 mb_type = MB_TYPE_16x16; | 536 mb_type = MB_TYPE_16x16; |
| 537 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */ | 537 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */ |
| 538 memset(h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t)); | 538 memset(h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t)); |
| 539 | 539 |
| 540 if (mb_type == 8) { | 540 if (mb_type == 8) { |
| 541 if (s->mb_x > 0) { | 541 if (s->mb_x > 0) { |
| 542 for (i = 0; i < 4; i++) { | 542 for (i = 0; i < 4; i++) { |
| 543 h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x
4_pred_mode[mb_xy - 1][i]; | 543 h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x
4_pred_mode[h->mb2br_xy[mb_xy - 1]+6-i]; |
| 544 } | 544 } |
| 545 if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) { | 545 if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) { |
| 546 h->left_samples_available = 0x5F5F; | 546 h->left_samples_available = 0x5F5F; |
| 547 } | 547 } |
| 548 } | 548 } |
| 549 if (s->mb_y > 0) { | 549 if (s->mb_y > 0) { |
| 550 h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[mb_xy
- s->mb_stride][4]; | 550 h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[h->mb
2br_xy[mb_xy - s->mb_stride]+0]; |
| 551 h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[mb_xy
- s->mb_stride][5]; | 551 h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[h->mb
2br_xy[mb_xy - s->mb_stride]+1]; |
| 552 h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[mb_xy
- s->mb_stride][6]; | 552 h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[h->mb
2br_xy[mb_xy - s->mb_stride]+2]; |
| 553 h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[mb_xy
- s->mb_stride][3]; | 553 h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[h->mb
2br_xy[mb_xy - s->mb_stride]+3]; |
| 554 | 554 |
| 555 if (h->intra4x4_pred_mode_cache[4+8*0] == -1) { | 555 if (h->intra4x4_pred_mode_cache[4+8*0] == -1) { |
| 556 h->top_samples_available = 0x33FF; | 556 h->top_samples_available = 0x33FF; |
| 557 } | 557 } |
| 558 } | 558 } |
| 559 | 559 |
| 560 /* decode prediction codes for luma blocks */ | 560 /* decode prediction codes for luma blocks */ |
| 561 for (i = 0; i < 16; i+=2) { | 561 for (i = 0; i < 16; i+=2) { |
| 562 vlc = svq3_get_ue_golomb(&s->gb); | 562 vlc = svq3_get_ue_golomb(&s->gb); |
| 563 | 563 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 617 for (i = 0; i < 4; i++) { | 617 for (i = 0; i < 4; i++) { |
| 618 memset(s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*
2*sizeof(int16_t)); | 618 memset(s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*
2*sizeof(int16_t)); |
| 619 } | 619 } |
| 620 if (s->pict_type == FF_B_TYPE) { | 620 if (s->pict_type == FF_B_TYPE) { |
| 621 for (i = 0; i < 4; i++) { | 621 for (i = 0; i < 4; i++) { |
| 622 memset(s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0
, 4*2*sizeof(int16_t)); | 622 memset(s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0
, 4*2*sizeof(int16_t)); |
| 623 } | 623 } |
| 624 } | 624 } |
| 625 } | 625 } |
| 626 if (!IS_INTRA4x4(mb_type)) { | 626 if (!IS_INTRA4x4(mb_type)) { |
| 627 memset(h->intra4x4_pred_mode[mb_xy], DC_PRED, 8); | 627 memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy], DC_PRED, 8); |
| 628 } | 628 } |
| 629 if (!IS_SKIP(mb_type) || s->pict_type == FF_B_TYPE) { | 629 if (!IS_SKIP(mb_type) || s->pict_type == FF_B_TYPE) { |
| 630 memset(h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t)); | 630 memset(h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t)); |
| 631 s->dsp.clear_blocks(h->mb); | 631 s->dsp.clear_blocks(h->mb); |
| 632 } | 632 } |
| 633 | 633 |
| 634 if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == FF_B_TY
PE)) { | 634 if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == FF_B_TY
PE)) { |
| 635 if ((vlc = svq3_get_ue_golomb(&s->gb)) >= 48){ | 635 if ((vlc = svq3_get_ue_golomb(&s->gb)) >= 48){ |
| 636 av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc); | 636 av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc); |
| 637 return -1; | 637 return -1; |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 | 767 |
| 768 skip_bits1(&s->gb); | 768 skip_bits1(&s->gb); |
| 769 skip_bits(&s->gb, 2); | 769 skip_bits(&s->gb, 2); |
| 770 | 770 |
| 771 while (get_bits1(&s->gb)) { | 771 while (get_bits1(&s->gb)) { |
| 772 skip_bits(&s->gb, 8); | 772 skip_bits(&s->gb, 8); |
| 773 } | 773 } |
| 774 | 774 |
| 775 /* reset intra predictors and invalidate motion vector references */ | 775 /* reset intra predictors and invalidate motion vector references */ |
| 776 if (s->mb_x > 0) { | 776 if (s->mb_x > 0) { |
| 777 memset(h->intra4x4_pred_mode[mb_xy - 1], -1, 4*sizeof(int8_t)); | 777 memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - 1 ]+3, -1, 4*sizeo
f(int8_t)); |
| 778 memset(h->intra4x4_pred_mode[mb_xy - s->mb_x], -1, 8*sizeof(int8_t)*s->m
b_x); | 778 memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_x] , -1, 8*sizeo
f(int8_t)*s->mb_x); |
| 779 } | 779 } |
| 780 if (s->mb_y > 0) { | 780 if (s->mb_y > 0) { |
| 781 memset(h->intra4x4_pred_mode[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)
*(s->mb_width - s->mb_x)); | 781 memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_stride], -1, 8*si
zeof(int8_t)*(s->mb_width - s->mb_x)); |
| 782 | 782 |
| 783 if (s->mb_x > 0) { | 783 if (s->mb_x > 0) { |
| 784 h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] = -1; | 784 h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1]+3] = -1; |
| 785 } | 785 } |
| 786 } | 786 } |
| 787 | 787 |
| 788 return 0; | 788 return 0; |
| 789 } | 789 } |
| 790 | 790 |
| 791 static av_cold int svq3_decode_init(AVCodecContext *avctx) | 791 static av_cold int svq3_decode_init(AVCodecContext *avctx) |
| 792 { | 792 { |
| 793 MpegEncContext *const s = avctx->priv_data; | 793 MpegEncContext *const s = avctx->priv_data; |
| 794 H264Context *const h = avctx->priv_data; | 794 H264Context *const h = avctx->priv_data; |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1075 CODEC_ID_SVQ3, | 1075 CODEC_ID_SVQ3, |
| 1076 sizeof(H264Context), | 1076 sizeof(H264Context), |
| 1077 svq3_decode_init, | 1077 svq3_decode_init, |
| 1078 NULL, | 1078 NULL, |
| 1079 ff_h264_decode_end, | 1079 ff_h264_decode_end, |
| 1080 svq3_decode_frame, | 1080 svq3_decode_frame, |
| 1081 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_DELAY, | 1081 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_DELAY, |
| 1082 .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Vi
deo 3 / SVQ3"), | 1082 .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Vi
deo 3 / SVQ3"), |
| 1083 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_NONE}, | 1083 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_NONE}, |
| 1084 }; | 1084 }; |
| OLD | NEW |