1 /*
2 * MPEG-4 decoder / encoder common code
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
27
29
31 {
34 return 16;
40 default:
41 return -1;
42 }
43 }
44
46 {
47 int c_wrap, c_xy, l_wrap, l_xy;
48
50 l_xy = (2 * s->
mb_y - 1) * l_wrap + s->
mb_x * 2 - 1;
52 c_xy = (s->
mb_y - 1) * c_wrap + s->
mb_x - 1;
53
54 /* clean AC */
55 memset(s->
ac_val[0] + l_xy, 0, (l_wrap * 2 + 1) * 16 *
sizeof(int16_t));
56 memset(s->
ac_val[1] + c_xy, 0, (c_wrap + 1) * 16 *
sizeof(int16_t));
57 memset(s->
ac_val[2] + c_xy, 0, (c_wrap + 1) * 16 *
sizeof(int16_t));
58
59 /* clean MV */
60 // we can't clear the MVs as they might be needed by a B-frame
65 }
66
67 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
68 #define tab_bias (tab_size / 2)
69
70 // used by MPEG-4 and rv10 decoder
72 {
73 int i;
78 }
79 }
80
82 int my, int i)
83 {
87 int p_mx, p_my;
88
92 s->
mv[1][i][0] = mx ? s->
mv[0][i][0] - p_mx
94 } else {
95 s->
mv[0][i][0] = p_mx * time_pb / time_pp + mx;
96 s->
mv[1][i][0] = mx ? s->
mv[0][i][0] - p_mx
97 : p_mx * (time_pb - time_pp) / time_pp;
98 }
102 s->
mv[1][i][1] = my ? s->
mv[0][i][1] - p_my
104 } else {
105 s->
mv[0][i][1] = p_my * time_pb / time_pp + my;
106 s->
mv[1][i][1] = my ? s->
mv[0][i][1] - p_my
107 : p_my * (time_pb - time_pp) / time_pp;
108 }
109 }
110
111 #undef tab_size
112 #undef tab_bias
113
114 /**
115 * @return the mb_type
116 */
118 {
121 uint16_t time_pp;
122 uint16_t time_pb;
123 int i;
124
125 // FIXME avoid divides
126 // try special case with shifts for 1 and 3 B-frames?
127
128 if (
IS_8X8(colocated_mb_type)) {
130 for (i = 0; i < 4; i++)
135 for (i = 0; i < 2; i++) {
142 } else {
145 }
147 time_pb / time_pp + mx;
149 time_pb / time_pp + my;
150 s->
mv[1][i][0] = mx ? s->
mv[0][i][0] -
153 (time_pb - time_pp) / time_pp;
154 s->
mv[1][i][1] = my ? s->
mv[0][i][1] -
157 (time_pb - time_pp) / time_pp;
158 }
161 } else {
165 s->
mv[0][3][0] = s->
mv[0][0][0];
168 s->
mv[0][3][1] = s->
mv[0][0][1];
171 s->
mv[1][3][0] = s->
mv[1][0][0];
174 s->
mv[1][3][1] = s->
mv[1][0][1];
178 else
180 // Note see prev line
182 }
183 }
#define MV_TYPE_FIELD
2 vectors, one per field
int last_mv[2][2][2]
last MV, used for MV prediction in MPEG-1 & B-frame MPEG-4
int16_t(*[3] ac_val)[16]
used for MPEG-4 AC prediction, all 3 arrays must be continuous
int16_t(*[2][2] p_field_mv_table)[2]
MV table (2MV per MB) interlaced P-frame encoding.
void ff_mpeg4_clean_buffers(MpegEncContext *s)
uint16_t pp_time
time distance between the last 2 p,s,i frames
#define FF_BUG_DIRECT_BLOCKSIZE
int16_t direct_scale_mv[2][64]
precomputed to avoid divisions in ff_mpeg4_set_direct_mv
void ff_mpeg4_init_direct_mv(MpegEncContext *s)
int quarter_sample
1->qpel, 0->half pel ME/MC
uint8_t ff_mpeg4_static_rl_table_store[3][2][2 *MAX_RUN+MAX_LEVEL+3]
int16_t(*[2] motion_val)[2]
#define MB_TYPE_INTERLACED
int block_index[6]
index to current MB in block based arrays with edges
#define MV_TYPE_16X16
1 vector for the whole mb
int f_code
forward MV resolution
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s)
uint16_t pb_field_time
like above, just for interlaced
int mv[2][4][2]
motion vectors for a macroblock first coordinate : 0 = forward 1 = backward second " : depend...
int b8_stride
2*mb_width+1 used for some 8x8 block arrays to allow simple addressing
struct AVCodecContext * avctx
int mb_stride
mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11 ...
static void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx, int my, int i)
int workaround_bugs
Work around bugs in encoders which sometimes cannot be detected automatically.
Picture next_picture
copy of the next picture structure.
uint32_t * mb_type
types and macros are defined in mpegutils.h
#define MV_TYPE_8X8
4 vectors (H.263, MPEG-4 4MV)
int b_code
backward MV resolution for B-frames (MPEG-4)
uint16_t pb_time
time distance between the last b and p,s,i frame