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

Commit f6f4c0d7 authored by Robert Shih's avatar Robert Shih Committed by Android (Google) Code Review
Browse files

Merge "StagefrightRecorder: webm (video only) support" into lmp-dev

parents b104d5a4 11481963
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -61,6 +61,9 @@ enum output_format {
    OUTPUT_FORMAT_AAC_ADIF = 5,
    OUTPUT_FORMAT_AAC_ADTS = 6,

    OUTPUT_FORMAT_AUDIO_ONLY_END = 7, // Used in validating the output format.  Should be the
                                      //  at the end of the audio only output formats.

    /* Stream over a socket, limited to a single stream */
    OUTPUT_FORMAT_RTP_AVP = 7,

+5 −2
Original line number Diff line number Diff line
@@ -186,8 +186,11 @@ status_t MediaRecorder::setOutputFormat(int of)
        ALOGE("setOutputFormat called in an invalid state: %d", mCurrentState);
        return INVALID_OPERATION;
    }
    if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START && of != OUTPUT_FORMAT_RTP_AVP && of != OUTPUT_FORMAT_MPEG2TS) { //first non-video output format
        ALOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of);
    if (mIsVideoSourceSet
            && of >= OUTPUT_FORMAT_AUDIO_ONLY_START //first non-video output format
            && of < OUTPUT_FORMAT_AUDIO_ONLY_END) {
        ALOGE("output format (%d) is meant for audio recording only"
              " and incompatible with video recording", of);
        return INVALID_OPERATION;
    }

+1 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ LOCAL_C_INCLUDES := \
    $(TOP)/frameworks/av/media/libstagefright/include               \
    $(TOP)/frameworks/av/media/libstagefright/rtsp                  \
    $(TOP)/frameworks/av/media/libstagefright/wifi-display          \
    $(TOP)/frameworks/av/media/libstagefright/webm                  \
    $(TOP)/frameworks/native/include/media/openmax                  \
    $(TOP)/external/tremolo/Tremolo                                 \

+44 −29
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <inttypes.h>
#include <utils/Log.h>

#include "WebmWriter.h"
#include "StagefrightRecorder.h"

