annotate VideoPlayer.h @ 2345:182effc4b0ee

for MultimediaPlayer
author Ritor1
date Mon, 07 Apr 2014 19:15:13 +0600
parents ddb803517a48
children d57505d3c70c
rev   line source
0
Ritor1
parents:
diff changeset
1 #pragma once
1802
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
2 #include "OSWindow.h"
1262
0aeac0b9ca30 included header cleanup
Grumpy7
parents: 1253
diff changeset
3 #include "Texture.h"
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
4 #include "MediaPlayer.h"
0
Ritor1
parents:
diff changeset
5
Ritor1
parents:
diff changeset
6
Ritor1
parents:
diff changeset
7
Ritor1
parents:
diff changeset
8
2137
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
9
0
Ritor1
parents:
diff changeset
10 #pragma pack(push, 1)
Ritor1
parents:
diff changeset
11
Ritor1
parents:
diff changeset
12
Ritor1
parents:
diff changeset
13
Ritor1
parents:
diff changeset
14 struct _BINK
Ritor1
parents:
diff changeset
15 {
Ritor1
parents:
diff changeset
16 int uWidth;
Ritor1
parents:
diff changeset
17 int uHeight;
Ritor1
parents:
diff changeset
18 };
Ritor1
parents:
diff changeset
19
Ritor1
parents:
diff changeset
20 struct _BINK_1_5_21_0: public _BINK
Ritor1
parents:
diff changeset
21 {
Ritor1
parents:
diff changeset
22 int uNumFrames;
Ritor1
parents:
diff changeset
23 int uCurrentFrame;
Ritor1
parents:
diff changeset
24 int Data1;
Ritor1
parents:
diff changeset
25 int uFrameRate;
Ritor1
parents:
diff changeset
26 int field_18[3];
Ritor1
parents:
diff changeset
27 int uFlags;
Ritor1
parents:
diff changeset
28 };
Ritor1
parents:
diff changeset
29
Ritor1
parents:
diff changeset
30 struct _BINK_3_0_0_0: public _BINK
Ritor1
parents:
diff changeset
31 {
Ritor1
parents:
diff changeset
32 int unk_0;
Ritor1
parents:
diff changeset
33 int unk_1;
Ritor1
parents:
diff changeset
34 int uNumFrames;
Ritor1
parents:
diff changeset
35 int uCurrentFrame;
Ritor1
parents:
diff changeset
36 int _unk2;
Ritor1
parents:
diff changeset
37 int _unk_[10];
Ritor1
parents:
diff changeset
38 };
Ritor1
parents:
diff changeset
39
Ritor1
parents:
diff changeset
40
Ritor1
parents:
diff changeset
41 struct _BINKBUF
Ritor1
parents:
diff changeset
42 {
Ritor1
parents:
diff changeset
43 int uWidth;
Ritor1
parents:
diff changeset
44 int uHeight;
Ritor1
parents:
diff changeset
45 int field_8;
Ritor1
parents:
diff changeset
46 int field_C;
Ritor1
parents:
diff changeset
47 int uBinkDDSurfaceType;
Ritor1
parents:
diff changeset
48 void *pDDrawSurfaceData;
Ritor1
parents:
diff changeset
49 int uDDrawSurfacePitch;
Ritor1
parents:
diff changeset
50 int field_1C;
Ritor1
parents:
diff changeset
51 int field_20;
1802
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
52 int target_width;
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
53 int target_height;
0
Ritor1
parents:
diff changeset
54 int field_2C;
Ritor1
parents:
diff changeset
55 int field_30;
Ritor1
parents:
diff changeset
56 int field_34;
Ritor1
parents:
diff changeset
57 int field_38;
Ritor1
parents:
diff changeset
58 int field_3C;
Ritor1
parents:
diff changeset
59 int field_40;
Ritor1
parents:
diff changeset
60 int field_44;
Ritor1
parents:
diff changeset
61 struct IDirectDrawSurface *pTargetDDrawSurface;
Ritor1
parents:
diff changeset
62 int field_4C;
Ritor1
parents:
diff changeset
63 int uRectX;
Ritor1
parents:
diff changeset
64 int uRectY;
Ritor1
parents:
diff changeset
65 HWND hWnd;
Ritor1
parents:
diff changeset
66 int field_5C;
Ritor1
parents:
diff changeset
67 float field_60;
Ritor1
parents:
diff changeset
68 float field_64;
Ritor1
parents:
diff changeset
69 int field_68;
Ritor1
parents:
diff changeset
70 int field_6C;
Ritor1
parents:
diff changeset
71 void *pDDrawSurfaceData_;
Ritor1
parents:
diff changeset
72 int field_74;
Ritor1
parents:
diff changeset
73 int field_78;
Ritor1
parents:
diff changeset
74 };
Ritor1
parents:
diff changeset
75 struct _BINKBUF_1_5_21_0: public _BINKBUF
Ritor1
parents:
diff changeset
76 {
Ritor1
parents:
diff changeset
77 int field_7C;
Ritor1
parents:
diff changeset
78 int field_80;
Ritor1
parents:
diff changeset
79 int field_84;
Ritor1
parents:
diff changeset
80 int field_88;
Ritor1
parents:
diff changeset
81 int field_8C;
Ritor1
parents:
diff changeset
82 int field_90;
Ritor1
parents:
diff changeset
83 int field_94;
Ritor1
parents:
diff changeset
84 int field_98;
Ritor1
parents:
diff changeset
85 int field_9C;
Ritor1
parents:
diff changeset
86 int field_A0;
Ritor1
parents:
diff changeset
87 };
Ritor1
parents:
diff changeset
88
Ritor1
parents:
diff changeset
89 struct _BINKBUF_3_0_0_0: public _BINKBUF
Ritor1
parents:
diff changeset
90 {
Ritor1
parents:
diff changeset
91 };
Ritor1
parents:
diff changeset
92 #pragma pack(pop)
Ritor1
parents:
diff changeset
93
Ritor1
parents:
diff changeset
94
Ritor1
parents:
diff changeset
95
Ritor1
parents:
diff changeset
96
Ritor1
parents:
diff changeset
97 #pragma pack(push, 1)
Ritor1
parents:
diff changeset
98 struct MovieHeader
Ritor1
parents:
diff changeset
99 {
Ritor1
parents:
diff changeset
100 char pVideoName[40];
Ritor1
parents:
diff changeset
101 unsigned int uFileOffset;
Ritor1
parents:
diff changeset
102 };
Ritor1
parents:
diff changeset
103 #pragma pack(pop)
Ritor1
parents:
diff changeset
104
Ritor1
parents:
diff changeset
105
Ritor1
parents:
diff changeset
106
Ritor1
parents:
diff changeset
107
Ritor1
parents:
diff changeset
108
2290
d65414f65bd4 add MMT.cpp and MMT.h
Ritor1
parents: 2221
diff changeset
109 void ShowMM7IntroVideo_and_LoadingScreen();
0
Ritor1
parents:
diff changeset
110
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
111 extern "C"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
112 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
113 #include "lib/libavcodec/avcodec.h"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
114 #include "lib/libavformat/avformat.h"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
115 #include "lib/libavutil/avutil.h"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
116 #include "lib/libavutil/imgutils.h"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
117 #include "lib/libswscale/swscale.h"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
118 #include "lib/libswresample/swresample.h"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
119 #include "lib/libavutil/opt.h"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
120 //#include "libavutil/samplefmt.h"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
121 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
122 #pragma comment(lib, "avcodec.lib")
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
123 #pragma comment(lib, "avformat.lib")
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
124 #pragma comment(lib, "avutil.lib")
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
125 #pragma comment(lib, "swscale.lib")
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
126 #pragma comment(lib, "swresample.lib")
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
127
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
128 #include "lib/OpenAL/al.h"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
129 #include "lib/OpenAL/alc.h"
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
130 #pragma comment(lib, "OpenAL32.lib")
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
131
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
132
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
133
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
134 template<int MAX_SAMPLES_BUFFERS>
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
135 class OpenALSoundProviderGeneric
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
136 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
137 public:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
138 inline OpenALSoundProviderGeneric()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
139 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
140 this->device = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
141 this->context = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
142 this->samples_current_buffer = 0;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
143
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
144 this->samples_source_id = -1;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
145 for (int i = 0; i < MAX_SAMPLES_BUFFERS; ++i)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
146 samples_buffer_id[i] = -1;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
147 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
148
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
149 inline bool Initialize()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
150 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
151 auto device_names = alcGetString(nullptr, ALC_ALL_DEVICES_SPECIFIER);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
152 if (!device_names)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
153 device_names = alcGetString(nullptr, ALC_DEVICE_SPECIFIER);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
154 if (device_names)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
155 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
156 for (auto device_name = device_names; device_name[0]; device_name += strlen(device_name))
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
157 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
158 continue;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
159 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
160 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
161
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
162 device = alcOpenDevice(nullptr);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
163 if (!device || CheckError())
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
164 return false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
165
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
166 context = alcCreateContext(device, nullptr);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
167 if (!context || CheckError())
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
168 return Release(), false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
169
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
170 alcMakeContextCurrent(context);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
171
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
172 bool eax2 = alIsExtensionPresent("EAX2.0");
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
173 bool eax3 = alIsExtensionPresent("EAX3.0");
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
174 bool eax4 = alIsExtensionPresent("EAX4.0");
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
175 bool eax5 = alIsExtensionPresent("EAX5.0");
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
176
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
177 auto vendor = alGetString(AL_VERSION);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
178 auto version = alGetString(AL_VERSION);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
179 auto extensions = alcGetString(device, ALC_EXTENSIONS);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
180
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
181 alGenBuffers(MAX_SAMPLES_BUFFERS, samples_buffer_id);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
182 if (CheckError())
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
183 return Release(), false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
184
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
185 alGenSources(1, &samples_source_id);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
186 if (CheckError())
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
187 return Release(), false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
188
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
189 float sound_pos[] = { 0.0f, 0.0f, 0.0f };
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
190 alSourcefv(samples_source_id, AL_POSITION, sound_pos);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
191 alSourcei(samples_source_id, AL_LOOPING, AL_FALSE);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
192
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
193 return true;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
194 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
195
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
196 void Release()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
197 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
198 if (samples_source_id != -1)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
199 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
200 alDeleteSources(1, &samples_source_id);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
201 samples_source_id = -1;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
202 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
203
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
204 for (int i = 0; i < MAX_SAMPLES_BUFFERS; ++i)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
205 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
206 if (samples_buffer_id[i] != -1)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
207 alDeleteBuffers(1, &samples_buffer_id[i]);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
208 samples_buffer_id[i] = -1;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
209 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
210
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
211 alcMakeContextCurrent(nullptr);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
212 if (context)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
213 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
214 alcDestroyContext(context);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
215 context = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
216 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
217 if (device)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
218 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
219 alcCloseDevice(device);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
220 device = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
221 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
222 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
223
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
224 void PlaySample(int num_channels, int sample_rate, int num_samples, void *samples)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
225 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
226 //char msg[256];sprintf(msg, "chan %u rate %5u num %5u ptr %p\n", num_channels, sample_rate, num_samples, samples);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
227 //log(msg);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
228 ALenum sound_format;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
229 switch (num_channels)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
230 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
231 case 1: sound_format = AL_FORMAT_MONO16; break;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
232 case 2: sound_format = AL_FORMAT_STEREO16; break;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
233 default:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
234 if (bool multichannel = alIsExtensionPresent("AL_EXT_MCFORMATS"))
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
235 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
236 switch (num_channels)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
237 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
238 case 4: sound_format = alGetEnumValue("AL_FORMAT_QUAD16"); break;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
239 case 6: sound_format = alGetEnumValue("AL_FORMAT_51CHN16"); break;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
240 case 7: sound_format = alGetEnumValue("AL_FORMAT_61CHN16"); break;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
241 case 8: sound_format = alGetEnumValue("AL_FORMAT_71CHN16"); break;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
242 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
243 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
244 __debugbreak();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
245 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
246
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
247 float listener_pos[] = { 0.0f, 0.0f, 0.0f };
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
248 float listener_vel[] = { 0.0f, 0.0f, 0.0f };
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
249 float listener_orientation[] = { 0.0f, 0.0f, -1.0f, // direction
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
250 0.0f, 1.0f, 0.0f }; // up vector
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
251 alListenerfv(AL_POSITION, listener_pos);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
252 alListenerfv(AL_VELOCITY, listener_vel);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
253 alListenerfv(AL_ORIENTATION, listener_orientation);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
254
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
255 unsigned int *next_buffer = samples_buffer_id + samples_current_buffer;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
256
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
257 alBufferData(*next_buffer, sound_format, samples, num_samples * sizeof(__int16), sample_rate);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
258 CheckError();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
259
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
260
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
261 int num_processed_buffers;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
262 alGetSourcei(samples_source_id, AL_BUFFERS_PROCESSED, &num_processed_buffers);
2208
0b2eea6f80c9 for video in homes
Ritor1
parents: 2142
diff changeset
263 /*while (num_processed_buffers)
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
264 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
265 unsigned int processed_buffers_id[4];
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
266 alSourceUnqueueBuffers(samples_source_id, min(4, num_processed_buffers), processed_buffers_id);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
267 CheckError();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
268 alGetSourcei(samples_source_id, AL_BUFFERS_PROCESSED, &num_processed_buffers);
2208
0b2eea6f80c9 for video in homes
Ritor1
parents: 2142
diff changeset
269 }*/
0b2eea6f80c9 for video in homes
Ritor1
parents: 2142
diff changeset
270 for (int i = 0; i < num_processed_buffers; ++i)
0b2eea6f80c9 for video in homes
Ritor1
parents: 2142
diff changeset
271 {
0b2eea6f80c9 for video in homes
Ritor1
parents: 2142
diff changeset
272 unsigned int processed_buffer_id;
0b2eea6f80c9 for video in homes
Ritor1
parents: 2142
diff changeset
273 alSourceUnqueueBuffers(samples_source_id, 1, &processed_buffer_id);
0b2eea6f80c9 for video in homes
Ritor1
parents: 2142
diff changeset
274 if (!CheckError())
0b2eea6f80c9 for video in homes
Ritor1
parents: 2142
diff changeset
275 alDeleteBuffers(1, &processed_buffer_id);
0b2eea6f80c9 for video in homes
Ritor1
parents: 2142
diff changeset
276 }
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
277
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
278 int num_queued_buffers;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
279 alGetSourcei(samples_source_id, AL_BUFFERS_QUEUED, &num_queued_buffers);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
280 if (num_queued_buffers >= MAX_SAMPLES_BUFFERS)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
281 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
282 __debugbreak();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
283 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
284
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
285 alSourceQueueBuffers(samples_source_id, 1, next_buffer);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
286 CheckError();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
287
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
288 int status;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
289 alGetSourcei(samples_source_id, AL_SOURCE_STATE, &status);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
290 if (status != AL_PLAYING)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
291 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
292 alSourcePlay(samples_source_id);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
293 CheckError();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
294 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
295
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
296 if (++samples_current_buffer >= MAX_SAMPLES_BUFFERS)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
297 samples_current_buffer = 0;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
298 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
299
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
300
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
301
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
302 protected:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
303 ALCdevice *device;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
304 ALCcontext *context;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
305 unsigned int samples_buffer_id[MAX_SAMPLES_BUFFERS];
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
306 unsigned int samples_source_id;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
307 int samples_current_buffer;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
308
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
309
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
310 bool CheckError()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
311 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
312 ALenum code = alcGetError(device);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
313 if (code != ALC_NO_ERROR)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
314 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
315 DWORD w;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
316 const char *message = alcGetString(device, code);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
317 WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), message, lstrlenA(message), &w, nullptr);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
318 return true;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
319 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
320 return false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
321 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
322 };
2137
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
323 typedef OpenALSoundProviderGeneric<64> OpenALSoundProvider;
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
324
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
325
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
326
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
327 void av_logger(void *, int, const char *format, va_list args);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
328
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
329
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
330
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
331 #include <memory>
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
332 using std::tr1::shared_ptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
333 using std::tr1::make_shared;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
334
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
335 class MultimediaFrame
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
336 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
337 public:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
338 typedef shared_ptr<MultimediaFrame> Ptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
339 inline MultimediaFrame(AVMediaType type, AVPacket *packet, AVCodecContext *dec_ctx)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
340 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
341 this->type = type;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
342 this->f = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
343 this->p = packet;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
344 this->dec_ctx = dec_ctx;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
345 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
346 virtual ~MultimediaFrame() { return; }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
347
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
348
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
349 AVMediaType Type() const { return type; }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
350 AVFrame *GetAVFrame() { return f; }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
351
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
352 virtual int Decode() = 0;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
353 virtual void *GetData() = 0;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
354 virtual int GetDataPitch() = 0;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
355
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
356
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
357 protected:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
358 AVMediaType type;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
359 AVFrame *f;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
360 AVPacket *p;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
361 AVCodecContext *dec_ctx;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
362 };
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
363
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
364
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
365
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
366 class MultimediaVideoFrame : public MultimediaFrame
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
367 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
368 public:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
369 inline MultimediaVideoFrame(AVMediaType type, AVPacket *packet, AVCodecContext *dec_ctx, int width, int height) :
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
370 MultimediaFrame(type, packet, dec_ctx)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
371 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
372 this->width = width;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
373 this->height = height;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
374 this->rescaled_data[0] = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
375 this->rescaled_linesize[0] = 0;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
376 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
377 virtual ~MultimediaVideoFrame()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
378 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
379 av_freep(&rescaled_data);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
380 av_frame_free(&f);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
381 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
382
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
383 int Decode() override
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
384 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
385 f = avcodec_alloc_frame();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
386 avcodec_get_frame_defaults(f);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
387
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
388 volatile int done = false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
389 do
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
390 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
391 int ret;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
392 //Ôóíêöèÿ avcodec_decode_video2 îñóùåñòâëÿåò äåêîäèðîâàíèå ïàêåòà â ôðåéì ñ èñïîëüçîâàíèåì êîäåêà,
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
393 //êîòîðûé ìû ïîëó÷èëè ðàíüøå (codec_context). Ôóíêöèÿ óñòàíàâëèâàåò ïîëîæèòåëüíîå çíà÷åíèå frame_finished â ñëó÷àå
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
394 //åñëè ôðåéì äåêîäèðîâàí öåëèêîì (òî åñòü îäèí ôðåéì ìîæåò çàíèìàòü íåñêîëüêî ïàêåòîâ è frame_finished áóäåò
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
395 //óñòàíîâëåí òîëüêî ïðè äåêîäèðîâàíèè ïîñëåäíåãî ïàêåòà).
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
396 if ((ret = avcodec_decode_video2(dec_ctx, f, (int *)&done, p)) < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
397 return ret;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
398 } while (!done);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
399 if (Rescale(f, width, height, AV_PIX_FMT_RGB32, rescaled_data, rescaled_linesize))
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
400 return 0;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
401 else return -1;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
402 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
403
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
404 virtual void *GetData() { return rescaled_data[0]; }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
405 virtual int GetDataPitch() { return rescaled_linesize[0]; }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
406
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
407 protected:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
408 int width;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
409 int height;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
410 uint8_t *rescaled_data[8];
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
411 int rescaled_linesize[8];
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
412
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
413 bool Rescale(AVFrame *frame, int dst_width, int dst_height, AVPixelFormat format, uint8_t **out_data, int *out_linesize)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
414 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
415 if (av_image_alloc(out_data, out_linesize, dst_width, dst_height, format, 1) < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
416 return false;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
417 // ñîçäàíèå êîíòåêñòà äëÿ ïðåîáðàçîâàíèÿ
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
418 SwsContext *converter = sws_getContext(frame->width, frame->height, (AVPixelFormat)frame->format,
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
419 dst_width, dst_height, format, SWS_BICUBIC, nullptr, nullptr, nullptr);
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
420 // ïðåîáðàçîâàíèå êàäðà
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
421 sws_scale(converter, frame->data, frame->linesize, 0, frame->height, out_data, out_linesize);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
422 sws_freeContext(converter);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
423
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
424 return true;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
425 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
426 };
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
427
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
428
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
429
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
430 class MultimediaAudioFrame : public MultimediaFrame
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
431 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
432 public:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
433 inline MultimediaAudioFrame(AVMediaType type, AVPacket *packet, AVCodecContext *dec_ctx) :
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
434 MultimediaFrame(type, packet, dec_ctx)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
435 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
436 this->resampled_data = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
437 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
438 virtual ~MultimediaAudioFrame()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
439 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
440 av_free(resampled_data);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
441 av_frame_free(&f);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
442 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
443
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
444 int Decode() override
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
445 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
446 f = avcodec_alloc_frame();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
447 avcodec_get_frame_defaults(f);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
448
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
449 volatile int done = false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
450 do
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
451 {
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
452 //Äåêîäèðîâàíèå àóäèî-ïàêåòà îñóùåñòâëÿåòñÿ ôóíêöèåé avcodec_decode_audio4
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
453 int ret;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
454 if ((ret = avcodec_decode_audio4(dec_ctx, f, (int *)&done, p)) < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
455 return ret;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
456 } while (!done);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
457 if (Resample(f, f->channel_layout, f->sample_rate,
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
458 f->channel_layout, f->sample_rate, AV_SAMPLE_FMT_S16, &resampled_data))
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
459 return 0;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
460 else return -1;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
461 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
462
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
463 virtual void *GetData() { return resampled_data; }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
464 virtual int GetDataPitch() { return 2 * f->nb_samples; }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
465
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
466 protected:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
467 uint8_t *resampled_data;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
468
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
469 bool Resample(AVFrame *frame,
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
470 int64_t src_channel_layout, int src_sample_rate,
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
471 int64_t dst_channel_layout, int dst_sample_rate, AVSampleFormat dst_format, uint8_t **out_data)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
472 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
473 SwrContext *converter = swr_alloc();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
474
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
475 av_opt_set_int(converter, "in_channel_layout", src_channel_layout, 0);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
476 av_opt_set_int(converter, "in_sample_rate", src_sample_rate, 0);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
477 av_opt_set_sample_fmt(converter, "in_sample_fmt", (AVSampleFormat)frame->format, 0);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
478
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
479 av_opt_set_int(converter, "out_channel_layout", dst_channel_layout, 0);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
480 av_opt_set_int(converter, "out_sample_rate", dst_sample_rate, 0);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
481 av_opt_set_sample_fmt(converter, "out_sample_fmt", dst_format, 0);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
482
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
483 if (swr_init(converter) < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
484 return false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
485
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
486 int dst_nb_samples;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
487 int max_dst_nb_samples = dst_nb_samples = av_rescale_rnd(frame->nb_samples, dst_sample_rate, src_channel_layout, AV_ROUND_UP);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
488
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
489 uint8_t **dst_data;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
490 int dst_linesize;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
491 int dst_nb_channels = av_get_channel_layout_nb_channels(dst_channel_layout);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
492 if (av_samples_alloc_array_and_samples(&dst_data, &dst_linesize, dst_nb_channels, dst_nb_samples, dst_format, 0) < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
493 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
494 swr_free(&converter);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
495 return false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
496 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
497
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
498 dst_nb_samples = av_rescale_rnd(swr_get_delay(converter, src_sample_rate) + frame->nb_samples, dst_sample_rate, src_sample_rate, AV_ROUND_UP);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
499 if (dst_nb_samples > max_dst_nb_samples)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
500 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
501 av_free(dst_data[0]);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
502 if (av_samples_alloc(dst_data, &dst_linesize, dst_nb_channels, dst_nb_samples, dst_format, 1) < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
503 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
504 swr_free(&converter);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
505 return false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
506 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
507 max_dst_nb_samples = dst_nb_samples;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
508 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
509
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
510
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
511 if (swr_convert(converter, dst_data, dst_nb_samples, (const uint8_t **)frame->data, frame->nb_samples) < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
512 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
513 av_free(dst_data[0]);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
514 swr_free(&converter);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
515 return false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
516 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
517
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
518 *out_data = dst_data[0];
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
519 return true;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
520 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
521 };
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
522
2137
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
523 int readFunction(void* opaque, uint8_t* buf, int buf_size);
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
524
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
525 int64_t seekFunction(void* opaque, int64_t offset, int whence);
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
526
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
527 template<int NUM_PRECACHED_FRAMES>
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
528 class MovieCached
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
529 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
530 public:
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
531 //bool Stopped() { return stopped; }
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
532 int GetWidth() { return width; }
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
533 int GetHeight() { return height; }
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
534 inline ~MovieCached()
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
535 {
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
536 Release();
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
537 }
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
538 protected:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
539 friend class MultimediaPlayer;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
540 inline MovieCached(OpenALSoundProvider *sound_provider)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
541 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
542 this->format_ctx = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
543 this->sound_provider = sound_provider;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
544 this->stopped = false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
545
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
546 this->video_stream_idx = -1;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
547 this->video_stream = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
548 this->video_stream_dec = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
549 this->video_stream_dec_ctx = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
550
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
551 this->audio_stream_idx = -1;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
552 this->audio_stream = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
553 this->audio_stream_dec = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
554 this->audio_stream_dec_ctx = nullptr;
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
555
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
556 packet = nullptr;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
557 ioBuffer = nullptr;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
558 format_ctx = nullptr;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
559 avioContext = nullptr;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
560 }
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
561
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
562 /*bool LoadFromLOD(HANDLE h, int readFunction(void*, uint8_t*, int), int64_t seekFunction(void*, int64_t, int), int width, int height)
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
563 {
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
564 if (!ioBuffer)
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
565 ioBuffer = (unsigned char *)av_malloc(16384 + FF_INPUT_BUFFER_PADDING_SIZE); // can get av_free()ed by libav
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
566 if (!avioContext)
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
567 avioContext = avio_alloc_context(ioBuffer, 16384, 0, h, &readFunction, NULL, &seekFunction);
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
568 if (!format_ctx)
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
569 format_ctx = avformat_alloc_context();
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
570 format_ctx->pb = avioContext;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
571 return Load("dummyFilename", width, height);
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
572 } */
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
573
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
574 /*bool Load(const char *video_filename, int width, int height)
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
575 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
576 this->width = width;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
577 this->height = height;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
578 // Open video file
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
579 //îòêðîåì âõîäíîé ôàéë(Øàã 2)
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
580 //Ôóíêöèÿ avformat_open_input ÷èòàåò ôàéëîâûé çàãîëîâîê è ñîõðàíÿåò èíôîðìàöèþ î íàéäåííûõ ôîðìàòàõ â ñòðóêòóðå
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
581 //AVFormatContext. Îñòàëüíûå àðãóìåíòû ìîãóò áûòü óñòàíîâëåíû â NULL, â ýòîì ñëó÷àå libavformat èñïîëüçóåò
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
582 //àâòîìàòè÷åñêîå îïðåäåëåíèå ïàðàìåòðîâ.
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
583 if (avformat_open_input(&format_ctx, video_filename, nullptr, nullptr) >= 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
584 {
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
585 // Retrieve stream information
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
586 //Ò.ê. avformat_open_input ÷èòàåò òîëüêî çàãîëîâîê ôàéëà, òî ñëåäóþùèì øàãîì íóæíî ïîëó÷èòü èíôîðìàöèþ î ïîòîêàõ
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
587 //â ôàéëå. Ýòî äåëàåòñÿ ôóíêöèåé avformat_find_stream_info.(Øàã 3)
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
588 if (avformat_find_stream_info(format_ctx, nullptr) >= 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
589 {
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
590 // Dump information about file onto standard error
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
591 //Ïîñëå ýòîãî format_context->streams ñîäåðæèò âñå ñóùåñòâóþùèå ïîòîêè ôàéëà.
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
592 //Èõ êîëè÷åñòâî ðàâíî format_context->nb_streams.
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
593 //Âûâåñòè ïîäðîáíóþ èíôîðìàöèþ î ôàéëå è îáî âñåõ ïîòîêàõ ìîæíî ôóíêöèåé av_dump_format.
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
594 av_dump_format(format_ctx, 0, video_filename, 0);
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
595
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
596 video_stream_idx = OpenStream(AVMEDIA_TYPE_VIDEO, &video_stream, &video_stream_dec, &video_stream_dec_ctx);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
597 if (video_stream_idx < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
598 return Release(), false;
2221
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
599 if (_stricmp("binkvideo", video_stream_dec->name) )//Ritor1: include
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
600 {
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
601 this->width = video_stream_dec_ctx->width;
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
602 this->height = video_stream_dec_ctx->height;
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
603 }
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
604
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
605 audio_stream_idx = OpenStream(AVMEDIA_TYPE_AUDIO, &audio_stream, &audio_stream_dec, &audio_stream_dec_ctx);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
606 if (audio_stream_idx < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
607 return Release(), false;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
608
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
609 strcpy(movie_name, video_filename);
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
610 //Äàííûå èç ôàéëà ÷èòàþòñÿ ïàêåòàìè (AVPacket)
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
611 packet = new AVPacket;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
612 av_init_packet(packet);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
613 return true;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
614 }
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
615 fprintf(stderr, "ffmpeg: Unable to find stream info\n");
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
616 return Release(), false;
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
617 }
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
618 fprintf(stderr, "ffmpeg: Unable to open input file\n");
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
619 return Release(), false;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
620 } */
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
621
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
622 bool Release()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
623 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
624 if (packet)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
625 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
626 av_free_packet(packet);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
627 delete packet;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
628 packet = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
629 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
630
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
631 if (video_stream_idx >= 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
632 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
633 video_stream_idx = -1;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
634 video_stream = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
635 video_stream_dec = nullptr;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
636
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
637 // çàêðûòèå âèäåî êîäåêà
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
638 avcodec_close(video_stream_dec_ctx);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
639 video_stream_dec_ctx = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
640 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
641
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
642 if (audio_stream_idx >= 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
643 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
644 audio_stream_idx = -1;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
645 audio_stream = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
646 audio_stream_dec = nullptr;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
647
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
648 // çàêðûòèå àóäèî êîäåêà
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
649 avcodec_close(audio_stream_dec_ctx);
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
650
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
651 }
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
652 if (avioContext)
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
653 {
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
654 av_free(avioContext);
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
655 avioContext = nullptr;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
656 }
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
657 if (format_ctx)
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
658 {
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
659 avformat_free_context(format_ctx);
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
660 format_ctx = nullptr;
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
661 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
662 return true;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
663 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
664
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
665
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
666 /*int OpenStream(AVMediaType type, AVStream **out_stream, AVCodec **out_dec, AVCodecContext **out_dec_ctx)
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
667 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
668 int stream_idx = av_find_best_stream(format_ctx, type, -1, -1, nullptr, 0);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
669 if (stream_idx < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
670 return stream_idx;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
671
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
672 auto stream = format_ctx->streams[stream_idx];
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
673 //Èíôîðìàöèÿ î êîäåêå â ïîòîêå íàçûâàåòñÿ «êîíòåêñòîì êîäåêà» (AVCodecContext).
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
674 //Èñïîëüçóÿ ýòó èíôîðìàöèþ, ìû ìîæåì íàéòè íåîáõîäèìûé êîäåê (AVCodec) è îòêðûòü åãî.
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
675 auto dec_ctx = stream->codec;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
676 auto dec = avcodec_find_decoder(dec_ctx->codec_id);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
677 if (dec)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
678 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
679 if (avcodec_open2(dec_ctx, dec, nullptr) >= 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
680 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
681 *out_stream = stream;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
682 *out_dec = dec;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
683 *out_dec_ctx = dec_ctx;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
684 return stream_idx;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
685 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
686 }
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
687 fprintf(stderr, "ffmpeg: Unable to open codec\n");
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
688 return -1;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
689 } */
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
690
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
691 MultimediaFrame::Ptr GetNextFrame()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
692 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
693 packet->data = nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
694 packet->size = 0;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
695
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
696 volatile int got_frame = false;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
697 //÷òåíèå ïàêåòîâ
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
698 do
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
699 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
700 if (av_read_frame(format_ctx, packet) < 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
701 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
702 stopped = true;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
703 return nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
704 }
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
705 } while (packet->stream_index != video_stream_idx && //ïîêà ïàêåò íå ïðåíàäëåæèò ê âèäåîïîòîêó
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
706 packet->stream_index != audio_stream_idx); //è íå ïðèíàäëåæèò àóäèîïîòîêó
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
707
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
708 if (packet->stream_index == video_stream_idx)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
709 return MultimediaFrame::Ptr(new MultimediaVideoFrame(AVMEDIA_TYPE_VIDEO, packet, video_stream_dec_ctx, width, height));
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
710 else if (packet->stream_index == audio_stream_idx)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
711 return MultimediaFrame::Ptr(new MultimediaAudioFrame(AVMEDIA_TYPE_AUDIO, packet, audio_stream_dec_ctx));
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
712 return nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
713 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
714
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
715
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
716
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
717 char movie_name[256];
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
718 int width;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
719 int height;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
720 //bool stopped;
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
721 AVFormatContext *format_ctx;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
722 //AVFrame *frame;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
723 AVPacket *packet;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
724 //MultimediaFrame *frames[NUM_PRECACHED_FRAMES];
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
725 OpenALSoundProvider *sound_provider;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
726
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
727 int video_stream_idx;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
728 AVStream *video_stream;//ñîäåðæàò èíôîðìàöèþ î âèäåî ïîòîêå
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
729 AVCodec *video_stream_dec;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
730 AVCodecContext *video_stream_dec_ctx;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
731
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
732 int audio_stream_idx;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
733 AVStream *audio_stream;//ñîäåðæàò èíôîðìàöèþ î àóäèî ïîòîêå
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
734 AVCodec *audio_stream_dec;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
735 AVCodecContext *audio_stream_dec_ctx;
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
736 unsigned char * ioBuffer;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
737 AVIOContext *avioContext;
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
738 };
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
739 //typedef MovieCached<10> Movie;
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
740
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
741
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
742
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
743
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
744 /*class MultimediaPlayer
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
745 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
746 public:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
747 inline MultimediaPlayer()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
748 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
749 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
750
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
751 bool Initialize()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
752 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
753 if (!libavcodec_initialized)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
754 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
755 av_log_set_callback(Logger);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
756 avcodec_register_all();
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
757
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
758 // Register all available file formats and codecs
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
759 //èíèöèàëèçèðóåì áèáëèîòåêó ffmpeg(Øàã 1)
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
760 //Âî âðåìÿ èíèöèàëèçàöèè ðåãèñòðèðóþòñÿ âñå èìåþùèåñÿ â áèáëèîòåêå ôîðìàòû ôàéëîâ è êîäåêîâ.
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
761 //Ïîñëå ýòîãî îíè áóäóò èñïîëüçîâàòüñÿ àâòîìàòè÷åñêè ïðè îòêðûòèè ôàéëîâ ýòîãî ôîðìàòà è ñ ýòèìè êîäåêàìè.
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
762 av_register_all();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
763
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
764 libavcodec_initialized = true;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
765 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
766
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
767 sound_provider = new OpenALSoundProvider;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
768 sound_provider->Initialize();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
769
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
770 return true;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
771 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
772
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
773 /*Movie *LoadMovieFromLOD(HANDLE h, int readFunction(void*, uint8_t*, int), int64_t seekFunction(void*, int64_t, int), int width, int height)
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
774 {
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
775 auto movie = new Movie(sound_provider);
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
776 if (movie)
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
777 {
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
778 if (movie->LoadFromLOD(h, readFunction, seekFunction, width, height))
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
779 {
2221
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
780 if (_stricmp("binkvideo", movie->video_stream_dec->name) )
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
781 {
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
782 current_movie_width = movie->video_stream_dec_ctx->width;
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
783 current_movie_height = movie->video_stream_dec_ctx->height;
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
784 }
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
785 else
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
786 {
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
787 current_movie_width = width;
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
788 current_movie_height = height;
c69013c186c7 for video
Ritor1
parents: 2208
diff changeset
789 }
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
790 return current_movie = movie;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
791 }
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
792 delete movie;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
793 }
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
794 return nullptr;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
795 } */
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
796
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
797 /*Movie *LoadMovie(const char *filename, int width, int height)
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
798 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
799 auto movie = new Movie(sound_provider);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
800 if (movie)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
801 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
802 if (movie->Load(filename, width, height))
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
803 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
804 current_movie_width = width;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
805 current_movie_height = height;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
806 return current_movie = movie;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
807 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
808 delete movie;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
809 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
810 return nullptr;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
811 }
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
812
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
813 inline char *DoFrame()
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
814 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
815 if (!current_movie)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
816 return nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
817
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
818 while (true)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
819 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
820 auto frame = current_movie->GetNextFrame();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
821 if (!frame)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
822 return nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
823
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
824 if (frame->Type() == AVMEDIA_TYPE_AUDIO)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
825 {
2137
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
826 //continue;
2334
ddb803517a48 unused local variables I commented
Ritor1
parents: 2316
diff changeset
827 // uint8_t *data;
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
828 if (frame->Decode() >= 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
829 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
830 auto f = frame->GetAVFrame();
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
831 sound_provider->PlaySample(f->channels, f->sample_rate, f->nb_samples, frame->GetData());
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
832 Sleep(20);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
833 continue;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
834 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
835 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
836 else if (frame->Type() == AVMEDIA_TYPE_VIDEO)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
837 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
838 uint8_t *dst_data[4] = { 0 };
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
839 int dst_linesize[4] = { 0 };
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
840 if (frame->Decode() >= 0)
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
841 {
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
842 auto image = new char[current_movie_width * current_movie_height * 4];
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
843 memcpy(image, frame->GetData(), current_movie_height * frame->GetDataPitch());
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
844
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
845 return image;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
846 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
847 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
848 return nullptr;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
849 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
850 }
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
851
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
852
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
853
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
854 protected:
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
855 static void Logger(void *, int, const char *format, va_list args);
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
856
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
857 OpenALSoundProvider *sound_provider;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
858 //Movie *current_movie;
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
859 int current_movie_width;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
860 int current_movie_height;
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
861
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
862 static bool libavcodec_initialized;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
863 };*/
2134
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
864
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
865
992d2e6f907d preparation for libavcodec
zipi
parents: 1802
diff changeset
866
0
Ritor1
parents:
diff changeset
867
Ritor1
parents:
diff changeset
868
Ritor1
parents:
diff changeset
869
Ritor1
parents:
diff changeset
870 #pragma pack(push, 1)
Ritor1
parents:
diff changeset
871 struct VideoPlayer
Ritor1
parents:
diff changeset
872 {
1262
0aeac0b9ca30 included header cleanup
Grumpy7
parents: 1253
diff changeset
873 VideoPlayer();
0
Ritor1
parents:
diff changeset
874 //----- (004BECBD) --------------------------------------------------------
Ritor1
parents:
diff changeset
875 virtual ~VideoPlayer()
Ritor1
parents:
diff changeset
876 {
Ritor1
parents:
diff changeset
877 bStopBeforeSchedule = false;
165
Ritor1
parents: 0
diff changeset
878 pResetflag = 0;
0
Ritor1
parents:
diff changeset
879 pVideoFrame.Release();
Ritor1
parents:
diff changeset
880 }
Ritor1
parents:
diff changeset
881
Ritor1
parents:
diff changeset
882 void PlayDeathMovie();
Ritor1
parents:
diff changeset
883 unsigned int SmackCheckSurfaceFromat();
1802
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
884 void Initialize(OSWindow *window);
0
Ritor1
parents:
diff changeset
885 void Prepare();
Ritor1
parents:
diff changeset
886 void Unload();
Ritor1
parents:
diff changeset
887 void FastForwardToFrame(unsigned int uFrameNum);
1802
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
888 void BinkDrawFrame(int a3, int a4);
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
889 void BinkUpdatePalette() {}
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
890 void SmackDrawFrame(int a3, int a4);
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
891 void SmackUpdatePalette();
0
Ritor1
parents:
diff changeset
892 _BINK *OpenBink(const char *pName);
Ritor1
parents:
diff changeset
893 struct _SMACK *OpenSmack(const char *pFilename);
898
10fa7dad1391 DrawPaperdoll clean
Ritor1
parents: 323
diff changeset
894 void OpenHouseMovie(const char *pMovieName, unsigned int a3_1);//0x4BF28F
0
Ritor1
parents:
diff changeset
895 bool AnyMovieLoaded();
898
10fa7dad1391 DrawPaperdoll clean
Ritor1
parents: 323
diff changeset
896 void OpenGlobalMovie(const char *pFilename, unsigned int bLoop, int a4);
0
Ritor1
parents:
diff changeset
897 void _4BF5B2();
898
10fa7dad1391 DrawPaperdoll clean
Ritor1
parents: 323
diff changeset
898 void SelectMovieType();//0x4BF73A
1802
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
899 _BINKBUF *CreateBinkBuffer(unsigned int uWidth, unsigned int uHeight, char a4);
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
900 void _inlined_in_463149();
0
Ritor1
parents:
diff changeset
901
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
902 void MovieLoop(const char *pMovieName, int a2, int a3, int a4);
0
Ritor1
parents:
diff changeset
903
Ritor1
parents:
diff changeset
904
Ritor1
parents:
diff changeset
905 RGBTexture pVideoFrame;
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
906 //struct _SMACK *pSmackerMovie;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
907 //struct _SMACKBUF *pSmackerBuffer;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
908 //char *pSomeSmackerBuffer;
0
Ritor1
parents:
diff changeset
909 int field_34;
Ritor1
parents:
diff changeset
910 MovieHeader *pMightVideoHeaders;
Ritor1
parents:
diff changeset
911 MovieHeader *pMagicVideoHeaders;
165
Ritor1
parents: 0
diff changeset
912 int pResetflag;
0
Ritor1
parents:
diff changeset
913 int field_44;
Ritor1
parents:
diff changeset
914 unsigned int uNumMightVideoHeaders;
Ritor1
parents:
diff changeset
915 unsigned int uNumMagicVideoHeaders;
Ritor1
parents:
diff changeset
916 int uBinkDirectDrawSurfaceType;
2137
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
917 int bBufferLoaded;
0
Ritor1
parents:
diff changeset
918 unsigned int bPlayingMovie;
Ritor1
parents:
diff changeset
919 unsigned int bFirstFrame;
Ritor1
parents:
diff changeset
920 unsigned int bUsingSmackerMMX;
Ritor1
parents:
diff changeset
921 unsigned int bLoopPlaying;
Ritor1
parents:
diff changeset
922 int field_68;
Ritor1
parents:
diff changeset
923 unsigned int bStopBeforeSchedule;
1802
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
924 //HWND hWindow;
633f81bb3ae7 HWND -> class OSWindow
Nomad
parents: 1458
diff changeset
925 OSWindow *window;
0
Ritor1
parents:
diff changeset
926 struct _SMACKBLIT *pSmackMovieBlit;
Ritor1
parents:
diff changeset
927 HANDLE hMightVid;
Ritor1
parents:
diff changeset
928 HANDLE hMagicVid;
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
929 //_BINK *pBinkMovie;
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
930 //_BINKBUF *pBinkBuffer;
0
Ritor1
parents:
diff changeset
931 char field_88[20];
Ritor1
parents:
diff changeset
932 unsigned int uMovieFormat;
2137
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
933 int uMovieFormatSwapped;
0
Ritor1
parents:
diff changeset
934 char pCurrentMovieName[64];
Ritor1
parents:
diff changeset
935 char pVideoFrameTextureFilename[32];
323
d720a13e2273 Very basic picking & entering houses
Nomad
parents: 165
diff changeset
936 int field_104;
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
937 Media::Player *pPlayer;
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
938 Media::IMovie *pMovie;
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
939 HANDLE hVidFile;
2137
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
940 int uSize;
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
941 int uOffset;
2142
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
942 void UpdatePalette();
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
943 static int readFunction(void *, uint8_t *, int);
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
944 static int64_t seekFunction(void *, int64_t, int);
ca548138d6aa some code cleaning in video playing, loops play but there is a memory leak
zipi
parents: 2137
diff changeset
945 void LoadMovie(const char *);
2345
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
946 void PlayAudio(const wchar_t * pFilename);
182effc4b0ee for MultimediaPlayer
Ritor1
parents: 2334
diff changeset
947 void PlayMovie(const wchar_t * pFilename);
0
Ritor1
parents:
diff changeset
948 };
Ritor1
parents:
diff changeset
949 #pragma pack(pop)
Ritor1
parents:
diff changeset
950
Ritor1
parents:
diff changeset
951
Ritor1
parents:
diff changeset
952
Ritor1
parents:
diff changeset
953
Ritor1
parents:
diff changeset
954
Ritor1
parents:
diff changeset
955 extern VideoPlayer *pVideoPlayer;
2137
d24ee391fd1f libavcodec playing movies and houses, loops not working yet
zipi
parents: 2134
diff changeset
956 extern LRESULT __stdcall wWinProc(HWND hwnd, unsigned int msg, WPARAM wparam, LPARAM lparam);