Mercurial > libavcodec.hg
annotate beosthread.c @ 11557:53822d92c3f7 libavcodec
Make sure the EC code does not attempt to use inter based concealment if there
is no reference frame available. (this can happen because the EC code will attempt
to use reference frames even for I/IDR frames)
author | michael |
---|---|
date | Tue, 30 Mar 2010 20:46:46 +0000 |
parents | 7bfe7456e372 |
children |
rev | line source |
---|---|
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
1 /* |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
2 * Copyright (c) 2004 François Revol <revol@free.fr> |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
3 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
4 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
5 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
7 * modify it under the terms of the GNU Lesser General Public |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
8 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
10 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
14 * Lesser General Public License for more details. |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
15 * |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
16 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
19 */ |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
20 //#define DEBUG |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
21 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
22 #include "avcodec.h" |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
23 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
24 #include <OS.h> |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
25 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
26 typedef struct ThreadContext{ |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
27 AVCodecContext *avctx; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
28 thread_id thread; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
29 sem_id work_sem; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
30 sem_id done_sem; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
31 int (*func)(AVCodecContext *c, void *arg); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
32 void *arg; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
33 int ret; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
34 }ThreadContext; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
35 |
2469
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
36 // it's odd Be never patented that :D |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
37 struct benaphore { |
2979 | 38 vint32 atom; |
39 sem_id sem; | |
2469
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
40 }; |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
41 static inline int lock_ben(struct benaphore *ben) |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
42 { |
2979 | 43 if (atomic_add(&ben->atom, 1) > 0) |
44 return acquire_sem(ben->sem); | |
45 return B_OK; | |
2469
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
46 } |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
47 static inline int unlock_ben(struct benaphore *ben) |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
48 { |
2979 | 49 if (atomic_add(&ben->atom, -1) > 1) |
50 return release_sem(ben->sem); | |
51 return B_OK; | |
2469
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
52 } |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
53 |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
54 static struct benaphore av_thread_lib_ben; |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
55 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
56 static int32 ff_thread_func(void *v){ |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
57 ThreadContext *c= v; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
58 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
59 for(;;){ |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
60 //printf("thread_func %X enter wait\n", (int)v); fflush(stdout); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
61 acquire_sem(c->work_sem); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
62 //printf("thread_func %X after wait (func=%X)\n", (int)v, (int)c->func); fflush(stdout); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
63 if(c->func) |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
64 c->ret= c->func(c->avctx, c->arg); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
65 else |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
66 return 0; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
67 //printf("thread_func %X signal complete\n", (int)v); fflush(stdout); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
68 release_sem(c->done_sem); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
69 } |
2967 | 70 |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
71 return B_OK; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
72 } |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
73 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
74 /** |
5127 | 75 * Free what has been allocated by avcodec_thread_init(). |
76 * Must be called after decoding has finished, especially do not call while avcodec_thread_execute() is running. | |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
77 */ |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
78 void avcodec_thread_free(AVCodecContext *s){ |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
79 ThreadContext *c= s->thread_opaque; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
80 int i; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
81 int32 ret; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
82 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
83 for(i=0; i<s->thread_count; i++){ |
2967 | 84 |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
85 c[i].func= NULL; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
86 release_sem(c[i].work_sem); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
87 wait_for_thread(c[i].thread, &ret); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
88 if(c[i].work_sem > B_OK) delete_sem(c[i].work_sem); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
89 if(c[i].done_sem > B_OK) delete_sem(c[i].done_sem); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
90 } |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
91 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
92 av_freep(&s->thread_opaque); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
93 } |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
94 |
11492
7bfe7456e372
Remove avcodec_thread_execute from avcodec.h, and make static functions that
benoit
parents:
10954
diff
changeset
|
95 static int avcodec_thread_execute(AVCodecContext *s, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size){ |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
96 ThreadContext *c= s->thread_opaque; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
97 int i; |
2967 | 98 |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
99 assert(s == c->avctx); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
100 assert(count <= s->thread_count); |
2967 | 101 |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
102 /* note, we can be certain that this is not called with the same AVCodecContext by different threads at the same time */ |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
103 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
104 for(i=0; i<count; i++){ |
8129
a9734fe0811e
Making it easier to send arbitrary structures as work orders to MT workers
romansh
parents:
5215
diff
changeset
|
105 c[i].arg= (char*)arg + i*size; |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
106 c[i].func= func; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
107 c[i].ret= 12345; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
108 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
109 release_sem(c[i].work_sem); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
110 } |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
111 for(i=0; i<count; i++){ |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
112 acquire_sem(c[i].done_sem); |
2967 | 113 |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
114 c[i].func= NULL; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
115 if(ret) ret[i]= c[i].ret; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
116 } |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
117 return 0; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
118 } |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
119 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
120 int avcodec_thread_init(AVCodecContext *s, int thread_count){ |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
121 int i; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
122 ThreadContext *c; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
123 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
124 s->thread_count= thread_count; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
125 |
10954 | 126 if (thread_count <= 1) |
127 return 0; | |
128 | |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
129 assert(!s->thread_opaque); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
130 c= av_mallocz(sizeof(ThreadContext)*thread_count); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
131 s->thread_opaque= c; |
2967 | 132 |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
133 for(i=0; i<thread_count; i++){ |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
134 //printf("init semaphors %d\n", i); fflush(stdout); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
135 c[i].avctx= s; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
136 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
137 if((c[i].work_sem = create_sem(0, "ff work sem")) < B_OK) |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
138 goto fail; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
139 if((c[i].done_sem = create_sem(0, "ff done sem")) < B_OK) |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
140 goto fail; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
141 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
142 //printf("create thread %d\n", i); fflush(stdout); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
143 c[i].thread = spawn_thread(ff_thread_func, "libavcodec thread", B_LOW_PRIORITY, &c[i] ); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
144 if( c[i].thread < B_OK ) goto fail; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
145 resume_thread(c[i].thread ); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
146 } |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
147 //printf("init done\n"); fflush(stdout); |
2967 | 148 |
2362
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
149 s->execute= avcodec_thread_execute; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
150 |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
151 return 0; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
152 fail: |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
153 avcodec_thread_free(s); |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
154 return -1; |
7a6ff8cc7c95
BeOS threading support. changed some "if FOO_THREAD||BAR_THREAD" to a more generic "if HAVE_THREADS"
mmu_man
parents:
diff
changeset
|
155 } |
2469
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
156 |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
157 /* provide a mean to serialize calls to avcodec_*() for thread safety. */ |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
158 |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
159 int avcodec_thread_lock_lib(void) |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
160 { |
2979 | 161 return lock_ben(&av_thread_lib_ben); |
2469
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
162 } |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
163 |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
164 int avcodec_thread_unlock_lib(void) |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
165 { |
2979 | 166 return unlock_ben(&av_thread_lib_ben); |
2469
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
167 } |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
168 |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
169 /* our versions of _init and _fini (which are called by those actually from crt.o) */ |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
170 |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
171 void initialize_after(void) |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
172 { |
2979 | 173 av_thread_lib_ben.atom = 0; |
174 av_thread_lib_ben.sem = create_sem(0, "libavcodec benaphore"); | |
2469
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
175 } |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
176 |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
177 void uninitialize_before(void) |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
178 { |
2979 | 179 delete_sem(av_thread_lib_ben.sem); |
2469
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
180 } |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
181 |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
182 |
df02930c138b
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
mmu_man
parents:
2362
diff
changeset
|
183 |