4 * This file is part of Libav.
6 * Libav 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 * Libav 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 Libav; 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
24 #include "libavutil/rational.h"
26 #include "mpegvideo.h"
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
38 extern const AVRational ff_h263_pixel_aspect
[16];
39 extern const uint8_t ff_h263_cbpy_tab
[16][2];
41 extern const uint8_t ff_cbpc_b_tab
[4][2];
43 extern const uint8_t ff_mvtab
[33][2];
45 extern const uint8_t ff_h263_intra_MCBPC_code
[9];
46 extern const uint8_t ff_h263_intra_MCBPC_bits
[9];
48 extern const uint8_t ff_h263_inter_MCBPC_code
[28];
49 extern const uint8_t ff_h263_inter_MCBPC_bits
[28];
50 extern const uint8_t ff_h263_mbtype_b_tab
[15][2];
52 extern VLC ff_h263_intra_MCBPC_vlc
;
53 extern VLC ff_h263_inter_MCBPC_vlc
;
54 extern VLC ff_h263_cbpy_vlc
;
56 extern RLTable ff_h263_rl_inter
;
58 extern RLTable ff_rl_intra_aic
;
60 extern const uint16_t ff_h263_format
[8][2];
61 extern const uint8_t ff_modified_quant_tab
[2][32];
62 extern uint16_t ff_mba_max
[6];
63 extern uint8_t ff_mba_length
[7];
65 extern uint8_t ff_h263_static_rl_table_store
[2][2][2*MAX_RUN
+ MAX_LEVEL
+ 3];
68 int ff_h263_decode_motion(MpegEncContext
* s
, int pred
, int f_code
);
69 av_const
int ff_h263_aspect_to_info(AVRational aspect
);
70 int ff_h263_decode_init(AVCodecContext
*avctx
);
71 int ff_h263_decode_frame(AVCodecContext
*avctx
,
72 void *data
, int *got_frame
,
74 int ff_h263_decode_end(AVCodecContext
*avctx
);
75 void ff_h263_encode_mb(MpegEncContext
*s
,
77 int motion_x
, int motion_y
);
78 void ff_h263_encode_picture_header(MpegEncContext
*s
, int picture_number
);
79 void ff_h263_encode_gob_header(MpegEncContext
* s
, int mb_line
);
80 int16_t *ff_h263_pred_motion(MpegEncContext
* s
, int block
, int dir
,
82 void ff_h263_encode_init(MpegEncContext
*s
);
83 void ff_h263_decode_init_vlc(void);
84 int ff_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 ff_h263_pred_dc(MpegEncContext
* s
, int n
, int16_t **dc_val_ptr
);
92 void ff_h263_pred_acdc(MpegEncContext
* s
, int16_t *block
, int n
);
96 * Print picture info if FF_DEBUG_PICT_INFO is set.
98 void ff_h263_show_pict_info(MpegEncContext
*s
);
100 int ff_intel_h263_decode_picture_header(MpegEncContext
*s
);
101 int ff_h263_decode_mb(MpegEncContext
*s
,
102 int16_t block
[6][64]);
105 * Return the value of the 3bit "source format" syntax element.
106 * This represents some standard picture dimensions or indicates that
107 * width&height are explicitly stored later.
109 int av_const
h263_get_picture_format(int width
, int height
);
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
);
118 static inline int h263_get_motion_length(MpegEncContext
* s
, int val
, int f_code
){
119 int l
, bit_size
, code
;
122 return ff_mvtab
[0][1];
124 bit_size
= f_code
- 1;
125 /* modulo encoding */
126 l
= INT_BIT
- 6 - bit_size
;
129 code
= (val
>> bit_size
) + 1;
131 return ff_mvtab
[code
][1] + 1 + bit_size
;
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
));
141 ff_h263_encode_motion(s
, x
, f_code
);
142 ff_h263_encode_motion(s
, y
, f_code
);
146 static inline int get_p_cbp(MpegEncContext
* s
,
147 int16_t block
[6][64],
148 int motion_x
, int motion_y
){
151 if (s
->mpv_flags
& FF_MPV_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);
159 int score
= ff_h263_inter_MCBPC_bits
[i
+ offset
] * lambda
;
160 if(i
&1) score
+= s
->coded_score
[5];
161 if(i
&2) score
+= s
->coded_score
[4];
163 if(score
< best_cbpc_score
){
164 best_cbpc_score
= score
;
170 int score
= ff_h263_cbpy_tab
[i
^ 0xF][1] * lambda
;
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];
176 if(score
< best_cbpy_score
){
177 best_cbpy_score
= score
;
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)
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
]);
195 for (i
= 0; i
< 6; i
++) {
196 if (s
->block_last_index
[i
] >= 0)
203 static inline void memsetw(short *tab
, int val
, int n
)
210 #endif /* AVCODEC_H263_H */