Mercurial > libavcodec.hg
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; |