screenrecord: add bframes option

Test: screenrecord --codec-name OMX.google.h264.encoder --bframes 1 /sdcard/a.mp4
Change-Id: I6ae9310fb5ef644138af0becb7428f4a2c6393fe
gugelfrei
Wonsik Kim 5 years ago
parent 1f2f5058f7
commit 15a5130330

@ -48,6 +48,7 @@
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/MediaCodec.h>
#include <media/stagefright/MediaCodecConstants.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaMuxer.h>
#include <media/stagefright/PersistentSurface.h>
@ -83,8 +84,6 @@ using android::status_t;
using android::DISPLAY_ORIENTATION_0;
using android::DISPLAY_ORIENTATION_180;
using android::DISPLAY_ORIENTATION_90;
using android::INFO_FORMAT_CHANGED;
using android::INFO_OUTPUT_BUFFERS_CHANGED;
using android::INVALID_OPERATION;
using android::NAME_NOT_FOUND;
using android::NO_ERROR;
@ -113,6 +112,7 @@ static uint32_t gVideoWidth = 0; // default width+height
static uint32_t gVideoHeight = 0;
static uint32_t gBitRate = 20000000; // 20Mbps
static uint32_t gTimeLimitSec = kMaxTimeLimitSec;
static uint32_t gBframes = 0;
// Set by signal handler to stop recording.
static volatile bool gStopRequested = false;
@ -184,13 +184,18 @@ static status_t prepareEncoder(float displayFps, sp<MediaCodec>* pCodec,
}
sp<AMessage> format = new AMessage;
format->setInt32("width", gVideoWidth);
format->setInt32("height", gVideoHeight);
format->setString("mime", kMimeTypeAvc);
format->setInt32("color-format", OMX_COLOR_FormatAndroidOpaque);
format->setInt32("bitrate", gBitRate);
format->setFloat("frame-rate", displayFps);
format->setInt32("i-frame-interval", 10);
format->setInt32(KEY_WIDTH, gVideoWidth);
format->setInt32(KEY_HEIGHT, gVideoHeight);
format->setString(KEY_MIME, kMimeTypeAvc);
format->setInt32(KEY_COLOR_FORMAT, OMX_COLOR_FormatAndroidOpaque);
format->setInt32(KEY_BIT_RATE, gBitRate);
format->setFloat(KEY_FRAME_RATE, displayFps);
format->setInt32(KEY_I_FRAME_INTERVAL, 10);
format->setInt32(KEY_MAX_B_FRAMES, gBframes);
if (gBframes > 0) {
format->setInt32(KEY_PROFILE, AVCProfileMain);
format->setInt32(KEY_LEVEL, AVCLevel41);
}
sp<android::ALooper> looper = new android::ALooper;
looper->setName("screenrecord_looper");
@ -478,7 +483,7 @@ static status_t runEncoder(const sp<MediaCodec>& encoder,
case -EAGAIN: // INFO_TRY_AGAIN_LATER
ALOGV("Got -EAGAIN, looping");
break;
case INFO_FORMAT_CHANGED: // INFO_OUTPUT_FORMAT_CHANGED
case android::INFO_FORMAT_CHANGED: // INFO_OUTPUT_FORMAT_CHANGED
{
// Format includes CSD, which we must provide to muxer.
ALOGV("Encoder format changed");
@ -495,7 +500,7 @@ static status_t runEncoder(const sp<MediaCodec>& encoder,
}
}
break;
case INFO_OUTPUT_BUFFERS_CHANGED: // INFO_OUTPUT_BUFFERS_CHANGED
case android::INFO_OUTPUT_BUFFERS_CHANGED: // INFO_OUTPUT_BUFFERS_CHANGED
// Not expected for an encoder; handle it anyway.
ALOGV("Encoder buffers changed");
err = encoder->getOutputBuffers(&buffers);
@ -960,6 +965,7 @@ int main(int argc, char* const argv[]) {
{ "codec-name", required_argument, NULL, 'N' },
{ "monotonic-time", no_argument, NULL, 'm' },
{ "persistent-surface", no_argument, NULL, 'p' },
{ "bframes", required_argument, NULL, 'B' },
{ NULL, 0, NULL, 0 }
};
@ -1052,6 +1058,11 @@ int main(int argc, char* const argv[]) {
case 'p':
gPersistentSurface = true;
break;
case 'B':
if (parseValueWithUnit(optarg, &gBframes) != NO_ERROR) {
return 2;
}
break;
default:
if (ic != '?') {
fprintf(stderr, "getopt_long returned unexpected value 0x%x\n", ic);

Loading…
Cancel
Save