4 * This file is part of FFmpeg.
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.
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.
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
20 #ifndef AVCODEC_H263_H
21 #define AVCODEC_H263_H
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
32 extern const AVRational ff_h263_pixel_aspect
[16];
33 extern const uint8_t ff_h263_cbpy_tab
[16][2];
35 extern const uint8_t cbpc_b_tab
[4][2];
37 extern const uint8_t mvtab
[33][2];
39 extern const uint8_t ff_h263_intra_MCBPC_code
[9];
40 extern const uint8_t ff_h263_intra_MCBPC_bits
[9];
42 extern const uint8_t ff_h263_inter_MCBPC_code
[28];
43 extern const uint8_t ff_h263_inter_MCBPC_bits
[28];
44 extern const uint8_t h263_mbtype_b_tab
[15][2];
46 extern VLC ff_h263_intra_MCBPC_vlc
;
47 extern VLC ff_h263_inter_MCBPC_vlc
;
48 extern VLC ff_h263_cbpy_vlc
;
50 extern RLTable ff_h263_rl_inter
;
52 extern RLTable rl_intra_aic
;
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];
59 extern uint8_t ff_h263_static_rl_table_store
[2][2][2*MAX_RUN
+ MAX_LEVEL
+ 3];
62 int h263_decode_motion(MpegEncContext
* s
, int pred
, int f_code
);
63 av_const
int ff_h263_aspect_to_info(AVRational aspect
);
64 int ff_h263_decode_init(AVCodecContext
*avctx
);
65 int ff_h263_decode_frame(AVCodecContext
*avctx
,
66 void *data
, int *data_size
,
68 int ff_h263_decode_end(AVCodecContext
*avctx
);
69 void h263_encode_mb(MpegEncContext
*s
,
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
,
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 int ff_h263_decode_mba(MpegEncContext
*s
);
83 void ff_h263_encode_mba(MpegEncContext
*s
);
84 void ff_init_qscale_tab(MpegEncContext
*s
);
85 int h263_pred_dc(MpegEncContext
* s
, int n
, int16_t **dc_val_ptr
);
86 void h263_pred_acdc(MpegEncContext
* s
, DCTELEM
*block
, int n
);
90 * Prints picture info if FF_DEBUG_PICT_INFO is set.
92 void ff_h263_show_pict_info(MpegEncContext
*s
);
94 int ff_intel_h263_decode_picture_header(MpegEncContext
*s
);
95 int ff_h263_decode_mb(MpegEncContext
*s
,
96 DCTELEM block
[6][64]);
99 * Returns the value of the 3bit "source format" syntax element.
100 * that represents some standard picture dimensions or indicates that
101 * width&height are explicitly stored later.
103 int av_const
h263_get_picture_format(int width
, int height
);
105 void ff_clean_h263_qscales(MpegEncContext
*s
);
106 int ff_h263_resync(MpegEncContext
*s
);
107 const uint8_t *ff_h263_find_resync_marker(const uint8_t *p
, const uint8_t *end
);
108 int ff_h263_get_gob_height(MpegEncContext
*s
);
109 void ff_h263_encode_motion(MpegEncContext
* s
, int val
, int f_code
);
112 static inline int h263_get_motion_length(MpegEncContext
* s
, int val
, int f_code
){
113 int l
, bit_size
, code
;
118 bit_size
= f_code
- 1;
119 /* modulo encoding */
120 l
= INT_BIT
- 6 - bit_size
;
123 code
= (val
>> bit_size
) + 1;
125 return mvtab
[code
][1] + 1 + bit_size
;
129 static inline void ff_h263_encode_motion_vector(MpegEncContext
* s
, int x
, int y
, int f_code
){
130 if(s
->flags2
& CODEC_FLAG2_NO_OUTPUT
){
131 skip_put_bits(&s
->pb
,
132 h263_get_motion_length(s
, x
, f_code
)
133 +h263_get_motion_length(s
, y
, f_code
));
135 ff_h263_encode_motion(s
, x
, f_code
);
136 ff_h263_encode_motion(s
, y
, f_code
);
140 static inline int get_p_cbp(MpegEncContext
* s
,
141 DCTELEM block
[6][64],
142 int motion_x
, int motion_y
){
145 if(s
->flags
& CODEC_FLAG_CBP_RD
){
146 int best_cbpy_score
= INT_MAX
;
147 int best_cbpc_score
= INT_MAX
;
148 int cbpc
= (-1), cbpy
= (-1);
149 const int offset
= (s
->mv_type
==MV_TYPE_16X16 ?
0 : 16) + (s
->dquant ?
8 : 0);
150 const int lambda
= s
->lambda2
>> (FF_LAMBDA_SHIFT
- 6);
153 int score
= ff_h263_inter_MCBPC_bits
[i
+ offset
] * lambda
;
154 if(i
&1) score
+= s
->coded_score
[5];
155 if(i
&2) score
+= s
->coded_score
[4];
157 if(score
< best_cbpc_score
){
158 best_cbpc_score
= score
;
164 int score
= ff_h263_cbpy_tab
[i
^ 0xF][1] * lambda
;
165 if(i
&1) score
+= s
->coded_score
[3];
166 if(i
&2) score
+= s
->coded_score
[2];
167 if(i
&4) score
+= s
->coded_score
[1];
168 if(i
&8) score
+= s
->coded_score
[0];
170 if(score
< best_cbpy_score
){
171 best_cbpy_score
= score
;
176 if ((motion_x
| motion_y
| s
->dquant
) == 0 && s
->mv_type
==MV_TYPE_16X16
){
177 if(best_cbpy_score
+ best_cbpc_score
+ 2*lambda
>= 0)
181 for (i
= 0; i
< 6; i
++) {
182 if (s
->block_last_index
[i
] >= 0 && ((cbp
>> (5 - i
))&1)==0 ){
183 s
->block_last_index
[i
]= -1;
184 s
->dsp
.clear_block(s
->block
[i
]);
189 for (i
= 0; i
< 6; i
++) {
190 if (s
->block_last_index
[i
] >= 0)
197 static inline int get_b_cbp(MpegEncContext
* s
, DCTELEM block
[6][64],
198 int motion_x
, int motion_y
, int mb_type
){
201 if(s
->flags
& CODEC_FLAG_CBP_RD
){
203 const int lambda
= s
->lambda2
>> (FF_LAMBDA_SHIFT
- 6);
206 if(s
->coded_score
[i
] < 0){
207 score
+= s
->coded_score
[i
];
214 if ((motion_x
| motion_y
| s
->dquant
| mb_type
) == 0){
215 zero_score
-= 4; //2*MV + mb_type + cbp bit
219 if(zero_score
<= score
){
224 for (i
= 0; i
< 6; i
++) {
225 if (s
->block_last_index
[i
] >= 0 && ((cbp
>> (5 - i
))&1)==0 ){
226 s
->block_last_index
[i
]= -1;
227 s
->dsp
.clear_block(s
->block
[i
]);
231 for (i
= 0; i
< 6; i
++) {
232 if (s
->block_last_index
[i
] >= 0)
239 static inline void memsetw(short *tab
, int val
, int n
)