1 /*
2 * H263/MPEG4 backend for encoder and decoder
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * H263+ support.
5 * Copyright (c) 2001 Juan J. Sierralta P
6 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
7 *
8 * This file is part of FFmpeg.
9 *
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25 /**
26 * @file
27 * h263/mpeg4 codec.
28 */
29
31
41
42
44
45
48 //FIXME a lot of that is only needed for !low_delay
51
53
55 int motion_x, motion_y;
57 motion_x = 0;
58 motion_y = 0;
60 motion_x = s->
mv[0][0][0];
61 motion_y = s->
mv[0][0][1];
62 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
63 int i;
64 motion_x = s->
mv[0][0][0] + s->
mv[0][1][0];
65 motion_y = s->
mv[0][0][1] + s->
mv[0][1][1];
66 motion_x = (motion_x>>1) | (motion_x&1);
67 for(i=0; i<2; i++){
70 }
75 }
76
77 /* no update if 8X8 because it has been done during parsing */
86 }
87
88 if(s->
encoding){
//FIXME encoding MUST be cleaned up
93 else
95 }
96 }
97
99 {
101 int16_t *dc_val;
102
103 /* find prediction */
104 if (n < 4) {
105 x = 2 * s->
mb_x + (n & 1);
106 y = 2 * s->
mb_y + ((n & 2) >> 1);
109 } else {
113 dc_val = s->
dc_val[n - 4 + 1];
114 }
115 /* B C
116 * A X
117 */
118 a = dc_val[(x - 1) + (y) *
wrap];
119 c = dc_val[(x) + (y - 1) *
wrap];
120
121 /* No prediction outside GOB boundary */
123 if(n!=2) c= 1024;
125 }
126 /* just DC prediction */
127 if (a != 1024 && c != 1024)
128 pred_dc = (a +
c) >> 1;
129 else if (a != 1024)
131 else
133
134 /* we assume pred is positive */
135 *dc_val_ptr = &dc_val[x + y *
wrap];
137 }
138
140 int qp_c;
147
148 // if(s->pict_type==AV_PICTURE_TYPE_B && !s->readable) return;
149
150 /*
151 Diag Top
152 Left Center
153 */
158 }else
159 qp_c= 0;
160
162 int qp_dt, qp_tt, qp_tc;
163
165 qp_tt=0;
166 else
168
169 if(qp_c)
170 qp_tc= qp_c;
171 else
172 qp_tc= qp_tt;
173
174 if(qp_tc){
178
181 }
182
183 if(qp_tt)
185
188 qp_dt= qp_tt;
189 else
191
192 if(qp_dt){
197 }
198 }
199 }
200
201 if(qp_c){
205 }
206
208 int qp_lc;
210 qp_lc= qp_c;
211 else
213
214 if(qp_lc){
221 }
222 }
223 }
224 }
225
227 {
229 int16_t *dc_val, *ac_val, *ac_val1;
230
231 /* find prediction */
232 if (n < 4) {
233 x = 2 * s->
mb_x + (n & 1);
234 y = 2 * s->
mb_y + (n>> 1);
239 } else {
243 dc_val = s->
dc_val[n - 4 + 1];
244 ac_val = s->
ac_val[n - 4 + 1][0];
246 }
247
248 ac_val += ((
y) * wrap + (x)) * 16;
249 ac_val1 = ac_val;
250
251 /* B C
252 * A X
253 */
254 a = dc_val[(x - 1) + (y) *
wrap];
255 c = dc_val[(x) + (y - 1) *
wrap];
256
257 /* No prediction outside GOB boundary */
259 if(n!=2) c= 1024;
261 }
262
264 pred_dc = 1024;
266 /* left prediction */
267 if (a != 1024) {
268 ac_val -= 16;
269 for(i=1;i<8;i++) {
271 }
273 }
274 } else {
275 /* top prediction */
276 if (c != 1024) {
278 for(i=1;i<8;i++) {
280 }
282 }
283 }
284 } else {
285 /* just DC prediction */
286 if (a != 1024 && c != 1024)
287 pred_dc = (a +
c) >> 1;
288 else if (a != 1024)
290 else
292 }
293
294 /* we assume pred is positive */
295 block[0]=block[0]*scale +
pred_dc;
296
297 if (block[0] < 0)
298 block[0] = 0;
299 else
300 block[0] |= 1;
301
302 /* Update AC/DC tables */
303 dc_val[(x) + (y) *
wrap] = block[0];
304
305 /* left copy */
306 for(i=1;i<8;i++)
308 /* top copy */
309 for(i=1;i<8;i++)
311 }
312
314 int *px, int *py)
315 {
317 int16_t *
A, *
B, *
C, (*mot_val)[2];
318 static const int off[4]= {2, 1, 1, -1};
319
322
323 A = mot_val[ - 1];
324 /* special case for first (slice) line */
326 // we can't just change some MVs to simulate that as we need them for the B frames (and ME)
327 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
328 if(block==0){ //most common case
330 *px= *py = 0;
334 *px = C[0];
335 *py = C[1];
336 }else{
339 }
340 }else{
341 *px = A[0];
342 *py = A[1];
343 }
344 }else if(block==1){
349 }else{
350 *px = A[0];
351 *py = A[1];
352 }
353 }else{ /* block==2*/
354 B = mot_val[ -
wrap];
357 A[0]=A[1]=0;
358
361 }
362 } else {
363 B = mot_val[ -
wrap];
367 }
368 return *mot_val;
369 }
370
371
372 /**
373 * Get the GOB height based on picture height.
374 */
377 return 1;
378 else if (s->
height <= 800)
379 return 2;
380 else
381 return 4;
382 }