annotate libmpeg2/slice.c @ 36:846535ace7a2

libmpeg2-0.2.0 merge
author arpi_esp
date Sun, 04 Mar 2001 21:01:54 +0000
parents 3b5f5d1c5041
children 0d76b2b962ad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 /*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2 * slice.c
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
3 * Copyright (C) 1999-2001 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
4 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
5 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
6 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
7 * mpeg2dec is free software; you can redistribute it and/or modify
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
10 * (at your option) any later version.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
11 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
12 * mpeg2dec is distributed in the hope that it will be useful,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
15 * GNU General Public License for more details.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
16 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
20 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
21
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
22 #include "config.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
23
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
24 #include <string.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
25 #include <inttypes.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
26
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
27 #include "video_out.h"
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
28 #include "mpeg2_internal.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
29 #include "attributes.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
30
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31 extern mc_functions_t mc_functions;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
32 extern void (* idct_block_copy) (int16_t * block, uint8_t * dest, int stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33 extern void (* idct_block_add) (int16_t * block, uint8_t * dest, int stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
34
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35 #include "vlc.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37 static int non_linear_quantizer_scale [] = {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 0, 1, 2, 3, 4, 5, 6, 7,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39 8, 10, 12, 14, 16, 18, 20, 22,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40 24, 28, 32, 36, 40, 44, 48, 52,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41 56, 64, 72, 80, 88, 96, 104, 112
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
42 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
44 static inline int get_macroblock_modes (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
46 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
47 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
48 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49 int macroblock_modes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 MBtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
52 switch (picture->picture_coding_type) {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53 case I_TYPE:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
55 tab = MB_I + UBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 DUMPBITS (bit_buf, bits, tab->len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57 macroblock_modes = tab->modes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
59 if ((! (picture->frame_pred_frame_dct)) &&
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
60 (picture->picture_structure == FRAME_PICTURE)) {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 macroblock_modes |= UBITS (bit_buf, 1) * DCT_TYPE_INTERLACED;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 return macroblock_modes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 case P_TYPE:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 tab = MB_P + UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 DUMPBITS (bit_buf, bits, tab->len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 macroblock_modes = tab->modes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
73 if (picture->picture_structure != FRAME_PICTURE) {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 macroblock_modes |= UBITS (bit_buf, 2) * MOTION_TYPE_BASE;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 DUMPBITS (bit_buf, bits, 2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 return macroblock_modes;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
79 } else if (picture->frame_pred_frame_dct) {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 macroblock_modes |= MC_FRAME;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 return macroblock_modes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 macroblock_modes |= UBITS (bit_buf, 2) * MOTION_TYPE_BASE;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86 DUMPBITS (bit_buf, bits, 2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88 if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 macroblock_modes |= UBITS (bit_buf, 1) * DCT_TYPE_INTERLACED;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 return macroblock_modes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 case B_TYPE:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 tab = MB_B + UBITS (bit_buf, 6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 DUMPBITS (bit_buf, bits, tab->len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 macroblock_modes = tab->modes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
101 if (picture->picture_structure != FRAME_PICTURE) {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 if (! (macroblock_modes & MACROBLOCK_INTRA)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 macroblock_modes |= UBITS (bit_buf, 2) * MOTION_TYPE_BASE;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 DUMPBITS (bit_buf, bits, 2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 return macroblock_modes;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
107 } else if (picture->frame_pred_frame_dct) {
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
108 /* if (! (macroblock_modes & MACROBLOCK_INTRA)) */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 macroblock_modes |= MC_FRAME;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 return macroblock_modes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 if (macroblock_modes & MACROBLOCK_INTRA)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 goto intra;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 macroblock_modes |= UBITS (bit_buf, 2) * MOTION_TYPE_BASE;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 DUMPBITS (bit_buf, bits, 2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 intra:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 macroblock_modes |= UBITS (bit_buf, 1) * DCT_TYPE_INTERLACED;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 return macroblock_modes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 case D_TYPE:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 return MACROBLOCK_INTRA;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 default:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
137 static inline int get_quantizer_scale (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
139 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
140 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
141 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 int quantizer_scale_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 quantizer_scale_code = UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 DUMPBITS (bit_buf, bits, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
148 if (picture->q_scale_type)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 return non_linear_quantizer_scale [quantizer_scale_code];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 return quantizer_scale_code << 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
157 static inline int get_motion_delta (picture_t * picture, int f_code)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
159 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
160 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
161 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 int delta;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 int sign;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 MVtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 if (bit_buf & 0x80000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 } else if (bit_buf >= 0x0c000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172 tab = MV_4 + UBITS (bit_buf, 4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 delta = (tab->delta << f_code) + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 bits += tab->len + f_code + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 bit_buf <<= tab->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 sign = SBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178 bit_buf <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
179
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
180 if (f_code)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
181 delta += UBITS (bit_buf, f_code);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182 bit_buf <<= f_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184 return (delta ^ sign) - sign;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
186 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
188 tab = MV_10 + UBITS (bit_buf, 10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 delta = (tab->delta << f_code) + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190 bits += tab->len + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191 bit_buf <<= tab->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193 sign = SBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 bit_buf <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 if (f_code) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198 delta += UBITS (bit_buf, f_code);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 DUMPBITS (bit_buf, bits, f_code);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202 return (delta ^ sign) - sign;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 static inline int bound_motion_vector (int vector, int f_code)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212 #if 1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 int limit;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 limit = 16 << f_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 if (vector >= limit)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 return vector - 2*limit;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219 else if (vector < -limit)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 return vector + 2*limit;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221 else return vector;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 return (vector << (27 - f_code)) >> (27 - f_code);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
227 static inline int get_dmv (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
229 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
230 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
231 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 DMVtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235 tab = DMV_2 + UBITS (bit_buf, 2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 DUMPBITS (bit_buf, bits, tab->len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237 return tab->dmv;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
239 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
240 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
243 static inline int get_coded_block_pattern (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
245 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
246 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
247 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 CBPtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
253 if (bit_buf >= 0x20000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255 tab = CBP_7 - 16 + UBITS (bit_buf, 7);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 DUMPBITS (bit_buf, bits, tab->len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 return tab->cbp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261 tab = CBP_9 + UBITS (bit_buf, 9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262 DUMPBITS (bit_buf, bits, tab->len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 return tab->cbp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
267 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
268 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
269 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
271 static inline int get_luma_dc_dct_diff (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
272 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
273 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
274 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
275 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
276 DCtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
277 int size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
278 int dc_diff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 if (bit_buf < 0xf8000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 tab = DC_lum_5 + UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282 size = tab->size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
283 if (size) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
284 bits += tab->len + size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
285 bit_buf <<= tab->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286 dc_diff =
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
287 UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
288 bit_buf <<= size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289 return dc_diff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
290 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 DUMPBITS (bit_buf, bits, 3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295 tab = DC_long - 0x1e0 + UBITS (bit_buf, 9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 size = tab->size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 DUMPBITS (bit_buf, bits, tab->len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
300 DUMPBITS (bit_buf, bits, size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
301 return dc_diff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
302 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
303 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
304 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
305 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
306 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
307
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
308 static inline int get_chroma_dc_dct_diff (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
309 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
310 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
311 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
312 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
313 DCtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
314 int size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
315 int dc_diff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
316
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
317 if (bit_buf < 0xf8000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
318 tab = DC_chrom_5 + UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
319 size = tab->size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
320 if (size) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
321 bits += tab->len + size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
322 bit_buf <<= tab->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
323 dc_diff =
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
324 UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
325 bit_buf <<= size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
326 return dc_diff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
327 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
328 DUMPBITS (bit_buf, bits, 2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
329 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
330 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
331 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
332 tab = DC_long - 0x3e0 + UBITS (bit_buf, 10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
333 size = tab->size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 DUMPBITS (bit_buf, bits, tab->len + 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336 dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337 DUMPBITS (bit_buf, bits, size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
338 return dc_diff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
339 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
340 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
341 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
342 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
344
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
345 #define SATURATE(val) \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
346 do { \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
347 if ((uint32_t)(val + 2048) > 4095) \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
348 val = (val > 0) ? 2047 : -2048; \
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
349 } while (0)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
350
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
351 static void get_intra_block_B14 (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
352 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
353 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
354 int j;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
355 int val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
356 uint8_t * scan = picture->scan;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
357 uint8_t * quant_matrix = picture->intra_quantizer_matrix;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
358 int quantizer_scale = picture->quantizer_scale;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
359 int mismatch;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
360 DCTtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
361 uint32_t bit_buf;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
362 int bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
363 uint8_t * bit_ptr;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
364 int16_t * dest;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
365
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
366 dest = picture->DCTblock;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
367 i = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
368 mismatch = ~dest[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
369
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
370 bit_buf = picture->bitstream_buf;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
371 bits = picture->bitstream_bits;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
372 bit_ptr = picture->bitstream_ptr;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
373
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
374 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
375
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
376 while (1) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
377 if (bit_buf >= 0x28000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
378
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
379 tab = DCT_B14AC_5 - 5 + UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
380
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
381 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
382 if (i >= 64)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
383 break; /* end of block */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
384
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
385 normal_code:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
386 j = scan[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
387 bit_buf <<= tab->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
388 bits += tab->len + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
389 val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
390
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
391 /* if (bitstream_get (1)) val = -val; */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
392 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
393
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
394 SATURATE (val);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
395 dest[j] = val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
396 mismatch ^= val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
397
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
398 bit_buf <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
399 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
400
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
401 continue;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
402
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
403 } else if (bit_buf >= 0x04000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
404
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
405 tab = DCT_B14_8 - 4 + UBITS (bit_buf, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
406
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
407 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
408 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
409 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
410
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
411 /* escape code */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
412
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
413 i += UBITS (bit_buf << 6, 6) - 64;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
414 if (i >= 64)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
415 break; /* illegal, check needed to avoid buffer overflow */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
416
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
417 j = scan[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
418
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
419 DUMPBITS (bit_buf, bits, 12);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
420 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
421 val = (SBITS (bit_buf, 12) *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
422 quantizer_scale * quant_matrix[j]) / 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
423
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
424 SATURATE (val);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
425 dest[j] = val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
426 mismatch ^= val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
427
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
428 DUMPBITS (bit_buf, bits, 12);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
429 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
430
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
431 continue;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
432
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
433 } else if (bit_buf >= 0x02000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
434 tab = DCT_B14_10 - 8 + UBITS (bit_buf, 10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
435 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
436 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
437 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
438 } else if (bit_buf >= 0x00800000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
439 tab = DCT_13 - 16 + UBITS (bit_buf, 13);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
440 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
441 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
442 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
443 } else if (bit_buf >= 0x00200000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
444 tab = DCT_15 - 16 + UBITS (bit_buf, 15);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
445 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
446 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
447 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
448 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
449 tab = DCT_16 + UBITS (bit_buf, 16);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
450 bit_buf <<= 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
451 GETWORD (bit_buf, bits + 16, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
452 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
453 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
454 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
455 }
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
456 break; /* illegal, check needed to avoid buffer overflow */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
457 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
458 dest[63] ^= mismatch & 1;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
459 DUMPBITS (bit_buf, bits, 2); /* dump end of block code */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
460 picture->bitstream_buf = bit_buf;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
461 picture->bitstream_bits = bits;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
462 picture->bitstream_ptr = bit_ptr;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
463 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
464
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
465 static void get_intra_block_B15 (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
466 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
467 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
468 int j;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
469 int val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
470 uint8_t * scan = picture->scan;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
471 uint8_t * quant_matrix = picture->intra_quantizer_matrix;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
472 int quantizer_scale = picture->quantizer_scale;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
473 int mismatch;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
474 DCTtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
475 uint32_t bit_buf;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
476 int bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
477 uint8_t * bit_ptr;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
478 int16_t * dest;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
479
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
480 dest = picture->DCTblock;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
481 i = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
482 mismatch = ~dest[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
483
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
484 bit_buf = picture->bitstream_buf;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
485 bits = picture->bitstream_bits;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
486 bit_ptr = picture->bitstream_ptr;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
487
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
488 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
489
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
490 while (1) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
491 if (bit_buf >= 0x04000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
492
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
493 tab = DCT_B15_8 - 4 + UBITS (bit_buf, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
494
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
495 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
496 if (i < 64) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
497
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
498 normal_code:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
499 j = scan[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
500 bit_buf <<= tab->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
501 bits += tab->len + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
502 val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
503
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
504 /* if (bitstream_get (1)) val = -val; */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
505 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
506
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
507 SATURATE (val);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
508 dest[j] = val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
509 mismatch ^= val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
510
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
511 bit_buf <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
512 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
513
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
514 continue;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
515
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
516 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
517
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
518 /* end of block. I commented out this code because if we */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
519 /* dont exit here we will still exit at the later test :) */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
520
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
521 /* if (i >= 128) break; */ /* end of block */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
522
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
523 /* escape code */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
524
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
525 i += UBITS (bit_buf << 6, 6) - 64;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
526 if (i >= 64)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
527 break; /* illegal, check against buffer overflow */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
528
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
529 j = scan[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
530
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
531 DUMPBITS (bit_buf, bits, 12);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
532 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
533 val = (SBITS (bit_buf, 12) *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
534 quantizer_scale * quant_matrix[j]) / 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
535
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
536 SATURATE (val);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
537 dest[j] = val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
538 mismatch ^= val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
539
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
540 DUMPBITS (bit_buf, bits, 12);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
541 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
542
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
543 continue;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
544
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
545 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
546 } else if (bit_buf >= 0x02000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
547 tab = DCT_B15_10 - 8 + UBITS (bit_buf, 10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
548 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
549 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
550 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
551 } else if (bit_buf >= 0x00800000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
552 tab = DCT_13 - 16 + UBITS (bit_buf, 13);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
553 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
554 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
555 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
556 } else if (bit_buf >= 0x00200000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
557 tab = DCT_15 - 16 + UBITS (bit_buf, 15);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
558 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
559 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
560 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
561 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
562 tab = DCT_16 + UBITS (bit_buf, 16);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
563 bit_buf <<= 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
564 GETWORD (bit_buf, bits + 16, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
565 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
566 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
567 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
568 }
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
569 break; /* illegal, check needed to avoid buffer overflow */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
570 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
571 dest[63] ^= mismatch & 1;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
572 DUMPBITS (bit_buf, bits, 4); /* dump end of block code */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
573 picture->bitstream_buf = bit_buf;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
574 picture->bitstream_bits = bits;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
575 picture->bitstream_ptr = bit_ptr;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
576 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
577
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
578 static void get_non_intra_block (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
579 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
580 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
581 int j;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
582 int val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
583 uint8_t * scan = picture->scan;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
584 uint8_t * quant_matrix = picture->non_intra_quantizer_matrix;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
585 int quantizer_scale = picture->quantizer_scale;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
586 int mismatch;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
587 DCTtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
588 uint32_t bit_buf;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
589 int bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
590 uint8_t * bit_ptr;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
591 int16_t * dest;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
592
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
593 i = -1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
594 mismatch = 1;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
595 dest = picture->DCTblock;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
596
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
597 bit_buf = picture->bitstream_buf;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
598 bits = picture->bitstream_bits;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
599 bit_ptr = picture->bitstream_ptr;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
600
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
601 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
602 if (bit_buf >= 0x28000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
603 tab = DCT_B14DC_5 - 5 + UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
604 goto entry_1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
605 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
606 goto entry_2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
607
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
608 while (1) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
609 if (bit_buf >= 0x28000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
610
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
611 tab = DCT_B14AC_5 - 5 + UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
612
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
613 entry_1:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
614 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
615 if (i >= 64)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
616 break; /* end of block */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
617
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
618 normal_code:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
619 j = scan[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
620 bit_buf <<= tab->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
621 bits += tab->len + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
622 val = ((2*tab->level+1) * quantizer_scale * quant_matrix[j]) >> 5;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
623
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
624 /* if (bitstream_get (1)) val = -val; */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
625 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
626
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
627 SATURATE (val);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
628 dest[j] = val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
629 mismatch ^= val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
630
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
631 bit_buf <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
632 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
633
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
634 continue;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
635
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
636 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
637
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
638 entry_2:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
639 if (bit_buf >= 0x04000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
640
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
641 tab = DCT_B14_8 - 4 + UBITS (bit_buf, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
642
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
643 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
644 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
645 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
646
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
647 /* escape code */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
648
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
649 i += UBITS (bit_buf << 6, 6) - 64;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
650 if (i >= 64)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
651 break; /* illegal, check needed to avoid buffer overflow */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
652
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
653 j = scan[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
654
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
655 DUMPBITS (bit_buf, bits, 12);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
656 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
657 val = 2 * (SBITS (bit_buf, 12) + SBITS (bit_buf, 1)) + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
658 val = (val * quantizer_scale * quant_matrix[j]) / 32;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
659
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
660 SATURATE (val);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
661 dest[j] = val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
662 mismatch ^= val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
663
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
664 DUMPBITS (bit_buf, bits, 12);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
665 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
666
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
667 continue;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
668
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
669 } else if (bit_buf >= 0x02000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
670 tab = DCT_B14_10 - 8 + UBITS (bit_buf, 10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
671 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
672 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
673 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
674 } else if (bit_buf >= 0x00800000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
675 tab = DCT_13 - 16 + UBITS (bit_buf, 13);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
676 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
677 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
678 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
679 } else if (bit_buf >= 0x00200000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
680 tab = DCT_15 - 16 + UBITS (bit_buf, 15);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
681 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
682 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
683 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
684 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
685 tab = DCT_16 + UBITS (bit_buf, 16);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
686 bit_buf <<= 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
687 GETWORD (bit_buf, bits + 16, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
688 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
689 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
690 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
691 }
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
692 break; /* illegal, check needed to avoid buffer overflow */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
693 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
694 dest[63] ^= mismatch & 1;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
695 DUMPBITS (bit_buf, bits, 2); /* dump end of block code */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
696 picture->bitstream_buf = bit_buf;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
697 picture->bitstream_bits = bits;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
698 picture->bitstream_ptr = bit_ptr;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
699 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
700
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
701 static void get_mpeg1_intra_block (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
702 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
703 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
704 int j;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
705 int val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
706 uint8_t * scan = picture->scan;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
707 uint8_t * quant_matrix = picture->intra_quantizer_matrix;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
708 int quantizer_scale = picture->quantizer_scale;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
709 DCTtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
710 uint32_t bit_buf;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
711 int bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
712 uint8_t * bit_ptr;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
713 int16_t * dest;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
714
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
715 i = 0;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
716 dest = picture->DCTblock;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
717
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
718 bit_buf = picture->bitstream_buf;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
719 bits = picture->bitstream_bits;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
720 bit_ptr = picture->bitstream_ptr;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
721
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
722 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
723
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
724 while (1) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
725 if (bit_buf >= 0x28000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
726
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
727 tab = DCT_B14AC_5 - 5 + UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
728
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
729 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
730 if (i >= 64)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
731 break; /* end of block */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
732
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
733 normal_code:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
734 j = scan[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
735 bit_buf <<= tab->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
736 bits += tab->len + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
737 val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
738
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
739 /* oddification */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
740 val = (val - 1) | 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
741
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
742 /* if (bitstream_get (1)) val = -val; */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
743 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
744
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
745 SATURATE (val);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
746 dest[j] = val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
747
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
748 bit_buf <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
749 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
750
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
751 continue;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
752
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
753 } else if (bit_buf >= 0x04000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
754
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
755 tab = DCT_B14_8 - 4 + UBITS (bit_buf, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
756
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
757 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
758 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
759 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
760
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
761 /* escape code */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
762
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
763 i += UBITS (bit_buf << 6, 6) - 64;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
764 if (i >= 64)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
765 break; /* illegal, check needed to avoid buffer overflow */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
766
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
767 j = scan[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
768
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
769 DUMPBITS (bit_buf, bits, 12);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
770 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
771 val = SBITS (bit_buf, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
772 if (! (val & 0x7f)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
773 DUMPBITS (bit_buf, bits, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
774 val = UBITS (bit_buf, 8) + 2 * val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
775 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
776 val = (val * quantizer_scale * quant_matrix[j]) / 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
777
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
778 /* oddification */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
779 val = (val + ~SBITS (val, 1)) | 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
780
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
781 SATURATE (val);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
782 dest[j] = val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
783
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
784 DUMPBITS (bit_buf, bits, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
785 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
786
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
787 continue;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
788
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
789 } else if (bit_buf >= 0x02000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
790 tab = DCT_B14_10 - 8 + UBITS (bit_buf, 10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
791 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
792 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
793 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
794 } else if (bit_buf >= 0x00800000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
795 tab = DCT_13 - 16 + UBITS (bit_buf, 13);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
796 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
797 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
798 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
799 } else if (bit_buf >= 0x00200000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
800 tab = DCT_15 - 16 + UBITS (bit_buf, 15);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
801 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
802 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
803 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
804 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
805 tab = DCT_16 + UBITS (bit_buf, 16);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
806 bit_buf <<= 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
807 GETWORD (bit_buf, bits + 16, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
808 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
809 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
810 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
811 }
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
812 break; /* illegal, check needed to avoid buffer overflow */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
813 }
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
814 DUMPBITS (bit_buf, bits, 2); /* dump end of block code */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
815 picture->bitstream_buf = bit_buf;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
816 picture->bitstream_bits = bits;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
817 picture->bitstream_ptr = bit_ptr;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
818 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
819
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
820 static void get_mpeg1_non_intra_block (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
821 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
822 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
823 int j;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
824 int val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
825 uint8_t * scan = picture->scan;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
826 uint8_t * quant_matrix = picture->non_intra_quantizer_matrix;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
827 int quantizer_scale = picture->quantizer_scale;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
828 DCTtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
829 uint32_t bit_buf;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
830 int bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
831 uint8_t * bit_ptr;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
832 int16_t * dest;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
833
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
834 i = -1;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
835 dest = picture->DCTblock;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
836
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
837 bit_buf = picture->bitstream_buf;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
838 bits = picture->bitstream_bits;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
839 bit_ptr = picture->bitstream_ptr;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
840
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
841 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
842 if (bit_buf >= 0x28000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
843 tab = DCT_B14DC_5 - 5 + UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
844 goto entry_1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
845 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
846 goto entry_2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
847
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
848 while (1) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
849 if (bit_buf >= 0x28000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
850
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
851 tab = DCT_B14AC_5 - 5 + UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
852
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
853 entry_1:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
854 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
855 if (i >= 64)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
856 break; /* end of block */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
857
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
858 normal_code:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
859 j = scan[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
860 bit_buf <<= tab->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
861 bits += tab->len + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
862 val = ((2*tab->level+1) * quantizer_scale * quant_matrix[j]) >> 5;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
863
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
864 /* oddification */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
865 val = (val - 1) | 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
866
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
867 /* if (bitstream_get (1)) val = -val; */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
868 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
869
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
870 SATURATE (val);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
871 dest[j] = val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
872
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
873 bit_buf <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
874 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
875
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
876 continue;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
877
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
878 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
879
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
880 entry_2:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
881 if (bit_buf >= 0x04000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
882
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
883 tab = DCT_B14_8 - 4 + UBITS (bit_buf, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
884
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
885 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
886 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
887 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
888
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
889 /* escape code */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
890
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
891 i += UBITS (bit_buf << 6, 6) - 64;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
892 if (i >= 64)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
893 break; /* illegal, check needed to avoid buffer overflow */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
894
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
895 j = scan[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
896
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
897 DUMPBITS (bit_buf, bits, 12);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
898 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
899 val = SBITS (bit_buf, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
900 if (! (val & 0x7f)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
901 DUMPBITS (bit_buf, bits, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
902 val = UBITS (bit_buf, 8) + 2 * val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
903 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
904 val = 2 * (val + SBITS (val, 1)) + 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
905 val = (val * quantizer_scale * quant_matrix[j]) / 32;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
906
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
907 /* oddification */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
908 val = (val + ~SBITS (val, 1)) | 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
909
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
910 SATURATE (val);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
911 dest[j] = val;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
912
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
913 DUMPBITS (bit_buf, bits, 8);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
914 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
915
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
916 continue;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
917
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
918 } else if (bit_buf >= 0x02000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
919 tab = DCT_B14_10 - 8 + UBITS (bit_buf, 10);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
920 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
921 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
922 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
923 } else if (bit_buf >= 0x00800000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
924 tab = DCT_13 - 16 + UBITS (bit_buf, 13);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
925 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
926 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
927 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
928 } else if (bit_buf >= 0x00200000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
929 tab = DCT_15 - 16 + UBITS (bit_buf, 15);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
930 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
931 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
932 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
933 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
934 tab = DCT_16 + UBITS (bit_buf, 16);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
935 bit_buf <<= 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
936 GETWORD (bit_buf, bits + 16, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
937 i += tab->run;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
938 if (i < 64)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
939 goto normal_code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
940 }
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
941 break; /* illegal, check needed to avoid buffer overflow */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
942 }
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
943 DUMPBITS (bit_buf, bits, 2); /* dump end of block code */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
944 picture->bitstream_buf = bit_buf;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
945 picture->bitstream_bits = bits;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
946 picture->bitstream_ptr = bit_ptr;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
947 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
948
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
949 static inline int get_macroblock_address_increment (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
950 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
951 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
952 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
953 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
954
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
955 MBAtab * tab;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
956 int mba;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
957
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
958 mba = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
959
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
960 while (1) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
961 if (bit_buf >= 0x10000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
962 tab = MBA_5 - 2 + UBITS (bit_buf, 5);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
963 DUMPBITS (bit_buf, bits, tab->len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
964 return mba + tab->mba;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
965 } else if (bit_buf >= 0x03000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
966 tab = MBA_11 - 24 + UBITS (bit_buf, 11);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
967 DUMPBITS (bit_buf, bits, tab->len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
968 return mba + tab->mba;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
969 } else switch (UBITS (bit_buf, 11)) {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
970 case 8: /* macroblock_escape */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
971 mba += 33;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
972 /* no break here on purpose */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
973 case 15: /* macroblock_stuffing (MPEG1 only) */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
974 DUMPBITS (bit_buf, bits, 11);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
975 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
976 break;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
977 default: /* end of slice, or error */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
978 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
979 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
980 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
981
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
982 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
983 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
984 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
985 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
986
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
987 static inline void slice_intra_DCT (picture_t * picture, int cc,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
988 uint8_t * dest, int stride)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
989 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
990 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
991 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
992 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
993 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
994 /* Get the intra DC coefficient and inverse quantize it */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
995 if (cc == 0)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
996 picture->dc_dct_pred[0] += get_luma_dc_dct_diff (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
997 else
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
998 picture->dc_dct_pred[cc] += get_chroma_dc_dct_diff (picture);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
999 picture->DCTblock[0] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1000 picture->dc_dct_pred[cc] << (3 - picture->intra_dc_precision);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1001 memset (picture->DCTblock + 1, 0, 63 * sizeof (int16_t));
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1002
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1003 if (picture->mpeg1) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1004 if (picture->picture_coding_type != D_TYPE)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1005 get_mpeg1_intra_block (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1006 } else if (picture->intra_vlc_format)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1007 get_intra_block_B15 (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1008 else
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1009 get_intra_block_B14 (picture);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1010 idct_block_copy (picture->DCTblock, dest, stride);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1011 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1012 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1013 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1014 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1015
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1016 static inline void slice_non_intra_DCT (picture_t * picture, uint8_t * dest,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1017 int stride)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1018 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1019 memset (picture->DCTblock, 0, 64 * sizeof (int16_t));
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1020 if (picture->mpeg1)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1021 get_mpeg1_non_intra_block (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1022 else
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1023 get_non_intra_block (picture);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1024 idct_block_add (picture->DCTblock, dest, stride);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1025 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1026
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1027 static inline void motion_block (void (** table) (uint8_t *, uint8_t *,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1028 int32_t, int32_t),
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1029 int x_pred, int y_pred,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1030 uint8_t * dest[3], int dest_offset,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1031 uint8_t * src[3], int src_offset,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1032 int stride, int height, int second_half)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1033 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1034 int xy_half;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1035 uint8_t * src1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1036 uint8_t * src2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1037
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1038 xy_half = ((y_pred & 1) << 1) | (x_pred & 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1039
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1040 src1 = src[0] + src_offset + (x_pred >> 1) + (y_pred >> 1) * stride +
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1041 second_half * (stride << 3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1042
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1043 table[xy_half] (dest[0] + dest_offset + second_half * (stride << 3),
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1044 src1, stride, height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1045
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1046 x_pred /= 2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1047 y_pred /= 2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1048
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1049 xy_half = ((y_pred & 1) << 1) | (x_pred & 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1050 stride >>= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1051 height >>= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1052 src_offset >>= 1; src_offset += second_half * (stride << 2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1053 dest_offset >>= 1; dest_offset += second_half * (stride << 2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1054
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1055 src1 = src[1] + src_offset + (x_pred >> 1) + (y_pred >> 1) * stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1056 src2 = src[2] + src_offset + (x_pred >> 1) + (y_pred >> 1) * stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1057
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1058 table[4+xy_half] (dest[1] + dest_offset, src1, stride, height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1059 table[4+xy_half] (dest[2] + dest_offset, src2, stride, height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1060 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1061
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1062
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1063 static void motion_mp1 (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1064 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1065 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1066 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1067 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1068 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1069 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1070 int motion_x, motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1071
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1072 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1073 motion_x = motion->pmv[0][0] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1074 motion->f_code[0]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1075 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1076 motion->pmv[0][0] = motion_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1077
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1078 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1079 motion_y = motion->pmv[0][1] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1080 motion->f_code[0]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1081 motion_y = bound_motion_vector (motion_y, motion->f_code[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1082 motion->pmv[0][1] = motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1083
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1084 if (motion->f_code[1]) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1085 motion_x <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1086 motion_y <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1087 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1088
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1089 motion_block (table, motion_x, motion_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1090 motion->ref[0], offset, stride, 16, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1091 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1092 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1093 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1094 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1095
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1096 static void motion_mp1_reuse (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1097 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1098 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1099 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1100 int motion_x, motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1101
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1102 motion_x = motion->pmv[0][0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1103 motion_y = motion->pmv[0][1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1104
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1105 if (motion->f_code[1]) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1106 motion_x <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1107 motion_y <<= 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1108 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1109
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1110 motion_block (table, motion_x, motion_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1111 motion->ref[0], offset, stride, 16, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1112 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1113
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1114 static void motion_fr_frame (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1115 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1116 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1117 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1118 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1119 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1120 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1121 int motion_x, motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1122
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1123 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1124 motion_x = motion->pmv[0][0] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1125 motion->f_code[0]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1126 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1127 motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1128
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1129 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1130 motion_y = motion->pmv[0][1] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1131 motion->f_code[1]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1132 motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1133 motion->pmv[1][1] = motion->pmv[0][1] = motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1134
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1135 motion_block (table, motion_x, motion_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1136 motion->ref[0], offset, stride, 16, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1137 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1138 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1139 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1140 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1141
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1142 static void motion_fr_field (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1143 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1144 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1145 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1146 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1147 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1148 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1149 int motion_x, motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1150 int field_select;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1151
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1152 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1153 field_select = SBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1154 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1155
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1156 motion_x = motion->pmv[0][0] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1157 motion->f_code[0]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1158 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1159 motion->pmv[0][0] = motion_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1160
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1161 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1162 motion_y = (motion->pmv[0][1] >> 1) + get_motion_delta (picture,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1163 motion->f_code[1]);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1164 /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1165 motion->pmv[0][1] = motion_y << 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1166
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1167 motion_block (table, motion_x, motion_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1168 motion->ref[0], offset + (field_select & stride),
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1169 stride * 2, 8, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1170
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1171 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1172 field_select = SBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1173 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1174
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1175 motion_x = motion->pmv[1][0] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1176 motion->f_code[0]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1177 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1178 motion->pmv[1][0] = motion_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1179
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1180 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1181 motion_y = (motion->pmv[1][1] >> 1) + get_motion_delta (picture,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1182 motion->f_code[1]);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1183 /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1184 motion->pmv[1][1] = motion_y << 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1185
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1186 motion_block (table, motion_x, motion_y, dest, offset + stride,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1187 motion->ref[0], offset + (field_select & stride),
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1188 stride * 2, 8, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1189 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1190 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1191 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1192 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1193
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1194 static void motion_fr_dmv (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1195 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1196 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1197 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1198 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1199 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1200 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1201 int motion_x, motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1202 int dmv_x, dmv_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1203 int m;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1204 int other_x, other_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1205
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1206 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1207 motion_x = motion->pmv[0][0] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1208 motion->f_code[0]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1209 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1210 motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1211
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1212 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1213 dmv_x = get_dmv (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1214
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1215 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1216 motion_y = (motion->pmv[0][1] >> 1) + get_motion_delta (picture,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1217 motion->f_code[1]);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1218 /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1219 motion->pmv[1][1] = motion->pmv[0][1] = motion_y << 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1220
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1221 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1222 dmv_y = get_dmv (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1223
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1224 motion_block (mc_functions.put, motion_x, motion_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1225 motion->ref[0], offset, stride * 2, 8, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1226
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1227 m = picture->top_field_first ? 1 : 3;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1228 other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1229 other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y - 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1230 motion_block (mc_functions.avg, other_x, other_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1231 motion->ref[0], offset + stride, stride * 2, 8, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1232
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1233 motion_block (mc_functions.put, motion_x, motion_y, dest, offset + stride,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1234 motion->ref[0], offset + stride, stride * 2, 8, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1235
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1236 m = picture->top_field_first ? 3 : 1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1237 other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1238 other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y + 1;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1239 motion_block (mc_functions.avg, other_x, other_y, dest, offset + stride,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1240 motion->ref[0], offset, stride * 2, 8, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1241 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1242 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1243 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1244 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1245
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1246 /* like motion_frame, but reuse previous motion vectors */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1247 static void motion_fr_reuse (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1248 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1249 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1250 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1251 motion_block (table, motion->pmv[0][0], motion->pmv[0][1], dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1252 motion->ref[0], offset, stride, 16, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1253 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1254
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1255 /* like motion_frame, but use null motion vectors */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1256 static void motion_fr_zero (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1257 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1258 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1259 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1260 motion_block (table, 0, 0, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1261 motion->ref[0], offset, stride, 16, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1262 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1263
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1264 /* like motion_frame, but parsing without actual motion compensation */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1265 static void motion_fr_conceal (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1266 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1267 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1268 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1269 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1270 int tmp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1271
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1272 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1273 tmp = (picture->f_motion.pmv[0][0] +
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1274 get_motion_delta (picture, picture->f_motion.f_code[0]));
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1275 tmp = bound_motion_vector (tmp, picture->f_motion.f_code[0]);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1276 picture->f_motion.pmv[1][0] = picture->f_motion.pmv[0][0] = tmp;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1277
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1278 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1279 tmp = (picture->f_motion.pmv[0][1] +
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1280 get_motion_delta (picture, picture->f_motion.f_code[1]));
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1281 tmp = bound_motion_vector (tmp, picture->f_motion.f_code[1]);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1282 picture->f_motion.pmv[1][1] = picture->f_motion.pmv[0][1] = tmp;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1283
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1284 DUMPBITS (bit_buf, bits, 1); /* remove marker_bit */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1285 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1286 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1287 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1288 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1289
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1290 static void motion_fi_field (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1291 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1292 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1293 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1294 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1295 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1296 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1297 int motion_x, motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1298 int field_select;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1299
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1300 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1301 field_select = UBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1302 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1303
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1304 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1305 motion_x = motion->pmv[0][0] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1306 motion->f_code[0]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1307 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1308 motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1309
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1310 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1311 motion_y = motion->pmv[0][1] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1312 motion->f_code[1]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1313 motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1314 motion->pmv[1][1] = motion->pmv[0][1] = motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1315
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1316 motion_block (table, motion_x, motion_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1317 motion->ref[field_select], offset, stride, 16, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1318 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1319 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1320 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1321 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1322
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1323 static void motion_fi_16x8 (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1324 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1325 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1326 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1327 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1328 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1329 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1330 int motion_x, motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1331 int field_select;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1332
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1333 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1334 field_select = UBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1335 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1336
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1337 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1338 motion_x = motion->pmv[0][0] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1339 motion->f_code[0]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1340 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1341 motion->pmv[0][0] = motion_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1342
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1343 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1344 motion_y = motion->pmv[0][1] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1345 motion->f_code[1]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1346 motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1347 motion->pmv[0][1] = motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1348
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1349 motion_block (table, motion_x, motion_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1350 motion->ref[field_select], offset, stride, 8, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1351
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1352 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1353 field_select = UBITS (bit_buf, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1354 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1355
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1356 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1357 motion_x = motion->pmv[1][0] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1358 motion->f_code[0]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1359 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1360 motion->pmv[1][0] = motion_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1361
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1362 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1363 motion_y = motion->pmv[1][1] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1364 motion->f_code[1]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1365 motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1366 motion->pmv[1][1] = motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1367
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1368 motion_block (table, motion_x, motion_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1369 motion->ref[field_select], offset, stride, 8, 1);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1370 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1371 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1372 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1373 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1374
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1375 static void motion_fi_dmv (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1376 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1377 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1378 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1379 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1380 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1381 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1382 int motion_x, motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1383 int dmv_x, dmv_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1384
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1385 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1386 motion_x = motion->pmv[0][0] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1387 motion->f_code[0]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1388 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1389 motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1390
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1391 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1392 dmv_x = get_dmv (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1393
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1394 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1395 motion_y = motion->pmv[0][1] + get_motion_delta (picture,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1396 motion->f_code[1]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1397 motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1398 motion->pmv[1][1] = motion->pmv[0][1] = motion_y;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1399
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1400 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1401 dmv_y = get_dmv (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1402
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1403 motion_block (mc_functions.put, motion_x, motion_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1404 motion->ref[picture->current_field], offset, stride, 16, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1405
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1406 motion_x = ((motion_x + (motion_x > 0)) >> 1) + dmv_x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1407 motion_y = ((motion_y + (motion_y > 0)) >> 1) + dmv_y +
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1408 2 * picture->current_field - 1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1409 motion_block (mc_functions.avg, motion_x, motion_y, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1410 motion->ref[!picture->current_field], offset, stride, 16, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1411 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1412 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1413 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1414 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1415
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1416 static void motion_fi_reuse (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1417 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1418 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1419 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1420 motion_block (table, motion->pmv[0][0], motion->pmv[0][1], dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1421 motion->ref[picture->current_field], offset, stride, 16, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1422 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1423
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1424 static void motion_fi_zero (picture_t * picture, motion_t * motion,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1425 uint8_t * dest[3], int offset, int stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1426 void (** table) (uint8_t *, uint8_t *, int, int))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1427 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1428 motion_block (table, 0, 0, dest, offset,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1429 motion->ref[picture->current_field], offset, stride, 16, 0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1430 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1431
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1432 static void motion_fi_conceal (picture_t * picture)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1433 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1434 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1435 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1436 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1437 int tmp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1438
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1439 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1440 DUMPBITS (bit_buf, bits, 1); /* remove field_select */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1441
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1442 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1443 tmp = (picture->f_motion.pmv[0][0] +
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1444 get_motion_delta (picture, picture->f_motion.f_code[0]));
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1445 tmp = bound_motion_vector (tmp, picture->f_motion.f_code[0]);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1446 picture->f_motion.pmv[1][0] = picture->f_motion.pmv[0][0] = tmp;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1447
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1448 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1449 tmp = (picture->f_motion.pmv[0][1] +
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1450 get_motion_delta (picture, picture->f_motion.f_code[1]));
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1451 tmp = bound_motion_vector (tmp, picture->f_motion.f_code[1]);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1452 picture->f_motion.pmv[1][1] = picture->f_motion.pmv[0][1] = tmp;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1453
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1454 DUMPBITS (bit_buf, bits, 1); /* remove marker_bit */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1455 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1456 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1457 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1458 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1459
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1460 #define MOTION(routine,direction) \
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1461 do { \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1462 if ((direction) & MACROBLOCK_MOTION_FORWARD) \
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1463 routine (picture, &(picture->f_motion), dest, offset, stride, \
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1464 mc_functions.put); \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1465 if ((direction) & MACROBLOCK_MOTION_BACKWARD) \
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1466 routine (picture, &(picture->b_motion), dest, offset, stride, \
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1467 ((direction) & MACROBLOCK_MOTION_FORWARD ? \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1468 mc_functions.avg : mc_functions.put)); \
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1469 } while (0)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1470
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1471 #define CHECK_DISPLAY \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1472 do { \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1473 if (offset == picture->coded_picture_width) { \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1474 picture->f_motion.ref[0][0] += 16 * stride; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1475 picture->f_motion.ref[0][1] += 4 * stride; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1476 picture->f_motion.ref[0][2] += 4 * stride; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1477 picture->b_motion.ref[0][0] += 16 * stride; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1478 picture->b_motion.ref[0][1] += 4 * stride; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1479 picture->b_motion.ref[0][2] += 4 * stride; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1480 do { /* just so we can use the break statement */ \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1481 if (picture->current_frame->copy) { \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1482 picture->current_frame->copy (picture->current_frame, \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1483 dest); \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1484 if (picture->picture_coding_type == B_TYPE) \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1485 break; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1486 } \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1487 dest[0] += 16 * stride; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1488 dest[1] += 4 * stride; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1489 dest[2] += 4 * stride; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1490 } while (0); \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1491 offset = 0; \
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1492 } \
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1493 } while (0)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1494
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1495 int slice_process (picture_t * picture, uint8_t code, uint8_t * buffer)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1496 {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1497 #define bit_buf (picture->bitstream_buf)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1498 #define bits (picture->bitstream_bits)
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1499 #define bit_ptr (picture->bitstream_ptr)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1500 int macroblock_modes;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1501 int stride;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1502 uint8_t * dest[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1503 int offset;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1504 uint8_t ** forward_ref[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1505
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1506 stride = picture->coded_picture_width;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1507 offset = (code - 1) * stride * 4;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1508
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1509 forward_ref[0] = picture->forward_reference_frame->base;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1510 if (picture->picture_structure != FRAME_PICTURE) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1511 offset <<= 1;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1512 forward_ref[1] = picture->forward_reference_frame->base;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1513 picture->current_field = (picture->picture_structure == BOTTOM_FIELD);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1514 if ((picture->second_field) &&
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1515 (picture->picture_coding_type != B_TYPE))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1516 forward_ref[picture->picture_structure == TOP_FIELD] =
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1517 picture->current_frame->base;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1518 picture->f_motion.ref[1][0] = forward_ref[1][0] + offset * 4 + stride;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1519 picture->f_motion.ref[1][1] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1520 forward_ref[1][1] + offset + (stride >> 1);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1521 picture->f_motion.ref[1][2] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1522 forward_ref[1][2] + offset + (stride >> 1);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1523 picture->b_motion.ref[1][0] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1524 picture->backward_reference_frame->base[0] + offset * 4 + stride;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1525 picture->b_motion.ref[1][1] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1526 (picture->backward_reference_frame->base[1] +
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1527 offset + (stride >> 1));
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1528 picture->b_motion.ref[1][2] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1529 (picture->backward_reference_frame->base[2] +
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1530 offset + (stride >> 1));
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1531 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1532
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1533 picture->f_motion.ref[0][0] = forward_ref[0][0] + offset * 4;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1534 picture->f_motion.ref[0][1] = forward_ref[0][1] + offset;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1535 picture->f_motion.ref[0][2] = forward_ref[0][2] + offset;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1536 picture->f_motion.f_code[0] = picture->f_code[0][0];
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1537 picture->f_motion.f_code[1] = picture->f_code[0][1];
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1538 picture->f_motion.pmv[0][0] = picture->f_motion.pmv[0][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1539 picture->f_motion.pmv[1][0] = picture->f_motion.pmv[1][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1540 picture->b_motion.ref[0][0] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1541 picture->backward_reference_frame->base[0] + offset * 4;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1542 picture->b_motion.ref[0][1] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1543 picture->backward_reference_frame->base[1] + offset;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1544 picture->b_motion.ref[0][2] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1545 picture->backward_reference_frame->base[2] + offset;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1546 picture->b_motion.f_code[0] = picture->f_code[1][0];
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1547 picture->b_motion.f_code[1] = picture->f_code[1][1];
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1548 picture->b_motion.pmv[0][0] = picture->b_motion.pmv[0][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1549 picture->b_motion.pmv[1][0] = picture->b_motion.pmv[1][1] = 0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1550
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1551 if ((picture->current_frame->copy) &&
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1552 (picture->picture_coding_type == B_TYPE))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1553 offset = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1554
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1555 dest[0] = picture->current_frame->base[0] + offset * 4;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1556 dest[1] = picture->current_frame->base[1] + offset;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1557 dest[2] = picture->current_frame->base[2] + offset;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1558
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1559 switch (picture->picture_structure) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1560 case BOTTOM_FIELD:
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1561 dest[0] += stride;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1562 dest[1] += stride >> 1;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1563 dest[2] += stride >> 1;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1564 /* follow thru */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1565 case TOP_FIELD:
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1566 stride <<= 1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1567 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1568
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1569 /* reset intra dc predictor */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1570 picture->dc_dct_pred[0] = picture->dc_dct_pred[1] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1571 picture->dc_dct_pred[2] = 1 << (picture->intra_dc_precision + 7);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1572
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1573 bitstream_init (picture, buffer);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1574
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1575 picture->quantizer_scale = get_quantizer_scale (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1576
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1577 /* ignore intra_slice and all the extra data */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1578 while (bit_buf & 0x80000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1579 DUMPBITS (bit_buf, bits, 9);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1580 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1581 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1582 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1583
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1584 NEEDBITS (bit_buf, bits, bit_ptr);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1585 offset = get_macroblock_address_increment (picture) << 4;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1586
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1587 while (1) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1588 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1589
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1590 macroblock_modes = get_macroblock_modes (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1591
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1592 /* maybe integrate MACROBLOCK_QUANT test into get_macroblock_modes ? */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1593 if (macroblock_modes & MACROBLOCK_QUANT)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1594 picture->quantizer_scale = get_quantizer_scale (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1595
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1596 if (macroblock_modes & MACROBLOCK_INTRA) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1597
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1598 int DCT_offset, DCT_stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1599
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1600 if (picture->concealment_motion_vectors) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1601 if (picture->picture_structure == FRAME_PICTURE)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1602 motion_fr_conceal (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1603 else
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1604 motion_fi_conceal (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1605 } else {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1606 picture->f_motion.pmv[0][0] = picture->f_motion.pmv[0][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1607 picture->f_motion.pmv[1][0] = picture->f_motion.pmv[1][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1608 picture->b_motion.pmv[0][0] = picture->b_motion.pmv[0][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1609 picture->b_motion.pmv[1][0] = picture->b_motion.pmv[1][1] = 0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1610 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1611
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1612 if (macroblock_modes & DCT_TYPE_INTERLACED) {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1613 DCT_offset = stride;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1614 DCT_stride = stride * 2;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1615 } else {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1616 DCT_offset = stride * 8;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1617 DCT_stride = stride;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1618 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1619
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1620 /* Decode lum blocks */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1621 slice_intra_DCT (picture, 0, dest[0] + offset, DCT_stride);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1622 slice_intra_DCT (picture, 0, dest[0] + offset + 8, DCT_stride);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1623 slice_intra_DCT (picture, 0, dest[0] + offset + DCT_offset,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1624 DCT_stride);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1625 slice_intra_DCT (picture, 0, dest[0] + offset + DCT_offset + 8,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1626 DCT_stride);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1627
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1628 /* Decode chroma blocks */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1629 slice_intra_DCT (picture, 1, dest[1] + (offset >> 1), stride >> 1);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1630 slice_intra_DCT (picture, 2, dest[2] + (offset >> 1), stride >> 1);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1631
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1632 if (picture->picture_coding_type == D_TYPE) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1633 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1634 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1635 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1636 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1637
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1638 if (picture->mpeg1) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1639 if ((macroblock_modes & MOTION_TYPE_MASK) == MC_FRAME)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1640 MOTION (motion_mp1, macroblock_modes);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1641 else {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1642 /* non-intra mb without forward mv in a P picture */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1643 picture->f_motion.pmv[0][0] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1644 picture->f_motion.pmv[0][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1645 picture->f_motion.pmv[1][0] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1646 picture->f_motion.pmv[1][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1647 MOTION (motion_fr_zero, MACROBLOCK_MOTION_FORWARD);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1648 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1649 } else if (picture->picture_structure == FRAME_PICTURE)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1650 switch (macroblock_modes & MOTION_TYPE_MASK) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1651 case MC_FRAME:
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1652 MOTION (motion_fr_frame, macroblock_modes);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1653 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1654
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1655 case MC_FIELD:
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1656 MOTION (motion_fr_field, macroblock_modes);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1657 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1658
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1659 case MC_DMV:
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1660 MOTION (motion_fr_dmv, MACROBLOCK_MOTION_FORWARD);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1661 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1662
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1663 case 0:
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1664 /* non-intra mb without forward mv in a P picture */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1665 picture->f_motion.pmv[0][0] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1666 picture->f_motion.pmv[0][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1667 picture->f_motion.pmv[1][0] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1668 picture->f_motion.pmv[1][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1669 MOTION (motion_fr_zero, MACROBLOCK_MOTION_FORWARD);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1670 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1671 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1672 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1673 switch (macroblock_modes & MOTION_TYPE_MASK) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1674 case MC_FIELD:
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1675 MOTION (motion_fi_field, macroblock_modes);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1676 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1677
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1678 case MC_16X8:
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1679 MOTION (motion_fi_16x8, macroblock_modes);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1680 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1681
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1682 case MC_DMV:
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1683 MOTION (motion_fi_dmv, MACROBLOCK_MOTION_FORWARD);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1684 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1685
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1686 case 0:
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1687 /* non-intra mb without forward mv in a P picture */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1688 picture->f_motion.pmv[0][0] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1689 picture->f_motion.pmv[0][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1690 picture->f_motion.pmv[1][0] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1691 picture->f_motion.pmv[1][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1692 MOTION (motion_fi_zero, MACROBLOCK_MOTION_FORWARD);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1693 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1694 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1695
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1696 /* 6.3.17.4 Coded block pattern */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1697 if (macroblock_modes & MACROBLOCK_PATTERN) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1698 int coded_block_pattern;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1699 int DCT_offset, DCT_stride;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1700
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1701 if (macroblock_modes & DCT_TYPE_INTERLACED) {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1702 DCT_offset = stride;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1703 DCT_stride = stride * 2;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1704 } else {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1705 DCT_offset = stride * 8;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1706 DCT_stride = stride;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1707 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1708
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1709 coded_block_pattern = get_coded_block_pattern (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1710
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1711 /* Decode lum blocks */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1712
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1713 if (coded_block_pattern & 0x20)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1714 slice_non_intra_DCT (picture, dest[0] + offset,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1715 DCT_stride);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1716 if (coded_block_pattern & 0x10)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1717 slice_non_intra_DCT (picture, dest[0] + offset + 8,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1718 DCT_stride);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1719 if (coded_block_pattern & 0x08)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1720 slice_non_intra_DCT (picture,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1721 dest[0] + offset + DCT_offset,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1722 DCT_stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1723 if (coded_block_pattern & 0x04)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1724 slice_non_intra_DCT (picture,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1725 dest[0] + offset + DCT_offset + 8,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1726 DCT_stride);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1727
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1728 /* Decode chroma blocks */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1729
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1730 if (coded_block_pattern & 0x2)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1731 slice_non_intra_DCT (picture, dest[1] + (offset >> 1),
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1732 stride >> 1);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1733 if (coded_block_pattern & 0x1)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1734 slice_non_intra_DCT (picture, dest[2] + (offset >> 1),
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1735 stride >> 1);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1736 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1737
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1738 picture->dc_dct_pred[0] = picture->dc_dct_pred[1] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1739 picture->dc_dct_pred[2] = 1 << (picture->intra_dc_precision+7);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1740 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1741
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1742 offset += 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1743 CHECK_DISPLAY;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1744
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1745 NEEDBITS (bit_buf, bits, bit_ptr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1746
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1747 if (bit_buf & 0x80000000) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1748 DUMPBITS (bit_buf, bits, 1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1749 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1750 int mba_inc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1751
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1752 mba_inc = get_macroblock_address_increment (picture);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1753 if (!mba_inc)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1754 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1755
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1756 /* reset intra dc predictor on skipped block */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1757 picture->dc_dct_pred[0] = picture->dc_dct_pred[1] =
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1758 picture->dc_dct_pred[2] = 1 << (picture->intra_dc_precision+7);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1759
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1760 /* handling of skipped mb's differs between P_TYPE and B_TYPE */
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1761 /* pictures */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1762 if (picture->picture_coding_type == P_TYPE) {
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1763 picture->f_motion.pmv[0][0] = picture->f_motion.pmv[0][1] = 0;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1764 picture->f_motion.pmv[1][0] = picture->f_motion.pmv[1][1] = 0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1765
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1766 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1767 if (picture->picture_structure == FRAME_PICTURE)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1768 MOTION (motion_fr_zero, MACROBLOCK_MOTION_FORWARD);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1769 else
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1770 MOTION (motion_fi_zero, MACROBLOCK_MOTION_FORWARD);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1771
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1772 offset += 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1773 CHECK_DISPLAY;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1774 } while (--mba_inc);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1775 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1776 do {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1777 if (picture->mpeg1)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1778 MOTION (motion_mp1_reuse, macroblock_modes);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1779 else if (picture->picture_structure == FRAME_PICTURE)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1780 MOTION (motion_fr_reuse, macroblock_modes);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1781 else
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
1782 MOTION (motion_fi_reuse, macroblock_modes);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1783
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1784 offset += 16;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1785 CHECK_DISPLAY;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1786 } while (--mba_inc);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1787 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1788 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1789 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1790
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1791 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1792 #undef bit_buf
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1793 #undef bits
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1794 #undef bit_ptr
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1795 }