ffmpeg / libavcodec / mpeg4video.c @ 2912e87a
History  View  Annotate  Download (6.29 KB)
1 
/*


2 
* MPEG4 decoder / encoder common code.

3 
* Copyright (c) 2000,2001 Fabrice Bellard

4 
* Copyright (c) 20022010 Michael Niedermayer <michaelni@gmx.at>

5 
*

6 
* This file is part of Libav.

7 
*

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.

12 
*

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.

17 
*

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 021101301 USA

21 
*/

22  
23 
#include "mpegvideo.h" 
24 
#include "mpeg4video.h" 
25 
#include "mpeg4data.h" 
26  
27 
uint8_t ff_mpeg4_static_rl_table_store[3][2][2*MAX_RUN + MAX_LEVEL + 3]; 
28  
29 
int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){

30 
switch(s>pict_type){

31 
case FF_I_TYPE:

32 
return 16; 
33 
case FF_P_TYPE:

34 
case FF_S_TYPE:

35 
return s>f_code+15; 
36 
case FF_B_TYPE:

37 
return FFMAX3(s>f_code, s>b_code, 2) + 15; 
38 
default:

39 
return 1; 
40 
} 
41 
} 
42  
43 
void ff_mpeg4_clean_buffers(MpegEncContext *s)

44 
{ 
45 
int c_wrap, c_xy, l_wrap, l_xy;

46  
47 
l_wrap= s>b8_stride; 
48 
l_xy= (2*s>mb_y1)*l_wrap + s>mb_x*2  1; 
49 
c_wrap= s>mb_stride; 
50 
c_xy= (s>mb_y1)*c_wrap + s>mb_x  1; 
51  
52 
#if 0

53 
/* clean DC */

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);

57 
#endif

58  
59 
/* clean AC */

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)); 
63  
64 
/* clean MV */

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));

68 
s>last_mv[0][0][0]= 
69 
s>last_mv[0][0][1]= 
70 
s>last_mv[1][0][0]= 
71 
s>last_mv[1][0][1]= 0; 
72 
} 
73  
74 
#define tab_size ((signed)FF_ARRAY_ELEMS(s>direct_scale_mv[0])) 
75 
#define tab_bias (tab_size/2) 
76  
77 
//used by mpeg4 and rv10 decoder

78 
void ff_mpeg4_init_direct_mv(MpegEncContext *s){

79 
int i;

80 
for(i=0; i<tab_size; i++){ 
81 
s>direct_scale_mv[0][i] = (itab_bias)*s>pb_time/s>pp_time;

82 
s>direct_scale_mv[1][i] = (itab_bias)*(s>pb_times>pp_time)/s>pp_time;

83 
} 
84 
} 
85  
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; 
90 
int p_mx, p_my;

91  
92 
p_mx= s>next_picture.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];

97 
}else{

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; 
101 
} 
102 
p_my= s>next_picture.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];

107 
}else{

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; 
111 
} 
112 
} 
113  
114 
#undef tab_size

115 
#undef tab_bias

116  
117 
/**

118 
*

119 
* @return the mb_type

120 
*/

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.mb_type[mb_index]; 
124 
uint16_t time_pp; 
125 
uint16_t time_pb; 
126 
int i;

127  
128 
//FIXME avoid divides

129 
// try special case with shifts for 1 and 3 Bframes?

130  
131 
if(IS_8X8(colocated_mb_type)){

132 
s>mv_type = MV_TYPE_8X8; 
133 
for(i=0; i<4; i++){ 
134 
ff_mpeg4_set_one_direct_mv(s, mx, my, i); 
135 
} 
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; 
139 
for(i=0; i<2; i++){ 
140 
int field_select= s>next_picture.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; 
146 
}else{

147 
time_pp= s>pp_field_time + field_select  i; 
148 
time_pb= s>pb_field_time + field_select  i; 
149 
} 
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; 
156 
} 
157 
return MB_TYPE_DIRECT2  MB_TYPE_16x8  MB_TYPE_L0L1  MB_TYPE_INTERLACED;

158 
}else{

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; 
166 
else

167 
s>mv_type= MV_TYPE_8X8; 
168 
return MB_TYPE_DIRECT2  MB_TYPE_16x16  MB_TYPE_L0L1; //Note see prev line 
169 
} 
170 
} 
171 