diff options
| -rw-r--r-- | cmds/stagefright/recordvideo.cpp | 14 | ||||
| -rw-r--r-- | media/libstagefright/MPEG2TSWriter.cpp | 2 | ||||
| -rw-r--r-- | media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp | 2 |
3 files changed, 15 insertions, 3 deletions
diff --git a/cmds/stagefright/recordvideo.cpp b/cmds/stagefright/recordvideo.cpp index 3bd1fe2..e02f111 100644 --- a/cmds/stagefright/recordvideo.cpp +++ b/cmds/stagefright/recordvideo.cpp @@ -43,6 +43,7 @@ static void usage(const char *me) { fprintf(stderr, " -l encoder level. see omx il header (default: encoder specific)\n"); fprintf(stderr, " -p encoder profile. see omx il header (default: encoder specific)\n"); fprintf(stderr, " -v video codec: [0] AVC [1] M4V [2] H263 (default: 0)\n"); + fprintf(stderr, " -s(oftware) prefer software codec\n"); fprintf(stderr, "The output file is /sdcard/output.mp4\n"); exit(1); } @@ -162,10 +163,11 @@ int main(int argc, char **argv) { int profile = -1; // Encoder specific default int codec = 0; const char *fileName = "/sdcard/output.mp4"; + bool preferSoftwareCodec = false; android::ProcessState::self()->startThreadPool(); int res; - while ((res = getopt(argc, argv, "b:c:f:i:n:w:t:l:p:v:h")) >= 0) { + while ((res = getopt(argc, argv, "b:c:f:i:n:w:t:l:p:v:hs")) >= 0) { switch (res) { case 'b': { @@ -233,6 +235,12 @@ int main(int argc, char **argv) { break; } + case 's': + { + preferSoftwareCodec = true; + break; + } + case 'h': default: { @@ -278,13 +286,15 @@ int main(int argc, char **argv) { sp<MediaSource> encoder = OMXCodec::Create( - client.interface(), enc_meta, true /* createEncoder */, source); + client.interface(), enc_meta, true /* createEncoder */, source, + 0, preferSoftwareCodec ? OMXCodec::kPreferSoftwareCodecs : 0); sp<MPEG4Writer> writer = new MPEG4Writer(fileName); writer->addSource(encoder); int64_t start = systemTime(); CHECK_EQ((status_t)OK, writer->start()); while (!writer->reachedEOS()) { + usleep(100000); } err = writer->stop(); int64_t end = systemTime(); diff --git a/media/libstagefright/MPEG2TSWriter.cpp b/media/libstagefright/MPEG2TSWriter.cpp index 92f12af..c9ed5bb 100644 --- a/media/libstagefright/MPEG2TSWriter.cpp +++ b/media/libstagefright/MPEG2TSWriter.cpp @@ -419,6 +419,8 @@ void MPEG2TSWriter::SourceInfo::onMessageReceived(const sp<AMessage> &msg) { } else { postAVCFrame(buffer); } + } else { + readMore(); } buffer->release(); diff --git a/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp b/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp index a2ef3a1..81ee419 100644 --- a/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp +++ b/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp @@ -909,12 +909,12 @@ void SoftAVCEncoder::onQueueFilled(OMX_U32 portIndex) { outQueue.erase(outQueue.begin()); CHECK(!mInputBufferInfoVec.empty()); InputBufferInfo *inputBufInfo = mInputBufferInfoVec.begin(); - mInputBufferInfoVec.erase(mInputBufferInfoVec.begin()); outHeader->nTimeStamp = inputBufInfo->mTimeUs; outHeader->nFlags |= (inputBufInfo->mFlags | OMX_BUFFERFLAG_ENDOFFRAME); outHeader->nFilledLen = dataLength; outInfo->mOwnedByUs = false; notifyFillBufferDone(outHeader); + mInputBufferInfoVec.erase(mInputBufferInfoVec.begin()); } } |
