59db1ee512e715941e41e9b9e3376a5fc3f77f85
[ffmpeg.git] / libav / h263enc.c
1 /*
2  * H263 backend for ffmpeg encoder
3  * Copyright (c) 2000 Gerard Lantau.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <netinet/in.h>
22 #include "common.h"
23 #include "mpegvideo.h"
24 #include "h263data.h"
25
26 void h263_picture_header(MpegEncContext *s, int picture_number)
27 {
28     int format;
29
30     align_put_bits(&s->pb);
31     put_bits(&s->pb, 22, 0x20);
32     put_bits(&s->pb, 8, ((s->picture_number * 30) / s->frame_rate) & 0xff); 
33
34     put_bits(&s->pb, 1, 1); /* marker */
35     put_bits(&s->pb, 1, 0); /* h263 id */
36     put_bits(&s->pb, 1, 0); /* split screen off */
37     put_bits(&s->pb, 1, 0); /* camera  off */
38     put_bits(&s->pb, 1, 0); /* freeze picture release off */
39
40     if (s->width == 128 && s->height == 96)
41         format = 1;
42     else if (s->width == 176 && s->height == 144)
43         format = 2;
44     else if (s->width == 352 && s->height == 288)
45         format = 3;
46     else if (s->width == 704 && s->height == 576)
47         format = 4;
48     else if (s->width == 1408 && s->height == 1152)
49         format = 5;
50     else
51         abort();
52
53     put_bits(&s->pb, 3, format);
54     
55     put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
56
57     put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
58
59     put_bits(&s->pb, 1, 0); /* SAC: off */
60
61     put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
62
63     put_bits(&s->pb, 1, 0); /* not PB frame */
64
65     put_bits(&s->pb, 5, s->qscale);
66     
67     put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
68     
69     put_bits(&s->pb, 1, 0); /* no PEI */
70 }
71
72 static void h263_encode_block(MpegEncContext *s, DCTELEM *block, 
73                               int n);
74
75 void h263_encode_mb(MpegEncContext *s, 
76                     DCTELEM block[6][64],
77                     int motion_x, int motion_y)
78 {
79     int cbpc, cbpy, i, cbp;
80
81     if (!s->mb_intra) {
82         /* compute cbp */
83         cbp = 0;
84         for(i=0;i<6;i++) {
85             if (s->block_last_index[i] >= 0)
86                 cbp |= 1 << (5 - i);
87         }
88         if ((cbp | motion_x | motion_y) == 0) {
89             /* skip macroblock */
90             put_bits(&s->pb, 1, 1);
91             return;
92         }
93             
94         put_bits(&s->pb, 1, 0); /* mb coded */
95         cbpc = cbp & 3;
96         put_bits(&s->pb, 
97                  inter_MCBPC_bits[cbpc], 
98                  inter_MCBPC_code[cbpc]);
99         cbpy = cbp >> 2;
100         cbpy ^= 0xf;
101         put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
102         
103         /* motion vectors: zero */
104         put_bits(&s->pb, 1, 1);
105         put_bits(&s->pb, 1, 1);
106
107     } else {
108         /* compute cbp */
109         cbp = 0;
110         for(i=0;i<6;i++) {
111             if (s->block_last_index[i] >= 1)
112                 cbp |= 1 << (5 - i);
113         }
114
115         cbpc = cbp & 3;
116         if (s->pict_type == I_TYPE) {
117             put_bits(&s->pb, 
118                      intra_MCBPC_bits[cbpc], 
119                      intra_MCBPC_code[cbpc]);
120         } else {
121             put_bits(&s->pb, 1, 0); /* mb coded */
122             put_bits(&s->pb, 
123                      inter_MCBPC_bits[cbpc + 4], 
124                      inter_MCBPC_code[cbpc + 4]);
125         }
126         cbpy = cbp >> 2;
127         put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
128     }
129     
130     /* encode each block */
131     for(i=0;i<6;i++) {
132         h263_encode_block(s, block[i], i);
133     }
134 }
135
136 static void h263_encode_block(MpegEncContext *s, DCTELEM *block, int n)
137 {
138     int level, run, last, i, j, last_index, last_non_zero, sign, alevel;
139     int code, len;
140
141     if (s->mb_intra) {
142         /* DC coef */
143         level = block[0];
144         if (level == 128)
145             put_bits(&s->pb, 8, 0xff);
146         else
147             put_bits(&s->pb, 8, level & 0xff);
148         i = 1;
149     } else {
150         i = 0;
151     }
152     
153     /* AC coefs */
154     last_index = s->block_last_index[n];
155     last_non_zero = i - 1;
156     for(;i<=last_index;i++) {
157         j = zigzag_direct[i];
158         level = block[j];
159         if (level) {
160             run = i - last_non_zero - 1;
161             last = (i == last_index);
162             sign = 0;
163             alevel = level;
164             if (level < 0) {
165                 sign = 1;
166                 alevel = -level;
167             }
168             len = 0;
169             code = 0; /* only to disable warning */
170             if (last == 0) {
171                 if (run < 2 && alevel < 13 ) {
172                     len = coeff_tab0[run][alevel-1][1];
173                     code = coeff_tab0[run][alevel-1][0];
174                 } else if (run >= 2 && run < 27 && alevel < 5) {
175                     len = coeff_tab1[run-2][alevel-1][1];
176                     code = coeff_tab1[run-2][alevel-1][0];
177                 }
178             } else {
179                 if (run < 2 && alevel < 4) {
180                     len = coeff_tab2[run][alevel-1][1];
181                     code = coeff_tab2[run][alevel-1][0];
182                 } else if (run >= 2 && run < 42 && alevel == 1) {
183                     len = coeff_tab3[run-2][1];
184                     code = coeff_tab3[run-2][0];
185                 }
186             }
187             
188             if (len != 0) {
189                 code = (code << 1) | sign;
190                 put_bits(&s->pb, len + 1, code);
191             } else {
192                     /* escape */
193                     put_bits(&s->pb, 7, 3);
194                     put_bits(&s->pb, 1, last);
195                     put_bits(&s->pb, 6, run);
196                     put_bits(&s->pb, 8, level & 0xff);
197             }
198
199             last_non_zero = i;
200         }
201     }
202 }
203
204 /* write RV 1.0 compatible frame header */
205 void rv10_encode_picture_header(MpegEncContext *s, int picture_number)
206 {
207     align_put_bits(&s->pb);
208
209     put_bits(&s->pb, 1, 1); /* marker */
210
211     put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
212
213     put_bits(&s->pb, 1, 0); /* not PB frame */
214
215     put_bits(&s->pb, 5, s->qscale);
216     
217     if (s->pict_type == I_TYPE) {
218         /* specific MPEG like DC coding not used */
219     }
220     
221     /* if multiple packets per frame are sent, the position at which
222        to display the macro blocks is coded here */
223     put_bits(&s->pb, 6, 0); /* mb_x */
224     put_bits(&s->pb, 6, 0); /* mb_y */
225     put_bits(&s->pb, 12, s->mb_width * s->mb_height);
226     
227     put_bits(&s->pb, 3, 0); /* ignored */
228 }
229