comparison mpegvideo.c @ 12036:93a22c0fe8fe libavcodec

Maybe fix threaded mpeg*video encoding This allocates per-thread copies of some MpegEncContext.ac_val which is used concurrently from the encoding threads.
author mru
date Thu, 01 Jul 2010 11:51:01 +0000
parents fdafbcef52f5
children 25e9cb2b9477
comparison
equal deleted inserted replaced
12035:09705b027344 12036:93a22c0fe8fe
354 pic->type= 0; 354 pic->type= 0;
355 } 355 }
356 } 356 }
357 357
358 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){ 358 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
359 int y_size = s->b8_stride * (2 * s->mb_height + 1);
360 int c_size = s->mb_stride * (s->mb_height + 1);
361 int yc_size = y_size + 2 * c_size;
359 int i; 362 int i;
360 363
361 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264) 364 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
362 FF_ALLOCZ_OR_GOTO(s->avctx, s->allocated_edge_emu_buffer, (s->width+64)*2*21*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance 365 FF_ALLOCZ_OR_GOTO(s->avctx, s->allocated_edge_emu_buffer, (s->width+64)*2*21*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance
363 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21; 366 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21;
379 s->block= s->blocks[0]; 382 s->block= s->blocks[0];
380 383
381 for(i=0;i<12;i++){ 384 for(i=0;i<12;i++){
382 s->pblocks[i] = &s->block[i]; 385 s->pblocks[i] = &s->block[i];
383 } 386 }
387
388 if (s->ac_val_base) {
389 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail);
390 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
391 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
392 s->ac_val[2] = s->ac_val[1] + c_size;
393 }
394
384 return 0; 395 return 0;
385 fail: 396 fail:
386 return -1; //free() through MPV_common_end() 397 return -1; //free() through MPV_common_end()
387 } 398 }
388 399
398 409
399 av_freep(&s->dct_error_sum); 410 av_freep(&s->dct_error_sum);
400 av_freep(&s->me.map); 411 av_freep(&s->me.map);
401 av_freep(&s->me.score_map); 412 av_freep(&s->me.score_map);
402 av_freep(&s->blocks); 413 av_freep(&s->blocks);
414 av_freep(&s->ac_val_base);
403 s->block= NULL; 415 s->block= NULL;
404 } 416 }
405 417
406 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){ 418 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
407 #define COPY(a) bak->a= src->a 419 #define COPY(a) bak->a= src->a
421 COPY(me.map_generation); 433 COPY(me.map_generation);
422 COPY(pb); 434 COPY(pb);
423 COPY(dct_error_sum); 435 COPY(dct_error_sum);
424 COPY(dct_count[0]); 436 COPY(dct_count[0]);
425 COPY(dct_count[1]); 437 COPY(dct_count[1]);
438 COPY(ac_val_base);
439 COPY(ac_val[0]);
440 COPY(ac_val[1]);
441 COPY(ac_val[2]);
426 #undef COPY 442 #undef COPY
427 } 443 }
428 444
429 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){ 445 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
430 MpegEncContext bak; 446 MpegEncContext bak;