2 * MPEG-4 decoder / encoder common code
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at>
6 * This file is part of Libav.
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.
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.
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
23 #include "mpegutils.h"
24 #include "mpegvideo.h"
25 #include "mpeg4video.h"
26 #include "mpeg4data.h"
28 uint8_t ff_mpeg4_static_rl_table_store
[3][2][2 * MAX_RUN
+ MAX_LEVEL
+ 3];
30 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext
*s
)
32 switch (s
->pict_type
) {
33 case AV_PICTURE_TYPE_I
:
35 case AV_PICTURE_TYPE_P
:
36 case AV_PICTURE_TYPE_S
:
37 return s
->f_code
+ 15;
38 case AV_PICTURE_TYPE_B
:
39 return FFMAX3(s
->f_code
, s
->b_code
, 2) + 15;
45 void ff_mpeg4_clean_buffers(MpegEncContext
*s
)
47 int c_wrap
, c_xy
, l_wrap
, l_xy
;
49 l_wrap
= s
->b8_stride
;
50 l_xy
= (2 * s
->mb_y
- 1) * l_wrap
+ s
->mb_x
* 2 - 1;
51 c_wrap
= s
->mb_stride
;
52 c_xy
= (s
->mb_y
- 1) * c_wrap
+ s
->mb_x
- 1;
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));
60 // we can't clear the MVs as they might be needed by a B-frame
64 s
->last_mv
[1][0][1] = 0;
67 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
68 #define tab_bias (tab_size / 2)
70 // used by MPEG-4 and rv10 decoder
71 void ff_mpeg4_init_direct_mv(MpegEncContext
*s
)
74 for (i
= 0; i
< tab_size
; i
++) {
75 s
->direct_scale_mv
[0][i
] = (i
- tab_bias
) * s
->pb_time
/ s
->pp_time
;
76 s
->direct_scale_mv
[1][i
] = (i
- tab_bias
) * (s
->pb_time
- s
->pp_time
) /
81 static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext
*s
, int mx
,
84 int xy
= s
->block_index
[i
];
85 uint16_t time_pp
= s
->pp_time
;
86 uint16_t time_pb
= s
->pb_time
;
89 p_mx
= s
->next_picture
.motion_val
[0][xy
][0];
90 if ((unsigned)(p_mx
+ tab_bias
) < tab_size
) {
91 s
->mv
[0][i
][0] = s
->direct_scale_mv
[0][p_mx
+ tab_bias
] + mx
;
92 s
->mv
[1][i
][0] = mx
? s
->mv
[0][i
][0] - p_mx
93 : s
->direct_scale_mv
[1][p_mx
+ tab_bias
];
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
;
99 p_my
= s
->next_picture
.motion_val
[0][xy
][1];
100 if ((unsigned)(p_my
+ tab_bias
) < tab_size
) {
101 s
->mv
[0][i
][1] = s
->direct_scale_mv
[0][p_my
+ tab_bias
] + my
;
102 s
->mv
[1][i
][1] = my
? s
->mv
[0][i
][1] - p_my
103 : s
->direct_scale_mv
[1][p_my
+ tab_bias
];
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
;
115 * @return the mb_type
117 int ff_mpeg4_set_direct_mv(MpegEncContext
*s
, int mx
, int my
)
119 const int mb_index
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
120 const int colocated_mb_type
= s
->next_picture
.mb_type
[mb_index
];
125 // FIXME avoid divides
126 // try special case with shifts for 1 and 3 B-frames?
128 if (IS_8X8(colocated_mb_type
)) {
129 s
->mv_type
= MV_TYPE_8X8
;
130 for (i
= 0; i
< 4; i
++)
131 ff_mpeg4_set_one_direct_mv(s
, mx
, my
, i
);
132 return MB_TYPE_DIRECT2
| MB_TYPE_8x8
| MB_TYPE_L0L1
;
133 } else if (IS_INTERLACED(colocated_mb_type
)) {
134 s
->mv_type
= MV_TYPE_FIELD
;
135 for (i
= 0; i
< 2; i
++) {
136 int field_select
= s
->next_picture
.ref_index
[0][4 * mb_index
+ 2 * i
];
137 s
->field_select
[0][i
] = field_select
;
138 s
->field_select
[1][i
] = i
;
139 if (s
->top_field_first
) {
140 time_pp
= s
->pp_field_time
- field_select
+ i
;
141 time_pb
= s
->pb_field_time
- field_select
+ i
;
143 time_pp
= s
->pp_field_time
+ field_select
- i
;
144 time_pb
= s
->pb_field_time
+ field_select
- i
;
146 s
->mv
[0][i
][0] = s
->p_field_mv_table
[i
][0][mb_index
][0] *
147 time_pb
/ time_pp
+ mx
;
148 s
->mv
[0][i
][1] = s
->p_field_mv_table
[i
][0][mb_index
][1] *
149 time_pb
/ time_pp
+ my
;
150 s
->mv
[1][i
][0] = mx
? s
->mv
[0][i
][0] -
151 s
->p_field_mv_table
[i
][0][mb_index
][0]
152 : s
->p_field_mv_table
[i
][0][mb_index
][0] *
153 (time_pb
- time_pp
) / time_pp
;
154 s
->mv
[1][i
][1] = my
? s
->mv
[0][i
][1] -
155 s
->p_field_mv_table
[i
][0][mb_index
][1]
156 : s
->p_field_mv_table
[i
][0][mb_index
][1] *
157 (time_pb
- time_pp
) / time_pp
;
159 return MB_TYPE_DIRECT2
| MB_TYPE_16x8
|
160 MB_TYPE_L0L1
| MB_TYPE_INTERLACED
;
162 ff_mpeg4_set_one_direct_mv(s
, mx
, my
, 0);
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];
175 if ((s
->avctx
->workaround_bugs
& FF_BUG_DIRECT_BLOCKSIZE
) ||
177 s
->mv_type
= MV_TYPE_16X16
;
179 s
->mv_type
= MV_TYPE_8X8
;
180 // Note see prev line
181 return MB_TYPE_DIRECT2
| MB_TYPE_16x16
| MB_TYPE_L0L1
;