blob: 515b008ae45e7bf98f983371237ac73e3e2c1372
1 | /* |
2 | * MPEG-4 encoder/decoder internal header. |
3 | * Copyright (c) 2000,2001 Fabrice Bellard |
4 | * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at> |
5 | * |
6 | * This file is part of FFmpeg. |
7 | * |
8 | * FFmpeg is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU Lesser General Public |
10 | * License as published by the Free Software Foundation; either |
11 | * version 2.1 of the License, or (at your option) any later version. |
12 | * |
13 | * FFmpeg is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * Lesser General Public License for more details. |
17 | * |
18 | * You should have received a copy of the GNU Lesser General Public |
19 | * License along with FFmpeg; if not, write to the Free Software |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | */ |
22 | |
23 | #ifndef AVCODEC_MPEG4VIDEO_H |
24 | #define AVCODEC_MPEG4VIDEO_H |
25 | |
26 | #include <stdint.h> |
27 | |
28 | #include "get_bits.h" |
29 | #include "mpegvideo.h" |
30 | #include "rl.h" |
31 | |
32 | // shapes |
33 | #define RECT_SHAPE 0 |
34 | #define BIN_SHAPE 1 |
35 | #define BIN_ONLY_SHAPE 2 |
36 | #define GRAY_SHAPE 3 |
37 | |
38 | #define SIMPLE_VO_TYPE 1 |
39 | #define CORE_VO_TYPE 3 |
40 | #define MAIN_VO_TYPE 4 |
41 | #define NBIT_VO_TYPE 5 |
42 | #define ARTS_VO_TYPE 10 |
43 | #define ACE_VO_TYPE 12 |
44 | #define ADV_SIMPLE_VO_TYPE 17 |
45 | |
46 | // aspect_ratio_info |
47 | #define EXTENDED_PAR 15 |
48 | |
49 | //vol_sprite_usage / sprite_enable |
50 | #define STATIC_SPRITE 1 |
51 | #define GMC_SPRITE 2 |
52 | |
53 | #define MOTION_MARKER 0x1F001 |
54 | #define DC_MARKER 0x6B001 |
55 | |
56 | #define VOS_STARTCODE 0x1B0 |
57 | #define USER_DATA_STARTCODE 0x1B2 |
58 | #define GOP_STARTCODE 0x1B3 |
59 | #define VISUAL_OBJ_STARTCODE 0x1B5 |
60 | #define VOP_STARTCODE 0x1B6 |
61 | |
62 | /* smaller packets likely don't contain a real frame */ |
63 | #define MAX_NVOP_SIZE 19 |
64 | |
65 | typedef struct Mpeg4DecContext { |
66 | MpegEncContext m; |
67 | |
68 | /// number of bits to represent the fractional part of time |
69 | int time_increment_bits; |
70 | int shape; |
71 | int vol_sprite_usage; |
72 | int sprite_brightness_change; |
73 | int num_sprite_warping_points; |
74 | /// sprite trajectory points |
75 | uint16_t sprite_traj[4][2]; |
76 | /// sprite shift [isChroma] |
77 | int sprite_shift[2]; |
78 | |
79 | // reversible vlc |
80 | int rvlc; |
81 | /// could this stream contain resync markers |
82 | int resync_marker; |
83 | /// time distance of first I -> B, used for interlaced B-frames |
84 | int t_frame; |
85 | |
86 | int new_pred; |
87 | int enhancement_type; |
88 | int scalability; |
89 | int use_intra_dc_vlc; |
90 | |
91 | /// QP above which the ac VLC should be used for intra dc |
92 | int intra_dc_threshold; |
93 | |
94 | /* bug workarounds */ |
95 | int divx_version; |
96 | int divx_build; |
97 | int xvid_build; |
98 | int lavc_build; |
99 | |
100 | /// flag for having shown the warning about invalid Divx B-frames |
101 | int showed_packed_warning; |
102 | /** does the stream contain the low_delay flag, |
103 | * used to work around buggy encoders. */ |
104 | int vol_control_parameters; |
105 | int cplx_estimation_trash_i; |
106 | int cplx_estimation_trash_p; |
107 | int cplx_estimation_trash_b; |
108 | } Mpeg4DecContext; |
109 | |
110 | /* dc encoding for MPEG-4 */ |
111 | extern const uint8_t ff_mpeg4_DCtab_lum[13][2]; |
112 | extern const uint8_t ff_mpeg4_DCtab_chrom[13][2]; |
113 | |
114 | extern const uint16_t ff_mpeg4_intra_vlc[103][2]; |
115 | extern const int8_t ff_mpeg4_intra_level[102]; |
116 | extern const int8_t ff_mpeg4_intra_run[102]; |
117 | |
118 | extern RLTable ff_mpeg4_rl_intra; |
119 | |
120 | /* Note this is identical to the intra rvlc except that it is reordered. */ |
121 | extern RLTable ff_rvlc_rl_inter; |
122 | extern RLTable ff_rvlc_rl_intra; |
123 | |
124 | extern const uint16_t ff_sprite_trajectory_tab[15][2]; |
125 | extern const uint8_t ff_mb_type_b_tab[4][2]; |
126 | |
127 | /* these matrixes will be permuted for the idct */ |
128 | extern const int16_t ff_mpeg4_default_intra_matrix[64]; |
129 | extern const int16_t ff_mpeg4_default_non_intra_matrix[64]; |
130 | |
131 | extern const uint8_t ff_mpeg4_y_dc_scale_table[32]; |
132 | extern const uint8_t ff_mpeg4_c_dc_scale_table[32]; |
133 | extern const uint16_t ff_mpeg4_resync_prefix[8]; |
134 | |
135 | extern const uint8_t ff_mpeg4_dc_threshold[8]; |
136 | |
137 | void ff_mpeg4_encode_mb(MpegEncContext *s, |
138 | int16_t block[6][64], |
139 | int motion_x, int motion_y); |
140 | void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n, |
141 | int dir); |
142 | void ff_set_mpeg4_time(MpegEncContext *s); |
143 | int ff_mpeg4_encode_picture_header(MpegEncContext *s, int picture_number); |
144 | |
145 | int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb); |
146 | void ff_mpeg4_encode_video_packet_header(MpegEncContext *s); |
147 | void ff_mpeg4_clean_buffers(MpegEncContext *s); |
148 | void ff_mpeg4_stuffing(PutBitContext *pbc); |
149 | void ff_mpeg4_init_partitions(MpegEncContext *s); |
150 | void ff_mpeg4_merge_partitions(MpegEncContext *s); |
151 | void ff_clean_mpeg4_qscales(MpegEncContext *s); |
152 | int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx); |
153 | int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s); |
154 | int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx); |
155 | void ff_mpeg4_init_direct_mv(MpegEncContext *s); |
156 | void ff_mpeg4videodec_static_init(void); |
157 | int ff_mpeg4_workaround_bugs(AVCodecContext *avctx); |
158 | int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size); |
159 | |
160 | /** |
161 | * @return the mb_type |
162 | */ |
163 | int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my); |
164 | |
165 | extern uint8_t ff_mpeg4_static_rl_table_store[3][2][2 * MAX_RUN + MAX_LEVEL + 3]; |
166 | |
167 | #if 0 //3IV1 is quite rare and it slows things down a tiny bit |
168 | #define IS_3IV1 s->codec_tag == AV_RL32("3IV1") |
169 | #else |
170 | #define IS_3IV1 0 |
171 | #endif |
172 | |
173 | /** |
174 | * Predict the dc. |
175 | * encoding quantized level -> quantized diff |
176 | * decoding quantized diff -> quantized level |
177 | * @param n block index (0-3 are luma, 4-5 are chroma) |
178 | * @param dir_ptr pointer to an integer where the prediction direction will be stored |
179 | */ |
180 | static inline int ff_mpeg4_pred_dc(MpegEncContext *s, int n, int level, |
181 | int *dir_ptr, int encoding) |
182 | { |
183 | int a, b, c, wrap, pred, scale, ret; |
184 | int16_t *dc_val; |
185 | |
186 | /* find prediction */ |
187 | if (n < 4) |
188 | scale = s->y_dc_scale; |
189 | else |
190 | scale = s->c_dc_scale; |
191 | if (IS_3IV1) |
192 | scale = 8; |
193 | |
194 | wrap = s->block_wrap[n]; |
195 | dc_val = s->dc_val[0] + s->block_index[n]; |
196 | |
197 | /* B C |
198 | * A X |
199 | */ |
200 | a = dc_val[-1]; |
201 | b = dc_val[-1 - wrap]; |
202 | c = dc_val[-wrap]; |
203 | |
204 | /* outside slice handling (we can't do that by memset as we need the |
205 | * dc for error resilience) */ |
206 | if (s->first_slice_line && n != 3) { |
207 | if (n != 2) |
208 | b = c = 1024; |
209 | if (n != 1 && s->mb_x == s->resync_mb_x) |
210 | b = a = 1024; |
211 | } |
212 | if (s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y + 1) { |
213 | if (n == 0 || n == 4 || n == 5) |
214 | b = 1024; |
215 | } |
216 | |
217 | if (abs(a - b) < abs(b - c)) { |
218 | pred = c; |
219 | *dir_ptr = 1; /* top */ |
220 | } else { |
221 | pred = a; |
222 | *dir_ptr = 0; /* left */ |
223 | } |
224 | /* we assume pred is positive */ |
225 | pred = FASTDIV((pred + (scale >> 1)), scale); |
226 | |
227 | if (encoding) { |
228 | ret = level - pred; |
229 | } else { |
230 | level += pred; |
231 | ret = level; |
232 | } |
233 | level *= scale; |
234 | if (level & (~2047)) { |
235 | if (!s->encoding && (s->avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_AGGRESSIVE))) { |
236 | if (level < 0) { |
237 | av_log(s->avctx, AV_LOG_ERROR, |
238 | "dc<0 at %dx%d\n", s->mb_x, s->mb_y); |
239 | return -1; |
240 | } |
241 | if (level > 2048 + scale) { |
242 | av_log(s->avctx, AV_LOG_ERROR, |
243 | "dc overflow at %dx%d\n", s->mb_x, s->mb_y); |
244 | return -1; |
245 | } |
246 | } |
247 | if (level < 0) |
248 | level = 0; |
249 | else if (!(s->workaround_bugs & FF_BUG_DC_CLIP)) |
250 | level = 2047; |
251 | } |
252 | dc_val[0] = level; |
253 | |
254 | return ret; |
255 | } |
256 | |
257 | #endif /* AVCODEC_MPEG4VIDEO_H */ |
258 |