annotate rv34.c @ 9568:976a7ad342af libavcodec

Revert changing VLC initialization type for RV3/4 decoder. While using large static table is not good (especially for embedded devices and CPUs with small cache), other alternatives are not very good either.
author kostya
date Mon, 27 Apr 2009 05:30:22 +0000
parents 6900e4f82110
children 305536ce781f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1 /*
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
2 * RV30/40 decoder common data
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
3 * Copyright (c) 2007 Mike Melanson, Konstantin Shishkov
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
4 *
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
5 * This file is part of FFmpeg.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
6 *
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
11 *
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
16 *
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
20 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
21
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
22 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8693
diff changeset
23 * @file libavcodec/rv34.c
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
24 * RV30/40 decoder common data
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
25 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
26
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
27 #include "avcodec.h"
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
28 #include "dsputil.h"
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
29 #include "mpegvideo.h"
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
30 #include "golomb.h"
8627
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8504
diff changeset
31 #include "mathops.h"
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
32 #include "rectangle.h"
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
33
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
34 #include "rv34vlc.h"
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
35 #include "rv34data.h"
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
36 #include "rv34.h"
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
37
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
38 //#define DEBUG
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
39
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
40 /** translation of RV30/40 macroblock types to lavc ones */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
41 static const int rv34_mb_type_to_lavc[12] = {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
42 MB_TYPE_INTRA,
8036
9b98b2261938 Mark some of RV3/4 block types as having separate DC subblock
kostya
parents: 6750
diff changeset
43 MB_TYPE_INTRA16x16 | MB_TYPE_SEPARATE_DC,
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
44 MB_TYPE_16x16 | MB_TYPE_L0,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
45 MB_TYPE_8x8 | MB_TYPE_L0,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
46 MB_TYPE_16x16 | MB_TYPE_L0,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
47 MB_TYPE_16x16 | MB_TYPE_L1,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
48 MB_TYPE_SKIP,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
49 MB_TYPE_DIRECT2 | MB_TYPE_16x16,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
50 MB_TYPE_16x8 | MB_TYPE_L0,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
51 MB_TYPE_8x16 | MB_TYPE_L0,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
52 MB_TYPE_16x16 | MB_TYPE_L0L1,
8036
9b98b2261938 Mark some of RV3/4 block types as having separate DC subblock
kostya
parents: 6750
diff changeset
53 MB_TYPE_16x16 | MB_TYPE_L0 | MB_TYPE_SEPARATE_DC
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
54 };
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
55
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
56
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
57 static RV34VLC intra_vlcs[NUM_INTRA_TABLES], inter_vlcs[NUM_INTER_TABLES];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
58
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
59 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
60 * @defgroup vlc RV30/40 VLC generating functions
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
61 * @{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
62 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
63
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
64 static const int table_offs[] = {
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
65 0, 1818, 3622, 4144, 4698, 5234, 5804, 5868, 5900, 5932,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
66 5996, 6252, 6316, 6348, 6380, 7674, 8944, 10274, 11668, 12250,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
67 14060, 15846, 16372, 16962, 17512, 18148, 18180, 18212, 18244, 18308,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
68 18564, 18628, 18660, 18692, 20036, 21314, 22648, 23968, 24614, 26384,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
69 28190, 28736, 29366, 29938, 30608, 30640, 30672, 30704, 30768, 31024,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
70 31088, 31120, 31184, 32570, 33898, 35236, 36644, 37286, 39020, 40802,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
71 41368, 42052, 42692, 43348, 43380, 43412, 43444, 43476, 43604, 43668,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
72 43700, 43732, 45100, 46430, 47778, 49160, 49802, 51550, 53340, 53972,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
73 54648, 55348, 55994, 56122, 56154, 56186, 56218, 56346, 56410, 56442,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
74 56474, 57878, 59290, 60636, 62036, 62682, 64460, 64524, 64588, 64716,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
75 64844, 66076, 67466, 67978, 68542, 69064, 69648, 70296, 72010, 72074,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
76 72138, 72202, 72330, 73572, 74936, 75454, 76030, 76566, 77176, 77822,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
77 79582, 79646, 79678, 79742, 79870, 81180, 82536, 83064, 83672, 84242,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
78 84934, 85576, 87384, 87448, 87480, 87544, 87672, 88982, 90340, 90902,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
79 91598, 92182, 92846, 93488, 95246, 95278, 95310, 95374, 95502, 96878,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
80 98266, 98848, 99542, 100234, 100884, 101524, 103320, 103352, 103384, 103416,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
81 103480, 104874, 106222, 106910, 107584, 108258, 108902, 109544, 111366, 111398,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
82 111430, 111462, 111494, 112878, 114320, 114988, 115660, 116310, 116950, 117592
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
83 };
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
84
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
85 static VLC_TYPE table_data[117592][2];
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
86
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
87 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
88 * Generate VLC from codeword lengths.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
89 * @param bits codeword lengths (zeroes are accepted)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
90 * @param size length of input data
8684
ec65d742016f Fix Doxygen comments for RV3/4 decoder.
kostya
parents: 8627
diff changeset
91 * @param vlc output VLC
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
92 * @param insyms symbols for input codes (NULL for default ones)
9520
c9c23894f4ae Make RV3/4 VLC tables use new static initialization method
kostya
parents: 9355
diff changeset
93 * @param num VLC table number (for static initialization)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
94 */
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
95 static void rv34_gen_vlc(const uint8_t *bits, int size, VLC *vlc, const uint8_t *insyms,
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
96 const int num)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
97 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
98 int i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
99 int counts[17] = {0}, codes[17];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
100 uint16_t cw[size], syms[size];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
101 uint8_t bits2[size];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
102 int maxbits = 0, realsize = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
103
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
104 for(i = 0; i < size; i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
105 if(bits[i]){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
106 bits2[realsize] = bits[i];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
107 syms[realsize] = insyms ? insyms[i] : i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
108 realsize++;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
109 maxbits = FFMAX(maxbits, bits[i]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
110 counts[bits[i]]++;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
111 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
112 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
113
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
114 codes[0] = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
115 for(i = 0; i < 16; i++)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
116 codes[i+1] = (codes[i] + counts[i]) << 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
117 for(i = 0; i < realsize; i++)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
118 cw[i] = codes[bits2[i]]++;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
119
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
120 vlc->table = &table_data[table_offs[num]];
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
121 vlc->table_allocated = table_offs[num + 1] - table_offs[num];
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
122 init_vlc_sparse(vlc, FFMIN(maxbits, 9), realsize,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
123 bits2, 1, 1,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
124 cw, 2, 2,
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
125 syms, 2, 2, INIT_VLC_USE_NEW_STATIC);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
126 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
127
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
128 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
129 * Initialize all tables.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
130 */
8693
18737839ed27 Add missing void keyword to parameterless function declarations.
diego
parents: 8684
diff changeset
131 static av_cold void rv34_init_tables(void)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
132 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
133 int i, j, k;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
134
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
135 for(i = 0; i < NUM_INTRA_TABLES; i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
136 for(j = 0; j < 2; j++){
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
137 rv34_gen_vlc(rv34_table_intra_cbppat [i][j], CBPPAT_VLC_SIZE, &intra_vlcs[i].cbppattern[j], NULL, 19*i + 0 + j);
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
138 rv34_gen_vlc(rv34_table_intra_secondpat[i][j], OTHERBLK_VLC_SIZE, &intra_vlcs[i].second_pattern[j], NULL, 19*i + 2 + j);
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
139 rv34_gen_vlc(rv34_table_intra_thirdpat [i][j], OTHERBLK_VLC_SIZE, &intra_vlcs[i].third_pattern[j], NULL, 19*i + 4 + j);
9520
c9c23894f4ae Make RV3/4 VLC tables use new static initialization method
kostya
parents: 9355
diff changeset
140 for(k = 0; k < 4; k++){
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
141 rv34_gen_vlc(rv34_table_intra_cbp[i][j+k*2], CBP_VLC_SIZE, &intra_vlcs[i].cbp[j][k], rv34_cbp_code, 19*i + 6 + j*4 + k);
9520
c9c23894f4ae Make RV3/4 VLC tables use new static initialization method
kostya
parents: 9355
diff changeset
142 }
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
143 }
9520
c9c23894f4ae Make RV3/4 VLC tables use new static initialization method
kostya
parents: 9355
diff changeset
144 for(j = 0; j < 4; j++){
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
145 rv34_gen_vlc(rv34_table_intra_firstpat[i][j], FIRSTBLK_VLC_SIZE, &intra_vlcs[i].first_pattern[j], NULL, 19*i + 14 + j);
9520
c9c23894f4ae Make RV3/4 VLC tables use new static initialization method
kostya
parents: 9355
diff changeset
146 }
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
147 rv34_gen_vlc(rv34_intra_coeff[i], COEFF_VLC_SIZE, &intra_vlcs[i].coefficient, NULL, 19*i + 18);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
148 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
149
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
150 for(i = 0; i < NUM_INTER_TABLES; i++){
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
151 rv34_gen_vlc(rv34_inter_cbppat[i], CBPPAT_VLC_SIZE, &inter_vlcs[i].cbppattern[0], NULL, i*12 + 95);
9520
c9c23894f4ae Make RV3/4 VLC tables use new static initialization method
kostya
parents: 9355
diff changeset
152 for(j = 0; j < 4; j++){
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
153 rv34_gen_vlc(rv34_inter_cbp[i][j], CBP_VLC_SIZE, &inter_vlcs[i].cbp[0][j], rv34_cbp_code, i*12 + 96 + j);
9520
c9c23894f4ae Make RV3/4 VLC tables use new static initialization method
kostya
parents: 9355
diff changeset
154 }
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
155 for(j = 0; j < 2; j++){
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
156 rv34_gen_vlc(rv34_table_inter_firstpat [i][j], FIRSTBLK_VLC_SIZE, &inter_vlcs[i].first_pattern[j], NULL, i*12 + 100 + j);
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
157 rv34_gen_vlc(rv34_table_inter_secondpat[i][j], OTHERBLK_VLC_SIZE, &inter_vlcs[i].second_pattern[j], NULL, i*12 + 102 + j);
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
158 rv34_gen_vlc(rv34_table_inter_thirdpat [i][j], OTHERBLK_VLC_SIZE, &inter_vlcs[i].third_pattern[j], NULL, i*12 + 104 + j);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
159 }
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
160 rv34_gen_vlc(rv34_inter_coeff[i], COEFF_VLC_SIZE, &inter_vlcs[i].coefficient, NULL, i*12 + 106);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
161 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
162 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
163
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
164 /** @} */ // vlc group
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
165
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
166
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
167 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
168 * @defgroup transform RV30/40 inverse transform functions
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
169 * @{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
170 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
171
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
172 static av_always_inline void rv34_row_transform(int temp[16], DCTELEM *block)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
173 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
174 int i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
175
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
176 for(i=0; i<4; i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
177 const int z0= 13*(block[i+8*0] + block[i+8*2]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
178 const int z1= 13*(block[i+8*0] - block[i+8*2]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
179 const int z2= 7* block[i+8*1] - 17*block[i+8*3];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
180 const int z3= 17* block[i+8*1] + 7*block[i+8*3];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
181
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
182 temp[4*i+0]= z0+z3;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
183 temp[4*i+1]= z1+z2;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
184 temp[4*i+2]= z1-z2;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
185 temp[4*i+3]= z0-z3;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
186 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
187 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
188
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
189 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
190 * Real Video 3.0/4.0 inverse transform
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
191 * Code is almost the same as in SVQ3, only scaling is different.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
192 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
193 static void rv34_inv_transform(DCTELEM *block){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
194 int temp[16];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
195 int i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
196
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
197 rv34_row_transform(temp, block);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
198
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
199 for(i=0; i<4; i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
200 const int z0= 13*(temp[4*0+i] + temp[4*2+i]) + 0x200;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
201 const int z1= 13*(temp[4*0+i] - temp[4*2+i]) + 0x200;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
202 const int z2= 7* temp[4*1+i] - 17*temp[4*3+i];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
203 const int z3= 17* temp[4*1+i] + 7*temp[4*3+i];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
204
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
205 block[i*8+0]= (z0 + z3)>>10;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
206 block[i*8+1]= (z1 + z2)>>10;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
207 block[i*8+2]= (z1 - z2)>>10;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
208 block[i*8+3]= (z0 - z3)>>10;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
209 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
210
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
211 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
212
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
213 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
214 * RealVideo 3.0/4.0 inverse transform for DC block
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
215 *
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
216 * Code is almost the same as rv34_inv_transform()
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
217 * but final coefficients are multiplied by 1.5 and have no rounding.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
218 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
219 static void rv34_inv_transform_noround(DCTELEM *block){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
220 int temp[16];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
221 int i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
222
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
223 rv34_row_transform(temp, block);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
224
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
225 for(i=0; i<4; i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
226 const int z0= 13*(temp[4*0+i] + temp[4*2+i]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
227 const int z1= 13*(temp[4*0+i] - temp[4*2+i]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
228 const int z2= 7* temp[4*1+i] - 17*temp[4*3+i];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
229 const int z3= 17* temp[4*1+i] + 7*temp[4*3+i];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
230
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
231 block[i*8+0]= ((z0 + z3)*3)>>11;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
232 block[i*8+1]= ((z1 + z2)*3)>>11;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
233 block[i*8+2]= ((z1 - z2)*3)>>11;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
234 block[i*8+3]= ((z0 - z3)*3)>>11;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
235 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
236
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
237 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
238
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
239 /** @} */ // transform
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
240
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
241
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
242 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
243 * @defgroup block RV30/40 4x4 block decoding functions
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
244 * @{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
245 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
246
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
247 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
248 * Decode coded block pattern.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
249 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
250 static int rv34_decode_cbp(GetBitContext *gb, RV34VLC *vlc, int table)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
251 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
252 int pattern, code, cbp=0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
253 int ones;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
254 static const int cbp_masks[3] = {0x100000, 0x010000, 0x110000};
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
255 static const int shifts[4] = { 0, 2, 8, 10 };
8721
42e258f2b931 Silence two pointer assignment compiler warnings in rv34.c
kostya
parents: 8718
diff changeset
256 const int *curshift = shifts;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
257 int i, t, mask;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
258
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
259 code = get_vlc2(gb, vlc->cbppattern[table].table, 9, 2);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
260 pattern = code & 0xF;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
261 code >>= 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
262
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
263 ones = rv34_count_ones[pattern];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
264
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
265 for(mask = 8; mask; mask >>= 1, curshift++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
266 if(pattern & mask)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
267 cbp |= get_vlc2(gb, vlc->cbp[table][ones].table, vlc->cbp[table][ones].bits, 1) << curshift[0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
268 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
269
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
270 for(i = 0; i < 4; i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
271 t = modulo_three_table[code][i];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
272 if(t == 1)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
273 cbp |= cbp_masks[get_bits1(gb)] << i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
274 if(t == 2)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
275 cbp |= cbp_masks[2] << i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
276 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
277 return cbp;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
278 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
279
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
280 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
281 * Get one coefficient value from the bistream and store it.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
282 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
283 static inline void decode_coeff(DCTELEM *dst, int coef, int esc, GetBitContext *gb, VLC* vlc)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
284 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
285 if(coef){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
286 if(coef == esc){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
287 coef = get_vlc2(gb, vlc->table, 9, 2);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
288 if(coef > 23){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
289 coef -= 23;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
290 coef = 22 + ((1 << coef) | get_bits(gb, coef));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
291 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
292 coef += esc;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
293 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
294 if(get_bits1(gb))
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
295 coef = -coef;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
296 *dst = coef;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
297 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
298 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
299
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
300 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
301 * Decode 2x2 subblock of coefficients.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
302 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
303 static inline void decode_subblock(DCTELEM *dst, int code, const int is_block2, GetBitContext *gb, VLC *vlc)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
304 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
305 int coeffs[4];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
306
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
307 coeffs[0] = modulo_three_table[code][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
308 coeffs[1] = modulo_three_table[code][1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
309 coeffs[2] = modulo_three_table[code][2];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
310 coeffs[3] = modulo_three_table[code][3];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
311 decode_coeff(dst , coeffs[0], 3, gb, vlc);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
312 if(is_block2){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
313 decode_coeff(dst+8, coeffs[1], 2, gb, vlc);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
314 decode_coeff(dst+1, coeffs[2], 2, gb, vlc);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
315 }else{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
316 decode_coeff(dst+1, coeffs[1], 2, gb, vlc);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
317 decode_coeff(dst+8, coeffs[2], 2, gb, vlc);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
318 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
319 decode_coeff(dst+9, coeffs[3], 2, gb, vlc);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
320 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
321
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
322 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
323 * Decode coefficients for 4x4 block.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
324 *
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
325 * This is done by filling 2x2 subblocks with decoded coefficients
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
326 * in this order (the same for subblocks and subblock coefficients):
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
327 * o--o
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
328 * /
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
329 * /
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
330 * o--o
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
331 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
332
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
333 static inline void rv34_decode_block(DCTELEM *dst, GetBitContext *gb, RV34VLC *rvlc, int fc, int sc)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
334 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
335 int code, pattern;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
336
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
337 code = get_vlc2(gb, rvlc->first_pattern[fc].table, 9, 2);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
338
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
339 pattern = code & 0x7;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
340
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
341 code >>= 3;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
342 decode_subblock(dst, code, 0, gb, &rvlc->coefficient);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
343
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
344 if(pattern & 4){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
345 code = get_vlc2(gb, rvlc->second_pattern[sc].table, 9, 2);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
346 decode_subblock(dst + 2, code, 0, gb, &rvlc->coefficient);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
347 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
348 if(pattern & 2){ // Looks like coefficients 1 and 2 are swapped for this block
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
349 code = get_vlc2(gb, rvlc->second_pattern[sc].table, 9, 2);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
350 decode_subblock(dst + 8*2, code, 1, gb, &rvlc->coefficient);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
351 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
352 if(pattern & 1){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
353 code = get_vlc2(gb, rvlc->third_pattern[sc].table, 9, 2);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
354 decode_subblock(dst + 8*2+2, code, 0, gb, &rvlc->coefficient);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
355 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
356
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
357 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
358
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
359 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
360 * Dequantize ordinary 4x4 block.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
361 * @todo optimize
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
362 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
363 static inline void rv34_dequant4x4(DCTELEM *block, int Qdc, int Q)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
364 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
365 int i, j;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
366
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
367 block[0] = (block[0] * Qdc + 8) >> 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
368 for(i = 0; i < 4; i++)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
369 for(j = !i; j < 4; j++)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
370 block[j + i*8] = (block[j + i*8] * Q + 8) >> 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
371 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
372
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
373 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
374 * Dequantize 4x4 block of DC values for 16x16 macroblock.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
375 * @todo optimize
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
376 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
377 static inline void rv34_dequant4x4_16x16(DCTELEM *block, int Qdc, int Q)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
378 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
379 int i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
380
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
381 for(i = 0; i < 3; i++)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
382 block[rv34_dezigzag[i]] = (block[rv34_dezigzag[i]] * Qdc + 8) >> 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
383 for(; i < 16; i++)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
384 block[rv34_dezigzag[i]] = (block[rv34_dezigzag[i]] * Q + 8) >> 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
385 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
386 /** @} */ //block functions
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
387
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
388
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
389 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
390 * @defgroup bitstream RV30/40 bitstream parsing
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
391 * @{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
392 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
393
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
394 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
395 * Decode starting slice position.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
396 * @todo Maybe replace with ff_h263_decode_mba() ?
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
397 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
398 int ff_rv34_get_start_offset(GetBitContext *gb, int mb_size)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
399 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
400 int i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
401 for(i = 0; i < 5; i++)
8445
8621deaff8dc 352l: correct calculating number of bits for storing macroblock offset in RV3/4
kostya
parents: 8371
diff changeset
402 if(rv34_mb_max_sizes[i] >= mb_size - 1)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
403 break;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
404 return rv34_mb_bits_sizes[i];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
405 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
406
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
407 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
408 * Select VLC set for decoding from current quantizer, modifier and frame type.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
409 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
410 static inline RV34VLC* choose_vlc_set(int quant, int mod, int type)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
411 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
412 if(mod == 2 && quant < 19) quant += 10;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
413 else if(mod && quant < 26) quant += 5;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
414 return type ? &inter_vlcs[rv34_quant_to_vlc_set[1][av_clip(quant, 0, 30)]]
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
415 : &intra_vlcs[rv34_quant_to_vlc_set[0][av_clip(quant, 0, 30)]];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
416 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
417
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
418 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
419 * Decode quantizer difference and return modified quantizer.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
420 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
421 static inline int rv34_decode_dquant(GetBitContext *gb, int quant)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
422 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
423 if(get_bits1(gb))
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
424 return rv34_dquant_tab[get_bits1(gb)][quant];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
425 else
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
426 return get_bits(gb, 5);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
427 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
428
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
429 /** @} */ //bitstream functions
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
430
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
431 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
432 * @defgroup mv motion vector related code (prediction, reconstruction, motion compensation)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
433 * @{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
434 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
435
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
436 /** macroblock partition width in 8x8 blocks */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
437 static const uint8_t part_sizes_w[RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2 };
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
438
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
439 /** macroblock partition height in 8x8 blocks */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
440 static const uint8_t part_sizes_h[RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2 };
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
441
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
442 /** availability index for subblocks */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
443 static const uint8_t avail_indexes[4] = { 5, 6, 9, 10 };
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
444
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
445 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
446 * motion vector prediction
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
447 *
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
448 * Motion prediction performed for the block by using median prediction of
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
449 * motion vectors from the left, top and right top blocks but in corner cases
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
450 * some other vectors may be used instead.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
451 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
452 static void rv34_pred_mv(RV34DecContext *r, int block_type, int subblock_no, int dmv_no)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
453 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
454 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
455 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
456 int A[2] = {0}, B[2], C[2];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
457 int i, j;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
458 int mx, my;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
459 int avail_index = avail_indexes[subblock_no];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
460 int c_off = part_sizes_w[block_type];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
461
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
462 mv_pos += (subblock_no & 1) + (subblock_no >> 1)*s->b8_stride;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
463 if(subblock_no == 3)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
464 c_off = -1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
465
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
466 if(r->avail_cache[avail_index - 1]){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
467 A[0] = s->current_picture_ptr->motion_val[0][mv_pos-1][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
468 A[1] = s->current_picture_ptr->motion_val[0][mv_pos-1][1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
469 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
470 if(r->avail_cache[avail_index - 4]){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
471 B[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
472 B[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
473 }else{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
474 B[0] = A[0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
475 B[1] = A[1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
476 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
477 if(!r->avail_cache[avail_index - 4 + c_off]){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
478 if(r->avail_cache[avail_index - 4] && (r->avail_cache[avail_index - 1] || r->rv30)){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
479 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
480 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
481 }else{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
482 C[0] = A[0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
483 C[1] = A[1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
484 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
485 }else{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
486 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+c_off][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
487 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+c_off][1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
488 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
489 mx = mid_pred(A[0], B[0], C[0]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
490 my = mid_pred(A[1], B[1], C[1]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
491 mx += r->dmv[dmv_no][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
492 my += r->dmv[dmv_no][1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
493 for(j = 0; j < part_sizes_h[block_type]; j++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
494 for(i = 0; i < part_sizes_w[block_type]; i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
495 s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][0] = mx;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
496 s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][1] = my;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
497 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
498 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
499 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
500
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
501 #define GET_PTS_DIFF(a, b) ((a - b + 8192) & 0x1FFF)
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
502
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
503 /**
6096
89140b93ae09 Direct blocks should use motion vectors from the second reference frame
kostya
parents: 6036
diff changeset
504 * Calculate motion vector component that should be added for direct blocks.
89140b93ae09 Direct blocks should use motion vectors from the second reference frame
kostya
parents: 6036
diff changeset
505 */
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
506 static int calc_add_mv(RV34DecContext *r, int dir, int val)
6096
89140b93ae09 Direct blocks should use motion vectors from the second reference frame
kostya
parents: 6036
diff changeset
507 {
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
508 int refdist = GET_PTS_DIFF(r->next_pts, r->last_pts);
8086
ae146e429003 Correct motion vector scaling in B-frames for RV3/4
kostya
parents: 8074
diff changeset
509 int dist = dir ? -GET_PTS_DIFF(r->next_pts, r->cur_pts) : GET_PTS_DIFF(r->cur_pts, r->last_pts);
ae146e429003 Correct motion vector scaling in B-frames for RV3/4
kostya
parents: 8074
diff changeset
510 int mul;
6096
89140b93ae09 Direct blocks should use motion vectors from the second reference frame
kostya
parents: 6036
diff changeset
511
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
512 if(!refdist) return 0;
8086
ae146e429003 Correct motion vector scaling in B-frames for RV3/4
kostya
parents: 8074
diff changeset
513 mul = (dist << 14) / refdist;
ae146e429003 Correct motion vector scaling in B-frames for RV3/4
kostya
parents: 8074
diff changeset
514 return (val * mul + 0x2000) >> 14;
6096
89140b93ae09 Direct blocks should use motion vectors from the second reference frame
kostya
parents: 6036
diff changeset
515 }
89140b93ae09 Direct blocks should use motion vectors from the second reference frame
kostya
parents: 6036
diff changeset
516
89140b93ae09 Direct blocks should use motion vectors from the second reference frame
kostya
parents: 6036
diff changeset
517 /**
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
518 * Predict motion vector for B-frame macroblock.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
519 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
520 static inline void rv34_pred_b_vector(int A[2], int B[2], int C[2],
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
521 int A_avail, int B_avail, int C_avail,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
522 int *mx, int *my)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
523 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
524 if(A_avail + B_avail + C_avail != 3){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
525 *mx = A[0] + B[0] + C[0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
526 *my = A[1] + B[1] + C[1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
527 if(A_avail + B_avail + C_avail == 2){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
528 *mx /= 2;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
529 *my /= 2;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
530 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
531 }else{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
532 *mx = mid_pred(A[0], B[0], C[0]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
533 *my = mid_pred(A[1], B[1], C[1]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
534 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
535 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
536
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
537 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
538 * motion vector prediction for B-frames
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
539 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
540 static void rv34_pred_mv_b(RV34DecContext *r, int block_type, int dir)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
541 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
542 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
543 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
544 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
545 int A[2], B[2], C[2];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
546 int has_A = 0, has_B = 0, has_C = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
547 int mx, my;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
548 int i, j;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
549 Picture *cur_pic = s->current_picture_ptr;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
550 const int mask = dir ? MB_TYPE_L1 : MB_TYPE_L0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
551 int type = cur_pic->mb_type[mb_pos];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
552
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
553 memset(A, 0, sizeof(A));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
554 memset(B, 0, sizeof(B));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
555 memset(C, 0, sizeof(C));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
556 if((r->avail_cache[5-1] & type) & mask){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
557 A[0] = cur_pic->motion_val[dir][mv_pos - 1][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
558 A[1] = cur_pic->motion_val[dir][mv_pos - 1][1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
559 has_A = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
560 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
561 if((r->avail_cache[5-4] & type) & mask){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
562 B[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
563 B[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride][1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
564 has_B = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
565 }
9168
5de43b1eb9f4 Correct MV prediction for B-frame blocks in RV4 decoder
kostya
parents: 9162
diff changeset
566 if(r->avail_cache[5-4] && (r->avail_cache[5-2] & type) & mask){
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
567 C[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride + 2][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
568 C[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride + 2][1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
569 has_C = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
570 }else if((s->mb_x+1) == s->mb_width && (r->avail_cache[5-5] & type) & mask){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
571 C[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride - 1][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
572 C[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride - 1][1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
573 has_C = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
574 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
575
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
576 rv34_pred_b_vector(A, B, C, has_A, has_B, has_C, &mx, &my);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
577
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
578 mx += r->dmv[dir][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
579 my += r->dmv[dir][1];
6096
89140b93ae09 Direct blocks should use motion vectors from the second reference frame
kostya
parents: 6036
diff changeset
580
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
581 for(j = 0; j < 2; j++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
582 for(i = 0; i < 2; i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
583 cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][0] = mx;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
584 cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][1] = my;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
585 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
586 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
587 if(block_type == RV34_MB_B_BACKWARD || block_type == RV34_MB_B_FORWARD)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
588 fill_rectangle(cur_pic->motion_val[!dir][mv_pos], 2, 2, s->b8_stride, 0, 4);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
589 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
590
8099
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
591 /**
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
592 * motion vector prediction - RV3 version
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
593 */
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
594 static void rv34_pred_mv_rv3(RV34DecContext *r, int block_type, int dir)
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
595 {
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
596 MpegEncContext *s = &r->s;
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
597 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
598 int A[2] = {0}, B[2], C[2];
8504
3bfb7a2ea222 It turned out that RV30 uses motion vectors for forward motion B-frame
kostya
parents: 8445
diff changeset
599 int i, j, k;
8099
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
600 int mx, my;
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
601 int avail_index = avail_indexes[0];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
602
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
603 if(r->avail_cache[avail_index - 1]){
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
604 A[0] = s->current_picture_ptr->motion_val[0][mv_pos-1][0];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
605 A[1] = s->current_picture_ptr->motion_val[0][mv_pos-1][1];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
606 }
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
607 if(r->avail_cache[avail_index - 4]){
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
608 B[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][0];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
609 B[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][1];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
610 }else{
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
611 B[0] = A[0];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
612 B[1] = A[1];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
613 }
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
614 if(!r->avail_cache[avail_index - 4 + 2]){
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
615 if(r->avail_cache[avail_index - 4] && (r->avail_cache[avail_index - 1])){
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
616 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][0];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
617 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][1];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
618 }else{
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
619 C[0] = A[0];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
620 C[1] = A[1];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
621 }
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
622 }else{
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
623 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+2][0];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
624 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+2][1];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
625 }
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
626 mx = mid_pred(A[0], B[0], C[0]);
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
627 my = mid_pred(A[1], B[1], C[1]);
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
628 mx += r->dmv[0][0];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
629 my += r->dmv[0][1];
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
630 for(j = 0; j < 2; j++){
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
631 for(i = 0; i < 2; i++){
8504
3bfb7a2ea222 It turned out that RV30 uses motion vectors for forward motion B-frame
kostya
parents: 8445
diff changeset
632 for(k = 0; k < 2; k++){
3bfb7a2ea222 It turned out that RV30 uses motion vectors for forward motion B-frame
kostya
parents: 8445
diff changeset
633 s->current_picture_ptr->motion_val[k][mv_pos + i + j*s->b8_stride][0] = mx;
3bfb7a2ea222 It turned out that RV30 uses motion vectors for forward motion B-frame
kostya
parents: 8445
diff changeset
634 s->current_picture_ptr->motion_val[k][mv_pos + i + j*s->b8_stride][1] = my;
3bfb7a2ea222 It turned out that RV30 uses motion vectors for forward motion B-frame
kostya
parents: 8445
diff changeset
635 }
8099
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
636 }
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
637 }
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
638 }
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
639
8074
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
640 static const int chroma_coeffs[3] = { 0, 3, 5 };
6106
7185e3bb0614 RV30 thirdpel motion compensation support
kostya
parents: 6099
diff changeset
641
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
642 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
643 * generic motion compensation function
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
644 *
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
645 * @param r decoder context
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
646 * @param block_type type of the current block
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
647 * @param xoff horizontal offset from the start of the current block
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
648 * @param yoff vertical offset from the start of the current block
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
649 * @param mv_off offset to the motion vector information
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
650 * @param width width of the current partition in 8x8 blocks
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
651 * @param height height of the current partition in 8x8 blocks
8684
ec65d742016f Fix Doxygen comments for RV3/4 decoder.
kostya
parents: 8627
diff changeset
652 * @param dir motion compensation direction (i.e. from the last or the next reference frame)
ec65d742016f Fix Doxygen comments for RV3/4 decoder.
kostya
parents: 8627
diff changeset
653 * @param thirdpel motion vectors are specified in 1/3 of pixel
ec65d742016f Fix Doxygen comments for RV3/4 decoder.
kostya
parents: 8627
diff changeset
654 * @param qpel_mc a set of functions used to perform luma motion compensation
ec65d742016f Fix Doxygen comments for RV3/4 decoder.
kostya
parents: 8627
diff changeset
655 * @param chroma_mc a set of functions used to perform chroma motion compensation
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
656 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
657 static inline void rv34_mc(RV34DecContext *r, const int block_type,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
658 const int xoff, const int yoff, int mv_off,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
659 const int width, const int height, int dir,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
660 const int thirdpel,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
661 qpel_mc_func (*qpel_mc)[16],
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
662 h264_chroma_mc_func (*chroma_mc))
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
663 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
664 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
665 uint8_t *Y, *U, *V, *srcY, *srcU, *srcV;
8074
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
666 int dxy, mx, my, umx, umy, lx, ly, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
667 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride + mv_off;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
668 int is16x16 = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
669
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
670 if(thirdpel){
8074
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
671 int chroma_mx, chroma_my;
6106
7185e3bb0614 RV30 thirdpel motion compensation support
kostya
parents: 6099
diff changeset
672 mx = (s->current_picture_ptr->motion_val[dir][mv_pos][0] + (3 << 24)) / 3 - (1 << 24);
7185e3bb0614 RV30 thirdpel motion compensation support
kostya
parents: 6099
diff changeset
673 my = (s->current_picture_ptr->motion_val[dir][mv_pos][1] + (3 << 24)) / 3 - (1 << 24);
7185e3bb0614 RV30 thirdpel motion compensation support
kostya
parents: 6099
diff changeset
674 lx = (s->current_picture_ptr->motion_val[dir][mv_pos][0] + (3 << 24)) % 3;
7185e3bb0614 RV30 thirdpel motion compensation support
kostya
parents: 6099
diff changeset
675 ly = (s->current_picture_ptr->motion_val[dir][mv_pos][1] + (3 << 24)) % 3;
8074
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
676 chroma_mx = (s->current_picture_ptr->motion_val[dir][mv_pos][0] + 1) >> 1;
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
677 chroma_my = (s->current_picture_ptr->motion_val[dir][mv_pos][1] + 1) >> 1;
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
678 umx = (chroma_mx + (3 << 24)) / 3 - (1 << 24);
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
679 umy = (chroma_my + (3 << 24)) / 3 - (1 << 24);
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
680 uvmx = chroma_coeffs[(chroma_mx + (3 << 24)) % 3];
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
681 uvmy = chroma_coeffs[(chroma_my + (3 << 24)) % 3];
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
682 }else{
8221
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
683 int cx, cy;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
684 mx = s->current_picture_ptr->motion_val[dir][mv_pos][0] >> 2;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
685 my = s->current_picture_ptr->motion_val[dir][mv_pos][1] >> 2;
6121
bc59962f70b9 Fractional parts of motion vectors should be accounted separately too
kostya
parents: 6106
diff changeset
686 lx = s->current_picture_ptr->motion_val[dir][mv_pos][0] & 3;
bc59962f70b9 Fractional parts of motion vectors should be accounted separately too
kostya
parents: 6106
diff changeset
687 ly = s->current_picture_ptr->motion_val[dir][mv_pos][1] & 3;
8221
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
688 cx = s->current_picture_ptr->motion_val[dir][mv_pos][0] / 2;
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
689 cy = s->current_picture_ptr->motion_val[dir][mv_pos][1] / 2;
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
690 umx = cx >> 2;
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
691 umy = cy >> 2;
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
692 uvmx = (cx & 3) << 1;
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
693 uvmy = (cy & 3) << 1;
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
694 //due to some flaw RV40 uses the same MC compensation routine for H2V2 and H3V3
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
695 if(uvmx == 6 && uvmy == 6)
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
696 uvmx = uvmy = 4;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
697 }
6121
bc59962f70b9 Fractional parts of motion vectors should be accounted separately too
kostya
parents: 6106
diff changeset
698 dxy = ly*4 + lx;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
699 srcY = dir ? s->next_picture_ptr->data[0] : s->last_picture_ptr->data[0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
700 srcU = dir ? s->next_picture_ptr->data[1] : s->last_picture_ptr->data[1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
701 srcV = dir ? s->next_picture_ptr->data[2] : s->last_picture_ptr->data[2];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
702 src_x = s->mb_x * 16 + xoff + mx;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
703 src_y = s->mb_y * 16 + yoff + my;
8074
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
704 uvsrc_x = s->mb_x * 8 + (xoff >> 1) + umx;
31e90d4abe28 Fix chroma motion compensation for RV30
kostya
parents: 8046
diff changeset
705 uvsrc_y = s->mb_y * 8 + (yoff >> 1) + umy;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
706 srcY += src_y * s->linesize + src_x;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
707 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
708 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
8179
883feb4edb65 Use wider margins for edge emulation in RV30/40
kostya
parents: 8128
diff changeset
709 if( (unsigned)(src_x - !!lx*2) > s->h_edge_pos - !!lx*2 - (width <<3) - 4
883feb4edb65 Use wider margins for edge emulation in RV30/40
kostya
parents: 8128
diff changeset
710 || (unsigned)(src_y - !!ly*2) > s->v_edge_pos - !!ly*2 - (height<<3) - 4){
883feb4edb65 Use wider margins for edge emulation in RV30/40
kostya
parents: 8128
diff changeset
711 uint8_t *uvbuf= s->edge_emu_buffer + 22 * s->linesize;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
712
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
713 srcY -= 2 + 2*s->linesize;
8179
883feb4edb65 Use wider margins for edge emulation in RV30/40
kostya
parents: 8128
diff changeset
714 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, (width<<3)+6, (height<<3)+6,
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
715 src_x - 2, src_y - 2, s->h_edge_pos, s->v_edge_pos);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
716 srcY = s->edge_emu_buffer + 2 + 2*s->linesize;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
717 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, (width<<2)+1, (height<<2)+1,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
718 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
719 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, (width<<2)+1, (height<<2)+1,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
720 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
721 srcU = uvbuf;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
722 srcV = uvbuf + 16;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
723 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
724 Y = s->dest[0] + xoff + yoff *s->linesize;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
725 U = s->dest[1] + (xoff>>1) + (yoff>>1)*s->uvlinesize;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
726 V = s->dest[2] + (xoff>>1) + (yoff>>1)*s->uvlinesize;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
727
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
728 if(block_type == RV34_MB_P_16x8){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
729 qpel_mc[1][dxy](Y, srcY, s->linesize);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
730 Y += 8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
731 srcY += 8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
732 }else if(block_type == RV34_MB_P_8x16){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
733 qpel_mc[1][dxy](Y, srcY, s->linesize);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
734 Y += 8 * s->linesize;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
735 srcY += 8 * s->linesize;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
736 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
737 is16x16 = (block_type != RV34_MB_P_8x8) && (block_type != RV34_MB_P_16x8) && (block_type != RV34_MB_P_8x16);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
738 qpel_mc[!is16x16][dxy](Y, srcY, s->linesize);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
739 chroma_mc[2-width] (U, srcU, s->uvlinesize, height*4, uvmx, uvmy);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
740 chroma_mc[2-width] (V, srcV, s->uvlinesize, height*4, uvmx, uvmy);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
741 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
742
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
743 static void rv34_mc_1mv(RV34DecContext *r, const int block_type,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
744 const int xoff, const int yoff, int mv_off,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
745 const int width, const int height, int dir)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
746 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
747 rv34_mc(r, block_type, xoff, yoff, mv_off, width, height, dir, r->rv30,
6106
7185e3bb0614 RV30 thirdpel motion compensation support
kostya
parents: 6099
diff changeset
748 r->rv30 ? r->s.dsp.put_rv30_tpel_pixels_tab
8221
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
749 : r->s.dsp.put_rv40_qpel_pixels_tab,
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
750 r->rv30 ? r->s.dsp.put_h264_chroma_pixels_tab
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
751 : r->s.dsp.put_rv40_chroma_pixels_tab);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
752 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
753
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
754 static void rv34_mc_2mv(RV34DecContext *r, const int block_type)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
755 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
756 rv34_mc(r, block_type, 0, 0, 0, 2, 2, 0, r->rv30,
6106
7185e3bb0614 RV30 thirdpel motion compensation support
kostya
parents: 6099
diff changeset
757 r->rv30 ? r->s.dsp.put_rv30_tpel_pixels_tab
8221
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
758 : r->s.dsp.put_rv40_qpel_pixels_tab,
8244
3f3d653fb46d 34l: forgot to change one case of chroma MC for RV40
kostya
parents: 8243
diff changeset
759 r->rv30 ? r->s.dsp.put_h264_chroma_pixels_tab
3f3d653fb46d 34l: forgot to change one case of chroma MC for RV40
kostya
parents: 8243
diff changeset
760 : r->s.dsp.put_rv40_chroma_pixels_tab);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
761 rv34_mc(r, block_type, 0, 0, 0, 2, 2, 1, r->rv30,
6106
7185e3bb0614 RV30 thirdpel motion compensation support
kostya
parents: 6099
diff changeset
762 r->rv30 ? r->s.dsp.avg_rv30_tpel_pixels_tab
8221
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
763 : r->s.dsp.avg_rv40_qpel_pixels_tab,
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
764 r->rv30 ? r->s.dsp.avg_h264_chroma_pixels_tab
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
765 : r->s.dsp.avg_rv40_chroma_pixels_tab);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
766 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
767
6693
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
768 static void rv34_mc_2mv_skip(RV34DecContext *r)
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
769 {
8128
e2241dd85c65 Remove unused variable.
diego
parents: 8122
diff changeset
770 int i, j;
6693
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
771 for(j = 0; j < 2; j++)
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
772 for(i = 0; i < 2; i++){
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
773 rv34_mc(r, RV34_MB_P_8x8, i*8, j*8, i+j*r->s.b8_stride, 1, 1, 0, r->rv30,
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
774 r->rv30 ? r->s.dsp.put_rv30_tpel_pixels_tab
8221
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
775 : r->s.dsp.put_rv40_qpel_pixels_tab,
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
776 r->rv30 ? r->s.dsp.put_h264_chroma_pixels_tab
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
777 : r->s.dsp.put_rv40_chroma_pixels_tab);
6693
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
778 rv34_mc(r, RV34_MB_P_8x8, i*8, j*8, i+j*r->s.b8_stride, 1, 1, 1, r->rv30,
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
779 r->rv30 ? r->s.dsp.avg_rv30_tpel_pixels_tab
8221
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
780 : r->s.dsp.avg_rv40_qpel_pixels_tab,
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
781 r->rv30 ? r->s.dsp.avg_h264_chroma_pixels_tab
466100c8e27b Fix RV40 chroma MC
kostya
parents: 8181
diff changeset
782 : r->s.dsp.avg_rv40_chroma_pixels_tab);
6693
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
783 }
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
784 }
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
785
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
786 /** number of motion vectors in each macroblock type */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
787 static const int num_mvs[RV34_MB_TYPES] = { 0, 0, 1, 4, 1, 1, 0, 0, 2, 2, 2, 1 };
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
788
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
789 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
790 * Decode motion vector differences
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
791 * and perform motion vector reconstruction and motion compensation.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
792 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
793 static int rv34_decode_mv(RV34DecContext *r, int block_type)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
794 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
795 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
796 GetBitContext *gb = &s->gb;
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
797 int i, j, k, l;
6693
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
798 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
799 int next_bt;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
800
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
801 memset(r->dmv, 0, sizeof(r->dmv));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
802 for(i = 0; i < num_mvs[block_type]; i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
803 r->dmv[i][0] = svq3_get_se_golomb(gb);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
804 r->dmv[i][1] = svq3_get_se_golomb(gb);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
805 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
806 switch(block_type){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
807 case RV34_MB_TYPE_INTRA:
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
808 case RV34_MB_TYPE_INTRA16x16:
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
809 fill_rectangle(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], 2, 2, s->b8_stride, 0, 4);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
810 return 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
811 case RV34_MB_SKIP:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6156
diff changeset
812 if(s->pict_type == FF_P_TYPE){
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
813 fill_rectangle(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], 2, 2, s->b8_stride, 0, 4);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
814 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
815 break;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
816 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
817 case RV34_MB_B_DIRECT:
6693
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
818 //surprisingly, it uses motion scheme from next reference frame
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
819 next_bt = s->next_picture_ptr->mb_type[s->mb_x + s->mb_y * s->mb_stride];
9162
9f96409c5134 Fix direct and skip MB motion compensation in RV4:
kostya
parents: 9041
diff changeset
820 if(IS_INTRA(next_bt) || IS_SKIP(next_bt)){
9040
71620eeff338 Since motion vectors for intra blocks are always zero, do not try to retrieve them.
kostya
parents: 8827
diff changeset
821 fill_rectangle(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], 2, 2, s->b8_stride, 0, 4);
9162
9f96409c5134 Fix direct and skip MB motion compensation in RV4:
kostya
parents: 9041
diff changeset
822 fill_rectangle(s->current_picture_ptr->motion_val[1][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], 2, 2, s->b8_stride, 0, 4);
9f96409c5134 Fix direct and skip MB motion compensation in RV4:
kostya
parents: 9041
diff changeset
823 }else
9041
05e82eb11983 cosmetics: reindent after last commit
kostya
parents: 9040
diff changeset
824 for(j = 0; j < 2; j++)
05e82eb11983 cosmetics: reindent after last commit
kostya
parents: 9040
diff changeset
825 for(i = 0; i < 2; i++)
05e82eb11983 cosmetics: reindent after last commit
kostya
parents: 9040
diff changeset
826 for(k = 0; k < 2; k++)
05e82eb11983 cosmetics: reindent after last commit
kostya
parents: 9040
diff changeset
827 for(l = 0; l < 2; l++)
05e82eb11983 cosmetics: reindent after last commit
kostya
parents: 9040
diff changeset
828 s->current_picture_ptr->motion_val[l][mv_pos + i + j*s->b8_stride][k] = calc_add_mv(r, l, s->next_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][k]);
9162
9f96409c5134 Fix direct and skip MB motion compensation in RV4:
kostya
parents: 9041
diff changeset
829 if(!(IS_16X8(next_bt) || IS_8X16(next_bt) || IS_8X8(next_bt))) //we can use whole macroblock MC
6693
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
830 rv34_mc_2mv(r, block_type);
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
831 else
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
832 rv34_mc_2mv_skip(r);
6f13852a9161 Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents: 6517
diff changeset
833 fill_rectangle(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], 2, 2, s->b8_stride, 0, 4);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
834 break;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
835 case RV34_MB_P_16x16:
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
836 case RV34_MB_P_MIX16x16:
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
837 rv34_pred_mv(r, block_type, 0, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
838 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
839 break;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
840 case RV34_MB_B_FORWARD:
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
841 case RV34_MB_B_BACKWARD:
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
842 r->dmv[1][0] = r->dmv[0][0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
843 r->dmv[1][1] = r->dmv[0][1];
8099
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
844 if(r->rv30)
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
845 rv34_pred_mv_rv3(r, block_type, block_type == RV34_MB_B_BACKWARD);
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
846 else
bc786a34f6eb Introduce RV3-specific motion vector prediction.
kostya
parents: 8086
diff changeset
847 rv34_pred_mv_b (r, block_type, block_type == RV34_MB_B_BACKWARD);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
848 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, block_type == RV34_MB_B_BACKWARD);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
849 break;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
850 case RV34_MB_P_16x8:
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
851 case RV34_MB_P_8x16:
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
852 rv34_pred_mv(r, block_type, 0, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
853 rv34_pred_mv(r, block_type, 1 + (block_type == RV34_MB_P_16x8), 1);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
854 if(block_type == RV34_MB_P_16x8){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
855 rv34_mc_1mv(r, block_type, 0, 0, 0, 2, 1, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
856 rv34_mc_1mv(r, block_type, 0, 8, s->b8_stride, 2, 1, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
857 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
858 if(block_type == RV34_MB_P_8x16){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
859 rv34_mc_1mv(r, block_type, 0, 0, 0, 1, 2, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
860 rv34_mc_1mv(r, block_type, 8, 0, 1, 1, 2, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
861 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
862 break;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
863 case RV34_MB_B_BIDIR:
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
864 rv34_pred_mv_b (r, block_type, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
865 rv34_pred_mv_b (r, block_type, 1);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
866 rv34_mc_2mv (r, block_type);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
867 break;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
868 case RV34_MB_P_8x8:
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
869 for(i=0;i< 4;i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
870 rv34_pred_mv(r, block_type, i, i);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
871 rv34_mc_1mv (r, block_type, (i&1)<<3, (i&2)<<2, (i&1)+(i>>1)*s->b8_stride, 1, 1, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
872 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
873 break;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
874 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
875
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
876 return 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
877 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
878 /** @} */ // mv group
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
879
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
880 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
881 * @defgroup recons Macroblock reconstruction functions
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
882 * @{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
883 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
884 /** mapping of RV30/40 intra prediction types to standard H.264 types */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
885 static const int ittrans[9] = {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
886 DC_PRED, VERT_PRED, HOR_PRED, DIAG_DOWN_RIGHT_PRED, DIAG_DOWN_LEFT_PRED,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
887 VERT_RIGHT_PRED, VERT_LEFT_PRED, HOR_UP_PRED, HOR_DOWN_PRED,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
888 };
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
889
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
890 /** mapping of RV30/40 intra 16x16 prediction types to standard H.264 types */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
891 static const int ittrans16[4] = {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
892 DC_PRED8x8, VERT_PRED8x8, HOR_PRED8x8, PLANE_PRED8x8,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
893 };
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
894
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
895 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
896 * Perform 4x4 intra prediction.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
897 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
898 static void rv34_pred_4x4_block(RV34DecContext *r, uint8_t *dst, int stride, int itype, int up, int left, int down, int right)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
899 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
900 uint8_t *prev = dst - stride + 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
901 uint32_t topleft;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
902
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
903 if(!up && !left)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
904 itype = DC_128_PRED;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
905 else if(!up){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
906 if(itype == VERT_PRED) itype = HOR_PRED;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
907 if(itype == DC_PRED) itype = LEFT_DC_PRED;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
908 }else if(!left){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
909 if(itype == HOR_PRED) itype = VERT_PRED;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
910 if(itype == DC_PRED) itype = TOP_DC_PRED;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
911 if(itype == DIAG_DOWN_LEFT_PRED) itype = DIAG_DOWN_LEFT_PRED_RV40_NODOWN;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
912 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
913 if(!down){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
914 if(itype == DIAG_DOWN_LEFT_PRED) itype = DIAG_DOWN_LEFT_PRED_RV40_NODOWN;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
915 if(itype == HOR_UP_PRED) itype = HOR_UP_PRED_RV40_NODOWN;
6036
ce3b68242317 Correct spatial prediction mode in RV30/40 for vertical left direction
kostya
parents: 6026
diff changeset
916 if(itype == VERT_LEFT_PRED) itype = VERT_LEFT_PRED_RV40_NODOWN;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
917 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
918 if(!right && up){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
919 topleft = dst[-stride + 3] * 0x01010101;
8721
42e258f2b931 Silence two pointer assignment compiler warnings in rv34.c
kostya
parents: 8718
diff changeset
920 prev = (uint8_t*)&topleft;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
921 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
922 r->h.pred4x4[itype](dst, prev, stride);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
923 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
924
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
925 /** add_pixels_clamped for 4x4 block */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
926 static void rv34_add_4x4_block(uint8_t *dst, int stride, DCTELEM block[64], int off)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
927 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
928 int x, y;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
929 for(y = 0; y < 4; y++)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
930 for(x = 0; x < 4; x++)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
931 dst[x + y*stride] = av_clip_uint8(dst[x + y*stride] + block[off + x+y*8]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
932 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
933
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
934 static inline int adjust_pred16(int itype, int up, int left)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
935 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
936 if(!up && !left)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
937 itype = DC_128_PRED8x8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
938 else if(!up){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
939 if(itype == PLANE_PRED8x8)itype = HOR_PRED8x8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
940 if(itype == VERT_PRED8x8) itype = HOR_PRED8x8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
941 if(itype == DC_PRED8x8) itype = LEFT_DC_PRED8x8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
942 }else if(!left){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
943 if(itype == PLANE_PRED8x8)itype = VERT_PRED8x8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
944 if(itype == HOR_PRED8x8) itype = VERT_PRED8x8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
945 if(itype == DC_PRED8x8) itype = TOP_DC_PRED8x8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
946 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
947 return itype;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
948 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
949
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
950 static void rv34_output_macroblock(RV34DecContext *r, int8_t *intra_types, int cbp, int is16)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
951 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
952 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
953 DSPContext *dsp = &s->dsp;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
954 int i, j;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
955 uint8_t *Y, *U, *V;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
956 int itype;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
957 int avail[6*8] = {0};
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
958 int idx;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
959
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
960 // Set neighbour information.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
961 if(r->avail_cache[0])
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
962 avail[0] = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
963 if(r->avail_cache[1])
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
964 avail[1] = avail[2] = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
965 if(r->avail_cache[2])
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
966 avail[3] = avail[4] = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
967 if(r->avail_cache[3])
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
968 avail[5] = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
969 if(r->avail_cache[4])
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
970 avail[8] = avail[16] = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
971 if(r->avail_cache[8])
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
972 avail[24] = avail[32] = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
973
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
974 Y = s->dest[0];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
975 U = s->dest[1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
976 V = s->dest[2];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
977 if(!is16){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
978 for(j = 0; j < 4; j++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
979 idx = 9 + j*8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
980 for(i = 0; i < 4; i++, cbp >>= 1, Y += 4, idx++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
981 rv34_pred_4x4_block(r, Y, s->linesize, ittrans[intra_types[i]], avail[idx-8], avail[idx-1], avail[idx+7], avail[idx-7]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
982 avail[idx] = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
983 if(cbp & 1)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
984 rv34_add_4x4_block(Y, s->linesize, s->block[(i>>1)+(j&2)], (i&1)*4+(j&1)*32);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
985 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
986 Y += s->linesize * 4 - 4*4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
987 intra_types += s->b4_stride;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
988 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
989 intra_types -= s->b4_stride * 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
990 fill_rectangle(r->avail_cache + 5, 2, 2, 4, 0, 4);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
991 for(j = 0; j < 2; j++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
992 idx = 5 + j*4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
993 for(i = 0; i < 2; i++, cbp >>= 1, idx++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
994 rv34_pred_4x4_block(r, U + i*4 + j*4*s->uvlinesize, s->uvlinesize, ittrans[intra_types[i*2+j*2*s->b4_stride]], r->avail_cache[idx-4], r->avail_cache[idx-1], !i && !j, r->avail_cache[idx-3]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
995 rv34_pred_4x4_block(r, V + i*4 + j*4*s->uvlinesize, s->uvlinesize, ittrans[intra_types[i*2+j*2*s->b4_stride]], r->avail_cache[idx-4], r->avail_cache[idx-1], !i && !j, r->avail_cache[idx-3]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
996 r->avail_cache[idx] = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
997 if(cbp & 0x01)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
998 rv34_add_4x4_block(U + i*4 + j*4*s->uvlinesize, s->uvlinesize, s->block[4], i*4+j*32);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
999 if(cbp & 0x10)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1000 rv34_add_4x4_block(V + i*4 + j*4*s->uvlinesize, s->uvlinesize, s->block[5], i*4+j*32);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1001 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1002 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1003 }else{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1004 itype = ittrans16[intra_types[0]];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1005 itype = adjust_pred16(itype, r->avail_cache[5-4], r->avail_cache[5-1]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1006 r->h.pred16x16[itype](Y, s->linesize);
8180
f4a291734ad7 Eliminate direct use of s->current_picture in RV30/40 decoder
kostya
parents: 8179
diff changeset
1007 dsp->add_pixels_clamped(s->block[0], Y, s->linesize);
f4a291734ad7 Eliminate direct use of s->current_picture in RV30/40 decoder
kostya
parents: 8179
diff changeset
1008 dsp->add_pixels_clamped(s->block[1], Y + 8, s->linesize);
f4a291734ad7 Eliminate direct use of s->current_picture in RV30/40 decoder
kostya
parents: 8179
diff changeset
1009 Y += s->linesize * 8;
f4a291734ad7 Eliminate direct use of s->current_picture in RV30/40 decoder
kostya
parents: 8179
diff changeset
1010 dsp->add_pixels_clamped(s->block[2], Y, s->linesize);
f4a291734ad7 Eliminate direct use of s->current_picture in RV30/40 decoder
kostya
parents: 8179
diff changeset
1011 dsp->add_pixels_clamped(s->block[3], Y + 8, s->linesize);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1012
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1013 itype = ittrans16[intra_types[0]];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1014 if(itype == PLANE_PRED8x8) itype = DC_PRED8x8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1015 itype = adjust_pred16(itype, r->avail_cache[5-4], r->avail_cache[5-1]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1016 r->h.pred8x8[itype](U, s->uvlinesize);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1017 dsp->add_pixels_clamped(s->block[4], U, s->uvlinesize);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1018 r->h.pred8x8[itype](V, s->uvlinesize);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1019 dsp->add_pixels_clamped(s->block[5], V, s->uvlinesize);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1020 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1021 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1022
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1023 /** @} */ // recons group
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1024
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1025 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1026 * @addtogroup bitstream
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1027 * Decode macroblock header and return CBP in case of success, -1 otherwise.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1028 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1029 static int rv34_decode_mb_header(RV34DecContext *r, int8_t *intra_types)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1030 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1031 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1032 GetBitContext *gb = &s->gb;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1033 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1034 int i, t;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1035
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1036 if(!r->si.type){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1037 r->is16 = get_bits1(gb);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1038 if(!r->is16 && !r->rv30){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1039 if(!get_bits1(gb))
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1040 av_log(s->avctx, AV_LOG_ERROR, "Need DQUANT\n");
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1041 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1042 s->current_picture_ptr->mb_type[mb_pos] = r->is16 ? MB_TYPE_INTRA16x16 : MB_TYPE_INTRA;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1043 r->block_type = r->is16 ? RV34_MB_TYPE_INTRA16x16 : RV34_MB_TYPE_INTRA;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1044 }else{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1045 r->block_type = r->decode_mb_info(r);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1046 if(r->block_type == -1)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1047 return -1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1048 s->current_picture_ptr->mb_type[mb_pos] = rv34_mb_type_to_lavc[r->block_type];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1049 r->mb_type[mb_pos] = r->block_type;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1050 if(r->block_type == RV34_MB_SKIP){
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6156
diff changeset
1051 if(s->pict_type == FF_P_TYPE)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1052 r->mb_type[mb_pos] = RV34_MB_P_16x16;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6156
diff changeset
1053 if(s->pict_type == FF_B_TYPE)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1054 r->mb_type[mb_pos] = RV34_MB_B_DIRECT;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1055 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1056 r->is16 = !!IS_INTRA16x16(s->current_picture_ptr->mb_type[mb_pos]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1057 rv34_decode_mv(r, r->block_type);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1058 if(r->block_type == RV34_MB_SKIP){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1059 fill_rectangle(intra_types, 4, 4, s->b4_stride, 0, sizeof(intra_types[0]));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1060 return 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1061 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1062 r->chroma_vlc = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1063 r->luma_vlc = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1064 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1065 if(IS_INTRA(s->current_picture_ptr->mb_type[mb_pos])){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1066 if(r->is16){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1067 t = get_bits(gb, 2);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1068 fill_rectangle(intra_types, 4, 4, s->b4_stride, t, sizeof(intra_types[0]));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1069 r->luma_vlc = 2;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1070 }else{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1071 if(r->decode_intra_types(r, gb, intra_types) < 0)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1072 return -1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1073 r->luma_vlc = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1074 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1075 r->chroma_vlc = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1076 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1077 }else{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1078 for(i = 0; i < 16; i++)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1079 intra_types[(i & 3) + (i>>2) * s->b4_stride] = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1080 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 1);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1081 if(r->mb_type[mb_pos] == RV34_MB_P_MIX16x16){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1082 r->is16 = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1083 r->chroma_vlc = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1084 r->luma_vlc = 2;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1085 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1086 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1087 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1088
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1089 return rv34_decode_cbp(gb, r->cur_vlcs, r->is16);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1090 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1091
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1092 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1093 * @addtogroup recons
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1094 * @{
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1095 */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1096 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1097 * mask for retrieving all bits in coded block pattern
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1098 * corresponding to one 8x8 block
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1099 */
8181
d8f516ca0002 33l Fix applying residue condition in RV30/40 decoder
kostya
parents: 8180
diff changeset
1100 #define LUMA_CBP_BLOCK_MASK 0x33
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1101
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1102 #define U_CBP_MASK 0x0F0000
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1103 #define V_CBP_MASK 0xF00000
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1104
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1105
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1106 static void rv34_apply_differences(RV34DecContext *r, int cbp)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1107 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1108 static const int shifts[4] = { 0, 2, 8, 10 };
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1109 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1110 int i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1111
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1112 for(i = 0; i < 4; i++)
8181
d8f516ca0002 33l Fix applying residue condition in RV30/40 decoder
kostya
parents: 8180
diff changeset
1113 if((cbp & (LUMA_CBP_BLOCK_MASK << shifts[i])) || r->block_type == RV34_MB_P_MIX16x16)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1114 s->dsp.add_pixels_clamped(s->block[i], s->dest[0] + (i & 1)*8 + (i&2)*4*s->linesize, s->linesize);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1115 if(cbp & U_CBP_MASK)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1116 s->dsp.add_pixels_clamped(s->block[4], s->dest[1], s->uvlinesize);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1117 if(cbp & V_CBP_MASK)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1118 s->dsp.add_pixels_clamped(s->block[5], s->dest[2], s->uvlinesize);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1119 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1120
8116
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1121 static int is_mv_diff_gt_3(int16_t (*motion_val)[2], int step)
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1122 {
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1123 int d;
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1124 d = motion_val[0][0] - motion_val[-step][0];
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1125 if(d < -3 || d > 3)
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1126 return 1;
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1127 d = motion_val[0][1] - motion_val[-step][1];
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1128 if(d < -3 || d > 3)
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1129 return 1;
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1130 return 0;
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1131 }
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1132
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1133 static int rv34_set_deblock_coef(RV34DecContext *r)
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1134 {
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1135 MpegEncContext *s = &r->s;
8122
aec296246352 Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents: 8121
diff changeset
1136 int hmvmask = 0, vmvmask = 0, i, j;
8116
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1137 int midx = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1138 int16_t (*motion_val)[2] = s->current_picture_ptr->motion_val[0][midx];
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1139 for(j = 0; j < 16; j += 8){
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1140 for(i = 0; i < 2; i++){
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1141 if(is_mv_diff_gt_3(motion_val + i, 1))
8122
aec296246352 Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents: 8121
diff changeset
1142 vmvmask |= 0x11 << (j + i*2);
8245
7e6ca1be9e40 Fix reading out of buffer during RV30/40 deblock mask calculation
kostya
parents: 8244
diff changeset
1143 if((j || s->mb_y) && is_mv_diff_gt_3(motion_val + i, s->b8_stride))
8122
aec296246352 Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents: 8121
diff changeset
1144 hmvmask |= 0x03 << (j + i*2);
8116
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1145 }
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1146 motion_val += s->b8_stride;
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1147 }
8122
aec296246352 Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents: 8121
diff changeset
1148 if(s->first_slice_line)
aec296246352 Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents: 8121
diff changeset
1149 hmvmask &= ~0x000F;
aec296246352 Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents: 8121
diff changeset
1150 if(!s->mb_x)
aec296246352 Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents: 8121
diff changeset
1151 vmvmask &= ~0x1111;
8368
a7c85cdc11b5 Generate correct deblock pattern for RV30
kostya
parents: 8278
diff changeset
1152 if(r->rv30){ //RV30 marks both subblocks on the edge for filtering
a7c85cdc11b5 Generate correct deblock pattern for RV30
kostya
parents: 8278
diff changeset
1153 vmvmask |= (vmvmask & 0x4444) >> 1;
a7c85cdc11b5 Generate correct deblock pattern for RV30
kostya
parents: 8278
diff changeset
1154 hmvmask |= (hmvmask & 0x0F00) >> 4;
a7c85cdc11b5 Generate correct deblock pattern for RV30
kostya
parents: 8278
diff changeset
1155 if(s->mb_x)
a7c85cdc11b5 Generate correct deblock pattern for RV30
kostya
parents: 8278
diff changeset
1156 r->deblock_coefs[s->mb_x - 1 + s->mb_y*s->mb_stride] |= (vmvmask & 0x1111) << 3;
a7c85cdc11b5 Generate correct deblock pattern for RV30
kostya
parents: 8278
diff changeset
1157 if(!s->first_slice_line)
a7c85cdc11b5 Generate correct deblock pattern for RV30
kostya
parents: 8278
diff changeset
1158 r->deblock_coefs[s->mb_x + (s->mb_y - 1)*s->mb_stride] |= (hmvmask & 0xF) << 12;
a7c85cdc11b5 Generate correct deblock pattern for RV30
kostya
parents: 8278
diff changeset
1159 }
a7c85cdc11b5 Generate correct deblock pattern for RV30
kostya
parents: 8278
diff changeset
1160 return hmvmask | vmvmask;
8116
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1161 }
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1162
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1163 static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1164 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1165 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1166 GetBitContext *gb = &s->gb;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1167 int cbp, cbp2;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1168 int i, blknum, blkoff;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1169 DCTELEM block16[64];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1170 int luma_dc_quant;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1171 int dist;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1172 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1173
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1174 // Calculate which neighbours are available. Maybe it's worth optimizing too.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1175 memset(r->avail_cache, 0, sizeof(r->avail_cache));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1176 fill_rectangle(r->avail_cache + 5, 2, 2, 4, 1, 4);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1177 dist = (s->mb_x - s->resync_mb_x) + (s->mb_y - s->resync_mb_y) * s->mb_width;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1178 if(s->mb_x && dist)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1179 r->avail_cache[4] =
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1180 r->avail_cache[8] = s->current_picture_ptr->mb_type[mb_pos - 1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1181 if(dist >= s->mb_width)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1182 r->avail_cache[1] =
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1183 r->avail_cache[2] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1184 if(((s->mb_x+1) < s->mb_width) && dist >= s->mb_width - 1)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1185 r->avail_cache[3] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride + 1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1186 if(s->mb_x && dist > s->mb_width)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1187 r->avail_cache[0] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride - 1];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1188
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1189 s->qscale = r->si.quant;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1190 cbp = cbp2 = rv34_decode_mb_header(r, intra_types);
8370
edea96e4367b use precalculated mb_pos where available
kostya
parents: 8369
diff changeset
1191 r->cbp_luma [mb_pos] = cbp;
edea96e4367b use precalculated mb_pos where available
kostya
parents: 8369
diff changeset
1192 r->cbp_chroma[mb_pos] = cbp >> 16;
8116
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1193 if(s->pict_type == FF_I_TYPE)
8369
45c3780b1a96 Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents: 8368
diff changeset
1194 r->deblock_coefs[mb_pos] = 0xFFFF;
8116
2d01559f824c Calculating an additional MV-based deblocking pattern is the same
kostya
parents: 8099
diff changeset
1195 else
8369
45c3780b1a96 Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents: 8368
diff changeset
1196 r->deblock_coefs[mb_pos] = rv34_set_deblock_coef(r) | r->cbp_luma[mb_pos];
8370
edea96e4367b use precalculated mb_pos where available
kostya
parents: 8369
diff changeset
1197 s->current_picture_ptr->qscale_table[mb_pos] = s->qscale;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1198
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1199 if(cbp == -1)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1200 return -1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1201
8046
6df5221c3e26 Choose RV3/4 DC quantizer correctly
kostya
parents: 8038
diff changeset
1202 luma_dc_quant = r->block_type == RV34_MB_P_MIX16x16 ? r->luma_dc_quant_p[s->qscale] : r->luma_dc_quant_i[s->qscale];
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1203 if(r->is16){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1204 memset(block16, 0, sizeof(block16));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1205 rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1206 rv34_dequant4x4_16x16(block16, rv34_qscale_tab[luma_dc_quant],rv34_qscale_tab[s->qscale]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1207 rv34_inv_transform_noround(block16);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1208 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1209
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1210 for(i = 0; i < 16; i++, cbp >>= 1){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1211 if(!r->is16 && !(cbp & 1)) continue;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1212 blknum = ((i & 2) >> 1) + ((i & 8) >> 2);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1213 blkoff = ((i & 1) << 2) + ((i & 4) << 3);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1214 if(cbp & 1)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1215 rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->luma_vlc, 0);
8046
6df5221c3e26 Choose RV3/4 DC quantizer correctly
kostya
parents: 8038
diff changeset
1216 rv34_dequant4x4(s->block[blknum] + blkoff, rv34_qscale_tab[s->qscale],rv34_qscale_tab[s->qscale]);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1217 if(r->is16) //FIXME: optimize
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1218 s->block[blknum][blkoff] = block16[(i & 3) | ((i & 0xC) << 1)];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1219 rv34_inv_transform(s->block[blknum] + blkoff);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1220 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1221 if(r->block_type == RV34_MB_P_MIX16x16)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1222 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 1);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1223 for(; i < 24; i++, cbp >>= 1){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1224 if(!(cbp & 1)) continue;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1225 blknum = ((i & 4) >> 2) + 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1226 blkoff = ((i & 1) << 2) + ((i & 2) << 4);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1227 rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->chroma_vlc, 1);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1228 rv34_dequant4x4(s->block[blknum] + blkoff, rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]],rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1229 rv34_inv_transform(s->block[blknum] + blkoff);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1230 }
8370
edea96e4367b use precalculated mb_pos where available
kostya
parents: 8369
diff changeset
1231 if(IS_INTRA(s->current_picture_ptr->mb_type[mb_pos]))
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1232 rv34_output_macroblock(r, intra_types, cbp2, r->is16);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1233 else
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1234 rv34_apply_differences(r, cbp2);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1235
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1236 return 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1237 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1238
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1239 static int check_slice_end(RV34DecContext *r, MpegEncContext *s)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1240 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1241 int bits;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1242 if(s->mb_y >= s->mb_height)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1243 return 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1244 if(!s->mb_num_left)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1245 return 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1246 if(r->s.mb_skip_run > 1)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1247 return 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1248 bits = r->bits - get_bits_count(&s->gb);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1249 if(bits < 0 || (bits < 8 && !show_bits(&s->gb, bits)))
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1250 return 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1251 return 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1252 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1253
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1254 static inline int slice_compare(SliceInfo *si1, SliceInfo *si2)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1255 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1256 return si1->type != si2->type ||
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1257 si1->start >= si2->start ||
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1258 si1->width != si2->width ||
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
1259 si1->height != si2->height||
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
1260 si1->pts != si2->pts;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1261 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1262
8371
2ebc9b2c7459 add const qualifier to some pointers for input data
kostya
parents: 8370
diff changeset
1263 static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int buf_size)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1264 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1265 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1266 GetBitContext *gb = &s->gb;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1267 int mb_pos;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1268 int res;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1269
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1270 init_get_bits(&r->s.gb, buf, buf_size*8);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1271 res = r->parse_slice_header(r, gb, &r->si);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1272 if(res < 0){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1273 av_log(s->avctx, AV_LOG_ERROR, "Incorrect or unknown slice header\n");
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1274 return -1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1275 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1276
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1277 if ((s->mb_x == 0 && s->mb_y == 0) || s->current_picture_ptr==NULL) {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1278 if(s->width != r->si.width || s->height != r->si.height){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1279 av_log(s->avctx, AV_LOG_DEBUG, "Changing dimensions to %dx%d\n", r->si.width,r->si.height);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1280 MPV_common_end(s);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1281 s->width = r->si.width;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1282 s->height = r->si.height;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1283 if(MPV_common_init(s) < 0)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1284 return -1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1285 r->intra_types_hist = av_realloc(r->intra_types_hist, s->b4_stride * 4 * 2 * sizeof(*r->intra_types_hist));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1286 r->intra_types = r->intra_types_hist + s->b4_stride * 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1287 r->mb_type = av_realloc(r->mb_type, r->s.mb_stride * r->s.mb_height * sizeof(*r->mb_type));
6155
a425bdc70ac5 Save coded block patterns for future loop filtering.
kostya
parents: 6121
diff changeset
1288 r->cbp_luma = av_realloc(r->cbp_luma, r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_luma));
a425bdc70ac5 Save coded block patterns for future loop filtering.
kostya
parents: 6121
diff changeset
1289 r->cbp_chroma = av_realloc(r->cbp_chroma, r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_chroma));
8037
b6d93bef844a RV3 and RV4 decoders set some deblocking coefs for each macroblock,
kostya
parents: 8036
diff changeset
1290 r->deblock_coefs = av_realloc(r->deblock_coefs, r->s.mb_stride * r->s.mb_height * sizeof(*r->deblock_coefs));
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1291 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6156
diff changeset
1292 s->pict_type = r->si.type ? r->si.type : FF_I_TYPE;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1293 if(MPV_frame_start(s, s->avctx) < 0)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1294 return -1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1295 ff_er_frame_start(s);
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
1296 r->cur_pts = r->si.pts;
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
1297 if(s->pict_type != FF_B_TYPE){
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
1298 r->last_pts = r->next_pts;
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
1299 r->next_pts = r->cur_pts;
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6693
diff changeset
1300 }
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1301 s->mb_x = s->mb_y = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1302 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1303
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1304 r->si.end = end;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1305 s->qscale = r->si.quant;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1306 r->bits = buf_size*8;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1307 s->mb_num_left = r->si.end - r->si.start;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1308 r->s.mb_skip_run = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1309
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1310 mb_pos = s->mb_x + s->mb_y * s->mb_width;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1311 if(r->si.start != mb_pos){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1312 av_log(s->avctx, AV_LOG_ERROR, "Slice indicates MB offset %d, got %d\n", r->si.start, mb_pos);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1313 s->mb_x = r->si.start % s->mb_width;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1314 s->mb_y = r->si.start / s->mb_width;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1315 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1316 memset(r->intra_types_hist, -1, s->b4_stride * 4 * 2 * sizeof(*r->intra_types_hist));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1317 s->first_slice_line = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1318 s->resync_mb_x= s->mb_x;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1319 s->resync_mb_y= s->mb_y;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1320
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1321 ff_init_block_index(s);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1322 while(!check_slice_end(r, s)) {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1323 ff_update_block_index(s);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1324 s->dsp.clear_blocks(s->block[0]);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1325
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1326 if(rv34_decode_macroblock(r, r->intra_types + s->mb_x * 4 + 1) < 0){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1327 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_ERROR|DC_ERROR|MV_ERROR);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1328 return -1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1329 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1330 if (++s->mb_x == s->mb_width) {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1331 s->mb_x = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1332 s->mb_y++;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1333 ff_init_block_index(s);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1334
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1335 memmove(r->intra_types_hist, r->intra_types, s->b4_stride * 4 * sizeof(*r->intra_types_hist));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1336 memset(r->intra_types, -1, s->b4_stride * 4 * sizeof(*r->intra_types_hist));
8224
6771b3544991 Invoke future RV30/40 loop filter for already decoded rows instead of
kostya
parents: 8221
diff changeset
1337
6771b3544991 Invoke future RV30/40 loop filter for already decoded rows instead of
kostya
parents: 8221
diff changeset
1338 if(r->loop_filter && s->mb_y >= 2)
6771b3544991 Invoke future RV30/40 loop filter for already decoded rows instead of
kostya
parents: 8221
diff changeset
1339 r->loop_filter(r, s->mb_y - 2);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1340 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1341 if(s->mb_x == s->resync_mb_x)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1342 s->first_slice_line=0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1343 s->mb_num_left--;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1344 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1345 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1346
6750
c93570aeb3eb Remove unnecessary parentheses from return calls.
diego
parents: 6714
diff changeset
1347 return s->mb_y == s->mb_height;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1348 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1349
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1350 /** @} */ // recons group end
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1351
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1352 /**
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1353 * Initialize decoder.
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1354 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
1355 av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1356 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1357 RV34DecContext *r = avctx->priv_data;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1358 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1359
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1360 MPV_decode_defaults(s);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1361 s->avctx= avctx;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1362 s->out_format = FMT_H263;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1363 s->codec_id= avctx->codec_id;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1364
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1365 s->width = avctx->width;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1366 s->height = avctx->height;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1367
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1368 r->s.avctx = avctx;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1369 avctx->flags |= CODEC_FLAG_EMU_EDGE;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1370 r->s.flags |= CODEC_FLAG_EMU_EDGE;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1371 avctx->pix_fmt = PIX_FMT_YUV420P;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1372 avctx->has_b_frames = 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1373 s->low_delay = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1374
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1375 if (MPV_common_init(s) < 0)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1376 return -1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1377
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1378 ff_h264_pred_init(&r->h, CODEC_ID_RV40);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1379
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1380 r->intra_types_hist = av_malloc(s->b4_stride * 4 * 2 * sizeof(*r->intra_types_hist));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1381 r->intra_types = r->intra_types_hist + s->b4_stride * 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1382
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1383 r->mb_type = av_mallocz(r->s.mb_stride * r->s.mb_height * sizeof(*r->mb_type));
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1384
6155
a425bdc70ac5 Save coded block patterns for future loop filtering.
kostya
parents: 6121
diff changeset
1385 r->cbp_luma = av_malloc(r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_luma));
a425bdc70ac5 Save coded block patterns for future loop filtering.
kostya
parents: 6121
diff changeset
1386 r->cbp_chroma = av_malloc(r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_chroma));
8037
b6d93bef844a RV3 and RV4 decoders set some deblocking coefs for each macroblock,
kostya
parents: 8036
diff changeset
1387 r->deblock_coefs = av_malloc(r->s.mb_stride * r->s.mb_height * sizeof(*r->deblock_coefs));
6155
a425bdc70ac5 Save coded block patterns for future loop filtering.
kostya
parents: 6121
diff changeset
1388
9568
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
1389 if(!intra_vlcs[0].cbppattern[0].bits)
976a7ad342af Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents: 9554
diff changeset
1390 rv34_init_tables();
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1391
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1392 return 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1393 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1394
8371
2ebc9b2c7459 add const qualifier to some pointers for input data
kostya
parents: 8370
diff changeset
1395 static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1396 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1397 if(avctx->slice_count) return avctx->slice_offset[n];
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1398 else return AV_RL32(buf + n*8 - 4) == 1 ? AV_RL32(buf + n*8) : AV_RB32(buf + n*8);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1399 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1400
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1401 int ff_rv34_decode_frame(AVCodecContext *avctx,
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1402 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9168
diff changeset
1403 AVPacket *avpkt)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1404 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9168
diff changeset
1405 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9168
diff changeset
1406 int buf_size = avpkt->size;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1407 RV34DecContext *r = avctx->priv_data;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1408 MpegEncContext *s = &r->s;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1409 AVFrame *pict = data;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1410 SliceInfo si;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1411 int i;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1412 int slice_count;
8371
2ebc9b2c7459 add const qualifier to some pointers for input data
kostya
parents: 8370
diff changeset
1413 const uint8_t *slices_hdr = NULL;
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1414 int last = 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1415
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1416 /* no supplementary picture */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1417 if (buf_size == 0) {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1418 /* special case for last picture */
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1419 if (s->low_delay==0 && s->next_picture_ptr) {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1420 *pict= *(AVFrame*)s->next_picture_ptr;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1421 s->next_picture_ptr= NULL;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1422
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1423 *data_size = sizeof(AVFrame);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1424 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1425 return 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1426 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1427
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1428 if(!avctx->slice_count){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1429 slice_count = (*buf++) + 1;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1430 slices_hdr = buf + 4;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1431 buf += 8 * slice_count;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1432 }else
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1433 slice_count = avctx->slice_count;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1434
8754
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1435 //parse first slice header to check whether this frame can be decoded
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1436 if(get_slice_offset(avctx, slices_hdr, 0) > buf_size){
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1437 av_log(avctx, AV_LOG_ERROR, "Slice offset is greater than frame size\n");
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1438 return -1;
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1439 }
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1440 init_get_bits(&s->gb, buf+get_slice_offset(avctx, slices_hdr, 0), buf_size-get_slice_offset(avctx, slices_hdr, 0));
8821
58706d84c938 In RV3/4 nonzero MB offset for the first slice also indicates error
kostya
parents: 8754
diff changeset
1441 if(r->parse_slice_header(r, &r->s.gb, &si) < 0 || si.start){
8754
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1442 av_log(avctx, AV_LOG_ERROR, "First slice header is incorrect\n");
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1443 return -1;
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1444 }
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1445 if((!s->last_picture_ptr || !s->last_picture_ptr->data[0]) && si.type == FF_B_TYPE)
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1446 return -1;
8827
03ea23e85f42 Enable dropping frames for RV3/4
kostya
parents: 8821
diff changeset
1447 /* skip b frames if we are in a hurry */
03ea23e85f42 Enable dropping frames for RV3/4
kostya
parents: 8821
diff changeset
1448 if(avctx->hurry_up && si.type==FF_B_TYPE) return buf_size;
03ea23e85f42 Enable dropping frames for RV3/4
kostya
parents: 8821
diff changeset
1449 if( (avctx->skip_frame >= AVDISCARD_NONREF && si.type==FF_B_TYPE)
03ea23e85f42 Enable dropping frames for RV3/4
kostya
parents: 8821
diff changeset
1450 || (avctx->skip_frame >= AVDISCARD_NONKEY && si.type!=FF_I_TYPE)
03ea23e85f42 Enable dropping frames for RV3/4
kostya
parents: 8821
diff changeset
1451 || avctx->skip_frame >= AVDISCARD_ALL)
03ea23e85f42 Enable dropping frames for RV3/4
kostya
parents: 8821
diff changeset
1452 return buf_size;
03ea23e85f42 Enable dropping frames for RV3/4
kostya
parents: 8821
diff changeset
1453 /* skip everything if we are in a hurry>=5 */
03ea23e85f42 Enable dropping frames for RV3/4
kostya
parents: 8821
diff changeset
1454 if(avctx->hurry_up>=5)
03ea23e85f42 Enable dropping frames for RV3/4
kostya
parents: 8821
diff changeset
1455 return buf_size;
8754
f471abd09fef Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents: 8721
diff changeset
1456
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1457 for(i=0; i<slice_count; i++){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1458 int offset= get_slice_offset(avctx, slices_hdr, i);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1459 int size;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1460 if(i+1 == slice_count)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1461 size= buf_size - offset;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1462 else
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1463 size= get_slice_offset(avctx, slices_hdr, i+1) - offset;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1464
8243
d5949e5d36f3 Check RV30/40 slice offsets to be inside buffer.
kostya
parents: 8242
diff changeset
1465 if(offset > buf_size){
d5949e5d36f3 Check RV30/40 slice offsets to be inside buffer.
kostya
parents: 8242
diff changeset
1466 av_log(avctx, AV_LOG_ERROR, "Slice offset is greater than frame size\n");
d5949e5d36f3 Check RV30/40 slice offsets to be inside buffer.
kostya
parents: 8242
diff changeset
1467 break;
d5949e5d36f3 Check RV30/40 slice offsets to be inside buffer.
kostya
parents: 8242
diff changeset
1468 }
d5949e5d36f3 Check RV30/40 slice offsets to be inside buffer.
kostya
parents: 8242
diff changeset
1469
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1470 r->si.end = s->mb_width * s->mb_height;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1471 if(i+1 < slice_count){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1472 init_get_bits(&s->gb, buf+get_slice_offset(avctx, slices_hdr, i+1), (buf_size-get_slice_offset(avctx, slices_hdr, i+1))*8);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1473 if(r->parse_slice_header(r, &r->s.gb, &si) < 0){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1474 if(i+2 < slice_count)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1475 size = get_slice_offset(avctx, slices_hdr, i+2) - offset;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1476 else
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1477 size = buf_size - offset;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1478 }else
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1479 r->si.end = si.start;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1480 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1481 last = rv34_decode_slice(r, r->si.end, buf + offset, size);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1482 s->mb_num_left = r->s.mb_x + r->s.mb_y*r->s.mb_width - r->si.start;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1483 if(last)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1484 break;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1485 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1486
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1487 if(last){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1488 if(r->loop_filter)
8224
6771b3544991 Invoke future RV30/40 loop filter for already decoded rows instead of
kostya
parents: 8221
diff changeset
1489 r->loop_filter(r, s->mb_height - 1);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1490 ff_er_frame_end(s);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1491 MPV_frame_end(s);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6156
diff changeset
1492 if (s->pict_type == FF_B_TYPE || s->low_delay) {
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1493 *pict= *(AVFrame*)s->current_picture_ptr;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1494 } else if (s->last_picture_ptr != NULL) {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1495 *pict= *(AVFrame*)s->last_picture_ptr;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1496 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1497
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1498 if(s->last_picture_ptr || s->low_delay){
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1499 *data_size = sizeof(AVFrame);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1500 ff_print_debug_info(s, pict);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1501 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1502 s->current_picture_ptr= NULL; //so we can detect if frame_end wasnt called (find some nicer solution...)
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1503 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1504 return buf_size;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1505 }
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1506
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
1507 av_cold int ff_rv34_decode_end(AVCodecContext *avctx)
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1508 {
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1509 RV34DecContext *r = avctx->priv_data;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1510
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1511 MPV_common_end(&r->s);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1512
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1513 av_freep(&r->intra_types_hist);
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1514 r->intra_types = NULL;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1515 av_freep(&r->mb_type);
8038
efc935702bce 34l: free RV3/4 context variables at the end
kostya
parents: 8037
diff changeset
1516 av_freep(&r->cbp_luma);
efc935702bce 34l: free RV3/4 context variables at the end
kostya
parents: 8037
diff changeset
1517 av_freep(&r->cbp_chroma);
efc935702bce 34l: free RV3/4 context variables at the end
kostya
parents: 8037
diff changeset
1518 av_freep(&r->deblock_coefs);
6026
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1519
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1520 return 0;
49c086b24908 RV30/40 decoding core
kostya
parents:
diff changeset
1521 }