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 
121 
122  int rgb;
124 
125 static const uint8_t mpeg4_block_count[4] = {0, 6, 8, 12};
126 
127 /* dc encoding for MPEG-4 */
128 extern const uint8_t ff_mpeg4_DCtab_lum[13][2];
129 extern const uint8_t ff_mpeg4_DCtab_chrom[13][2];
130 
131 extern const uint16_t ff_mpeg4_intra_vlc[103][2];
132 extern const int8_t ff_mpeg4_intra_level[102];
133 extern const int8_t ff_mpeg4_intra_run[102];
134 
136 
137 /* Note this is identical to the intra rvlc except that it is reordered. */
140 
141 extern const uint16_t ff_sprite_trajectory_tab[15][2];
142 extern const uint8_t ff_mb_type_b_tab[4][2];
143 
144 /* these matrixes will be permuted for the idct */
145 extern const int16_t ff_mpeg4_default_intra_matrix[64];
146 extern const int16_t ff_mpeg4_default_non_intra_matrix[64];
147 
148 extern const uint8_t ff_mpeg4_y_dc_scale_table[32];
149 extern const uint8_t ff_mpeg4_c_dc_scale_table[32];
150 extern const uint16_t ff_mpeg4_resync_prefix[8];
151 
152 extern const uint8_t ff_mpeg4_dc_threshold[8];
153 
154 extern const uint16_t ff_mpeg4_studio_dc_luma[19][2];
155 extern const uint16_t ff_mpeg4_studio_dc_chroma[19][2];
156 extern const uint16_t ff_mpeg4_studio_intra[12][22][2];
157 
159  int16_t block[6][64],
160  int motion_x, int motion_y);
161 void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n,
162  int dir);
164 int ff_mpeg4_encode_picture_header(MpegEncContext *s, int picture_number);
165 
180 int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size);
181 
182 /**
183  * @return the mb_type
184  */
185 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my);
186 
188 
189 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
190 #define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
191 #else
192 #define IS_3IV1 0
193 #endif
194 
195 /**
196  * Predict the dc.
197  * encoding quantized level -> quantized diff
198  * decoding quantized diff -> quantized level
199  * @param n block index (0-3 are luma, 4-5 are chroma)
200  * @param dir_ptr pointer to an integer where the prediction direction will be stored
201  */
202 static inline int ff_mpeg4_pred_dc(MpegEncContext *s, int n, int level,
203  int *dir_ptr, int encoding)
204 {
205  int a, b, c, wrap, pred, scale, ret;
206  int16_t *dc_val;
207 
208  /* find prediction */
209  if (n < 4)
210  scale = s->y_dc_scale;
211  else
212  scale = s->c_dc_scale;
213  if (IS_3IV1)
214  scale = 8;
215 
216  wrap = s->block_wrap[n];
217  dc_val = s->dc_val[0] + s->block_index[n];
218 
219  /* B C
220  * A X
221  */
222  a = dc_val[-1];
223  b = dc_val[-1 - wrap];
224  c = dc_val[-wrap];
225 
226  /* outside slice handling (we can't do that by memset as we need the
227  * dc for error resilience) */
228  if (s->first_slice_line && n != 3) {
229  if (n != 2)
230  b = c = 1024;
231  if (n != 1 && s->mb_x == s->resync_mb_x)
232  b = a = 1024;
233  }
234  if (s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y + 1) {
235  if (n == 0 || n == 4 || n == 5)
236  b = 1024;
237  }
238 
239  if (abs(a - b) < abs(b - c)) {
240  pred = c;
241  *dir_ptr = 1; /* top */
242  } else {
243  pred = a;
244  *dir_ptr = 0; /* left */
245  }
246  /* we assume pred is positive */
247  pred = FASTDIV((pred + (scale >> 1)), scale);
248 
249  if (encoding) {
250  ret = level - pred;
251  } else {
252  level += pred;
253  ret = level;
254  }
255  level *= scale;
256  if (level & (~2047)) {
258  if (level < 0) {
260  "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
261  return AVERROR_INVALIDDATA;
262  }
263  if (level > 2048 + scale) {
265  "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
266  return AVERROR_INVALIDDATA;
267  }
268  }
269  if (level < 0)
270  level = 0;
271  else if (!(s->workaround_bugs & FF_BUG_DC_CLIP))
272  level = 2047;
273  }
274  dc_val[0] = level;
275 
276  return ret;
277 }
278 
279 #endif /* AVCODEC_MPEG4VIDEO_H */
uint16_t sprite_traj[4][2]
sprite trajectory points
Definition: mpeg4video.h:84
#define AV_EF_AGGRESSIVE
consider things that a sane encoder should not do as an error
Definition: avcodec.h:2713
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int sprite_brightness_change
Definition: mpeg4video.h:81
int resync_marker
could this stream contain resync markers
Definition: mpeg4video.h:91
const int8_t ff_mpeg4_intra_level[102]
Definition: mpeg4data.h:77
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:36
int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
#define AV_EF_BITSTREAM
detect bitstream specification deviations
Definition: avcodec.h:2706
mpegvideo header.
int ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s)
Definition: mpeg4video.c:30
RLTable.
Definition: rl.h:39
const uint16_t ff_mpeg4_resync_prefix[8]
Definition: mpeg4data.h:368
int encoding
true if we are encoding (vs decoding)
Definition: mpegvideo.h:114
int block_wrap[6]
Definition: mpegvideo.h:294
int cplx_estimation_trash_b
Definition: mpeg4video.h:116
void ff_mpeg4_merge_partitions(MpegEncContext *s)
int vol_sprite_usage
Definition: mpeg4video.h:80
The exact code depends on how similar the blocks are and how related they are to the block
uint8_t
const int16_t ff_mpeg4_default_non_intra_matrix[64]
Definition: mpeg4data.h:348
uint8_t ff_mpeg4_static_rl_table_store[3][2][2 *MAX_RUN+MAX_LEVEL+3]
Definition: mpeg4video.c:28
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
#define IS_3IV1
Definition: mpeg4video.h:192
int enhancement_type
Definition: mpeg4video.h:96
void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
const uint16_t ff_mpeg4_studio_dc_luma[19][2]
Definition: mpeg4data.h:377
int cplx_estimation_trash_p
Definition: mpeg4video.h:115
bitstream reader API header.
RLTable ff_rvlc_rl_inter
Definition: mpeg4data.h:214
static const uint8_t header[24]
Definition: sdr2.c:67
int intra_dc_threshold
QP above which the ac VLC should be used for intra dc.
Definition: mpeg4video.h:101
#define MAX_LEVEL
Definition: rl.h:36
static int ff_mpeg4_pred_dc(MpegEncContext *s, int n, int level, int *dir_ptr, int encoding)
Predict the dc.
Definition: mpeg4video.h:202
#define av_log(a,...)
MpegEncContext m
Definition: mpeg4video.h:75
int16_t * dc_val[3]
used for MPEG-4 DC prediction, all 3 arrays must be continuous
Definition: mpegvideo.h:187
const uint16_t ff_mpeg4_intra_vlc[103][2]
Definition: mpeg4data.h:47
const uint8_t ff_mpeg4_DCtab_chrom[13][2]
Definition: mpeg4data.h:41
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
const uint8_t ff_mpeg4_DCtab_lum[13][2]
Definition: mpeg4data.h:35
void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n, int dir)
Predict the ac.
Definition: mpeg4videodec.c:69
#define wrap(func)
Definition: neontest.h:65
const uint8_t ff_mpeg4_c_dc_scale_table[32]
Definition: mpeg4data.h:363
int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx)
Decode the next video packet.
rl header.
void ff_mpeg4_clean_buffers(MpegEncContext *s)
Definition: mpeg4video.c:45
int ff_mpeg4_decode_studio_slice_header(Mpeg4DecContext *ctx)
Decode the next video packet.
void ff_mpeg4videodec_static_init(void)
const uint16_t ff_sprite_trajectory_tab[15][2]
Definition: mpeg4data.h:326
Definition: vlc.h:26
int resync_mb_x
x position of last resync marker
Definition: mpegvideo.h:356
#define b
Definition: input.c:41
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Definition: avcodec.h:2697
void ff_clean_mpeg4_qscales(MpegEncContext *s)
modify mb_type & qscale so that encoding is actually possible in MPEG-4
AVFormatContext * ctx
Definition: movenc.c:48
int use_intra_dc_vlc
Definition: mpeg4video.h:98
const uint8_t ff_mpeg4_dc_threshold[8]
Definition: mpeg4data.h:372
#define s(width, name)
Definition: cbs_vp9.c:257
int n
Definition: avisynth_c.h:760
int vol_control_parameters
does the stream contain the low_delay flag, used to work around buggy encoders.
Definition: mpeg4video.h:113
const uint16_t ff_mpeg4_studio_dc_chroma[19][2]
Definition: mpeg4data.h:385
const uint8_t ff_mb_type_b_tab[4][2]
Definition: mpeg4data.h:332
int block_index[6]
index to current MB in block based arrays with edges
Definition: mpegvideo.h:293
static const float pred[4]
Definition: siprdata.h:259
int first_slice_line
used in MPEG-4 too to handle resync markers
Definition: mpegvideo.h:436
#define abs(x)
Definition: cuda_runtime.h:35
main external API structure.
Definition: avcodec.h:1568
int cplx_estimation_trash_i
Definition: mpeg4video.h:114
#define FASTDIV(a, b)
Definition: mathops.h:202
RLTable ff_rvlc_rl_intra
Definition: mpeg4data.h:318
const uint16_t ff_mpeg4_studio_intra[12][22][2]
Definition: mpeg4data.h:393
void * buf
Definition: avisynth_c.h:766
int showed_packed_warning
flag for having shown the warning about invalid Divx B-frames
Definition: mpeg4video.h:110
int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx)
Decode the first and second partition.
const int16_t ff_mpeg4_default_intra_matrix[64]
Definition: mpeg4data.h:337
void ff_set_mpeg4_time(MpegEncContext *s)
int sprite_shift[2]
sprite shift [isChroma]
Definition: mpeg4video.h:86
RLTable ff_mpeg4_rl_intra
Definition: mpeg4data.h:109
uint8_t level
Definition: svq3.c:207
MpegEncContext.
Definition: mpegvideo.h:81
#define MAX_RUN
Definition: rl.h:35
struct AVCodecContext * avctx
Definition: mpegvideo.h:98
VLC studio_intra_tab[12]
Definition: mpeg4video.h:118
int t_frame
time distance of first I -> B, used for interlaced B-frames
Definition: mpeg4video.h:93
void ff_mpeg4_init_direct_mv(MpegEncContext *s)
Definition: mpeg4video.c:71
const int8_t ff_mpeg4_intra_run[102]
Definition: mpeg4data.h:93
const uint8_t ff_mpeg4_y_dc_scale_table[32]
Definition: mpeg4data.h:359
void ff_mpeg4_stuffing(PutBitContext *pbc)
add MPEG-4 stuffing bits (01...1)
void ff_mpeg4_init_partitions(MpegEncContext *s)
int resync_mb_y
y position of last resync marker
Definition: mpegvideo.h:357
static const uint8_t mpeg4_block_count[4]
Definition: mpeg4video.h:125
int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb, int header)
Decode MPEG-4 headers.
void ff_mpeg4_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
int time_increment_bits
number of bits to represent the fractional part of time
Definition: mpeg4video.h:78
int workaround_bugs
workaround bugs in encoders which cannot be detected automatically
Definition: mpegvideo.h:119
int ff_mpeg4_encode_picture_header(MpegEncContext *s, int picture_number)
int num_sprite_warping_points
Definition: mpeg4video.h:82
#define FF_BUG_DC_CLIP
Definition: avcodec.h:2614
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
Definition: mpeg4video.c:117