Mercurial > libavcodec.hg
annotate mpeg4video.c @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 82d006235248 |
children | 31033caa5344 |
rev | line source |
---|---|
10803 | 1 /* |
2 * MPEG4 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 | |
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_y-1)*l_wrap + s->mb_x*2 - 1; | |
49 c_wrap= s->mb_stride; | |
50 c_xy= (s->mb_y-1)*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 } | |
10824
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
73 |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
74 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0])) |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
75 #define tab_bias (tab_size/2) |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
76 |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
77 //used by mpeg4 and rv10 decoder |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
78 void ff_mpeg4_init_direct_mv(MpegEncContext *s){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
79 int i; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
80 for(i=0; i<tab_size; i++){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
81 s->direct_scale_mv[0][i] = (i-tab_bias)*s->pb_time/s->pp_time; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
82 s->direct_scale_mv[1][i] = (i-tab_bias)*(s->pb_time-s->pp_time)/s->pp_time; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
83 } |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
84 } |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
85 |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
86 static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx, int my, int i){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
87 int xy= s->block_index[i]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
88 uint16_t time_pp= s->pp_time; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
89 uint16_t time_pb= s->pb_time; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
90 int p_mx, p_my; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
91 |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
92 p_mx= s->next_picture.motion_val[0][xy][0]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
93 if((unsigned)(p_mx + tab_bias) < tab_size){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
94 s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias] + mx; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
95 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
96 : s->direct_scale_mv[1][p_mx + tab_bias]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
97 }else{ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
98 s->mv[0][i][0] = p_mx*time_pb/time_pp + mx; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
99 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
100 : p_mx*(time_pb - time_pp)/time_pp; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
101 } |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
102 p_my= s->next_picture.motion_val[0][xy][1]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
103 if((unsigned)(p_my + tab_bias) < tab_size){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
104 s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias] + my; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
105 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
106 : s->direct_scale_mv[1][p_my + tab_bias]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
107 }else{ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
108 s->mv[0][i][1] = p_my*time_pb/time_pp + my; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
109 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
110 : p_my*(time_pb - time_pp)/time_pp; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
111 } |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
112 } |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
113 |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
114 #undef tab_size |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
115 #undef tab_bias |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
116 |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
117 /** |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
118 * |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
119 * @return the mb_type |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
120 */ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
121 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
122 const int mb_index= s->mb_x + s->mb_y*s->mb_stride; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
123 const int colocated_mb_type= s->next_picture.mb_type[mb_index]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
124 uint16_t time_pp; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
125 uint16_t time_pb; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
126 int i; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
127 |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
128 //FIXME avoid divides |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
129 // try special case with shifts for 1 and 3 B-frames? |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
130 |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
131 if(IS_8X8(colocated_mb_type)){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
132 s->mv_type = MV_TYPE_8X8; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
133 for(i=0; i<4; i++){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
134 ff_mpeg4_set_one_direct_mv(s, mx, my, i); |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
135 } |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
136 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
137 } else if(IS_INTERLACED(colocated_mb_type)){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
138 s->mv_type = MV_TYPE_FIELD; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
139 for(i=0; i<2; i++){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
140 int field_select= s->next_picture.ref_index[0][s->block_index[2*i]]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
141 s->field_select[0][i]= field_select; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
142 s->field_select[1][i]= i; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
143 if(s->top_field_first){ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
144 time_pp= s->pp_field_time - field_select + i; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
145 time_pb= s->pb_field_time - field_select + i; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
146 }else{ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
147 time_pp= s->pp_field_time + field_select - i; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
148 time_pb= s->pb_field_time + field_select - i; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
149 } |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
150 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
151 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
152 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0] |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
153 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
154 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1] |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
155 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
156 } |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
157 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
158 }else{ |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
159 ff_mpeg4_set_one_direct_mv(s, mx, my, 0); |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
160 s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->mv[0][0][0]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
161 s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->mv[0][0][1]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
162 s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = s->mv[1][0][0]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
163 s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = s->mv[1][0][1]; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
164 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample) |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
165 s->mv_type= MV_TYPE_16X16; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
166 else |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
167 s->mv_type= MV_TYPE_8X8; |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
168 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
169 } |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
170 } |
82d006235248
Move 3 direct MV related functions that i left out from h263.c to mpeg4video.c.
michael
parents:
10803
diff
changeset
|
171 |