Fix mdat size bug

Use volitale for counting.

Signed-off-by: Leo Ma <begeekmyfriend@gmail.com>
camera2
Leo Ma 9 years ago
parent 1d0580e1c8
commit db8610e945

@ -101,34 +101,10 @@ public class MainActivity extends Activity implements SurfaceHolder.Callback, Ca
}, new SrsMp4Muxer.EventHandler() { }, new SrsMp4Muxer.EventHandler() {
@Override @Override
public void onVideoTrackBuilt(String msg) { public void onVideoTrackBuilt(String msg) {
mNotifyMsg = msg;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), mNotifyMsg, Toast.LENGTH_SHORT).show();
}
});
} }
@Override @Override
public void onAudioTrackBuilt(String msg) { public void onAudioTrackBuilt(String msg) {
mNotifyMsg = msg;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), mNotifyMsg, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onVideoRecording(String msg) {
}
@Override
public void onAudioRecording(String msg) {
} }
@Override @Override

@ -81,6 +81,7 @@ public class SrsMp4Muxer {
private ArrayList<byte[]> ppsList = new ArrayList<>(); private ArrayList<byte[]> ppsList = new ArrayList<>();
private Thread worker; private Thread worker;
private volatile boolean bRecording = false;
private final Object writeLock = new Object(); private final Object writeLock = new Object();
private ConcurrentLinkedQueue<SrsEsFrame> frameCache = new ConcurrentLinkedQueue<>(); private ConcurrentLinkedQueue<SrsEsFrame> frameCache = new ConcurrentLinkedQueue<>();
@ -114,10 +115,6 @@ public class SrsMp4Muxer {
void onAudioTrackBuilt(String msg); void onAudioTrackBuilt(String msg);
void onVideoRecording(String msg);
void onAudioRecording(String msg);
void onRecordStarted(String msg); void onRecordStarted(String msg);
void onRecordFinished(String msg); void onRecordFinished(String msg);
@ -134,18 +131,16 @@ public class SrsMp4Muxer {
worker = new Thread(new Runnable() { worker = new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
bRecording = true;
while (!Thread.interrupted()) { while (bRecording) {
// Keep at least one audio and video frame in cache to ensure monotonically increasing. // Keep at least one audio and video frame in cache to ensure monotonically increasing.
while (!frameCache.isEmpty()) { while (!frameCache.isEmpty()) {
SrsEsFrame frame = frameCache.poll(); SrsEsFrame frame = frameCache.poll();
try { try {
if (frame.is_video()) { if (frame.is_video()) {
writeSampleData(VIDEO_TRACK, frame.bb, frame.bi, false); writeSampleData(VIDEO_TRACK, frame.bb, frame.bi, false);
mHandler.onVideoRecording("Video");
} else if (frame.is_audio()) { } else if (frame.is_audio()) {
writeSampleData(AUDIO_TRACK, frame.bb, frame.bi, true); writeSampleData(AUDIO_TRACK, frame.bb, frame.bi, true);
mHandler.onAudioRecording("Audio");
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
@ -172,7 +167,7 @@ public class SrsMp4Muxer {
public void stop() { public void stop() {
if (worker != null) { if (worker != null) {
worker.interrupt(); bRecording = false;
try { try {
worker.join(); worker.join();
} catch (InterruptedException e) { } catch (InterruptedException e) {
@ -313,11 +308,13 @@ public class SrsMp4Muxer {
frame.bi = bi; frame.bi = bi;
frame.track = track; frame.track = track;
if (bRecording) {
frameCache.add(frame); frameCache.add(frame);
synchronized (writeLock) { synchronized (writeLock) {
writeLock.notifyAll(); writeLock.notifyAll();
} }
} }
}
/** /**
* the search result for annexb. * the search result for annexb.
@ -671,7 +668,7 @@ public class SrsMp4Muxer {
private InterleaveChunkMdat mdat = null; private InterleaveChunkMdat mdat = null;
private FileOutputStream fos = null; private FileOutputStream fos = null;
private FileChannel fc = null; private FileChannel fc = null;
private long dataOffset = 0; private volatile long dataOffset = 0;
private HashMap<Track, long[]> track2SampleSizes = new HashMap<>(); private HashMap<Track, long[]> track2SampleSizes = new HashMap<>();
private void createMovie(File outputFile) throws IOException { private void createMovie(File outputFile) throws IOException {
@ -686,10 +683,11 @@ public class SrsMp4Muxer {
private void flushCurrentMdat() throws IOException { private void flushCurrentMdat() throws IOException {
long oldPosition = fc.position(); long oldPosition = fc.position();
fc.position(mdat.getOffset()); fc.position(mdat.getStartOffset());
mdat.setContentSize(dataOffset - mdat.getHeaderSize() - mdat.getStartOffset());
mdat.getBox(fc); mdat.getBox(fc);
fc.position(oldPosition); fc.position(oldPosition);
mdat.setDataOffset(0); mdat.setStartOffset(0);
mdat.setContentSize(0); mdat.setContentSize(0);
fos.flush(); fos.flush();
} }
@ -698,12 +696,11 @@ public class SrsMp4Muxer {
if (mdat.first) { if (mdat.first) {
mdat.setContentSize(0); mdat.setContentSize(0);
mdat.getBox(fc); mdat.getBox(fc);
mdat.setDataOffset(dataOffset); mdat.setStartOffset(dataOffset);
dataOffset += 16; dataOffset += mdat.getHeaderSize();
mdat.first = false; mdat.first = false;
} }
mdat.setContentSize(mdat.getContentSize() + bufferInfo.size);
mp4Movie.addSample(trackIndex, dataOffset, bufferInfo); mp4Movie.addSample(trackIndex, dataOffset, bufferInfo);
byteBuf.position(bufferInfo.offset + (isAudio ? 0 : 4)); byteBuf.position(bufferInfo.offset + (isAudio ? 0 : 4));
byteBuf.limit(bufferInfo.offset + bufferInfo.size); byteBuf.limit(bufferInfo.offset + bufferInfo.size);
@ -721,7 +718,7 @@ public class SrsMp4Muxer {
} }
private void finishMovie() throws IOException { private void finishMovie() throws IOException {
if (mdat.getContentSize() != 0) { if (mdat.getSize() != 0) {
flushCurrentMdat(); flushCurrentMdat();
} }
@ -759,18 +756,18 @@ public class SrsMp4Muxer {
private ContainerBox parent; private ContainerBox parent;
private ByteBuffer header; private ByteBuffer header;
private long contentSize = 1024 * 1024 * 1024; private long contentSize = 1024 * 1024 * 1024;
private long dataOffset = 0; private long startOffset = 0;
public ContainerBox getParent() { public ContainerBox getParent() {
return parent; return parent;
} }
public long getOffset() { public long getStartOffset() {
return dataOffset; return startOffset;
} }
public void setDataOffset(long offset) { public void setStartOffset(long offset) {
dataOffset = offset; startOffset = offset;
} }
public void setParent(ContainerBox parent) { public void setParent(ContainerBox parent) {
@ -793,6 +790,10 @@ public class SrsMp4Muxer {
return header.limit() + contentSize; return header.limit() + contentSize;
} }
public int getHeaderSize() {
return header.limit();
}
private boolean isSmallBox(long contentSize) { private boolean isSmallBox(long contentSize) {
return (contentSize + header.limit()) < 4294967296L; return (contentSize + header.limit()) < 4294967296L;
} }

Loading…
Cancel
Save