#include <binder/IPCThreadState.h>
@@ -764,7 +765,8 @@ status_t StagefrightRecorder::prepareInternal() {
        case OUTPUT_FORMAT_DEFAULT:
        case OUTPUT_FORMAT_THREE_GPP:
        case OUTPUT_FORMAT_MPEG_4:
            status = setupMPEG4Recording();
        case OUTPUT_FORMAT_WEBM:
            status = setupMPEG4orWEBMRecording();
            break;

        case OUTPUT_FORMAT_AMR_NB:
@@ -826,9 +828,14 @@ status_t StagefrightRecorder::start() {
        case OUTPUT_FORMAT_DEFAULT:
        case OUTPUT_FORMAT_THREE_GPP:
        case OUTPUT_FORMAT_MPEG_4:
        case OUTPUT_FORMAT_WEBM:
        {
            bool isMPEG4 = true;
            if (mOutputFormat == OUTPUT_FORMAT_WEBM) {
                isMPEG4 = false;
            }
            sp<MetaData> meta = new MetaData;
            setupMPEG4MetaData(&meta);
            setupMPEG4orWEBMMetaData(&meta);
            status = mWriter->start(meta.get());
            break;
        }
@@ -1538,12 +1545,17 @@ status_t StagefrightRecorder::setupAudioEncoder(const sp<MediaWriter>& writer) {
    return OK;
}

status_t StagefrightRecorder::setupMPEG4Recording() {
status_t StagefrightRecorder::setupMPEG4orWEBMRecording() {
    mWriter.clear();
    mTotalBitRate = 0;

    status_t err = OK;
    sp<MediaWriter> writer = new MPEG4Writer(mOutputFd);
    sp<MediaWriter> writer;
    if (mOutputFormat == OUTPUT_FORMAT_MPEG_4) {
        writer = new MPEG4Writer(mOutputFd);
    } else {
        writer = new WebmWriter(mOutputFd);
    }

    if (mVideoSource < VIDEO_SOURCE_LIST_END) {

@@ -1563,9 +1575,11 @@ status_t StagefrightRecorder::setupMPEG4Recording() {
        mTotalBitRate += mVideoBitRate;
    }

    if (mOutputFormat == OUTPUT_FORMAT_MPEG_4) {
        // Audio source is added at the end if it exists.
        // This help make sure that the "recoding" sound is suppressed for
        // camcorder applications in the recorded files.
        // TODO Audio source is currently unsupported for webm output; vorbis encoder needed.
        if (!mCaptureTimeLapse && (mAudioSource != AUDIO_SOURCE_CNT)) {
            err = setupAudioEncoder(writer);
            if (err != OK) return err;
@@ -1580,13 +1594,13 @@ status_t StagefrightRecorder::setupMPEG4Recording() {
            reinterpret_cast<MPEG4Writer *>(writer.get())->
                setGeoData(mLatitudex10000, mLongitudex10000);
        }
    }
    if (mMaxFileDurationUs != 0) {
        writer->setMaxFileDuration(mMaxFileDurationUs);
    }
    if (mMaxFileSizeBytes != 0) {
        writer->setMaxFileSize(mMaxFileSizeBytes);
    }

    if (mVideoSource == VIDEO_SOURCE_DEFAULT
            || mVideoSource == VIDEO_SOURCE_CAMERA) {
        mStartTimeOffsetMs = mEncoderProfiles->getStartTimeOffsetMs(mCameraId);
@@ -1595,8 +1609,7 @@ status_t StagefrightRecorder::setupMPEG4Recording() {
        mStartTimeOffsetMs = 200;
    }
    if (mStartTimeOffsetMs > 0) {
        reinterpret_cast<MPEG4Writer *>(writer.get())->
            setStartTimeOffsetMs(mStartTimeOffsetMs);
        writer->setStartTimeOffsetMs(mStartTimeOffsetMs);
    }

    writer->setListener(mListener);
@@ -1604,15 +1617,16 @@ status_t StagefrightRecorder::setupMPEG4Recording() {
    return OK;
}

void StagefrightRecorder::setupMPEG4MetaData(sp<MetaData> *meta) {
void StagefrightRecorder::setupMPEG4orWEBMMetaData(sp<MetaData> *meta) {
    int64_t startTimeUs = systemTime() / 1000;
    (*meta)->setInt64(kKeyTime, startTimeUs);
    (*meta)->setInt32(kKeyFileType, mOutputFormat);
    (*meta)->setInt32(kKeyBitRate, mTotalBitRate);
    (*meta)->setInt32(kKey64BitFileOffset, mUse64BitFileOffset);
    if (mMovieTimeScale > 0) {
        (*meta)->setInt32(kKeyTimeScale, mMovieTimeScale);
    }
    if (mOutputFormat == OUTPUT_FORMAT_MPEG_4) {
        (*meta)->setInt32(kKey64BitFileOffset, mUse64BitFileOffset);
        if (mTrackEveryTimeDurationUs > 0) {
            (*meta)->setInt64(kKeyTrackTimeStatus, mTrackEveryTimeDurationUs);
        }
@@ -1620,6 +1634,7 @@ void StagefrightRecorder::setupMPEG4MetaData(sp<MetaData> *meta) {
            (*meta)->setInt32(kKeyRotation, mRotationDegrees);
        }
    }
}

status_t StagefrightRecorder::pause() {
    ALOGV("pause");
+2 −2
Original line number Diff line number Diff line
@@ -128,8 +128,8 @@ private:
    sp<ALooper> mLooper;

    status_t prepareInternal();
    status_t setupMPEG4Recording();
    void setupMPEG4MetaData(sp<MetaData> *meta);
    status_t setupMPEG4orWEBMRecording();
    void setupMPEG4orWEBMMetaData(sp<MetaData> *meta);
    status_t setupAMRRecording();
    status_t setupAACRecording();
    status_t setupRawAudioRecording();