Mercurial > libavcodec.hg
annotate h263.h @ 11557:53822d92c3f7 libavcodec
Make sure the EC code does not attempt to use inter based concealment if there
is no reference frame available. (this can happen because the EC code will attempt
to use reference frames even for I/IDR frames)
author | michael |
---|---|
date | Tue, 30 Mar 2010 20:46:46 +0000 |
parents | 811467079ec9 |
children | fdafbcef52f5 |
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 | |
11412 | 23 #include <stdint.h> |
24 #include "libavutil/rational.h" | |
25 #include "get_bits.h" | |
26 #include "mpegvideo.h" | |
27 #include "rl.h" | |
28 | |
10803 | 29 // The defines below define the number of bits that are read at once for |
30 // reading vlc values. Changing these may improve speed and data cache needs | |
31 // be aware though that decreasing them may need the number of stages that is | |
32 // passed to get_vlc* to be increased. | |
33 #define INTRA_MCBPC_VLC_BITS 6 | |
34 #define INTER_MCBPC_VLC_BITS 7 | |
35 #define CBPY_VLC_BITS 6 | |
36 #define TEX_VLC_BITS 9 | |
37 | |
38 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
|
39 extern const uint8_t ff_h263_cbpy_tab[16][2]; |
10803 | 40 |
10828 | 41 extern const uint8_t cbpc_b_tab[4][2]; |
42 | |
10803 | 43 extern const uint8_t mvtab[33][2]; |
44 | |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
45 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
|
46 extern const uint8_t ff_h263_intra_MCBPC_bits[9]; |
10803 | 47 |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
48 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
|
49 extern const uint8_t ff_h263_inter_MCBPC_bits[28]; |
10828 | 50 extern const uint8_t h263_mbtype_b_tab[15][2]; |
10803 | 51 |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
52 extern VLC ff_h263_intra_MCBPC_vlc; |
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
53 extern VLC ff_h263_inter_MCBPC_vlc; |
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
54 extern VLC ff_h263_cbpy_vlc; |
10803 | 55 |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
56 extern RLTable ff_h263_rl_inter; |
10803 | 57 |
10828 | 58 extern RLTable rl_intra_aic; |
59 | |
60 extern const uint16_t h263_format[8][2]; | |
61 extern const uint8_t modified_quant_tab[2][32]; | |
62 extern uint16_t ff_mba_max[6]; | |
63 extern uint8_t ff_mba_length[7]; | |
64 | |
65 extern uint8_t ff_h263_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3]; | |
66 | |
67 | |
10803 | 68 int h263_decode_motion(MpegEncContext * s, int pred, int f_code); |
69 av_const int ff_h263_aspect_to_info(AVRational aspect); | |
10828 | 70 int ff_h263_decode_init(AVCodecContext *avctx); |
71 int ff_h263_decode_frame(AVCodecContext *avctx, | |
72 void *data, int *data_size, | |
73 AVPacket *avpkt); | |
74 int ff_h263_decode_end(AVCodecContext *avctx); | |
75 void h263_encode_mb(MpegEncContext *s, | |
76 DCTELEM block[6][64], | |
77 int motion_x, int motion_y); | |
78 void h263_encode_picture_header(MpegEncContext *s, int picture_number); | |
79 void h263_encode_gob_header(MpegEncContext * s, int mb_line); | |
80 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir, | |
81 int *px, int *py); | |
82 void h263_encode_init(MpegEncContext *s); | |
83 void h263_decode_init_vlc(MpegEncContext *s); | |
84 int h263_decode_picture_header(MpegEncContext *s); | |
85 int ff_h263_decode_gob_header(MpegEncContext *s); | |
86 void ff_h263_update_motion_val(MpegEncContext * s); | |
87 void ff_h263_loop_filter(MpegEncContext * s); | |
88 int ff_h263_decode_mba(MpegEncContext *s); | |
89 void ff_h263_encode_mba(MpegEncContext *s); | |
90 void ff_init_qscale_tab(MpegEncContext *s); | |
91 int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr); | |
92 void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n); | |
93 | |
94 | |
95 /** | |
96 * Prints picture info if FF_DEBUG_PICT_INFO is set. | |
97 */ | |
98 void ff_h263_show_pict_info(MpegEncContext *s); | |
99 | |
100 int ff_intel_h263_decode_picture_header(MpegEncContext *s); | |
101 int ff_h263_decode_mb(MpegEncContext *s, | |
102 DCTELEM block[6][64]); | |
103 | |
104 /** | |
105 * Returns the value of the 3bit "source format" syntax element. | |
106 * that represents some standard picture dimensions or indicates that | |
107 * width&height are explicitly stored later. | |
108 */ | |
109 int av_const h263_get_picture_format(int width, int height); | |
110 | |
111 void ff_clean_h263_qscales(MpegEncContext *s); | |
112 int ff_h263_resync(MpegEncContext *s); | |
113 const uint8_t *ff_h263_find_resync_marker(const uint8_t *p, const uint8_t *end); | |
114 int ff_h263_get_gob_height(MpegEncContext *s); | |
115 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code); | |
116 | |
10803 | 117 |
118 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){ | |
119 int l, bit_size, code; | |
120 | |
121 if (val == 0) { | |
122 return mvtab[0][1]; | |
123 } else { | |
124 bit_size = f_code - 1; | |
125 /* modulo encoding */ | |
126 l= INT_BIT - 6 - bit_size; | |
127 val = (val<<l)>>l; | |
128 val--; | |
129 code = (val >> bit_size) + 1; | |
130 | |
131 return mvtab[code][1] + 1 + bit_size; | |
132 } | |
133 } | |
134 | |
135 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){ | |
136 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){ | |
137 skip_put_bits(&s->pb, | |
138 h263_get_motion_length(s, x, f_code) | |
139 +h263_get_motion_length(s, y, f_code)); | |
140 }else{ | |
141 ff_h263_encode_motion(s, x, f_code); | |
142 ff_h263_encode_motion(s, y, f_code); | |
143 } | |
144 } | |
145 | |
146 static inline int get_p_cbp(MpegEncContext * s, | |
147 DCTELEM block[6][64], | |
148 int motion_x, int motion_y){ | |
149 int cbp, i; | |
150 | |
151 if(s->flags & CODEC_FLAG_CBP_RD){ | |
152 int best_cbpy_score= INT_MAX; | |
153 int best_cbpc_score= INT_MAX; | |
154 int cbpc = (-1), cbpy= (-1); | |
155 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0); | |
156 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); | |
157 | |
158 for(i=0; i<4; i++){ | |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
159 int score= ff_h263_inter_MCBPC_bits[i + offset] * lambda; |
10803 | 160 if(i&1) score += s->coded_score[5]; |
161 if(i&2) score += s->coded_score[4]; | |
162 | |
163 if(score < best_cbpc_score){ | |
164 best_cbpc_score= score; | |
165 cbpc= i; | |
166 } | |
167 } | |
168 | |
169 for(i=0; i<16; i++){ | |
10818
514dc1c87b2e
Rename most non static h263 tables so their name contains h263.
michael
parents:
10803
diff
changeset
|
170 int score= ff_h263_cbpy_tab[i ^ 0xF][1] * lambda; |
10803 | 171 if(i&1) score += s->coded_score[3]; |
172 if(i&2) score += s->coded_score[2]; | |
173 if(i&4) score += s->coded_score[1]; | |
174 if(i&8) score += s->coded_score[0]; | |
175 | |
176 if(score < best_cbpy_score){ | |
177 best_cbpy_score= score; | |
178 cbpy= i; | |
179 } | |
180 } | |
181 cbp= cbpc + 4*cbpy; | |
182 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){ | |
183 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0) | |
184 cbp= 0; | |
185 } | |
186 | |
187 for (i = 0; i < 6; i++) { | |
188 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){ | |
189 s->block_last_index[i]= -1; | |
190 s->dsp.clear_block(s->block[i]); | |
191 } | |
192 } | |
193 }else{ | |
194 cbp= 0; | |
195 for (i = 0; i < 6; i++) { | |
196 if (s->block_last_index[i] >= 0) | |
197 cbp |= 1 << (5 - i); | |
198 } | |
199 } | |
200 return cbp; | |
201 } | |
202 | |
203 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64], | |
204 int motion_x, int motion_y, int mb_type){ | |
205 int cbp=0, i; | |
206 | |
207 if(s->flags & CODEC_FLAG_CBP_RD){ | |
208 int score=0; | |
209 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); | |
210 | |
211 for(i=0; i<6; i++){ | |
212 if(s->coded_score[i] < 0){ | |
213 score += s->coded_score[i]; | |
214 cbp |= 1 << (5 - i); | |
215 } | |
216 } | |
217 | |
218 if(cbp){ | |
219 int zero_score= -6; | |
220 if ((motion_x | motion_y | s->dquant | mb_type) == 0){ | |
221 zero_score-= 4; //2*MV + mb_type + cbp bit | |
222 } | |
223 | |
224 zero_score*= lambda; | |
225 if(zero_score <= score){ | |
226 cbp=0; | |
227 } | |
228 } | |
229 | |
230 for (i = 0; i < 6; i++) { | |
231 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){ | |
232 s->block_last_index[i]= -1; | |
233 s->dsp.clear_block(s->block[i]); | |
234 } | |
235 } | |
236 }else{ | |
237 for (i = 0; i < 6; i++) { | |
238 if (s->block_last_index[i] >= 0) | |
239 cbp |= 1 << (5 - i); | |
240 } | |
241 } | |
242 return cbp; | |
243 } | |
10828 | 244 |
245 static inline void memsetw(short *tab, int val, int n) | |
246 { | |
247 int i; | |
248 for(i=0;i<n;i++) | |
249 tab[i] = val; | |
250 } | |
10803 | 251 #endif |