Mercurial > libavcodec.hg
annotate h263.h @ 11032:01bd040f8607 libavcodec
Unroll main loop so the edge==0 case is seperate.
This allows many things to be simplified away.
h264 decoder is overall 1% faster with a mbaff sample and
0.1% slower with the cathedral sample, probably because the slow loop
filter code must be loaded into the code cache for each first MB of each
row but isnt used for the following MBs.
author | michael |
---|---|
date | Thu, 28 Jan 2010 01:24:25 +0000 |
parents | d0657e337f91 |
children | f9e0f62a7d8a |
rev | line source |
---|---|
10803 | 1 /* |
2 * H263 internal header | |
3 * | |
4 * This file is part of FFmpeg. | |
5 * | |
6 * FFmpeg is free software; you can redistribute it and/or | |
7 * modify it under the terms of the GNU Lesser General Public | |
8 * License as published by the Free Software Foundation; either | |
9 * version 2.1 of the License, or (at your option) any later version. | |
10 * | |
11 * FFmpeg is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * Lesser General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU Lesser General Public | |
17 * License along with FFmpeg; if not, write to the Free Software | |
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
19 */ | |
20 #ifndef AVCODEC_H263_H | |
21 #define AVCODEC_H263_H | |
22 | |
23 // The defines below define the number of bits that are read at once for | |
24 // reading vlc values. Changing these may improve speed and data cache needs | |
25 // be aware though that decreasing them may need the number of stages that is | |
26 // passed to get_vlc* to be increased. | |
27 #define INTRA_MCBPC_VLC_BITS 6 | |
28 #define INTER_MCBPC_VLC_BITS 7 | |
29 #define CBPY_VLC_BITS 6 | |
30 #define TEX_VLC_BITS 9 | |
31 | |
32 extern const AVRational ff_h263_pixel_aspect[16]; | |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
33 extern const uint8_t ff_h263_cbpy_tab[16][2]; |
10803 | 34 |
10828 | 35 extern const uint8_t cbpc_b_tab[4][2]; |
36 | |
10803 | 37 extern const uint8_t mvtab[33][2]; |
38 | |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
39 extern const uint8_t ff_h263_intra_MCBPC_code[9]; |
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
40 extern const uint8_t ff_h263_intra_MCBPC_bits[9]; |
10803 | 41 |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
42 extern const uint8_t ff_h263_inter_MCBPC_code[28]; |
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
43 extern const uint8_t ff_h263_inter_MCBPC_bits[28]; |
10828 | 44 extern const uint8_t h263_mbtype_b_tab[15][2]; |
10803 | 45 |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
46 extern VLC ff_h263_intra_MCBPC_vlc; |
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
47 extern VLC ff_h263_inter_MCBPC_vlc; |
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
48 extern VLC ff_h263_cbpy_vlc; |
10803 | 49 |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
50 extern RLTable ff_h263_rl_inter; |
10803 | 51 |
10828 | 52 extern RLTable rl_intra_aic; |
53 | |
54 extern const uint16_t h263_format[8][2]; | |
55 extern const uint8_t modified_quant_tab[2][32]; | |
56 extern uint16_t ff_mba_max[6]; | |
57 extern uint8_t ff_mba_length[7]; | |
58 | |
59 extern uint8_t ff_h263_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3]; | |
60 | |
61 | |
10803 | 62 int h263_decode_motion(MpegEncContext * s, int pred, int f_code); |
63 av_const int ff_h263_aspect_to_info(AVRational aspect); | |
10828 | 64 int ff_h263_decode_init(AVCodecContext *avctx); |
65 int ff_h263_decode_frame(AVCodecContext *avctx, | |
66 void *data, int *data_size, | |
67 AVPacket *avpkt); | |
68 int ff_h263_decode_end(AVCodecContext *avctx); | |
69 void h263_encode_mb(MpegEncContext *s, | |
70 DCTELEM block[6][64], | |
71 int motion_x, int motion_y); | |
72 void h263_encode_picture_header(MpegEncContext *s, int picture_number); | |
73 void h263_encode_gob_header(MpegEncContext * s, int mb_line); | |
74 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir, | |
75 int *px, int *py); | |
76 void h263_encode_init(MpegEncContext *s); | |
77 void h263_decode_init_vlc(MpegEncContext *s); | |
78 int h263_decode_picture_header(MpegEncContext *s); | |
79 int ff_h263_decode_gob_header(MpegEncContext *s); | |
80 void ff_h263_update_motion_val(MpegEncContext * s); | |
81 void ff_h263_loop_filter(MpegEncContext * s); | |
82 void ff_set_qscale(MpegEncContext * s, int qscale); | |
83 int ff_h263_decode_mba(MpegEncContext *s); | |
84 void ff_h263_encode_mba(MpegEncContext *s); | |
85 void ff_init_qscale_tab(MpegEncContext *s); | |
86 int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr); | |
87 void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n); | |
88 | |
89 | |
90 /** | |
91 * Prints picture info if FF_DEBUG_PICT_INFO is set. | |
92 */ | |
93 void ff_h263_show_pict_info(MpegEncContext *s); | |
94 | |
95 int ff_intel_h263_decode_picture_header(MpegEncContext *s); | |
96 int ff_h263_decode_mb(MpegEncContext *s, | |
97 DCTELEM block[6][64]); | |
98 | |
99 /** | |
100 * Returns the value of the 3bit "source format" syntax element. | |
101 * that represents some standard picture dimensions or indicates that | |
102 * width&height are explicitly stored later. | |
103 */ | |
104 int av_const h263_get_picture_format(int width, int height); | |
105 | |
106 void ff_clean_h263_qscales(MpegEncContext *s); | |
107 int ff_h263_resync(MpegEncContext *s); | |
108 const uint8_t *ff_h263_find_resync_marker(const uint8_t *p, const uint8_t *end); | |
109 int ff_h263_get_gob_height(MpegEncContext *s); | |
110 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code); | |
111 | |
10803 | 112 |
113 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){ | |
114 int l, bit_size, code; | |
115 | |
116 if (val == 0) { | |
117 return mvtab[0][1]; | |
118 } else { | |
119 bit_size = f_code - 1; | |
120 /* modulo encoding */ | |
121 l= INT_BIT - 6 - bit_size; | |
122 val = (val<<l)>>l; | |
123 val--; | |
124 code = (val >> bit_size) + 1; | |
125 | |
126 return mvtab[code][1] + 1 + bit_size; | |
127 } | |
128 } | |
129 | |
130 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){ | |
131 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){ | |
132 skip_put_bits(&s->pb, | |
133 h263_get_motion_length(s, x, f_code) | |
134 +h263_get_motion_length(s, y, f_code)); | |
135 }else{ | |
136 ff_h263_encode_motion(s, x, f_code); | |
137 ff_h263_encode_motion(s, y, f_code); | |
138 } | |
139 } | |
140 | |
141 static inline int get_p_cbp(MpegEncContext * s, | |
142 DCTELEM block[6][64], | |
143 int motion_x, int motion_y){ | |
144 int cbp, i; | |
145 | |
146 if(s->flags & CODEC_FLAG_CBP_RD){ | |
147 int best_cbpy_score= INT_MAX; | |
148 int best_cbpc_score= INT_MAX; | |
149 int cbpc = (-1), cbpy= (-1); | |
150 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0); | |
151 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); | |
152 | |
153 for(i=0; i<4; i++){ | |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
154 int score= ff_h263_inter_MCBPC_bits[i + offset] * lambda; |
10803 | 155 if(i&1) score += s->coded_score[5]; |
156 if(i&2) score += s->coded_score[4]; | |
157 | |
158 if(score < best_cbpc_score){ | |
159 best_cbpc_score= score; | |
160 cbpc= i; | |
161 } | |
162 } | |
163 | |
164 for(i=0; i<16; i++){ | |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
165 int score= ff_h263_cbpy_tab[i ^ 0xF][1] * lambda; |
10803 | 166 if(i&1) score += s->coded_score[3]; |
167 if(i&2) score += s->coded_score[2]; | |
168 if(i&4) score += s->coded_score[1]; | |
169 if(i&8) score += s->coded_score[0]; | |
170 | |
171 if(score < best_cbpy_score){ | |
172 best_cbpy_score= score; | |
173 cbpy= i; | |
174 } | |
175 } | |
176 cbp= cbpc + 4*cbpy; | |
177 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){ | |
178 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0) | |
179 cbp= 0; | |
180 } | |
181 | |
182 for (i = 0; i < 6; i++) { | |
183 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){ | |
184 s->block_last_index[i]= -1; | |
185 s->dsp.clear_block(s->block[i]); | |
186 } | |
187 } | |
188 }else{ | |
189 cbp= 0; | |
190 for (i = 0; i < 6; i++) { | |
191 if (s->block_last_index[i] >= 0) | |
192 cbp |= 1 << (5 - i); | |
193 } | |
194 } | |
195 return cbp; | |
196 } | |
197 | |
198 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64], | |
199 int motion_x, int motion_y, int mb_type){ | |
200 int cbp=0, i; | |
201 | |
202 if(s->flags & CODEC_FLAG_CBP_RD){ | |
203 int score=0; | |
204 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); | |
205 | |
206 for(i=0; i<6; i++){ | |
207 if(s->coded_score[i] < 0){ | |
208 score += s->coded_score[i]; | |
209 cbp |= 1 << (5 - i); | |
210 } | |
211 } | |
212 | |
213 if(cbp){ | |
214 int zero_score= -6; | |
215 if ((motion_x | motion_y | s->dquant | mb_type) == 0){ | |
216 zero_score-= 4; //2*MV + mb_type + cbp bit | |
217 } | |
218 | |
219 zero_score*= lambda; | |
220 if(zero_score <= score){ | |
221 cbp=0; | |
222 } | |
223 } | |
224 | |
225 for (i = 0; i < 6; i++) { | |
226 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){ | |
227 s->block_last_index[i]= -1; | |
228 s->dsp.clear_block(s->block[i]); | |
229 } | |
230 } | |
231 }else{ | |
232 for (i = 0; i < 6; i++) { | |
233 if (s->block_last_index[i] >= 0) | |
234 cbp |= 1 << (5 - i); | |
235 } | |
236 } | |
237 return cbp; | |
238 } | |
10828 | 239 |
240 static inline void memsetw(short *tab, int val, int n) | |
241 { | |
242 int i; | |
243 for(i=0;i<n;i++) | |
244 tab[i] = val; | |
245 } | |
10803 | 246 #endif |