]> git.sesse.net Git - ffmpeg/blob - libavcodec/h261.c
1ffd64a5eca08afb2a93edf9e976c3b2667ebdcf
[ffmpeg] / libavcodec / h261.c
1 /*
2  * H261 common code
3  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
4  * Copyright (c) 2004 Maarten Daniels
5  *
6  * This file is part of Libav.
7  *
8  * Libav is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * Libav is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with Libav; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22
23 /**
24  * @file
25  * h261codec.
26  */
27
28 #include "avcodec.h"
29 #include "h261.h"
30
31 #define IS_FIL(a)    ((a)&MB_TYPE_H261_FIL)
32
33 uint8_t ff_h261_rl_table_store[2][2*MAX_RUN + MAX_LEVEL + 3];
34
35 static void h261_loop_filter(uint8_t *src, int stride)
36 {
37     int x,y,xy,yz;
38     int temp[64];
39
40     for(x=0; x<8; x++){
41         temp[x      ] = 4*src[x           ];
42         temp[x + 7*8] = 4*src[x + 7*stride];
43     }
44     for(y=1; y<7; y++){
45         for(x=0; x<8; x++){
46             xy = y * stride + x;
47             yz = y * 8 + x;
48             temp[yz] = src[xy - stride] + 2*src[xy] + src[xy + stride];
49         }
50     }
51
52     for(y=0; y<8; y++){
53         src[  y*stride] = (temp[  y*8] + 2)>>2;
54         src[7+y*stride] = (temp[7+y*8] + 2)>>2;
55         for(x=1; x<7; x++){
56             xy = y * stride + x;
57             yz = y * 8 + x;
58             src[xy] = (temp[yz-1] + 2*temp[yz] + temp[yz+1] + 8)>>4;
59         }
60     }
61 }
62
63 void ff_h261_loop_filter(MpegEncContext *s){
64     H261Context * h= (H261Context*)s;
65     const int linesize  = s->linesize;
66     const int uvlinesize= s->uvlinesize;
67     uint8_t *dest_y = s->dest[0];
68     uint8_t *dest_cb= s->dest[1];
69     uint8_t *dest_cr= s->dest[2];
70
71     if(!(IS_FIL (h->mtype)))
72         return;
73
74     h261_loop_filter(dest_y,                    linesize);
75     h261_loop_filter(dest_y                + 8, linesize);
76     h261_loop_filter(dest_y + 8 * linesize,     linesize);
77     h261_loop_filter(dest_y + 8 * linesize + 8, linesize);
78     h261_loop_filter(dest_cb, uvlinesize);
79     h261_loop_filter(dest_cr, uvlinesize);
80 }