Mercurial > libavcodec.hg
annotate svq3.c @ 1795:920e6381e1fe libavcodec
2 byte shorter userdata for mpeg4
in the past it was startcode,string,00,7F,startcode
now it is startcode,string,stratcode
both are mpeg4 compliant, as according to the standard the userdata lasts until the next 00 00 01 (startcode prefix) but some very primitive decoders which simply skip until the first 00 byte and then expect the next valid startcode might fail with the old variant, just a theory though (didnt test if quicktime can decode it now)
author | michael |
---|---|
date | Sun, 08 Feb 2004 22:52:35 +0000 |
parents | bdf3927bf8c5 |
children | 869256817a91 |
rev | line source |
---|---|
1234 | 1 /* |
2 * Copyright (c) 2003 The FFmpeg Project. | |
3 * | |
4 * This library is free software; you can redistribute it and/or | |
5 * modify it under the terms of the GNU Lesser General Public | |
6 * License as published by the Free Software Foundation; either | |
7 * version 2 of the License, or (at your option) any later version. | |
8 * | |
9 * This library is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 * Lesser General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU Lesser General Public | |
15 * License along with this library; if not, write to the Free Software | |
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
17 * | |
18 * | |
19 * How to use this decoder: | |
20 * SVQ3 data is transported within Apple Quicktime files. Quicktime files | |
1235
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
21 * have stsd atoms to describe media trak properties. A stsd atom for a |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
22 * video trak contains 1 or more ImageDescription atoms. These atoms begin |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
23 * with the 4-byte length of the atom followed by the codec fourcc. Some |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
24 * decoders need information in this atom to operate correctly. Such |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
25 * is the case with SVQ3. In order to get the best use out of this decoder, |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
26 * the calling app must make the SVQ3 ImageDescription atom available |
1234 | 27 * via the AVCodecContext's extradata[_size] field: |
28 * | |
1235
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
29 * AVCodecContext.extradata = pointer to ImageDescription, first characters |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
30 * are expected to be 'S', 'V', 'Q', and '3', NOT the 4-byte atom length |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
31 * AVCodecContext.extradata_size = size of ImageDescription atom memory |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
32 * buffer (which will be the same as the ImageDescription atom size field |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
33 * from the QT file, minus 4 bytes since the length is missing) |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
34 * |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
35 * You will know you have these parameters passed correctly when the decoder |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
36 * correctly decodes this file: |
8bb75c3c2f21
change the way the ImageDescription is passed to the decoder
tmmm
parents:
1234
diff
changeset
|
37 * ftp://ftp.mplayerhq.hu/MPlayer/samples/V-codecs/SVQ3/Vertical400kbit.sorenson3.mov |
1234 | 38 * |
39 */ | |
40 | |
41 /** | |
42 * @file svq3.c | |
43 * svq3 decoder. | |
44 */ | |
45 | |
1265 | 46 #define FULLPEL_MODE 1 |
47 #define HALFPEL_MODE 2 | |
48 #define THIRDPEL_MODE 3 | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
49 #define PREDICT_MODE 4 |
1265 | 50 |
1252 | 51 /* dual scan (from some older h264 draft) |
52 o-->o-->o o | |
53 | /| | |
54 o o o / o | |
55 | / | |/ | | |
56 o o o o | |
57 / | |
58 o-->o-->o-->o | |
59 */ | |
1234 | 60 static const uint8_t svq3_scan[16]={ |
61 0+0*4, 1+0*4, 2+0*4, 2+1*4, | |
62 2+2*4, 3+0*4, 3+1*4, 3+2*4, | |
63 0+1*4, 0+2*4, 1+1*4, 1+2*4, | |
64 0+3*4, 1+3*4, 2+3*4, 3+3*4, | |
65 }; | |
66 | |
67 static const uint8_t svq3_pred_0[25][2] = { | |
68 { 0, 0 }, | |
69 { 1, 0 }, { 0, 1 }, | |
70 { 0, 2 }, { 1, 1 }, { 2, 0 }, | |
71 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 }, | |
72 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 }, | |
73 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 }, | |
74 { 2, 4 }, { 3, 3 }, { 4, 2 }, | |
75 { 4, 3 }, { 3, 4 }, | |
76 { 4, 4 } | |
77 }; | |
78 | |
79 static const int8_t svq3_pred_1[6][6][5] = { | |
80 { { 2,-1,-1,-1,-1 }, { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, | |
81 { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, { 1, 2,-1,-1,-1 } }, | |
82 { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 }, | |
83 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } }, | |
84 { { 2, 0,-1,-1,-1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 }, | |
85 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } }, | |
86 { { 2, 0,-1,-1,-1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 }, | |
87 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } }, | |
88 { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 }, | |
89 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } }, | |
90 { { 0, 2,-1,-1,-1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 }, | |
91 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } }, | |
92 }; | |
93 | |
94 static const struct { uint8_t run; uint8_t level; } svq3_dct_tables[2][16] = { | |
95 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 }, | |
96 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } }, | |
97 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 }, | |
98 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } } | |
99 }; | |
100 | |
101 static const uint32_t svq3_dequant_coeff[32] = { | |
102 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718, | |
103 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873, | |
104 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683, | |
105 61694, 68745, 77615, 89113,100253,109366,126635,141533 | |
106 }; | |
107 | |
108 | |
109 static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp){ | |
110 const int qmul= svq3_dequant_coeff[qp]; | |
111 #define stride 16 | |
112 int i; | |
113 int temp[16]; | |
114 static const int x_offset[4]={0, 1*stride, 4* stride, 5*stride}; | |
115 static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride}; | |
116 | |
117 for(i=0; i<4; i++){ | |
118 const int offset= y_offset[i]; | |
119 const int z0= 13*(block[offset+stride*0] + block[offset+stride*4]); | |
120 const int z1= 13*(block[offset+stride*0] - block[offset+stride*4]); | |
121 const int z2= 7* block[offset+stride*1] - 17*block[offset+stride*5]; | |
122 const int z3= 17* block[offset+stride*1] + 7*block[offset+stride*5]; | |
123 | |
124 temp[4*i+0]= z0+z3; | |
125 temp[4*i+1]= z1+z2; | |
126 temp[4*i+2]= z1-z2; | |
127 temp[4*i+3]= z0-z3; | |
128 } | |
129 | |
130 for(i=0; i<4; i++){ | |
131 const int offset= x_offset[i]; | |
132 const int z0= 13*(temp[4*0+i] + temp[4*2+i]); | |
133 const int z1= 13*(temp[4*0+i] - temp[4*2+i]); | |
134 const int z2= 7* temp[4*1+i] - 17*temp[4*3+i]; | |
135 const int z3= 17* temp[4*1+i] + 7*temp[4*3+i]; | |
136 | |
137 block[stride*0 +offset]= ((z0 + z3)*qmul + 0x80000)>>20; | |
138 block[stride*2 +offset]= ((z1 + z2)*qmul + 0x80000)>>20; | |
139 block[stride*8 +offset]= ((z1 - z2)*qmul + 0x80000)>>20; | |
140 block[stride*10+offset]= ((z0 - z3)*qmul + 0x80000)>>20; | |
141 } | |
142 } | |
143 #undef stride | |
144 | |
145 static void svq3_add_idct_c (uint8_t *dst, DCTELEM *block, int stride, int qp, int dc){ | |
146 const int qmul= svq3_dequant_coeff[qp]; | |
147 int i; | |
148 uint8_t *cm = cropTbl + MAX_NEG_CROP; | |
149 | |
150 if (dc) { | |
151 dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2)); | |
152 block[0] = 0; | |
153 } | |
154 | |
155 for (i=0; i < 4; i++) { | |
156 const int z0= 13*(block[0 + 4*i] + block[2 + 4*i]); | |
157 const int z1= 13*(block[0 + 4*i] - block[2 + 4*i]); | |
158 const int z2= 7* block[1 + 4*i] - 17*block[3 + 4*i]; | |
159 const int z3= 17* block[1 + 4*i] + 7*block[3 + 4*i]; | |
160 | |
161 block[0 + 4*i]= z0 + z3; | |
162 block[1 + 4*i]= z1 + z2; | |
163 block[2 + 4*i]= z1 - z2; | |
164 block[3 + 4*i]= z0 - z3; | |
165 } | |
166 | |
167 for (i=0; i < 4; i++) { | |
168 const int z0= 13*(block[i + 4*0] + block[i + 4*2]); | |
169 const int z1= 13*(block[i + 4*0] - block[i + 4*2]); | |
170 const int z2= 7* block[i + 4*1] - 17*block[i + 4*3]; | |
171 const int z3= 17* block[i + 4*1] + 7*block[i + 4*3]; | |
172 const int rr= (dc + 0x80000); | |
173 | |
174 dst[i + stride*0]= cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ]; | |
175 dst[i + stride*1]= cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ]; | |
176 dst[i + stride*2]= cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ]; | |
177 dst[i + stride*3]= cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ]; | |
178 } | |
179 } | |
180 | |
181 static void pred4x4_down_left_svq3_c(uint8_t *src, uint8_t *topright, int stride){ | |
182 LOAD_TOP_EDGE | |
183 LOAD_LEFT_EDGE | |
184 const __attribute__((unused)) int unu0= t0; | |
185 const __attribute__((unused)) int unu1= l0; | |
186 | |
187 src[0+0*stride]=(l1 + t1)>>1; | |
188 src[1+0*stride]= | |
189 src[0+1*stride]=(l2 + t2)>>1; | |
190 src[2+0*stride]= | |
191 src[1+1*stride]= | |
192 src[0+2*stride]= | |
193 src[3+0*stride]= | |
194 src[2+1*stride]= | |
195 src[1+2*stride]= | |
196 src[0+3*stride]= | |
197 src[3+1*stride]= | |
198 src[2+2*stride]= | |
199 src[1+3*stride]= | |
200 src[3+2*stride]= | |
201 src[2+3*stride]= | |
202 src[3+3*stride]=(l3 + t3)>>1; | |
1282 | 203 } |
1234 | 204 |
205 static void pred16x16_plane_svq3_c(uint8_t *src, int stride){ | |
206 pred16x16_plane_compat_c(src, stride, 1); | |
207 } | |
208 | |
209 static inline int svq3_decode_block (GetBitContext *gb, DCTELEM *block, | |
210 int index, const int type) { | |
211 | |
212 static const uint8_t *const scan_patterns[4] = | |
213 { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan }; | |
214 | |
215 int run, level, sign, vlc, limit; | |
216 const int intra = (3 * type) >> 2; | |
217 const uint8_t *const scan = scan_patterns[type]; | |
218 | |
219 for (limit=(16 >> intra); index < 16; index=limit, limit+=8) { | |
220 for (; (vlc = svq3_get_ue_golomb (gb)) != 0; index++) { | |
221 | |
222 if (vlc == INVALID_VLC) | |
223 return -1; | |
224 | |
225 sign = (vlc & 0x1) - 1; | |
226 vlc = (vlc + 1) >> 1; | |
227 | |
228 if (type == 3) { | |
229 if (vlc < 3) { | |
230 run = 0; | |
231 level = vlc; | |
232 } else if (vlc < 4) { | |
233 run = 1; | |
234 level = 1; | |
235 } else { | |
236 run = (vlc & 0x3); | |
237 level = ((vlc + 9) >> 2) - run; | |
238 } | |
239 } else { | |
240 if (vlc < 16) { | |
241 run = svq3_dct_tables[intra][vlc].run; | |
242 level = svq3_dct_tables[intra][vlc].level; | |
243 } else if (intra) { | |
244 run = (vlc & 0x7); | |
245 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1))); | |
246 } else { | |
247 run = (vlc & 0xF); | |
248 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0))); | |
249 } | |
250 } | |
251 | |
252 if ((index += run) >= limit) | |
253 return -1; | |
254 | |
255 block[scan[index]] = (level ^ sign) - sign; | |
256 } | |
257 | |
258 if (type != 2) { | |
259 break; | |
260 } | |
261 } | |
262 | |
263 return 0; | |
264 } | |
265 | |
1319 | 266 static inline void svq3_mc_dir_part (MpegEncContext *s, |
267 int x, int y, int width, int height, | |
268 int mx, int my, int dxy, | |
269 int thirdpel, int dir, int avg) { | |
270 | |
271 const Picture *pic = (dir == 0) ? &s->last_picture : &s->next_picture; | |
1234 | 272 uint8_t *src, *dest; |
273 int i, emu = 0; | |
1267
85b71f9f7450
moving the svq3 motion compensation stuff to dsputil (this also means that existing optimized halfpel code is used now ...)
michaelni
parents:
1265
diff
changeset
|
274 int blocksize= 2 - (width>>3); //16->0, 8->1, 4->2 |
1234 | 275 |
1265 | 276 mx += x; |
277 my += y; | |
278 | |
1268 | 279 if (mx < 0 || mx >= (s->h_edge_pos - width - 1) || |
280 my < 0 || my >= (s->v_edge_pos - height - 1)) { | |
1234 | 281 |
282 if ((s->flags & CODEC_FLAG_EMU_EDGE)) { | |
283 emu = 1; | |
284 } | |
285 | |
1268 | 286 mx = clip (mx, -16, (s->h_edge_pos - width + 15)); |
287 my = clip (my, -16, (s->v_edge_pos - height + 15)); | |
1234 | 288 } |
289 | |
290 /* form component predictions */ | |
291 dest = s->current_picture.data[0] + x + y*s->linesize; | |
1319 | 292 src = pic->data[0] + mx + my*s->linesize; |
1234 | 293 |
294 if (emu) { | |
1321 | 295 ff_emulated_edge_mc (s->edge_emu_buffer, src, s->linesize, (width + 1), (height + 1), |
1268 | 296 mx, my, s->h_edge_pos, s->v_edge_pos); |
1234 | 297 src = s->edge_emu_buffer; |
298 } | |
1267
85b71f9f7450
moving the svq3 motion compensation stuff to dsputil (this also means that existing optimized halfpel code is used now ...)
michaelni
parents:
1265
diff
changeset
|
299 if(thirdpel) |
1319 | 300 (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize, width, height); |
1267
85b71f9f7450
moving the svq3 motion compensation stuff to dsputil (this also means that existing optimized halfpel code is used now ...)
michaelni
parents:
1265
diff
changeset
|
301 else |
1319 | 302 (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize, height); |
1234 | 303 |
304 if (!(s->flags & CODEC_FLAG_GRAY)) { | |
305 mx = (mx + (mx < (int) x)) >> 1; | |
306 my = (my + (my < (int) y)) >> 1; | |
307 width = (width >> 1); | |
308 height = (height >> 1); | |
1267
85b71f9f7450
moving the svq3 motion compensation stuff to dsputil (this also means that existing optimized halfpel code is used now ...)
michaelni
parents:
1265
diff
changeset
|
309 blocksize++; |
1234 | 310 |
311 for (i=1; i < 3; i++) { | |
312 dest = s->current_picture.data[i] + (x >> 1) + (y >> 1)*s->uvlinesize; | |
1319 | 313 src = pic->data[i] + mx + my*s->uvlinesize; |
1234 | 314 |
315 if (emu) { | |
1321 | 316 ff_emulated_edge_mc (s->edge_emu_buffer, src, s->uvlinesize, (width + 1), (height + 1), |
1268 | 317 mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1)); |
1321 | 318 src = s->edge_emu_buffer; |
1234 | 319 } |
1267
85b71f9f7450
moving the svq3 motion compensation stuff to dsputil (this also means that existing optimized halfpel code is used now ...)
michaelni
parents:
1265
diff
changeset
|
320 if(thirdpel) |
1319 | 321 (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->uvlinesize, width, height); |
1267
85b71f9f7450
moving the svq3 motion compensation stuff to dsputil (this also means that existing optimized halfpel code is used now ...)
michaelni
parents:
1265
diff
changeset
|
322 else |
1319 | 323 (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height); |
1234 | 324 } |
325 } | |
326 } | |
327 | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
328 static inline int svq3_mc_dir (H264Context *h, int size, int mode, int dir, int avg) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
329 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
330 int i, j, k, mx, my, dx, dy, x, y; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
331 MpegEncContext *const s = (MpegEncContext *) h; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
332 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
333 const int part_height = 16 >> ((unsigned) (size + 1) / 3); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
334 const int extra_width = (mode == PREDICT_MODE) ? -16*6 : 0; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
335 const int h_edge_pos = 6*(s->h_edge_pos - part_width ) - extra_width; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
336 const int v_edge_pos = 6*(s->v_edge_pos - part_height) - extra_width; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
337 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
338 for (i=0; i < 16; i+=part_height) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
339 for (j=0; j < 16; j+=part_width) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
340 const int b_xy = (4*s->mb_x+(j>>2)) + (4*s->mb_y+(i>>2))*h->b_stride; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
341 int dxy; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
342 x = 16*s->mb_x + j; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
343 y = 16*s->mb_y + i; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
344 k = ((j>>2)&1) + ((i>>1)&2) + ((j>>1)&4) + (i&8); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
345 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
346 if (mode != PREDICT_MODE) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
347 pred_motion (h, k, (part_width >> 2), dir, 1, &mx, &my); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
348 } else { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
349 mx = s->next_picture.motion_val[0][b_xy][0]<<1; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
350 my = s->next_picture.motion_val[0][b_xy][1]<<1; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
351 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
352 if (dir == 0) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
353 mx = ((mx * h->frame_num_offset) / h->prev_frame_num_offset + 1)>>1; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
354 my = ((my * h->frame_num_offset) / h->prev_frame_num_offset + 1)>>1; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
355 } else { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
356 mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1)>>1; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
357 my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1)>>1; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
358 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
359 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
360 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
361 /* clip motion vector prediction to frame border */ |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
362 mx = clip (mx, extra_width - 6*x, h_edge_pos - 6*x); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
363 my = clip (my, extra_width - 6*y, v_edge_pos - 6*y); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
364 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
365 /* get (optional) motion vector differential */ |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
366 if (mode == PREDICT_MODE) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
367 dx = dy = 0; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
368 } else { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
369 dy = svq3_get_se_golomb (&s->gb); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
370 dx = svq3_get_se_golomb (&s->gb); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
371 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
372 if (dx == INVALID_VLC || dy == INVALID_VLC) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
373 return -1; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
374 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
375 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
376 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
377 /* compute motion vector */ |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
378 if (mode == THIRDPEL_MODE) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
379 int fx, fy; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
380 mx = ((mx + 1)>>1) + dx; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
381 my = ((my + 1)>>1) + dy; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
382 fx= ((unsigned)(mx + 0x3000))/3 - 0x1000; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
383 fy= ((unsigned)(my + 0x3000))/3 - 0x1000; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
384 dxy= (mx - 3*fx) + 4*(my - 3*fy); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
385 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
386 svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
387 mx += mx; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
388 my += my; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
389 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
390 mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
391 my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
392 dxy= (mx&1) + 2*(my&1); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
393 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
394 svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
395 mx *= 3; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
396 my *= 3; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
397 } else { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
398 mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
399 my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
400 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
401 svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
402 mx *= 6; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
403 my *= 6; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
404 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
405 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
406 /* update mv_cache */ |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
407 if (mode != PREDICT_MODE) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
408 int32_t mv = pack16to32(mx,my); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
409 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
410 if (part_height == 8 && i < 8) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
411 *(int32_t *) h->mv_cache[dir][scan8[k] + 1*8] = mv; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
412 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
413 if (part_width == 8 && j < 8) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
414 *(int32_t *) h->mv_cache[dir][scan8[k] + 1 + 1*8] = mv; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
415 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
416 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
417 if (part_width == 8 && j < 8) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
418 *(int32_t *) h->mv_cache[dir][scan8[k] + 1] = mv; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
419 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
420 if (part_width == 4 || part_height == 4) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
421 *(int32_t *) h->mv_cache[dir][scan8[k]] = mv; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
422 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
423 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
424 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
425 /* write back motion vectors */ |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
426 fill_rectangle(s->current_picture.motion_val[dir][b_xy], part_width>>2, part_height>>2, h->b_stride, pack16to32(mx,my), 4); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
427 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
428 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
429 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
430 return 0; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
431 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
432 |
1234 | 433 static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
434 int i, j, k, m, dir, mode; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
435 int cbp = 0; |
1234 | 436 uint32_t vlc; |
437 int8_t *top, *left; | |
438 MpegEncContext *const s = (MpegEncContext *) h; | |
439 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride; | |
440 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride; | |
441 | |
442 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF; | |
443 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF; | |
444 h->topright_samples_available = 0xFFFF; | |
445 | |
446 if (mb_type == 0) { /* SKIP */ | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
447 if (s->pict_type == P_TYPE || s->next_picture.mb_type[mb_xy] == -1) { |
1319 | 448 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0); |
449 | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
450 if (s->pict_type == B_TYPE) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
451 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 1, 1); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
452 } |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
453 |
1319 | 454 mb_type = MB_TYPE_SKIP; |
455 } else { | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
456 svq3_mc_dir (h, s->next_picture.mb_type[mb_xy], PREDICT_MODE, 0, 0); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
457 svq3_mc_dir (h, s->next_picture.mb_type[mb_xy], PREDICT_MODE, 1, 1); |
1319 | 458 |
459 mb_type = MB_TYPE_16x16; | |
460 } | |
1234 | 461 } else if (mb_type < 8) { /* INTER */ |
462 if (h->thirdpel_flag && h->halfpel_flag == !get_bits (&s->gb, 1)) { | |
1265 | 463 mode = THIRDPEL_MODE; |
1234 | 464 } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits (&s->gb, 1)) { |
1265 | 465 mode = HALFPEL_MODE; |
1234 | 466 } else { |
1265 | 467 mode = FULLPEL_MODE; |
1234 | 468 } |
469 | |
470 /* fill caches */ | |
1319 | 471 /* note ref_cache should contain here: |
1252 | 472 ???????? |
473 ???11111 | |
474 N??11111 | |
475 N??11111 | |
476 N??11111 | |
477 N | |
478 */ | |
479 | |
1319 | 480 for (m=0; m < 2; m++) { |
481 if (s->mb_x > 0 && h->intra4x4_pred_mode[mb_xy - 1][0] != -1) { | |
482 for (i=0; i < 4; i++) { | |
483 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - 1 + i*h->b_stride]; | |
484 } | |
485 } else { | |
486 for (i=0; i < 4; i++) { | |
487 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0; | |
488 } | |
1234 | 489 } |
1319 | 490 if (s->mb_y > 0) { |
491 memcpy (h->mv_cache[m][scan8[0] - 1*8], s->current_picture.motion_val[m][b_xy - h->b_stride], 4*2*sizeof(int16_t)); | |
492 memset (&h->ref_cache[m][scan8[0] - 1*8], (h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1, 4); | |
1234 | 493 |
1319 | 494 if (s->mb_x < (s->mb_width - 1)) { |
495 *(uint32_t *) h->mv_cache[m][scan8[0] + 4 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride + 4]; | |
496 h->ref_cache[m][scan8[0] + 4 - 1*8] = | |
497 (h->intra4x4_pred_mode[mb_xy - s->mb_stride + 1][0] == -1 || | |
498 h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1; | |
499 }else | |
500 h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE; | |
501 if (s->mb_x > 0) { | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
502 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride - 1]; |
1319 | 503 h->ref_cache[m][scan8[0] - 1 - 1*8] = (h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] == -1) ? PART_NOT_AVAILABLE : 1; |
504 }else | |
505 h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE; | |
1252 | 506 }else |
1319 | 507 memset (&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8); |
508 | |
509 if (s->pict_type != B_TYPE) | |
510 break; | |
511 } | |
1234 | 512 |
513 /* decode motion vector(s) and form prediction(s) */ | |
1319 | 514 if (s->pict_type == P_TYPE) { |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
515 svq3_mc_dir (h, (mb_type - 1), mode, 0, 0); |
1319 | 516 } else { /* B_TYPE */ |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
517 if (mb_type != 2) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
518 svq3_mc_dir (h, 0, mode, 0, 0); |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
519 } else { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
520 for (i=0; i < 4; i++) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
521 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); |
1234 | 522 } |
523 } | |
1319 | 524 if (mb_type != 1) { |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
525 svq3_mc_dir (h, 0, mode, 1, (mb_type == 3)); |
1319 | 526 } else { |
527 for (i=0; i < 4; i++) { | |
528 memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); | |
529 } | |
530 } | |
1234 | 531 } |
532 | |
533 mb_type = MB_TYPE_16x16; | |
1319 | 534 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */ |
1234 | 535 memset (h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t)); |
536 | |
1319 | 537 if (mb_type == 8) { |
538 if (s->mb_x > 0) { | |
539 for (i=0; i < 4; i++) { | |
540 h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[mb_xy - 1][i]; | |
541 } | |
542 if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) { | |
543 h->left_samples_available = 0x5F5F; | |
544 } | |
1234 | 545 } |
1319 | 546 if (s->mb_y > 0) { |
547 h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][4]; | |
548 h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][5]; | |
549 h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][6]; | |
550 h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][3]; | |
551 | |
552 if (h->intra4x4_pred_mode_cache[4+8*0] == -1) { | |
553 h->top_samples_available = 0x33FF; | |
554 } | |
555 } | |
1234 | 556 |
1319 | 557 /* decode prediction codes for luma blocks */ |
558 for (i=0; i < 16; i+=2) { | |
559 vlc = svq3_get_ue_golomb (&s->gb); | |
1234 | 560 |
1319 | 561 if (vlc >= 25) |
562 return -1; | |
563 | |
564 left = &h->intra4x4_pred_mode_cache[scan8[i] - 1]; | |
565 top = &h->intra4x4_pred_mode_cache[scan8[i] - 8]; | |
1234 | 566 |
1319 | 567 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]]; |
568 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]]; | |
1234 | 569 |
1319 | 570 if (left[1] == -1 || left[2] == -1) |
571 return -1; | |
572 } | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
573 } else { /* mb_type == 33, DC_128_PRED block type */ |
1319 | 574 for (i=0; i < 4; i++) { |
575 memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4); | |
576 } | |
1234 | 577 } |
578 | |
579 write_back_intra_pred_mode (h); | |
1319 | 580 |
581 if (mb_type == 8) { | |
582 check_intra4x4_pred_mode (h); | |
583 | |
584 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF; | |
585 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF; | |
586 } else { | |
587 for (i=0; i < 4; i++) { | |
588 memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_128_PRED, 4); | |
589 } | |
590 | |
591 h->top_samples_available = 0x33FF; | |
592 h->left_samples_available = 0x5F5F; | |
593 } | |
1234 | 594 |
595 mb_type = MB_TYPE_INTRA4x4; | |
596 } else { /* INTRA16x16 */ | |
597 dir = i_mb_type_info[mb_type - 8].pred_mode; | |
598 dir = (dir >> 1) ^ 3*(dir & 1) ^ 1; | |
599 | |
600 if ((h->intra16x16_pred_mode = check_intra_pred_mode (h, dir)) == -1) | |
601 return -1; | |
602 | |
603 cbp = i_mb_type_info[mb_type - 8].cbp; | |
604 mb_type = MB_TYPE_INTRA16x16; | |
605 } | |
606 | |
607 if (!IS_INTER(mb_type) && s->pict_type != I_TYPE) { | |
608 for (i=0; i < 4; i++) { | |
609 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); | |
610 } | |
1319 | 611 if (s->pict_type == B_TYPE) { |
612 for (i=0; i < 4; i++) { | |
613 memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); | |
614 } | |
615 } | |
1234 | 616 } |
617 if (!IS_INTRA4x4(mb_type)) { | |
618 memset (h->intra4x4_pred_mode[mb_xy], DC_PRED, 8); | |
619 } | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
620 if (!IS_SKIP(mb_type) || s->pict_type == B_TYPE) { |
1252 | 621 memset (h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t)); |
622 s->dsp.clear_blocks(h->mb); | |
1234 | 623 } |
624 | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
625 if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == B_TYPE)) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
626 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48) |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
627 return -1; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
628 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
629 cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc]; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
630 } |
1234 | 631 if (IS_INTRA16x16(mb_type) || (s->pict_type != I_TYPE && s->adaptive_quant && cbp)) { |
632 s->qscale += svq3_get_se_golomb (&s->gb); | |
633 | |
634 if (s->qscale > 31) | |
635 return -1; | |
636 } | |
637 if (IS_INTRA16x16(mb_type)) { | |
638 if (svq3_decode_block (&s->gb, h->mb, 0, 0)) | |
639 return -1; | |
640 } | |
641 | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
642 if (cbp) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
643 const int index = IS_INTRA16x16(mb_type) ? 1 : 0; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
644 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1); |
1234 | 645 |
646 for (i=0; i < 4; i++) { | |
647 if ((cbp & (1 << i))) { | |
648 for (j=0; j < 4; j++) { | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
649 k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j); |
1234 | 650 h->non_zero_count_cache[ scan8[k] ] = 1; |
651 | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
652 if (svq3_decode_block (&s->gb, &h->mb[16*k], index, type)) |
1234 | 653 return -1; |
654 } | |
655 } | |
656 } | |
657 | |
658 if ((cbp & 0x30)) { | |
659 for (i=0; i < 2; ++i) { | |
660 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + 4*i)], 0, 3)) | |
661 return -1; | |
662 } | |
663 | |
664 if ((cbp & 0x20)) { | |
665 for (i=0; i < 8; i++) { | |
666 h->non_zero_count_cache[ scan8[16+i] ] = 1; | |
667 | |
668 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + i)], 1, 1)) | |
669 return -1; | |
670 } | |
671 } | |
672 } | |
673 } | |
674 | |
675 s->current_picture.mb_type[mb_xy] = mb_type; | |
676 | |
677 if (IS_INTRA(mb_type)) { | |
678 h->chroma_pred_mode = check_intra_pred_mode (h, DC_PRED8x8); | |
679 } | |
680 | |
681 return 0; | |
682 } | |
683 | |
1319 | 684 static int svq3_decode_slice_header (H264Context *h) { |
685 MpegEncContext *const s = (MpegEncContext *) h; | |
686 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride; | |
687 int i, header; | |
688 | |
689 header = get_bits (&s->gb, 8); | |
690 | |
691 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) { | |
692 /* TODO: what? */ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1330
diff
changeset
|
693 av_log(h->s.avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header); |
1319 | 694 return -1; |
695 } else { | |
696 int length = (header >> 5) & 3; | |
697 | |
698 h->next_slice_index = s->gb.index + 8*show_bits (&s->gb, 8*length) + 8*length; | |
699 | |
1754
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1699
diff
changeset
|
700 if (h->next_slice_index > s->gb.size_in_bits){ |
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1699
diff
changeset
|
701 av_log(h->s.avctx, AV_LOG_ERROR, "slice after bitstream end\n"); |
1319 | 702 return -1; |
1754
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1699
diff
changeset
|
703 } |
1319 | 704 |
705 s->gb.size_in_bits = h->next_slice_index - 8*(length - 1); | |
706 s->gb.index += 8; | |
707 | |
708 if (length > 0) { | |
709 memcpy ((uint8_t *) &s->gb.buffer[s->gb.index >> 3], | |
710 &s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1)); | |
711 } | |
712 } | |
713 | |
1754
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1699
diff
changeset
|
714 if ((i = svq3_get_ue_golomb (&s->gb)) == INVALID_VLC || i >= 3){ |
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1699
diff
changeset
|
715 av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i); |
1319 | 716 return -1; |
1754
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1699
diff
changeset
|
717 } |
1319 | 718 |
719 h->slice_type = golomb_to_pict_type[i]; | |
720 | |
721 if ((header & 0x9F) == 2) { | |
722 i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1)); | |
723 s->mb_skip_run = get_bits (&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width)); | |
724 } else { | |
725 get_bits1 (&s->gb); | |
726 s->mb_skip_run = 0; | |
727 } | |
728 | |
729 h->slice_num = get_bits (&s->gb, 8); | |
730 s->qscale = get_bits (&s->gb, 5); | |
731 s->adaptive_quant = get_bits1 (&s->gb); | |
732 | |
733 /* unknown fields */ | |
734 get_bits1 (&s->gb); | |
735 | |
736 if (h->unknown_svq3_flag) { | |
737 get_bits1 (&s->gb); | |
738 } | |
739 | |
740 get_bits1 (&s->gb); | |
741 get_bits (&s->gb, 2); | |
742 | |
743 while (get_bits1 (&s->gb)) { | |
744 get_bits (&s->gb, 8); | |
745 } | |
746 | |
747 /* reset intra predictors and invalidate motion vector references */ | |
748 if (s->mb_x > 0) { | |
749 memset (h->intra4x4_pred_mode[mb_xy - 1], -1, 4*sizeof(int8_t)); | |
750 memset (h->intra4x4_pred_mode[mb_xy - s->mb_x], -1, 8*sizeof(int8_t)*s->mb_x); | |
751 } | |
752 if (s->mb_y > 0) { | |
753 memset (h->intra4x4_pred_mode[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x)); | |
754 | |
755 if (s->mb_x > 0) { | |
756 h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] = -1; | |
757 } | |
758 } | |
759 | |
760 return 0; | |
761 } | |
762 | |
1234 | 763 static int svq3_decode_frame (AVCodecContext *avctx, |
764 void *data, int *data_size, | |
765 uint8_t *buf, int buf_size) { | |
766 MpegEncContext *const s = avctx->priv_data; | |
767 H264Context *const h = avctx->priv_data; | |
1319 | 768 int m, mb_type; |
769 | |
770 *data_size = 0; | |
1234 | 771 |
772 s->flags = avctx->flags; | |
1754
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1699
diff
changeset
|
773 s->flags2 = avctx->flags2; |
1699 | 774 s->unrestricted_mv = 1; |
775 | |
1234 | 776 if (!s->context_initialized) { |
1268 | 777 s->width = avctx->width; |
778 s->height = avctx->height; | |
1234 | 779 h->pred4x4[DIAG_DOWN_LEFT_PRED] = pred4x4_down_left_svq3_c; |
780 h->pred16x16[PLANE_PRED8x8] = pred16x16_plane_svq3_c; | |
781 h->halfpel_flag = 1; | |
782 h->thirdpel_flag = 1; | |
1319 | 783 h->unknown_svq3_flag = 0; |
1234 | 784 h->chroma_qp = 4; |
785 | |
786 if (MPV_common_init (s) < 0) | |
787 return -1; | |
788 | |
1268 | 789 h->b_stride = 4*s->mb_width; |
790 | |
1234 | 791 alloc_tables (h); |
1319 | 792 |
793 if (avctx->extradata && avctx->extradata_size >= 0x64 | |
794 && !memcmp (avctx->extradata, "SVQ3", 4)) { | |
795 | |
796 GetBitContext gb; | |
1234 | 797 |
1319 | 798 init_get_bits (&gb, (uint8_t *) avctx->extradata + 0x62, |
799 8*(avctx->extradata_size - 0x62)); | |
1234 | 800 |
1319 | 801 /* 'frame size code' and optional 'width, height' */ |
802 if (get_bits (&gb, 3) == 7) { | |
803 get_bits (&gb, 12); | |
804 get_bits (&gb, 12); | |
1234 | 805 } |
806 | |
1319 | 807 h->halfpel_flag = get_bits1 (&gb); |
808 h->thirdpel_flag = get_bits1 (&gb); | |
809 | |
810 /* unknown fields */ | |
811 get_bits1 (&gb); | |
812 get_bits1 (&gb); | |
813 get_bits1 (&gb); | |
814 get_bits1 (&gb); | |
815 | |
816 s->low_delay = get_bits1 (&gb); | |
817 | |
818 /* unknown field */ | |
819 get_bits1 (&gb); | |
820 | |
821 while (get_bits1 (&gb)) { | |
822 get_bits (&gb, 8); | |
823 } | |
824 | |
825 h->unknown_svq3_flag = get_bits1 (&gb); | |
826 avctx->has_b_frames = !s->low_delay; | |
1234 | 827 } |
828 } | |
829 | |
1319 | 830 /* special case for last picture */ |
831 if (buf_size == 0) { | |
832 if (s->next_picture_ptr && !s->low_delay) { | |
833 *(AVFrame *) data = *(AVFrame *) &s->next_picture; | |
834 *data_size = sizeof(AVFrame); | |
1234 | 835 } |
1319 | 836 return 0; |
1234 | 837 } |
838 | |
1319 | 839 init_get_bits (&s->gb, buf, 8*buf_size); |
1234 | 840 |
1319 | 841 s->mb_x = s->mb_y = 0; |
842 | |
843 if (svq3_decode_slice_header (h)) | |
1234 | 844 return -1; |
845 | |
1319 | 846 s->pict_type = h->slice_type; |
847 s->picture_number = h->slice_num; | |
1234 | 848 |
1250 | 849 if(avctx->debug&FF_DEBUG_PICT_INFO){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1330
diff
changeset
|
850 av_log(h->s.avctx, AV_LOG_DEBUG, "%c hpel:%d, tpel:%d aqp:%d qp:%d\n", |
1264 | 851 av_get_pict_type_char(s->pict_type), h->halfpel_flag, h->thirdpel_flag, |
1250 | 852 s->adaptive_quant, s->qscale |
853 ); | |
854 } | |
1234 | 855 |
1319 | 856 /* for hurry_up==5 */ |
857 s->current_picture.pict_type = s->pict_type; | |
858 s->current_picture.key_frame = (s->pict_type == I_TYPE); | |
859 | |
860 /* skip b frames if we dont have reference frames */ | |
861 if (s->last_picture_ptr == NULL && s->pict_type == B_TYPE) return 0; | |
862 /* skip b frames if we are in a hurry */ | |
863 if (avctx->hurry_up && s->pict_type == B_TYPE) return 0; | |
864 /* skip everything if we are in a hurry >= 5 */ | |
865 if (avctx->hurry_up >= 5) return 0; | |
866 | |
867 if (s->next_p_frame_damaged) { | |
868 if (s->pict_type == B_TYPE) | |
869 return 0; | |
870 else | |
871 s->next_p_frame_damaged = 0; | |
872 } | |
1234 | 873 |
874 frame_start (h); | |
875 | |
1319 | 876 if (s->pict_type == B_TYPE) { |
877 h->frame_num_offset = (h->slice_num - h->prev_frame_num); | |
878 | |
879 if (h->frame_num_offset < 0) { | |
880 h->frame_num_offset += 256; | |
881 } | |
882 if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) { | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1330
diff
changeset
|
883 av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n"); |
1319 | 884 return -1; |
885 } | |
886 } else { | |
887 h->prev_frame_num = h->frame_num; | |
888 h->frame_num = h->slice_num; | |
889 h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num); | |
890 | |
891 if (h->prev_frame_num_offset < 0) { | |
892 h->prev_frame_num_offset += 256; | |
893 } | |
894 } | |
895 | |
896 for(m=0; m<2; m++){ | |
897 int i; | |
898 for(i=0; i<4; i++){ | |
899 int j; | |
900 for(j=-1; j<4; j++) | |
901 h->ref_cache[m][scan8[0] + 8*i + j]= 1; | |
902 h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE; | |
903 } | |
1252 | 904 } |
905 | |
1234 | 906 for (s->mb_y=0; s->mb_y < s->mb_height; s->mb_y++) { |
907 for (s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) { | |
1319 | 908 |
909 if ( (s->gb.index + 7) >= s->gb.size_in_bits && | |
910 ((s->gb.index & 7) == 0 || show_bits (&s->gb, (-s->gb.index & 7)) == 0)) { | |
911 | |
912 s->gb.index = h->next_slice_index; | |
913 s->gb.size_in_bits = 8*buf_size; | |
914 | |
915 if (svq3_decode_slice_header (h)) | |
916 return -1; | |
917 | |
918 /* TODO: support s->mb_skip_run */ | |
919 } | |
920 | |
921 mb_type = svq3_get_ue_golomb (&s->gb); | |
1234 | 922 |
923 if (s->pict_type == I_TYPE) { | |
924 mb_type += 8; | |
1319 | 925 } else if (s->pict_type == B_TYPE && mb_type >= 4) { |
926 mb_type += 4; | |
1234 | 927 } |
1319 | 928 if (mb_type > 33 || svq3_decode_mb (h, mb_type)) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1330
diff
changeset
|
929 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y); |
1234 | 930 return -1; |
931 } | |
932 | |
933 if (mb_type != 0) { | |
934 hl_decode_mb (h); | |
935 } | |
1330
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
936 |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
937 if (s->pict_type != B_TYPE && !s->low_delay) { |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
938 s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride] = |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
939 (s->pict_type == P_TYPE && mb_type < 8) ? (mb_type - 1) : -1; |
c05c381a9c47
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
tmmm
parents:
1321
diff
changeset
|
940 } |
1234 | 941 } |
1268 | 942 |
943 ff_draw_horiz_band(s, 16*s->mb_y, 16); | |
1234 | 944 } |
945 | |
1319 | 946 MPV_frame_end(s); |
947 | |
948 if (s->pict_type == B_TYPE || s->low_delay) { | |
949 *(AVFrame *) data = *(AVFrame *) &s->current_picture; | |
950 } else { | |
951 *(AVFrame *) data = *(AVFrame *) &s->last_picture; | |
952 } | |
1234 | 953 |
1319 | 954 avctx->frame_number = s->picture_number - 1; |
955 | |
956 /* dont output the last pic after seeking */ | |
957 if (s->last_picture_ptr || s->low_delay) { | |
958 *data_size = sizeof(AVFrame); | |
959 } | |
960 | |
1234 | 961 return buf_size; |
962 } | |
963 | |
964 | |
965 AVCodec svq3_decoder = { | |
966 "svq3", | |
967 CODEC_TYPE_VIDEO, | |
968 CODEC_ID_SVQ3, | |
969 sizeof(H264Context), | |
970 decode_init, | |
971 NULL, | |
972 decode_end, | |
973 svq3_decode_frame, | |
1268 | 974 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, |
1234 | 975 }; |