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