11
11
12
12
import org .webrtc .EglBase ;
13
13
import org .webrtc .GlRectDrawer ;
14
- import org .webrtc .ThreadUtils ;
15
14
import org .webrtc .VideoFrame ;
16
15
import org .webrtc .VideoFrameDrawer ;
17
16
import org .webrtc .VideoSink ;
18
17
import org .webrtc .audio .JavaAudioDeviceModule ;
19
18
import org .webrtc .audio .JavaAudioDeviceModule .SamplesReadyCallback ;
20
19
21
- import java .io .FileOutputStream ;
22
20
import java .io .IOException ;
23
21
import java .nio .ByteBuffer ;
24
- import java .util .concurrent .CountDownLatch ;
25
22
26
23
class VideoFileRenderer implements VideoSink , SamplesReadyCallback {
27
24
private static final String TAG = "VideoFileRenderer" ;
28
25
private final HandlerThread renderThread ;
29
26
private final Handler renderThreadHandler ;
30
27
private final HandlerThread audioThread ;
31
28
private final Handler audioThreadHandler ;
32
- private final FileOutputStream videoOutFile ;
33
- private final String outputFileName ;
34
29
private int outputFileWidth = -1 ;
35
30
private int outputFileHeight = -1 ;
36
31
private ByteBuffer [] encoderOutputBuffers ;
@@ -56,8 +51,6 @@ class VideoFileRenderer implements VideoSink, SamplesReadyCallback {
56
51
private MediaCodec audioEncoder ;
57
52
58
53
VideoFileRenderer (String outputFile , final EglBase .Context sharedContext , boolean withAudio ) throws IOException {
59
- this .outputFileName = outputFile ;
60
- videoOutFile = new FileOutputStream (outputFile );
61
54
renderThread = new HandlerThread (TAG + "RenderThread" );
62
55
renderThread .start ();
63
56
renderThreadHandler = new Handler (renderThread .getLooper ());
@@ -134,28 +127,21 @@ private void renderFrameOnRenderThread(VideoFrame frame) {
134
127
* Release all resources. All already posted frames will be rendered first.
135
128
*/
136
129
void release () {
137
- final CountDownLatch cleanupBarrier = new CountDownLatch (2 );
138
130
isRunning = false ;
131
+ if (audioThreadHandler != null )
132
+ audioThreadHandler .post (() -> {
133
+ audioEncoder .stop ();
134
+ audioEncoder .release ();
135
+ audioThread .quit ();
136
+ });
139
137
renderThreadHandler .post (() -> {
140
138
encoder .stop ();
141
139
encoder .release ();
142
140
eglBase .release ();
141
+ mediaMuxer .stop ();
142
+ mediaMuxer .release ();
143
143
renderThread .quit ();
144
- cleanupBarrier .countDown ();
145
144
});
146
- if (audioThreadHandler != null ) {
147
- audioThreadHandler .post (() -> {
148
- audioEncoder .stop ();
149
- audioEncoder .release ();
150
- audioThread .quit ();
151
- cleanupBarrier .countDown ();
152
- });
153
- } else {
154
- cleanupBarrier .countDown ();
155
- }
156
- ThreadUtils .awaitUninterruptibly (cleanupBarrier );
157
- mediaMuxer .stop ();
158
- mediaMuxer .release ();
159
145
}
160
146
161
147
private boolean encoderStarted = false ;
@@ -208,8 +194,6 @@ private void drainEncoder() {
208
194
if (muxerStarted )
209
195
mediaMuxer .writeSampleData (trackIndex , encodedData , bufferInfo );
210
196
isRunning = isRunning && (bufferInfo .flags & MediaCodec .BUFFER_FLAG_END_OF_STREAM ) == 0 ;
211
- Log .d (TAG , "passed " + bufferInfo .size + " bytes to file"
212
- + (!isRunning ? " (EOS)" : "" ));
213
197
encoder .releaseOutputBuffer (encoderStatus , false );
214
198
if ((bufferInfo .flags & MediaCodec .BUFFER_FLAG_END_OF_STREAM ) != 0 ) {
215
199
break ;
@@ -262,8 +246,6 @@ private void drainAudio() {
262
246
if (muxerStarted )
263
247
mediaMuxer .writeSampleData (audioTrackIndex , encodedData , audioBufferInfo );
264
248
isRunning = isRunning && (audioBufferInfo .flags & MediaCodec .BUFFER_FLAG_END_OF_STREAM ) == 0 ;
265
- Log .d (TAG , "passed " + audioBufferInfo .size + " bytes to file"
266
- + (!isRunning ? " (EOS)" : "" ));
267
249
audioEncoder .releaseOutputBuffer (encoderStatus , false );
268
250
if ((audioBufferInfo .flags & MediaCodec .BUFFER_FLAG_END_OF_STREAM ) != 0 ) {
269
251
break ;
0 commit comments