Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b7c5444 authored by Benoit Goby's avatar Benoit Goby Committed by Android Git Automerger
Browse files

am e32106fd: screenrecord: Add raw frames output format

* commit 'e32106fd':
  screenrecord: Add raw frames output format
parents 4ae3cfd8 e32106fd
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ status_t FrameOutput::createInputSurface(int width, int height,
    return NO_ERROR;
}

status_t FrameOutput::copyFrame(FILE* fp, long timeoutUsec) {
status_t FrameOutput::copyFrame(FILE* fp, long timeoutUsec, bool rawFrames) {
    Mutex::Autolock _l(mMutex);
    ALOGV("copyFrame %ld\n", timeoutUsec);

@@ -150,9 +150,11 @@ status_t FrameOutput::copyFrame(FILE* fp, long timeoutUsec) {
                (endWhenNsec - pixWhenNsec) / 1000000.0);
    }

    size_t rgbDataLen = width * height * kOutBytesPerPixel;

    if (!rawFrames) {
        // Fill out the header.
        size_t headerLen = sizeof(uint32_t) * 5;
    size_t rgbDataLen = width * height * kOutBytesPerPixel;
        size_t packetLen = headerLen - sizeof(uint32_t) + rgbDataLen;
        uint8_t header[headerLen];
        setValueLE(&header[0], packetLen);
@@ -160,6 +162,8 @@ status_t FrameOutput::copyFrame(FILE* fp, long timeoutUsec) {
        setValueLE(&header[8], height);
        setValueLE(&header[12], width * kOutBytesPerPixel);
        setValueLE(&header[16], HAL_PIXEL_FORMAT_RGB_888);
        fwrite(header, 1, headerLen, fp);
    }

    // Currently using buffered I/O rather than writev().  Not expecting it
    // to make much of a difference, but it might be worth a test for larger
@@ -167,7 +171,6 @@ status_t FrameOutput::copyFrame(FILE* fp, long timeoutUsec) {
    if (kShowTiming) {
        startWhenNsec = systemTime(CLOCK_MONOTONIC);
    }
    fwrite(header, 1, headerLen, fp);
    fwrite(mPixelBuf, 1, rgbDataLen, fp);
    fflush(fp);
    if (kShowTiming) {
+1 −1
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ public:
    // specified number of microseconds.
    //
    // Returns ETIMEDOUT if the timeout expired before we found a frame.
    status_t copyFrame(FILE* fp, long timeoutUsec);
    status_t copyFrame(FILE* fp, long timeoutUsec, bool rawFrames);

    // Prepare to copy frames.  Makes the EGL context used by this object current.
    void prepareToCopy() {
+9 −5
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ static const char* kMimeTypeAvc = "video/avc";
static bool gVerbose = false;           // chatty on stdout
static bool gRotate = false;            // rotate 90 degrees
static enum {
    FORMAT_MP4, FORMAT_H264, FORMAT_FRAMES
    FORMAT_MP4, FORMAT_H264, FORMAT_FRAMES, FORMAT_RAW_FRAMES
} gOutputFormat = FORMAT_MP4;           // data format for output
static bool gSizeSpecified = false;     // was size explicitly requested?
static bool gWantInfoScreen = false;    // do we want initial info screen?
@@ -563,7 +563,7 @@ static status_t recordScreen(const char* fileName) {
    sp<MediaCodec> encoder;
    sp<FrameOutput> frameOutput;
    sp<IGraphicBufferProducer> encoderInputSurface;
    if (gOutputFormat != FORMAT_FRAMES) {
    if (gOutputFormat != FORMAT_FRAMES && gOutputFormat != FORMAT_RAW_FRAMES) {
        err = prepareEncoder(mainDpyInfo.fps, &encoder, &encoderInputSurface);

        if (err != NO_ERROR && !gSizeSpecified) {
@@ -643,7 +643,8 @@ static status_t recordScreen(const char* fileName) {
            break;
        }
        case FORMAT_H264:
        case FORMAT_FRAMES: {
        case FORMAT_FRAMES:
        case FORMAT_RAW_FRAMES: {
            rawFp = prepareRawOutput(fileName);
            if (rawFp == NULL) {
                if (encoder != NULL) encoder->release();
@@ -656,7 +657,7 @@ static status_t recordScreen(const char* fileName) {
            abort();
    }

    if (gOutputFormat == FORMAT_FRAMES) {
    if (gOutputFormat == FORMAT_FRAMES || gOutputFormat == FORMAT_RAW_FRAMES) {
        // TODO: if we want to make this a proper feature, we should output
        //       an outer header with version info.  Right now we never change
        //       the frame size or format, so we could conceivably just send
@@ -676,7 +677,8 @@ static status_t recordScreen(const char* fileName) {
            // stop was requested, but this will do for now.  (It almost
            // works because wait() wakes when a signal hits, but we
            // need to handle the edge cases.)
            err = frameOutput->copyFrame(rawFp, 250000);
            bool rawFrames = gOutputFormat == FORMAT_RAW_FRAMES;
            err = frameOutput->copyFrame(rawFp, 250000, rawFrames);
            if (err == ETIMEDOUT) {
                err = NO_ERROR;
            } else if (err != NO_ERROR) {
@@ -950,6 +952,8 @@ int main(int argc, char* const argv[]) {
                gOutputFormat = FORMAT_H264;
            } else if (strcmp(optarg, "frames") == 0) {
                gOutputFormat = FORMAT_FRAMES;
            } else if (strcmp(optarg, "raw-frames") == 0) {
                gOutputFormat = FORMAT_RAW_FRAMES;
            } else {
                fprintf(stderr, "Unknown format '%s'\n", optarg);
                return 2;