Mercurial > libavcodec.hg
comparison mpegvideo.c @ 7:1d3ac9654178 libavcodec
added skip macroblock optimization (big perf win on black regions for example)
author | glantau |
---|---|
date | Tue, 24 Jul 2001 20:43:41 +0000 |
parents | 986e461dc072 |
children | 1b4461b5a7fb |
comparison
equal
deleted
inserted
replaced
6:ec4642daa6fe | 7:1d3ac9654178 |
---|---|
169 s->intra_matrix[i] = default_intra_matrix[i]; | 169 s->intra_matrix[i] = default_intra_matrix[i]; |
170 s->chroma_intra_matrix[i] = default_intra_matrix[i]; | 170 s->chroma_intra_matrix[i] = default_intra_matrix[i]; |
171 s->non_intra_matrix[i] = default_non_intra_matrix[i]; | 171 s->non_intra_matrix[i] = default_non_intra_matrix[i]; |
172 s->chroma_non_intra_matrix[i] = default_non_intra_matrix[i]; | 172 s->chroma_non_intra_matrix[i] = default_non_intra_matrix[i]; |
173 } | 173 } |
174 /* init macroblock skip table */ | |
175 if (!s->encoding) { | |
176 s->mbskip_table = av_mallocz(s->mb_width * s->mb_height); | |
177 if (!s->mbskip_table) | |
178 goto fail; | |
179 } | |
180 | |
174 s->context_initialized = 1; | 181 s->context_initialized = 1; |
175 return 0; | 182 return 0; |
176 fail: | 183 fail: |
177 if (s->motion_val) | 184 if (s->motion_val) |
178 free(s->motion_val); | 185 free(s->motion_val); |
180 free(s->dc_val[0]); | 187 free(s->dc_val[0]); |
181 if (s->ac_val[0]) | 188 if (s->ac_val[0]) |
182 free(s->ac_val[0]); | 189 free(s->ac_val[0]); |
183 if (s->coded_block) | 190 if (s->coded_block) |
184 free(s->coded_block); | 191 free(s->coded_block); |
192 if (s->mbskip_table) | |
193 free(s->mbskip_table); | |
185 for(i=0;i<3;i++) { | 194 for(i=0;i<3;i++) { |
186 if (s->last_picture_base[i]) | 195 if (s->last_picture_base[i]) |
187 free(s->last_picture_base[i]); | 196 free(s->last_picture_base[i]); |
188 if (s->next_picture_base[i]) | 197 if (s->next_picture_base[i]) |
189 free(s->next_picture_base[i]); | 198 free(s->next_picture_base[i]); |
203 if (s->h263_pred) { | 212 if (s->h263_pred) { |
204 free(s->dc_val[0]); | 213 free(s->dc_val[0]); |
205 free(s->ac_val[0]); | 214 free(s->ac_val[0]); |
206 free(s->coded_block); | 215 free(s->coded_block); |
207 } | 216 } |
217 if (s->mbskip_table) | |
218 free(s->mbskip_table); | |
208 for(i=0;i<3;i++) { | 219 for(i=0;i<3;i++) { |
209 free(s->last_picture_base[i]); | 220 free(s->last_picture_base[i]); |
210 free(s->next_picture_base[i]); | 221 free(s->next_picture_base[i]); |
211 if (s->has_b_frames) | 222 if (s->has_b_frames) |
212 free(s->aux_picture_base[i]); | 223 free(s->aux_picture_base[i]); |
274 } | 285 } |
275 | 286 |
276 if (s->out_format == FMT_H263) | 287 if (s->out_format == FMT_H263) |
277 h263_encode_init_vlc(s); | 288 h263_encode_init_vlc(s); |
278 | 289 |
290 s->encoding = 1; | |
291 | |
279 /* init */ | 292 /* init */ |
280 if (MPV_common_init(s) < 0) | 293 if (MPV_common_init(s) < 0) |
281 return -1; | 294 return -1; |
282 | 295 |
283 /* rate control init */ | 296 /* rate control init */ |
710 } | 723 } |
711 } | 724 } |
712 | 725 |
713 if (!s->intra_only) { | 726 if (!s->intra_only) { |
714 UINT8 *dest_y, *dest_cb, *dest_cr; | 727 UINT8 *dest_y, *dest_cb, *dest_cr; |
728 UINT8 *mbskip_ptr; | |
729 | |
730 /* avoid copy if macroblock skipped in last frame too */ | |
731 if (!s->encoding) { | |
732 mbskip_ptr = &s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]; | |
733 if (s->mb_skiped) { | |
734 s->mb_skiped = 0; | |
735 /* if previous was skipped too, then nothing to do ! */ | |
736 if (*mbskip_ptr != 0) | |
737 goto the_end; | |
738 *mbskip_ptr = 1; /* indicate that this time we skiped it */ | |
739 } else { | |
740 *mbskip_ptr = 0; /* not skipped */ | |
741 } | |
742 } | |
715 | 743 |
716 dest_y = s->current_picture[0] + (mb_y * 16 * s->linesize) + mb_x * 16; | 744 dest_y = s->current_picture[0] + (mb_y * 16 * s->linesize) + mb_x * 16; |
717 dest_cb = s->current_picture[1] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8; | 745 dest_cb = s->current_picture[1] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8; |
718 dest_cr = s->current_picture[2] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8; | 746 dest_cr = s->current_picture[2] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8; |
719 | 747 |
760 | 788 |
761 put_dct(s, block[4], 4, dest_cb, dct_linesize >> 1); | 789 put_dct(s, block[4], 4, dest_cb, dct_linesize >> 1); |
762 put_dct(s, block[5], 5, dest_cr, dct_linesize >> 1); | 790 put_dct(s, block[5], 5, dest_cr, dct_linesize >> 1); |
763 } | 791 } |
764 } | 792 } |
793 the_end: | |
794 emms_c(); | |
765 } | 795 } |
766 | 796 |
767 static void encode_picture(MpegEncContext *s, int picture_number) | 797 static void encode_picture(MpegEncContext *s, int picture_number) |
768 { | 798 { |
769 int mb_x, mb_y, wrap; | 799 int mb_x, mb_y, wrap; |
883 ptr = s->last_picture[1] + offset; | 913 ptr = s->last_picture[1] + offset; |
884 sub_pixels_2(block[4], ptr, s->linesize >> 1, dxy); | 914 sub_pixels_2(block[4], ptr, s->linesize >> 1, dxy); |
885 ptr = s->last_picture[2] + offset; | 915 ptr = s->last_picture[2] + offset; |
886 sub_pixels_2(block[5], ptr, s->linesize >> 1, dxy); | 916 sub_pixels_2(block[5], ptr, s->linesize >> 1, dxy); |
887 } | 917 } |
918 emms_c(); | |
888 | 919 |
889 /* DCT & quantize */ | 920 /* DCT & quantize */ |
890 if (s->h263_msmpeg4) { | 921 if (s->h263_msmpeg4) { |
891 msmpeg4_dc_scale(s); | 922 msmpeg4_dc_scale(s); |
892 } else if (s->h263_pred) { | 923 } else if (s->h263_pred) { |