1 /*
2 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder.
3 * Copyright (c) 2006 Stefan Gehrer <stefan.gehrer@gmx.de>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder
25 * @author Stefan Gehrer <stefan.gehrer@gmx.de>
26 */
27
34
36 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3,
37 4, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 20,
38 22, 24, 26, 28, 30, 33, 33, 35, 35, 36, 37, 37, 39, 39, 42, 44,
39 46, 48, 50, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64
40 };
41
43 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
44 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
45 6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14,
46 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27
47 };
48
50 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
51 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
52 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,
53 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9
54 };
55
56 /** mark block as unavailable, i.e. out of picture
57 or not yet decoded */
59
64
65 /*****************************************************************************
66 *
67 * in-loop deblocking filter
68 *
69 ****************************************************************************/
70
72 {
74 return 2;
75 if ((abs(mvP->
x - mvQ->
x) >= 4) || (abs(mvP->
y - mvQ->
y) >= 4))
76 return 1;
77 if (b) {
80 if ((abs(mvP->
x - mvQ->
x) >= 4) || (abs(mvP->
y - mvQ->
y) >= 4))
81 return 1;
82 } else {
84 return 1;
85 }
86 return 0;
87 }
88
90 alpha = alpha_tab[av_clip(qp_avg + h->alpha_offset, 0, 63)]; \
91 beta = beta_tab[av_clip(qp_avg + h->beta_offset, 0, 63)]; \
92 tc = tc_tab[av_clip(qp_avg + h->alpha_offset, 0, 63)];
93
94 /**
95 * in-loop deblocking filter for a single macroblock
96 *
97 * boundary strength (bs) mapping:
98 *
99 * --4---5--
100 * 0 2 |
101 * | 6 | 7 |
102 * 1 3 |
103 * ---------
104 *
105 */
107 {
110 int i;
111
112 /* save un-deblocked lines */
119 for (i = 0; i < 8; i++) {
124 }
126 /* determine bs */
127 if (mb_type ==
I_8X8)
128 memset(bs, 2, 8);
129 else{
130 memset(bs, 0, 8);
134 }
138 }
143 }
151 }
156
163 }
164 }
165 }
168 }
169
170 #undef SET_PARAMS
171
172 /*****************************************************************************
173 *
174 * spatial intra prediction
175 *
176 ****************************************************************************/
177
180 {
181 int i;
182
183 switch (block) {
184 case 0:
189 top[17] = top[16];
190 top[0] = top[1];
193 break;
194 case 1:
196 for (i = 0; i < 8; i++)
203 else
204 memset(&top[9], top[8], 9);
205 top[17] = top[16];
206 top[0] = top[1];
209 break;
210 case 2:
213 top[17] = top[16];
214 top[0] = top[1];
217 break;
218 case 3:
220 for (i = 0; i < 8; i++)
223 memcpy(&top[0], h->
cy + 7 + 7 * h->
l_stride, 9);
224 memset(&top[9], top[8], 9);
225 break;
226 }
227 }
228
230 {
231 /* extend borders by one pixel */
239 } else {
244 }
245 }
246
248 {
251 for (y = 0; y < 8; y++) {
252 *((uint64_t *)(d + y * stride)) = a;
253 }
254 }
255
257 {
260 for (y = 0; y < 8; y++) {
261 a = left[y + 1] * 0x0101010101010101ULL;
262 *((uint64_t *)(d + y * stride)) = a;
263 }
264 }
265
267 {
269 uint64_t
a = 0x8080808080808080ULL;
270 for (y = 0; y < 8; y++)
271 *((uint64_t *)(d + y * stride)) =
a;
272 }
273
275 {
277 int ih = 0;
278 int iv = 0;
280
281 for (x = 0; x < 4; x++) {
282 ih += (x + 1) * (top [5 + x] - top [3 - x]);
283 iv += (x + 1) * (left[5 + x] - left[3 - x]);
284 }
285 ia = (top[8] + left[8]) << 4;
286 ih = (17 * ih + 16) >> 5;
287 iv = (17 * iv + 16) >> 5;
288 for (y = 0; y < 8; y++)
289 for (x = 0; x < 8; x++)
290 d[y * stride + x] = cm[(ia + (x - 3) * ih + (y - 3) * iv + 16) >> 5];
291 }
292
293 #define LOWPASS(ARRAY,INDEX) \
294 ((ARRAY[(INDEX) - 1] + 2 * ARRAY[(INDEX)] + ARRAY[(INDEX) + 1] + 2) >> 2)
295
297 {
299 for (y = 0; y < 8; y++)
300 for (x = 0; x < 8; x++)
301 d[y * stride + x] = (
LOWPASS(top, x + 1) +
LOWPASS(left, y + 1)) >> 1;
302 }
303
305 {
307 for (y = 0; y < 8; y++)
308 for (x = 0; x < 8; x++)
309 d[y * stride + x] = (
LOWPASS(top, x + y + 2) +
LOWPASS(left, x + y + 2)) >> 1;
310 }
311
313 {
315 for (y = 0; y < 8; y++)
316 for (x = 0; x < 8; x++)
317 if (x == y)
318 d[y * stride + x] = (left[1] + 2 * top[0] + top[1] + 2) >> 2;
319 else if (x > y)
320 d[y * stride + x] =
LOWPASS(top, x - y);
321 else
322 d[y * stride + x] =
LOWPASS(left, y - x);
323 }
324
326 {
328 for (y = 0; y < 8; y++)
329 for (x = 0; x < 8; x++)
330 d[y * stride + x] =
LOWPASS(left, y + 1);
331 }
332
334 {
336 for (y = 0; y < 8; y++)
337 for (x = 0; x < 8; x++)
338 d[y * stride + x] =
LOWPASS(top, x + 1);
339 }
340
341 #undef LOWPASS
342
344 {
345 *mode = mod_table[*
mode];
346 if (*mode < 0) {
348 *mode = 0;
349 }
350 }
351
353 {
354 /* save pred modes before they get modified */
359
360 /* modify pred modes according to availability of neighbour samples */
365 }
370 }
371 }
372
373 /*****************************************************************************
374 *
375 * motion compensation
376 *
377 ****************************************************************************/
378
384 {
385 const int mx= mv->
x + src_x_offset*8;
386 const int my= mv->
y + src_y_offset*8;
387 const int luma_xy= (mx&3) + ((my&3)<<2);
391 int extra_width = 0;
392 int extra_height= extra_width;
393 int emu=0;
394 const int full_mx= mx>>2;
395 const int full_my= my>>2;
396 const int pic_width = 16*h->
mb_width;
398
400 return;
401 if(mx&7) extra_width -= 3;
402 if(my&7) extra_height -= 3;
403
404 if( full_mx < 0-extra_width
405 || full_my < 0-extra_height
406 || full_mx + 16/*FIXME*/ > pic_width + extra_width
407 || full_my + 16/*FIXME*/ > pic_height + extra_height){
409 16+5, 16+5/*FIXME*/, full_mx-2, full_my-2, pic_width, pic_height);
411 emu=1;
412 }
413
414 qpix_op[luma_xy](dest_y, src_y, h->
l_stride);
//FIXME try variable height perhaps?
415
416 if(emu){
418 9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1);
420 }
421 chroma_op(dest_cb, src_cb, h->
c_stride, chroma_height, mx&7, my&7);
422
423 if(emu){
425 9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1);
427 }
428 chroma_op(dest_cr, src_cr, h->
c_stride, chroma_height, mx&7, my&7);
429 }
430
436 {
439
440 dest_y += 2*x_offset + 2*y_offset*h->
l_stride;
441 dest_cb += x_offset + y_offset*h->
c_stride;
442 dest_cr += x_offset + y_offset*h->
c_stride;
443 x_offset += 8*h->
mbx;
444 y_offset += 8*h->
mby;
445
449 dest_y, dest_cb, dest_cr, x_offset, y_offset,
450 qpix_op, chroma_op, mv);
451
452 qpix_op= qpix_avg;
453 chroma_op= chroma_avg;
454 }
455
459 dest_y, dest_cb, dest_cr, x_offset, y_offset,
461 }
462 }
463
472 }else{
497 }
498 }
499
500 /*****************************************************************************
501 *
502 * motion vector prediction
503 *
504 ****************************************************************************/
505
508
509 *d_x = (src->
x*distp*den + 256 + (src->
x>>31)) >> 9;
510 *d_y = (src->
y*distp*den + 256 + (src->
y>>31)) >> 9;
511 }
512
515 int ax, ay, bx, by, cx, cy;
516 int len_ab, len_bc, len_ca, len_mid;
517
518 /* scale candidates according to their temporal span */
522 /* find the geometrical median of the three candidates */
523 len_ab = abs(ax - bx) + abs(ay - by);
524 len_bc = abs(bx - cx) + abs(by - cy);
525 len_ca = abs(cx - ax) + abs(cy - ay);
526 len_mid =
mid_pred(len_ab, len_bc, len_ca);
527 if(len_mid == len_ab) {
530 } else if(len_mid == len_bc) {
533 } else {
536 }
537 }
538
546
550 mvC = &h->
mv[nP-5];
// set to top-left (mvD)
553 ((mvA->
x | mvA->
y | mvA->
ref) == 0) ||
554 ((mvB->
x | mvB->
y | mvB->
ref) == 0) )) {
556 /* if there is only one suitable candidate, take it */
557 }
else if((mvA->
ref >= 0) && (mvB->
ref < 0) && (mvC->
ref < 0)) {
558 mvP2= mvA;
559 }
else if((mvA->
ref < 0) && (mvB->
ref >= 0) && (mvC->
ref < 0)) {
560 mvP2= mvB;
561 }
else if((mvA->
ref < 0) && (mvB->
ref < 0) && (mvC->
ref >= 0)) {
562 mvP2= mvC;
564 mvP2= mvA;
566 mvP2= mvB;
568 mvP2= mvC;
569 }
570 if(mvP2){
573 }else
575
579 }
581 }
582
583 /*****************************************************************************
584 *
585 * macroblock level
586 *
587 ****************************************************************************/
588
589 /**
590 * initialise predictors for motion vectors and intra prediction
591 */
593 int i;
594
595 /* copy predictors from top line (MB B and C) into cache */
596 for(i=0;i<3;i++) {
599 }
602 /* clear top predictors if MB B is not available */
612 }
615 /* clear top-right predictors if MB C is not available */
619 }
620 /* clear top-left predictors if MB D is not available */
624 }
625 }
626
627 /**
628 * save predictors for later macroblocks and increase
629 * macroblock address
630 * @return 0 if end of frame is reached, 1 otherwise
631 */
633 int i;
634
639 /* copy mvs as predictors to the left */
640 for(i=0;i<=20;i+=4)
641 h->
mv[i] = h->
mv[i+2];
642 /* copy bottom mvs from cache to top line */
647 /* next MB address */
652 /* clear left pred_modes */
654 /* clear left mv predictors */
655 for(i=0;i<=20;i+=4)
659 /* re-calculate sample pointers */
664 return 0;
665 }
666 }
667 return 1;
668 }
669
670 /*****************************************************************************
671 *
672 * frame level
673 *
674 ****************************************************************************/
675
677 int i;
678
679 /* clear some predictors */
680 for(i=0;i<=20;i+=4)
696
697 return 0;
698 }
699
700 /*****************************************************************************
701 *
702 * headers and interface
703 *
704 ****************************************************************************/
705
706 /**
707 * some predictions require data from the top-neighbouring macroblock.
708 * this data has to be stored for one complete row of macroblocks
709 * and this storage space is allocated here
710 */
712 /* alloc top line of predictors */
720
721 /* alloc space for co-located MVs and types */
725 }
726
729
737
740
747 }
748
768 return 0;
769 }
770
773
777
789 return 0;
790 }