2 * MPEG4 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 "mpegvideo.h"
24 #include "mpeg4video.h"
25 #include "mpeg4data.h"
27 uint8_t ff_mpeg4_static_rl_table_store
[3][2][2*MAX_RUN
+ MAX_LEVEL
+ 3];
29 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext
*s
){
31 case AV_PICTURE_TYPE_I
:
33 case AV_PICTURE_TYPE_P
:
34 case AV_PICTURE_TYPE_S
:
36 case AV_PICTURE_TYPE_B
:
37 return FFMAX3(s
->f_code
, s
->b_code
, 2) + 15;
43 void ff_mpeg4_clean_buffers(MpegEncContext
*s
)
45 int c_wrap
, c_xy
, l_wrap
, l_xy
;
48 l_xy
= (2*s
->mb_y
-1)*l_wrap
+ s
->mb_x
*2 - 1;
50 c_xy
= (s
->mb_y
-1)*c_wrap
+ s
->mb_x
- 1;
54 memsetw(s
->dc_val
[0] + l_xy
, 1024, l_wrap
*2+1);
55 memsetw(s
->dc_val
[1] + c_xy
, 1024, c_wrap
+1);
56 memsetw(s
->dc_val
[2] + c_xy
, 1024, c_wrap
+1);
60 memset(s
->ac_val
[0] + l_xy
, 0, (l_wrap
*2+1)*16*sizeof(int16_t));
61 memset(s
->ac_val
[1] + c_xy
, 0, (c_wrap
+1)*16*sizeof(int16_t));
62 memset(s
->ac_val
[2] + c_xy
, 0, (c_wrap
+1)*16*sizeof(int16_t));
65 // we can't clear the MVs as they might be needed by a b frame
66 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
67 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
71 s
->last_mv
[1][0][1]= 0;
74 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
75 #define tab_bias (tab_size/2)
77 //used by mpeg4 and rv10 decoder
78 void ff_mpeg4_init_direct_mv(MpegEncContext
*s
){
80 for(i
=0; i
<tab_size
; i
++){
81 s
->direct_scale_mv
[0][i
] = (i
-tab_bias
)*s
->pb_time
/s
->pp_time
;
82 s
->direct_scale_mv
[1][i
] = (i
-tab_bias
)*(s
->pb_time
-s
->pp_time
)/s
->pp_time
;
86 static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext
*s
, int mx
, int my
, int i
){
87 int xy
= s
->block_index
[i
];
88 uint16_t time_pp
= s
->pp_time
;
89 uint16_t time_pb
= s
->pb_time
;
92 p_mx
= s
->next_picture
.f
.motion_val
[0][xy
][0];
93 if((unsigned)(p_mx
+ tab_bias
) < tab_size
){
94 s
->mv
[0][i
][0] = s
->direct_scale_mv
[0][p_mx
+ tab_bias
] + mx
;
95 s
->mv
[1][i
][0] = mx
? s
->mv
[0][i
][0] - p_mx
96 : s
->direct_scale_mv
[1][p_mx
+ tab_bias
];
98 s
->mv
[0][i
][0] = p_mx
*time_pb
/time_pp
+ mx
;
99 s
->mv
[1][i
][0] = mx
? s
->mv
[0][i
][0] - p_mx
100 : p_mx
*(time_pb
- time_pp
)/time_pp
;
102 p_my
= s
->next_picture
.f
.motion_val
[0][xy
][1];
103 if((unsigned)(p_my
+ tab_bias
) < tab_size
){
104 s
->mv
[0][i
][1] = s
->direct_scale_mv
[0][p_my
+ tab_bias
] + my
;
105 s
->mv
[1][i
][1] = my
? s
->mv
[0][i
][1] - p_my
106 : s
->direct_scale_mv
[1][p_my
+ tab_bias
];
108 s
->mv
[0][i
][1] = p_my
*time_pb
/time_pp
+ my
;
109 s
->mv
[1][i
][1] = my
? s
->mv
[0][i
][1] - p_my
110 : p_my
*(time_pb
- time_pp
)/time_pp
;
119 * @return the mb_type
121 int ff_mpeg4_set_direct_mv(MpegEncContext
*s
, int mx
, int my
){
122 const int mb_index
= s
->mb_x
+ s
->mb_y
*s
->mb_stride
;
123 const int colocated_mb_type
= s
->next_picture
.f
.mb_type
[mb_index
];
128 //FIXME avoid divides
129 // try special case with shifts for 1 and 3 B-frames?
131 if(IS_8X8(colocated_mb_type
)){
132 s
->mv_type
= MV_TYPE_8X8
;
134 ff_mpeg4_set_one_direct_mv(s
, mx
, my
, i
);
136 return MB_TYPE_DIRECT2
| MB_TYPE_8x8
| MB_TYPE_L0L1
;
137 } else if(IS_INTERLACED(colocated_mb_type
)){
138 s
->mv_type
= MV_TYPE_FIELD
;
140 int field_select
= s
->next_picture
.f
.ref_index
[0][4 * mb_index
+ 2 * i
];
141 s
->field_select
[0][i
]= field_select
;
142 s
->field_select
[1][i
]= i
;
143 if(s
->top_field_first
){
144 time_pp
= s
->pp_field_time
- field_select
+ i
;
145 time_pb
= s
->pb_field_time
- field_select
+ i
;
147 time_pp
= s
->pp_field_time
+ field_select
- i
;
148 time_pb
= s
->pb_field_time
+ field_select
- i
;
150 s
->mv
[0][i
][0] = s
->p_field_mv_table
[i
][0][mb_index
][0]*time_pb
/time_pp
+ mx
;
151 s
->mv
[0][i
][1] = s
->p_field_mv_table
[i
][0][mb_index
][1]*time_pb
/time_pp
+ my
;
152 s
->mv
[1][i
][0] = mx
? s
->mv
[0][i
][0] - s
->p_field_mv_table
[i
][0][mb_index
][0]
153 : s
->p_field_mv_table
[i
][0][mb_index
][0]*(time_pb
- time_pp
)/time_pp
;
154 s
->mv
[1][i
][1] = my
? s
->mv
[0][i
][1] - s
->p_field_mv_table
[i
][0][mb_index
][1]
155 : s
->p_field_mv_table
[i
][0][mb_index
][1]*(time_pb
- time_pp
)/time_pp
;
157 return MB_TYPE_DIRECT2
| MB_TYPE_16x8
| MB_TYPE_L0L1
| MB_TYPE_INTERLACED
;
159 ff_mpeg4_set_one_direct_mv(s
, mx
, my
, 0);
160 s
->mv
[0][1][0] = s
->mv
[0][2][0] = s
->mv
[0][3][0] = s
->mv
[0][0][0];
161 s
->mv
[0][1][1] = s
->mv
[0][2][1] = s
->mv
[0][3][1] = s
->mv
[0][0][1];
162 s
->mv
[1][1][0] = s
->mv
[1][2][0] = s
->mv
[1][3][0] = s
->mv
[1][0][0];
163 s
->mv
[1][1][1] = s
->mv
[1][2][1] = s
->mv
[1][3][1] = s
->mv
[1][0][1];
164 if((s
->avctx
->workaround_bugs
& FF_BUG_DIRECT_BLOCKSIZE
) || !s
->quarter_sample
)
165 s
->mv_type
= MV_TYPE_16X16
;
167 s
->mv_type
= MV_TYPE_8X8
;
168 return MB_TYPE_DIRECT2
| MB_TYPE_16x16
| MB_TYPE_L0L1
; //Note see prev line