Skip to content

Commit f61df49

Browse files
committed
jfProjector : convert Media*Coder -> MediaInput/Output
1 parent 4d625af commit f61df49

2 files changed

Lines changed: 67 additions & 48 deletions

File tree

projects/jfprojector/src/client/MainPanel.java

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import javaforce.*;
1717
import javaforce.awt.*;
1818
import javaforce.media.*;
19+
import javaforce.voip.*;
1920

2021
import common.Config;
2122

@@ -348,21 +349,31 @@ public void run() {
348349

349350
JFImage img = JFImage.createScreenCapture();
350351

351-
MediaEncoder encoder = new MediaEncoder();
352-
encoder.setAudioBitRate(getAudioBitRate());
353-
encoder.setVideoBitRate(getVideoBitRate());
352+
CodecInfo info = new CodecInfo();
353+
info.video_bit_rate = getVideoBitRate();
354354
int width = img.getWidth();
355355
int height = img.getHeight();
356+
info.width = width;
357+
info.height = height;
358+
info.fps = frameRate;
359+
360+
info.audio_bit_rate = getAudioBitRate();
361+
info.chs = chs;
362+
info.freq = audioRate;
363+
info.bits = 16;
364+
365+
Packet packet;
366+
MediaOutput encoder = new MediaOutput();
367+
encoder.create(MainPanel.this, "mpg");
368+
MediaAudioEncoder audio = null;
369+
MediaVideoEncoder video = encoder.createVideoEncoder(info);
370+
356371
JFLog.log("size=" + width + "," + height);
357372
JFLog.log("frameRate=" + frameRate);
358373
JFLog.log("audioRate=" + audioRate + ",chs=" + chs);
359-
if (!encoder.start(MainPanel.this, width, height, frameRate, chs
360-
, audioRate, "h264", true, doAudio))
361-
{
362-
failed("Unable to create output file");
363-
return;
364-
}
374+
365375
if (doAudio) {
376+
audio = encoder.createAudioEncoder(info);
366377
mic = new AudioInput();
367378
if (!mic.start(chs, audioRate, 16, samples * 2, (String)audioDevices.getSelectedItem())) {
368379
failed("Unable to start recording audio");
@@ -402,11 +413,13 @@ public void run() {
402413
skip_frame = false;
403414
}
404415
int px[] = img.getPixels();
405-
encoder.addVideo(px);
416+
packet = video.encode(px, 0, px.length);
417+
encoder.writePacket(packet);
406418
if (doAudio) {
407419
while (mic.read(sams8)) {
408420
swapEndian(sams8, sams16);
409-
encoder.addAudio(sams16);
421+
packet = audio.encode(sams16, 0, sams16.length);
422+
encoder.writePacket(packet);
410423
}
411424
}
412425
double now = System.currentTimeMillis();
@@ -420,7 +433,7 @@ public void run() {
420433
}
421434
delTray();
422435
if (frame != null) frame.setVisible(true);
423-
encoder.stop();
436+
encoder.close();
424437
if (doAudio) mic.stop();
425438
try {
426439
socket.close();

projects/jfprojector/src/server/Session.java

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import javaforce.*;
1313
import javaforce.awt.*;
1414
import javaforce.media.*;
15+
import javaforce.voip.*;
1516

1617
public class Session {
1718

@@ -27,7 +28,9 @@ public void run() {
2728
}
2829

2930
private Socket socket;
30-
private MediaDecoder decoder; //ffmpeg decoder
31+
private MediaInput decoder;
32+
private MediaAudioDecoder audio;
33+
private MediaVideoDecoder video;
3134
private long frameCount;
3235
private long audioCount;
3336
private final Object countLock = new Object();
@@ -79,20 +82,23 @@ public void run() {
7982
resizeVideo = false;
8083
eof = false;
8184

85+
width = window.getWidth();
86+
height = window.getHeight();
87+
8288
try {
8389
is = socket.getInputStream();
84-
decoder = new MediaDecoder();
90+
decoder = new MediaInput();
8591
if (decoder == null) throw new Exception("Unable to allocate decoder");
86-
if (!decoder.start(this, -1, -1, chs, 44100, false)) throw new Exception("Unable to start decoder");
92+
if (!decoder.open(this)) throw new Exception("Unable to start decoder");
93+
audio = decoder.createAudioDecoder();
94+
video = decoder.createVideoDecoder(width, height);
95+
CodecInfo info = decoder.getCodecInfo();
8796

88-
long mediaLength = decoder.getDuration();
97+
long mediaLength = info.duration;
8998
JFLog.log("Duration=" + mediaLength);
90-
fps = decoder.getFrameRate();
99+
fps = info.fps;
91100
JFLog.log("FPS=" + fps);
92-
width = window.getWidth();
93-
height = window.getHeight();
94101
JFLog.log("size=" + width + "x" + height);
95-
decoder.resize(width, height);
96102
video_buffer = new VideoBuffer(width, height, buffer_seconds * (int)fps);
97103
playThread = new PlayAudioVideoThread();
98104
playThread.start();
@@ -106,38 +112,38 @@ public void run() {
106112
synchronized(sizeLock) {
107113
width = new_width;
108114
height = new_height;
109-
decoder.resize(width, height);
115+
video = decoder.createVideoDecoder(width, height);
110116
resizeVideo = false;
111117
}
112118
}
113-
switch (decoder.read()) {
114-
case MediaCoder.AUDIO_FRAME: //audio packet read
115-
short audio[] = decoder.getAudio();
116-
audio_buffer.add(audio, 0, audio.length);
117-
synchronized(lock) {
118-
lock.notify();
119-
}
120-
break;
121-
case MediaCoder.VIDEO_FRAME: //video packet read
122-
int video[] = decoder.getVideo();
123-
JFImage img = video_buffer.getNewFrame();
124-
if (img != null) {
125-
if ((img.getWidth() != width) || (img.getHeight() != height)) {
126-
img.setSize(width, height);
127-
}
128-
img.putPixels(video, 0, 0, width, height, 0);
129-
video_buffer.freeNewFrame();
130-
} else {
131-
JFLog.log("Warning : VideoBuffer overflow");
132-
}
133-
synchronized(lock) {
134-
lock.notify();
119+
Packet packet = decoder.readPacket();
120+
if (packet == null) {
121+
eof = true;
122+
playing = false;
123+
break;
124+
}
125+
if (packet.stream == info.audio_stream) {
126+
short sams[] = audio.decode(packet);
127+
audio_buffer.add(sams, 0, sams.length);
128+
synchronized(lock) {
129+
lock.notify();
130+
}
131+
}
132+
else if (packet.stream == info.video_stream) {
133+
int px[] = video.decode(packet);
134+
JFImage img = video_buffer.getNewFrame();
135+
if (img != null) {
136+
if ((img.getWidth() != width) || (img.getHeight() != height)) {
137+
img.setSize(width, height);
135138
}
136-
break;
137-
case MediaCoder.END_FRAME:
138-
eof = true;
139-
playing = false;
140-
break;
139+
img.putPixels(px, 0, 0, width, height, 0);
140+
video_buffer.freeNewFrame();
141+
} else {
142+
JFLog.log("Warning : VideoBuffer overflow");
143+
}
144+
synchronized(lock) {
145+
lock.notify();
146+
}
141147
}
142148
}
143149
} catch (Exception e) {

0 commit comments

Comments
 (0)