annotate w32thread.c @ 4580:55d7ebd2d699 libavcodec

fix chroma mc2 bug, this is based on a patch by (Oleg Metelitsa oleg hitron co kr) and does slow the mc2 chroma put down, avg interrestingly seems unaffected speedwise on duron this of course should be rather done in a way which doesnt slow it down but its better a few % slower but correct then incorrect
author michael
date Fri, 23 Feb 2007 14:29:13 +0000
parents c8c591fe26f8
children f99e40a7155b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
1 /*
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
2 * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
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
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
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.
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
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,
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
14 * Lesser General Public License for more details.
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
15 *
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
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: 2967
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
19 *
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
20 */
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
21 //#define DEBUG
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
22
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
23 #include "avcodec.h"
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
24 #include "common.h"
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
25
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
26 #define WIN32_LEAN_AND_MEAN
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
27 #include <windows.h>
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
28 #include <process.h>
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
29
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
30 typedef struct ThreadContext{
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
31 AVCodecContext *avctx;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
32 HANDLE thread;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
33 HANDLE work_sem;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
34 HANDLE done_sem;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
35 int (*func)(AVCodecContext *c, void *arg);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
36 void *arg;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
37 int ret;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
38 }ThreadContext;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
39
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
40
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
41 static unsigned __stdcall thread_func(void *v){
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
42 ThreadContext *c= v;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
43
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
44 for(;;){
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
45 //printf("thread_func %X enter wait\n", (int)v); fflush(stdout);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
46 WaitForSingleObject(c->work_sem, INFINITE);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
47 //printf("thread_func %X after wait (func=%X)\n", (int)v, (int)c->func); fflush(stdout);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
48 if(c->func)
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
49 c->ret= c->func(c->avctx, c->arg);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
50 else
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
51 return 0;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
52 //printf("thread_func %X signal complete\n", (int)v); fflush(stdout);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
53 ReleaseSemaphore(c->done_sem, 1, 0);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
54 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1822
diff changeset
55
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
56 return 0;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
57 }
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
58
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
59 /**
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
60 * free what has been allocated by avcodec_thread_init().
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
61 * must be called after decoding has finished, especially dont call while avcodec_thread_execute() is running
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
62 */
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
63 void avcodec_thread_free(AVCodecContext *s){
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
64 ThreadContext *c= s->thread_opaque;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
65 int i;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
66
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
67 for(i=0; i<s->thread_count; i++){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1822
diff changeset
68
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
69 c[i].func= NULL;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
70 ReleaseSemaphore(c[i].work_sem, 1, 0);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
71 WaitForSingleObject(c[i].thread, INFINITE);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
72 if(c[i].work_sem) CloseHandle(c[i].work_sem);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
73 if(c[i].done_sem) CloseHandle(c[i].done_sem);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
74 }
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
75
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
76 av_freep(&s->thread_opaque);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
77 }
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
78
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
79 int avcodec_thread_execute(AVCodecContext *s, int (*func)(AVCodecContext *c2, void *arg2),void **arg, int *ret, int count){
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
80 ThreadContext *c= s->thread_opaque;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
81 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1822
diff changeset
82
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
83 assert(s == c->avctx);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
84 assert(count <= s->thread_count);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1822
diff changeset
85
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
86 /* note, we can be certain that this is not called with the same AVCodecContext by different threads at the same time */
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
87
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
88 for(i=0; i<count; i++){
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
89 c[i].arg= arg[i];
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
90 c[i].func= func;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
91 c[i].ret= 12345;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
92
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
93 ReleaseSemaphore(c[i].work_sem, 1, 0);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
94 }
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
95 for(i=0; i<count; i++){
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
96 WaitForSingleObject(c[i].done_sem, INFINITE);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1822
diff changeset
97
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
98 c[i].func= NULL;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
99 if(ret) ret[i]= c[i].ret;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
100 }
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
101 return 0;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
102 }
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
103
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
104 int avcodec_thread_init(AVCodecContext *s, int thread_count){
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
105 int i;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
106 ThreadContext *c;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
107 uint32_t threadid;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
108
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
109 s->thread_count= thread_count;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
110
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
111 assert(!s->thread_opaque);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
112 c= av_mallocz(sizeof(ThreadContext)*thread_count);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
113 s->thread_opaque= c;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1822
diff changeset
114
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
115 for(i=0; i<thread_count; i++){
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
116 //printf("init semaphors %d\n", i); fflush(stdout);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
117 c[i].avctx= s;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
118
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
119 if(!(c[i].work_sem = CreateSemaphore(NULL, 0, s->thread_count, NULL)))
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
120 goto fail;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
121 if(!(c[i].done_sem = CreateSemaphore(NULL, 0, s->thread_count, NULL)))
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
122 goto fail;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
123
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
124 //printf("create thread %d\n", i); fflush(stdout);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
125 c[i].thread = (HANDLE)_beginthreadex(NULL, 0, thread_func, &c[i], 0, &threadid );
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
126 if( !c[i].thread ) goto fail;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
127 }
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
128 //printf("init done\n"); fflush(stdout);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 1822
diff changeset
129
1822
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
130 s->execute= avcodec_thread_execute;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
131
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
132 return 0;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
133 fail:
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
134 avcodec_thread_free(s);
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
135 return -1;
7366bb5c363f w32threads by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
diff changeset
136 }