FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
mpeg4video.h
Go to the documentation of this file.
1
/*
2
* MPEG4 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
typedef
struct
Mpeg4DecContext
{
63
MpegEncContext
m
;
64
65
/// number of bits to represent the fractional part of time
66
int
time_increment_bits
;
67
int
shape
;
68
int
vol_sprite_usage
;
69
int
sprite_brightness_change
;
70
int
num_sprite_warping_points
;
71
/// sprite trajectory points
72
uint16_t
sprite_traj
[4][2];
73
/// sprite shift [isChroma]
74
int
sprite_shift
[2];
75
76
// reversible vlc
77
int
rvlc
;
78
/// could this stream contain resync markers
79
int
resync_marker
;
80
/// time distance of first I -> B, used for interlaced b frames
81
int
t_frame
;
82
83
int
new_pred
;
84
int
enhancement_type
;
85
int
scalability
;
86
int
use_intra_dc_vlc
;
87
88
/// QP above whch the ac VLC should be used for intra dc
89
int
intra_dc_threshold
;
90
91
/* bug workarounds */
92
int
divx_version
;
93
int
divx_build
;
94
int
xvid_build
;
95
int
lavc_build
;
96
97
/// flag for having shown the warning about divxs invalid b frames
98
int
showed_packed_warning
;
99
100
int
cplx_estimation_trash_i
;
101
int
cplx_estimation_trash_p
;
102
int
cplx_estimation_trash_b
;
103
}
Mpeg4DecContext
;
104
105
/* dc encoding for mpeg4 */
106
extern
const
uint8_t
ff_mpeg4_DCtab_lum
[13][2];
107
extern
const
uint8_t
ff_mpeg4_DCtab_chrom
[13][2];
108
109
extern
const
uint16_t
ff_mpeg4_intra_vlc
[103][2];
110
extern
const
int8_t
ff_mpeg4_intra_level
[102];
111
extern
const
int8_t
ff_mpeg4_intra_run
[102];
112
113
extern
RLTable
ff_mpeg4_rl_intra
;
114
115
/* Note this is identical to the intra rvlc except that it is reordered. */
116
extern
RLTable
ff_rvlc_rl_inter
;
117
extern
RLTable
ff_rvlc_rl_intra
;
118
119
extern
const
uint16_t
ff_sprite_trajectory_tab
[15][2];
120
extern
const
uint8_t
ff_mb_type_b_tab
[4][2];
121
122
/* these matrixes will be permuted for the idct */
123
extern
const
int16_t
ff_mpeg4_default_intra_matrix
[64];
124
extern
const
int16_t
ff_mpeg4_default_non_intra_matrix
[64];
125
126
extern
const
uint8_t
ff_mpeg4_y_dc_scale_table
[32];
127
extern
const
uint8_t
ff_mpeg4_c_dc_scale_table
[32];
128
extern
const
uint16_t
ff_mpeg4_resync_prefix
[8];
129
130
extern
const
uint8_t
ff_mpeg4_dc_threshold
[8];
131
132
void
ff_mpeg4_encode_mb
(
MpegEncContext
*
s
,
133
int16_t
block
[6][64],
134
int
motion_x,
int
motion_y);
135
void
ff_mpeg4_pred_ac
(
MpegEncContext
*
s
, int16_t *
block
,
int
n
,
136
int
dir);
137
void
ff_set_mpeg4_time
(
MpegEncContext
*
s
);
138
void
ff_mpeg4_encode_picture_header
(
MpegEncContext
*
s
,
int
picture_number);
139
140
int
ff_mpeg4_decode_picture_header
(
Mpeg4DecContext
*ctx,
GetBitContext
*gb);
141
void
ff_mpeg4_encode_video_packet_header
(
MpegEncContext
*
s
);
142
void
ff_mpeg4_clean_buffers
(
MpegEncContext
*
s
);
143
void
ff_mpeg4_stuffing
(
PutBitContext
*pbc);
144
void
ff_mpeg4_init_partitions
(
MpegEncContext
*
s
);
145
void
ff_mpeg4_merge_partitions
(
MpegEncContext
*
s
);
146
void
ff_clean_mpeg4_qscales
(
MpegEncContext
*
s
);
147
int
ff_mpeg4_decode_partitions
(
Mpeg4DecContext
*ctx);
148
int
ff_mpeg4_get_video_packet_prefix_length
(
MpegEncContext
*
s
);
149
int
ff_mpeg4_decode_video_packet_header
(
Mpeg4DecContext
*ctx);
150
void
ff_mpeg4_init_direct_mv
(
MpegEncContext
*
s
);
151
void
ff_mpeg4videodec_static_init
(
void
);
152
int
ff_mpeg4_workaround_bugs
(
AVCodecContext
*avctx);
153
int
ff_mpeg4_frame_end
(
AVCodecContext
*avctx,
const
uint8_t
*
buf
,
int
buf_size);
154
155
/**
156
*
157
* @return the mb_type
158
*/
159
int
ff_mpeg4_set_direct_mv
(
MpegEncContext
*
s
,
int
mx,
int
my);
160
161
extern
uint8_t
ff_mpeg4_static_rl_table_store
[3][2][2 *
MAX_RUN
+
MAX_LEVEL
+ 3];
162
163
#if 0 //3IV1 is quite rare and it slows things down a tiny bit
164
#define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
165
#else
166
#define IS_3IV1 0
167
#endif
168
169
/**
170
* Predict the dc.
171
* encoding quantized level -> quantized diff
172
* decoding quantized diff -> quantized level
173
* @param n block index (0-3 are luma, 4-5 are chroma)
174
* @param dir_ptr pointer to an integer where the prediction direction will be stored
175
*/
176
static
inline
int
ff_mpeg4_pred_dc
(
MpegEncContext
*
s
,
int
n
,
int
level
,
177
int
*dir_ptr,
int
encoding)
178
{
179
int
a
,
b
,
c
,
wrap
,
pred
,
scale
,
ret
;
180
int16_t *dc_val;
181
182
/* find prediction */
183
if
(n < 4)
184
scale = s->
y_dc_scale
;
185
else
186
scale = s->
c_dc_scale
;
187
if
(
IS_3IV1
)
188
scale = 8;
189
190
wrap = s->
block_wrap
[
n
];
191
dc_val = s->
dc_val
[0] + s->
block_index
[
n
];
192
193
/* B C
194
* A X
195
*/
196
a = dc_val[-1];
197
b = dc_val[-1 -
wrap
];
198
c = dc_val[-
wrap
];
199
200
/* outside slice handling (we can't do that by memset as we need the
201
* dc for error resilience) */
202
if
(s->
first_slice_line
&& n != 3) {
203
if
(n != 2)
204
b = c = 1024;
205
if
(n != 1 && s->
mb_x
== s->
resync_mb_x
)
206
b = a = 1024;
207
}
208
if
(s->
mb_x
== s->
resync_mb_x
&& s->
mb_y
== s->
resync_mb_y
+ 1) {
209
if
(n == 0 || n == 4 || n == 5)
210
b = 1024;
211
}
212
213
if
(abs(a - b) < abs(b - c)) {
214
pred =
c
;
215
*dir_ptr = 1;
/* top */
216
}
else
{
217
pred =
a
;
218
*dir_ptr = 0;
/* left */
219
}
220
/* we assume pred is positive */
221
pred =
FASTDIV
((pred + (scale >> 1)), scale);
222
223
if
(encoding) {
224
ret = level -
pred
;
225
}
else
{
226
level +=
pred
;
227
ret =
level
;
228
if
(s->
err_recognition
& (
AV_EF_BITSTREAM
|
AV_EF_AGGRESSIVE
)) {
229
if
(level < 0) {
230
av_log
(s->
avctx
,
AV_LOG_ERROR
,
231
"dc<0 at %dx%d\n"
, s->
mb_x
, s->
mb_y
);
232
return
-1;
233
}
234
if
(level * scale > 2048 + scale) {
235
av_log
(s->
avctx
,
AV_LOG_ERROR
,
236
"dc overflow at %dx%d\n"
, s->
mb_x
, s->
mb_y
);
237
return
-1;
238
}
239
}
240
}
241
level *=
scale
;
242
if
(level & (~2047)) {
243
if
(level < 0)
244
level = 0;
245
else
if
(!(s->
workaround_bugs
&
FF_BUG_DC_CLIP
))
246
level = 2047;
247
}
248
dc_val[0] =
level
;
249
250
return
ret
;
251
}
252
253
#endif
/* AVCODEC_MPEG4VIDEO_H */
Generated on Sun Mar 23 2014 23:49:59 for FFmpeg by
1.8.2