FFmpeg
mpeg4video.h
Go to the documentation of this file.
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 SIMPLE_STUDIO_VO_TYPE 14
45 #define CORE_STUDIO_VO_TYPE 15
46 #define ADV_SIMPLE_VO_TYPE 17
47 
48 #define VOT_VIDEO_ID 1
49 #define VOT_STILL_TEXTURE_ID 2
50 
51 // aspect_ratio_info
52 #define EXTENDED_PAR 15
53 
54 //vol_sprite_usage / sprite_enable
55 #define STATIC_SPRITE 1
56 #define GMC_SPRITE 2
57 
58 #define MOTION_MARKER 0x1F001
59 #define DC_MARKER 0x6B001
60 
61 #define VOS_STARTCODE 0x1B0
62 #define USER_DATA_STARTCODE 0x1B2
63 #define GOP_STARTCODE 0x1B3
64 #define VISUAL_OBJ_STARTCODE 0x1B5
65 #define VOP_STARTCODE 0x1B6
66 #define SLICE_STARTCODE 0x1B7
67 #define EXT_STARTCODE 0x1B8
68 
69 #define QUANT_MATRIX_EXT_ID 0x3
70 
71 /* smaller packets likely don't contain a real frame */
72 #define MAX_NVOP_SIZE 19
73 
74 typedef struct Mpeg4DecContext {
76 
77  /// number of bits to represent the fractional part of time
79  int shape;
83  /// sprite trajectory points
84  uint16_t sprite_traj[4][2];
85  /// sprite shift [isChroma]
86  int sprite_shift[2];
87 
88  // reversible vlc
89  int rvlc;
90  /// could this stream contain resync markers
92  /// time distance of first I -> B, used for interlaced B-frames
93  int t_frame;
94 
95  int new_pred;
99 
100  /// QP above which the ac VLC should be used for intra dc
102 
103  /* bug workarounds */
108 
109  /// flag for having shown the warning about invalid Divx B-frames
111  /** does the stream contain the low_delay flag,
112  * used to work around buggy encoders. */
117 
118  int rgb;
120 
121 static const uint8_t mpeg4_block_count[4] = {0, 6, 8, 12};
122 
123 /* dc encoding for MPEG-4 */
124 extern const uint8_t ff_mpeg4_DCtab_lum[13][2];
125 extern const uint8_t ff_mpeg4_DCtab_chrom[13][2];
126 
127 extern const uint16_t ff_mpeg4_intra_vlc[103][2];
128 extern const int8_t ff_mpeg4_intra_level[102];
129 extern const int8_t ff_mpeg4_intra_run[102];
130 
132 
133 /* Note this is identical to the intra rvlc except that it is reordered. */
136 
137 extern const uint8_t ff_sprite_trajectory_lens[15];
138 extern const uint8_t ff_mb_type_b_tab[4][2];
139 
140 /* these matrixes will be permuted for the idct */
141 extern const int16_t ff_mpeg4_default_intra_matrix[64];
142 extern const int16_t ff_mpeg4_default_non_intra_matrix[64];
143 
144 extern const uint8_t ff_mpeg4_y_dc_scale_table[32];
145 extern const uint8_t ff_mpeg4_c_dc_scale_table[32];
146 extern const uint16_t ff_mpeg4_resync_prefix[8];
147 
148 extern const uint8_t ff_mpeg4_dc_threshold[8];
149 
150 extern const uint8_t ff_mpeg4_studio_dc_luma[19][2];
151 extern const uint8_t ff_mpeg4_studio_dc_chroma[19][2];
152 extern const uint8_t ff_mpeg4_studio_intra[12][24][2];
153 
155  int16_t block[6][64],
156  int motion_x, int motion_y);
157 void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n,
158  int dir);
160 int ff_mpeg4_encode_picture_header(MpegEncContext *s, int picture_number);
161 
176 int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size);
177 
178 /**
179  * @return the mb_type
180  */
181 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my);
182 
184 
185 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
186 #define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
187 #else
188 #define IS_3IV1 0
189 #endif
190 
191 /**
192  * Predict the dc.
193  * encoding quantized level -> quantized diff
194  * decoding quantized diff -> quantized level
195  * @param n block index (0-3 are luma, 4-5 are chroma)
196  * @param dir_ptr pointer to an integer where the prediction direction will be stored
197  */
198 static inline int ff_mpeg4_pred_dc(MpegEncContext *s, int n, int level,
199  int *dir_ptr, int encoding)
200 {
201  int a, b, c, wrap, pred, scale, ret;
202  int16_t *dc_val;
203 
204  /* find prediction */
205  if (n < 4)
206  scale = s->y_dc_scale;
207  else
208  scale = s->c_dc_scale;
209  if (IS_3IV1)
210  scale = 8;
211 
212  wrap = s->block_wrap[n];
213  dc_val = s->dc_val[0] + s->block_index[n];
214 
215  /* B C
216  * A X
217  */
218  a = dc_val[-1];
219  b = dc_val[-1 - wrap];
220  c = dc_val[-wrap];
221 
222  /* outside slice handling (we can't do that by memset as we need the
223  * dc for error resilience) */
224  if (s->first_slice_line && n != 3) {
225  if (n != 2)
226  b = c = 1024;
227  if (n != 1 && s->mb_x == s->resync_mb_x)
228  b = a = 1024;
229  }
230  if (s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y + 1) {
231  if (n == 0 || n == 4 || n == 5)
232  b = 1024;
233  }
234 
235  if (abs(a - b) < abs(b - c)) {
236  pred = c;
237  *dir_ptr = 1; /* top */
238  } else {
239  pred = a;
240  *dir_ptr = 0; /* left */
241  }
242  /* we assume pred is positive */
243  pred = FASTDIV((pred + (scale >> 1)), scale);
244 
245  if (encoding) {
246  ret = level - pred;
247  } else {
248  level += pred;
249  ret = level;
250  }
251  level *= scale;
252  if (level & (~2047)) {
253  if (!s->encoding && (s->avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_AGGRESSIVE))) {
254  if (level < 0) {
255  av_log(s->avctx, AV_LOG_ERROR,
256  "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
257  return AVERROR_INVALIDDATA;
258  }
259  if (level > 2048 + scale) {
260  av_log(s->avctx, AV_LOG_ERROR,
261  "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
262  return AVERROR_INVALIDDATA;
263  }
264  }
265  if (level < 0)
266  level = 0;
267  else if (!(s->workaround_bugs & FF_BUG_DC_CLIP))
268  level = 2047;
269  }
270  dc_val[0] = level;
271 
272  return ret;
273 }
274 
275 #endif /* AVCODEC_MPEG4VIDEO_H */
ff_mpeg4_studio_dc_luma
const uint8_t ff_mpeg4_studio_dc_luma[19][2]
Definition: mpeg4data.h:375
FF_BUG_DC_CLIP
#define FF_BUG_DC_CLIP
Definition: avcodec.h:1584
ff_mpeg4_workaround_bugs
int ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
Definition: mpeg4videodec.c:2729
level
uint8_t level
Definition: svq3.c:206
Mpeg4DecContext::vol_sprite_usage
int vol_sprite_usage
Definition: mpeg4video.h:80
ff_mpeg4_encode_video_packet_header
void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
Definition: mpeg4videoenc.c:1361
mpeg4_block_count
static const uint8_t mpeg4_block_count[4]
Definition: mpeg4video.h:121
Mpeg4DecContext::showed_packed_warning
int showed_packed_warning
flag for having shown the warning about invalid Divx B-frames
Definition: mpeg4video.h:110
ff_mpeg4_merge_partitions
void ff_mpeg4_merge_partitions(MpegEncContext *s)
Definition: mpeg4videoenc.c:1335
MAX_RUN
#define MAX_RUN
Definition: rl.h:35
ff_sprite_trajectory_lens
const uint8_t ff_sprite_trajectory_lens[15]
Definition: mpeg4data.h:326
b
#define b
Definition: input.c:41
Mpeg4DecContext::rvlc
int rvlc
Definition: mpeg4video.h:89
ff_mpeg4_c_dc_scale_table
const uint8_t ff_mpeg4_c_dc_scale_table[32]
Definition: mpeg4data.h:361
ff_mpeg4_decode_video_packet_header
int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx)
Decode the next video packet.
Definition: mpeg4videodec.c:445
Mpeg4DecContext::new_pred
int new_pred
Definition: mpeg4video.h:95
mpegvideo.h
ff_mpeg4videodec_static_init
void ff_mpeg4videodec_static_init(void)
Definition: mpeg4videodec.c:3377
ff_mpeg4_init_direct_mv
void ff_mpeg4_init_direct_mv(MpegEncContext *s)
Definition: mpeg4video.c:71
ff_set_mpeg4_time
void ff_set_mpeg4_time(MpegEncContext *s)
Definition: mpeg4videoenc.c:874
ff_mpeg4_decode_partitions
int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx)
Decode the first and second partition.
Definition: mpeg4videodec.c:975
wrap
#define wrap(func)
Definition: neontest.h:65
ff_mpeg4_studio_dc_chroma
const uint8_t ff_mpeg4_studio_dc_chroma[19][2]
Definition: mpeg4data.h:382
RLTable
RLTable.
Definition: rl.h:39
GetBitContext
Definition: get_bits.h:61
ff_mpeg4_encode_mb
void ff_mpeg4_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
Definition: mpeg4videoenc.c:476
ff_mpeg4_rl_intra
RLTable ff_mpeg4_rl_intra
Definition: mpeg4data.h:109
AV_EF_BITSTREAM
#define AV_EF_BITSTREAM
detect bitstream specification deviations
Definition: avcodec.h:1654
ff_mpeg4_encode_picture_header
int ff_mpeg4_encode_picture_header(MpegEncContext *s, int picture_number)
Definition: mpeg4videoenc.c:1059
ff_mb_type_b_tab
const uint8_t ff_mb_type_b_tab[4][2]
Definition: mpeg4data.h:330
ff_mpeg4_decode_studio_slice_header
int ff_mpeg4_decode_studio_slice_header(Mpeg4DecContext *ctx)
Decode the next video packet.
Definition: mpeg4videodec.c:546
ff_mpeg4_dc_threshold
const uint8_t ff_mpeg4_dc_threshold[8]
Definition: mpeg4data.h:370
Mpeg4DecContext::sprite_brightness_change
int sprite_brightness_change
Definition: mpeg4video.h:81
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
s
#define s(width, name)
Definition: cbs_vp9.c:257
ff_mpeg4_intra_run
const int8_t ff_mpeg4_intra_run[102]
Definition: mpeg4data.h:93
Mpeg4DecContext::cplx_estimation_trash_b
int cplx_estimation_trash_b
Definition: mpeg4video.h:116
ctx
AVFormatContext * ctx
Definition: movenc.c:48
get_bits.h
ff_mpeg4_static_rl_table_store
uint8_t ff_mpeg4_static_rl_table_store[3][2][2 *MAX_RUN+MAX_LEVEL+3]
Definition: mpeg4video.c:28
ff_mpeg4_stuffing
void ff_mpeg4_stuffing(PutBitContext *pbc)
add MPEG-4 stuffing bits (01...1)
Definition: mpeg4videoenc.c:864
PutBitContext
Definition: put_bits.h:44
ff_mpeg4_default_intra_matrix
const int16_t ff_mpeg4_default_intra_matrix[64]
Definition: mpeg4data.h:335
Mpeg4DecContext::rgb
int rgb
Definition: mpeg4video.h:118
Mpeg4DecContext::shape
int shape
Definition: mpeg4video.h:79
Mpeg4DecContext::cplx_estimation_trash_i
int cplx_estimation_trash_i
Definition: mpeg4video.h:114
abs
#define abs(x)
Definition: cuda_runtime.h:35
Mpeg4DecContext
Definition: mpeg4video.h:74
FASTDIV
#define FASTDIV(a, b)
Definition: mathops.h:202
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ff_mpeg4_resync_prefix
const uint16_t ff_mpeg4_resync_prefix[8]
Definition: mpeg4data.h:366
Mpeg4DecContext::scalability
int scalability
Definition: mpeg4video.h:97
MAX_LEVEL
#define MAX_LEVEL
Definition: rl.h:36
Mpeg4DecContext::t_frame
int t_frame
time distance of first I -> B, used for interlaced B-frames
Definition: mpeg4video.h:93
Mpeg4DecContext::divx_version
int divx_version
Definition: mpeg4video.h:104
ff_mpeg4_set_direct_mv
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
Definition: mpeg4video.c:117
Mpeg4DecContext::lavc_build
int lavc_build
Definition: mpeg4video.h:107
ff_mpeg4_pred_dc
static int ff_mpeg4_pred_dc(MpegEncContext *s, int n, int level, int *dir_ptr, int encoding)
Predict the dc.
Definition: mpeg4video.h:198
Mpeg4DecContext::sprite_shift
int sprite_shift[2]
sprite shift [isChroma]
Definition: mpeg4video.h:86
header
static const uint8_t header[24]
Definition: sdr2.c:67
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
ff_mpeg4_pred_ac
void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n, int dir)
Predict the ac.
Definition: mpeg4videodec.c:71
ff_mpeg4_decode_picture_header
int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb, int header)
Decode MPEG-4 headers.
Definition: mpeg4videodec.c:3221
Mpeg4DecContext::sprite_traj
uint16_t sprite_traj[4][2]
sprite trajectory points
Definition: mpeg4video.h:84
Mpeg4DecContext::cplx_estimation_trash_p
int cplx_estimation_trash_p
Definition: mpeg4video.h:115
ff_clean_mpeg4_qscales
void ff_clean_mpeg4_qscales(MpegEncContext *s)
modify mb_type & qscale so that encoding is actually possible in MPEG-4
Definition: mpeg4videoenc.c:214
ff_mpeg4_get_video_packet_prefix_length
int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s)
Definition: mpeg4video.c:30
ff_rvlc_rl_inter
RLTable ff_rvlc_rl_inter
Definition: mpeg4data.h:214
Mpeg4DecContext::time_increment_bits
int time_increment_bits
number of bits to represent the fractional part of time
Definition: mpeg4video.h:78
Mpeg4DecContext::num_sprite_warping_points
int num_sprite_warping_points
Definition: mpeg4video.h:82
Mpeg4DecContext::use_intra_dc_vlc
int use_intra_dc_vlc
Definition: mpeg4video.h:98
ff_mpeg4_y_dc_scale_table
const uint8_t ff_mpeg4_y_dc_scale_table[32]
Definition: mpeg4data.h:357
uint8_t
uint8_t
Definition: audio_convert.c:194
ff_mpeg4_intra_vlc
const uint16_t ff_mpeg4_intra_vlc[103][2]
Definition: mpeg4data.h:47
ff_mpeg4_init_partitions
void ff_mpeg4_init_partitions(MpegEncContext *s)
Definition: mpeg4videoenc.c:1322
ff_mpeg4_DCtab_chrom
const uint8_t ff_mpeg4_DCtab_chrom[13][2]
Definition: mpeg4data.h:41
Mpeg4DecContext::vol_control_parameters
int vol_control_parameters
does the stream contain the low_delay flag, used to work around buggy encoders.
Definition: mpeg4video.h:113
ff_mpeg4_intra_level
const int8_t ff_mpeg4_intra_level[102]
Definition: mpeg4data.h:77
ff_mpeg4_default_non_intra_matrix
const int16_t ff_mpeg4_default_non_intra_matrix[64]
Definition: mpeg4data.h:346
ret
ret
Definition: filter_design.txt:187
pred
static const float pred[4]
Definition: siprdata.h:259
ff_mpeg4_frame_end
int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
Definition: mpeg4videodec.c:3403
ff_mpeg4_studio_intra
const uint8_t ff_mpeg4_studio_intra[12][24][2]
Definition: mpeg4data.h:389
ff_mpeg4_clean_buffers
void ff_mpeg4_clean_buffers(MpegEncContext *s)
Definition: mpeg4video.c:45
AVCodecContext
main external API structure.
Definition: avcodec.h:536
Mpeg4DecContext::m
MpegEncContext m
Definition: mpeg4video.h:75
ff_rvlc_rl_intra
RLTable ff_rvlc_rl_intra
Definition: mpeg4data.h:318
Mpeg4DecContext::resync_marker
int resync_marker
could this stream contain resync markers
Definition: mpeg4video.h:91
Mpeg4DecContext::enhancement_type
int enhancement_type
Definition: mpeg4video.h:96
AV_EF_AGGRESSIVE
#define AV_EF_AGGRESSIVE
consider things that a sane encoder should not do as an error
Definition: avcodec.h:1661
rl.h
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
Mpeg4DecContext::divx_build
int divx_build
Definition: mpeg4video.h:105
Mpeg4DecContext::xvid_build
int xvid_build
Definition: mpeg4video.h:106
ff_mpeg4_DCtab_lum
const uint8_t ff_mpeg4_DCtab_lum[13][2]
Definition: mpeg4data.h:35
MpegEncContext
MpegEncContext.
Definition: mpegvideo.h:81
Mpeg4DecContext::intra_dc_threshold
int intra_dc_threshold
QP above which the ac VLC should be used for intra dc.
Definition: mpeg4video.h:101
IS_3IV1
#define IS_3IV1
Definition: mpeg4video.h:188