Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
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 Libav.
7
*
8
* Libav 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
* Libav 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 Libav; 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
66
int
time_increment_bits
;
67
int
shape
;
68
int
vol_sprite_usage
;
69
int
sprite_brightness_change
;
70
int
num_sprite_warping_points
;
72
uint16_t
sprite_traj
[4][2];
74
int
sprite_shift
[2];
75
76
// reversible vlc
77
int
rvlc
;
79
int
resync_marker
;
81
int
t_frame
;
82
83
int
new_pred
;
84
int
enhancement_type
;
85
int
scalability
;
86
int
use_intra_dc_vlc
;
88
int
intra_dc_threshold
;
89
90
/* bug workarounds */
91
int
divx_version
;
92
int
divx_build
;
93
int
xvid_build
;
94
int
lavc_build
;
96
int
showed_packed_warning
;
97
98
int
cplx_estimation_trash_i
;
99
int
cplx_estimation_trash_p
;
100
int
cplx_estimation_trash_b
;
101
}
Mpeg4DecContext
;
102
103
/* dc encoding for mpeg4 */
104
extern
const
uint8_t
ff_mpeg4_DCtab_lum
[13][2];
105
extern
const
uint8_t
ff_mpeg4_DCtab_chrom
[13][2];
106
107
extern
const
uint16_t
ff_mpeg4_intra_vlc
[103][2];
108
extern
const
int8_t
ff_mpeg4_intra_level
[102];
109
extern
const
int8_t
ff_mpeg4_intra_run
[102];
110
111
extern
RLTable
ff_mpeg4_rl_intra
;
112
113
/* Note this is identical to the intra rvlc except that it is reordered. */
114
extern
RLTable
ff_rvlc_rl_inter
;
115
extern
RLTable
ff_rvlc_rl_intra
;
116
117
extern
const
uint16_t
ff_sprite_trajectory_tab
[15][2];
118
extern
const
uint8_t
ff_mb_type_b_tab
[4][2];
119
120
/* these matrixes will be permuted for the idct */
121
extern
const
int16_t
ff_mpeg4_default_intra_matrix
[64];
122
extern
const
int16_t
ff_mpeg4_default_non_intra_matrix
[64];
123
124
extern
const
uint8_t
ff_mpeg4_y_dc_scale_table
[32];
125
extern
const
uint8_t
ff_mpeg4_c_dc_scale_table
[32];
126
extern
const
uint16_t
ff_mpeg4_resync_prefix
[8];
127
128
extern
const
uint8_t
ff_mpeg4_dc_threshold
[8];
129
130
void
ff_mpeg4_encode_mb
(
MpegEncContext
*s,
131
int16_t
block
[6][64],
132
int
motion_x,
int
motion_y);
133
void
ff_mpeg4_pred_ac
(
MpegEncContext
*s, int16_t *
block
,
int
n,
134
int
dir);
135
void
ff_set_mpeg4_time
(
MpegEncContext
*s);
136
void
ff_mpeg4_encode_picture_header
(
MpegEncContext
*s,
int
picture_number);
137
138
int
ff_mpeg4_decode_picture_header
(
Mpeg4DecContext
*ctx,
GetBitContext
*gb);
139
void
ff_mpeg4_encode_video_packet_header
(
MpegEncContext
*s);
140
void
ff_mpeg4_clean_buffers
(
MpegEncContext
*s);
141
void
ff_mpeg4_stuffing
(
PutBitContext
*pbc);
142
void
ff_mpeg4_init_partitions
(
MpegEncContext
*s);
143
void
ff_mpeg4_merge_partitions
(
MpegEncContext
*s);
144
void
ff_clean_mpeg4_qscales
(
MpegEncContext
*s);
145
int
ff_mpeg4_decode_partitions
(
Mpeg4DecContext
*ctx);
146
int
ff_mpeg4_get_video_packet_prefix_length
(
MpegEncContext
*s);
147
int
ff_mpeg4_decode_video_packet_header
(
Mpeg4DecContext
*ctx);
148
void
ff_mpeg4_init_direct_mv
(
MpegEncContext
*s);
149
int
ff_mpeg4_frame_end
(
AVCodecContext
*avctx,
const
uint8_t
*buf,
int
buf_size);
150
155
int
ff_mpeg4_set_direct_mv
(
MpegEncContext
*s,
int
mx,
int
my);
156
157
extern
uint8_t
ff_mpeg4_static_rl_table_store
[3][2][2 *
MAX_RUN
+
MAX_LEVEL
+ 3];
158
159
#if 0 //3IV1 is quite rare and it slows things down a tiny bit
160
#define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
161
#else
162
#define IS_3IV1 0
163
#endif
164
172
static
inline
int
ff_mpeg4_pred_dc
(
MpegEncContext
*s,
int
n,
int
level
,
173
int
*dir_ptr,
int
encoding)
174
{
175
int
a,
b
, c,
wrap
,
pred
,
scale
, ret;
176
int16_t *dc_val;
177
178
/* find prediction */
179
if
(n < 4)
180
scale = s->
y_dc_scale
;
181
else
182
scale = s->
c_dc_scale
;
183
if
(
IS_3IV1
)
184
scale = 8;
185
186
wrap = s->
block_wrap
[n];
187
dc_val = s->
dc_val
[0] + s->
block_index
[n];
188
189
/* B C
190
* A X
191
*/
192
a = dc_val[-1];
193
b = dc_val[-1 -
wrap
];
194
c = dc_val[-
wrap
];
195
196
/* outside slice handling (we can't do that by memset as we need the
197
* dc for error resilience) */
198
if
(s->
first_slice_line
&& n != 3) {
199
if
(n != 2)
200
b = c = 1024;
201
if
(n != 1 && s->
mb_x
== s->
resync_mb_x
)
202
b = a = 1024;
203
}
204
if
(s->
mb_x
== s->
resync_mb_x
&& s->
mb_y
== s->
resync_mb_y
+ 1) {
205
if
(n == 0 || n == 4 || n == 5)
206
b = 1024;
207
}
208
209
if
(abs(a - b) < abs(b - c)) {
210
pred = c;
211
*dir_ptr = 1;
/* top */
212
}
else
{
213
pred = a;
214
*dir_ptr = 0;
/* left */
215
}
216
/* we assume pred is positive */
217
pred =
FASTDIV
((pred + (scale >> 1)), scale);
218
219
if
(encoding) {
220
ret = level -
pred
;
221
}
else
{
222
level +=
pred
;
223
ret =
level
;
224
if
(s->
err_recognition
&
AV_EF_BITSTREAM
) {
225
if
(level < 0) {
226
av_log
(s->
avctx
,
AV_LOG_ERROR
,
227
"dc<0 at %dx%d\n"
, s->
mb_x
, s->
mb_y
);
228
return
-1;
229
}
230
if
(level * scale > 2048 + scale) {
231
av_log
(s->
avctx
,
AV_LOG_ERROR
,
232
"dc overflow at %dx%d\n"
, s->
mb_x
, s->
mb_y
);
233
return
-1;
234
}
235
}
236
}
237
level *=
scale
;
238
if
(level & (~2047)) {
239
if
(level < 0)
240
level = 0;
241
else
if
(!(s->
workaround_bugs
&
FF_BUG_DC_CLIP
))
242
level = 2047;
243
}
244
dc_val[0] =
level
;
245
246
return
ret;
247
}
248
249
#endif
/* AVCODEC_MPEG4VIDEO_H */
Generated on Sun Jun 1 2014 17:55:32 for Libav by
1.8.1.2