Hier een beetje pesudo code, dan krijg je een idee wat er allemaal bij komt kijken. Een standaard geval van video encoding. Je hebt een video van N frames die je van divx wilt encoden naar mpeg in een applicatie. Audio laten we ff weg voor de simpelheid.
Simpel case:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| VideoFile *in_file = new VideoFile("path/to/video.avi");
VideoFile *out_file = new VideoFile("path/to/video.mpg");
VideoDecoder *decoder = new VideoDecoder("divx");
VideoEncoder *encoder = new VideoEncoder("mpeg");
int n;
for (n=0;n<in_file.numFrames();n++) {
VideoFrame *frame = in_file.readFrame(n);
VideoFrame *decodedframe = decoder.decodeFrame(frame);
VideoFrame *encodedframe = encoder.encodeFrame(decodedframe);
out_file.writeFrame(encodedframe);
}
in_file.closeFile();
out_file.closeFile(); |
Het is vrij simpel: pak elk frame, decode het, encode het, stop het in de nieuwe video, klaar. Kan niet makkelijker. Nu de SMP manier. Ik laat de specifieke threading code weg omdat dat niet te begrijpen is als je het niet eerder gezien hebt. Maar die moet je dus ook nog zelf programmeren!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| ResourceCondition *frame_ready = new Resourcecondition();
ResourceLock *in_frames = new ResourceLock();
ResourceLock *out_frames = new ResourceLock();
int frameswritten = 0;
int framesread = 0;
Thread *decoder_thread[num_cpus];
Thread *encoder_thread[num_cpus];
VideoFile *in_file = new VideoFile("path/to/video.avi");
VideoFile *out_file = new VideoFile("path/to/video.mpg");
VideoDecoder *decoder = new VideoDecoder("divx");
VideoEncoder *encoder = new VideoEncoder("mpeg");
int n;
run()
{
while (1) {
in_frames.lock();
VideoFrame *frame = in_file.readFrame(framesread);
int numframe = framesread;
framesread++;
in_frames.unlock();
VideoFrame *decodedframe = decoder.decodeFrame(frame);
VideoFrame *encodedframe = encoder.encodeFrame(decodedframe);
while (frameswritten < numframe)
frame_ready.wait();
out_frames.lock();
out_file.writeFrame(encodedframe);
frames_written++;
out_frames.unlock();
frame_ready.notify();
}
}
main() {
for (n=0;n<num_cpus;n++) {
thread[n] = new Thread(run);
}
while (framesread < in_file.numFrames())
frame_ready.wait();
for (n=0;n<num_cpus;n++) {
thread[n].killthread();
}
in_file.closeFile();
out_file.closeFile();
} |
Je ziet dat de code al veel moeilijker wordt. In echte code is het dus nog drie keer gecompliceerder omdat ik de threading code hier versimpel. Je moet resource locken om de frames in de juiste volgorde in de nieuwe file te krijgen en om te zorgen dat niet meerdere threads op 't zelfde moment data gaan lezen/schrijven, dan krijg je namelijk data door elkaar.
Dus 't is vrij moeilijk, vandaar dat niet veel projecten aan SMP capability doen...