| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2004 Roman Shaposhnik | 2 * Copyright (c) 2004 Roman Shaposhnik |
| 3 * Copyright (c) 2008 Alexander Strange (astrange@ithinksw.com) | 3 * Copyright (c) 2008 Alexander Strange (astrange@ithinksw.com) |
| 4 * | 4 * |
| 5 * Many thanks to Steven M. Schultz for providing clever ideas and | 5 * Many thanks to Steven M. Schultz for providing clever ideas and |
| 6 * to Michael Niedermayer <michaelni@gmx.at> for writing initial | 6 * to Michael Niedermayer <michaelni@gmx.at> for writing initial |
| 7 * implementation. | 7 * implementation. |
| 8 * | 8 * |
| 9 * This file is part of FFmpeg. | 9 * This file is part of FFmpeg. |
| 10 * | 10 * |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 int thread_count = avctx->thread_count, err = 0; | 441 int thread_count = avctx->thread_count, err = 0; |
| 442 int returning_thread = fctx->next_finished; | 442 int returning_thread = fctx->next_finished; |
| 443 PerThreadContext *p; | 443 PerThreadContext *p; |
| 444 | 444 |
| 445 p = &fctx->threads[fctx->next_decoding]; | 445 p = &fctx->threads[fctx->next_decoding]; |
| 446 update_thread_context_from_user(p->avctx, avctx); | 446 update_thread_context_from_user(p->avctx, avctx); |
| 447 err = submit_frame(p, avpkt); | 447 err = submit_frame(p, avpkt); |
| 448 if (err) return err; | 448 if (err) return err; |
| 449 | 449 |
| 450 fctx->next_decoding++; | 450 fctx->next_decoding++; |
| 451 int decoding_save = fctx->next_decoding; |
| 452 if (fctx->next_decoding >= thread_count) fctx->next_decoding = 0; |
| 451 | 453 |
| 452 if (fctx->delaying && avpkt->size) { | 454 if (fctx->delaying && avpkt->size) { |
| 453 if (fctx->next_decoding >= (thread_count-1)) fctx->delaying = 0; | 455 if (decoding_save >= (thread_count-1)) fctx->delaying = 0; |
| 454 | 456 |
| 455 *got_picture_ptr=0; | 457 *got_picture_ptr=0; |
| 456 return 0; | 458 return 0; |
| 457 } | 459 } |
| 458 | 460 |
| 459 //If it's draining frames at EOF, ignore null frames from the codec. | 461 //If it's draining frames at EOF, ignore null frames from the codec. |
| 460 //Only return one when we've run out of codec frames to return. | 462 //Only return one when we've run out of codec frames to return. |
| 461 do { | 463 do { |
| 462 p = &fctx->threads[returning_thread++]; | 464 p = &fctx->threads[returning_thread++]; |
| 463 | 465 |
| 464 if (p->state != STATE_INPUT_READY) { | 466 if (p->state != STATE_INPUT_READY) { |
| 465 pthread_mutex_lock(&p->progress_mutex); | 467 pthread_mutex_lock(&p->progress_mutex); |
| 466 while (p->state != STATE_INPUT_READY) | 468 while (p->state != STATE_INPUT_READY) |
| 467 pthread_cond_wait(&p->output_cond, &p->progress_mutex); | 469 pthread_cond_wait(&p->output_cond, &p->progress_mutex); |
| 468 pthread_mutex_unlock(&p->progress_mutex); | 470 pthread_mutex_unlock(&p->progress_mutex); |
| 469 } | 471 } |
| 470 | 472 |
| 471 *picture = p->picture; | 473 *picture = p->picture; |
| 472 *got_picture_ptr = p->got_picture; | 474 *got_picture_ptr = p->got_picture; |
| 473 | 475 |
| 474 avcodec_get_frame_defaults(&p->picture); | 476 avcodec_get_frame_defaults(&p->picture); |
| 475 p->got_picture = 0; | 477 p->got_picture = 0; |
| 476 | 478 |
| 477 if (returning_thread >= thread_count) returning_thread = 0; | 479 if (returning_thread >= thread_count) returning_thread = 0; |
| 478 } while (!avpkt->size && !*got_picture_ptr && returning_thread != fctx->next
_finished); | 480 } while (!avpkt->size && !*got_picture_ptr && returning_thread != fctx->next
_finished); |
| 479 | 481 |
| 480 update_thread_context_from_copy(avctx, p->avctx, 1); | 482 update_thread_context_from_copy(avctx, p->avctx, 1); |
| 481 | 483 |
| 482 if (fctx->next_decoding >= thread_count) fctx->next_decoding = 0; | |
| 483 fctx->next_finished = returning_thread; | 484 fctx->next_finished = returning_thread; |
| 484 | 485 |
| 485 return p->result; | 486 return p->result; |
| 486 } | 487 } |
| 487 | 488 |
| 488 void ff_thread_report_progress(AVFrame *f, int n, int field) | 489 void ff_thread_report_progress(AVFrame *f, int n, int field) |
| 489 { | 490 { |
| 490 PerThreadContext *p; | 491 PerThreadContext *p; |
| 491 int *progress = f->thread_opaque; | 492 int *progress = f->thread_opaque; |
| 492 | 493 |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 return 0; | 793 return 0; |
| 793 } | 794 } |
| 794 | 795 |
| 795 void avcodec_thread_free(AVCodecContext *avctx) | 796 void avcodec_thread_free(AVCodecContext *avctx) |
| 796 { | 797 { |
| 797 if (avctx->active_thread_type&FF_THREAD_FRAME) | 798 if (avctx->active_thread_type&FF_THREAD_FRAME) |
| 798 frame_thread_free(avctx, avctx->thread_count); | 799 frame_thread_free(avctx, avctx->thread_count); |
| 799 else | 800 else |
| 800 thread_free(avctx); | 801 thread_free(avctx); |
| 801 } | 802 } |
| OLD | NEW |