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

Commit df27b04b authored by Ray Essick's avatar Ray Essick
Browse files

Plumbing for OPUS encoding.

Webm, OGG container extensions to hold opus.
hooks so we can say that we're recording in opus format.
OMX-specific changes are omitted since our target is Codec2

Bug: 111850384
Test: with separate omx routines
Change-Id: Iecb8b53df3fbd8506d2e6f007602284eb2d0decc
parent 5a2048c3
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -48,7 +48,8 @@ const MediaProfiles::NameToTagMap MediaProfiles::sAudioEncoderNameMap[] = {
    {"amrwb",  AUDIO_ENCODER_AMR_WB},
    {"aac",    AUDIO_ENCODER_AAC},
    {"heaac",  AUDIO_ENCODER_HE_AAC},
    {"aaceld", AUDIO_ENCODER_AAC_ELD}
    {"aaceld", AUDIO_ENCODER_AAC_ELD}, 
    {"opus",   AUDIO_ENCODER_OPUS}
};

const MediaProfiles::NameToTagMap MediaProfiles::sFileFormatMap[] = {
+5 −1
Original line number Diff line number Diff line
@@ -81,6 +81,9 @@ enum output_format {
    /* HEIC data in a HEIF container */
    OUTPUT_FORMAT_HEIF = 10,

    /* Opus data in a OGG container */
    OUTPUT_FORMAT_OGG = 11,

    OUTPUT_FORMAT_LIST_END // must be last - used to validate format type
};

@@ -92,6 +95,7 @@ enum audio_encoder {
    AUDIO_ENCODER_HE_AAC = 4,
    AUDIO_ENCODER_AAC_ELD = 5,
    AUDIO_ENCODER_VORBIS = 6,
    AUDIO_ENCODER_OPUS = 7,

    AUDIO_ENCODER_LIST_END // must be the last - used to validate the audio encoder type
};
+28 −12
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/MediaCodecSource.h>
#include <media/stagefright/OggWriter.h>
#include <media/stagefright/PersistentSurface.h>
#include <media/MediaProfiles.h>
#include <camera/CameraParameters.h>
@@ -948,6 +949,10 @@ status_t StagefrightRecorder::prepareInternal() {
            status = setupMPEG2TSRecording();
            break;

        case OUTPUT_FORMAT_OGG:
            status = setupOggRecording();
            break;

        default:
            ALOGE("Unsupported output file format: %d", mOutputFormat);
            status = UNKNOWN_ERROR;
@@ -1013,6 +1018,7 @@ status_t StagefrightRecorder::start() {
        case OUTPUT_FORMAT_AAC_ADTS:
        case OUTPUT_FORMAT_RTP_AVP:
        case OUTPUT_FORMAT_MPEG2TS:
        case OUTPUT_FORMAT_OGG:
        {
            sp<MetaData> meta = new MetaData;
            int64_t startTimeUs = systemTime() / 1000;
@@ -1113,6 +1119,9 @@ sp<MediaCodecSource> StagefrightRecorder::createAudioSource() {
            format->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC);
            format->setInt32("aac-profile", OMX_AUDIO_AACObjectELD);
            break;
        case AUDIO_ENCODER_OPUS:
            format->setString("mime", MEDIA_MIMETYPE_AUDIO_OPUS);
            break;

        default:
            ALOGE("Unknown audio encoder: %d", mAudioEncoder);
@@ -1169,6 +1178,13 @@ status_t StagefrightRecorder::setupAACRecording() {
    return setupRawAudioRecording();
}

status_t StagefrightRecorder::setupOggRecording() {
    CHECK_EQ(mOutputFormat, OUTPUT_FORMAT_OGG);

    mWriter = new OggWriter(mOutputFd);
    return setupRawAudioRecording();
}

status_t StagefrightRecorder::setupAMRRecording() {
    CHECK(mOutputFormat == OUTPUT_FORMAT_AMR_NB ||
          mOutputFormat == OUTPUT_FORMAT_AMR_WB);
@@ -1813,6 +1829,7 @@ status_t StagefrightRecorder::setupAudioEncoder(const sp<MediaWriter>& writer) {
        case AUDIO_ENCODER_AAC:
        case AUDIO_ENCODER_HE_AAC:
        case AUDIO_ENCODER_AAC_ELD:
        case AUDIO_ENCODER_OPUS:
            break;

        default:
@@ -1863,19 +1880,18 @@ status_t StagefrightRecorder::setupMPEG4orWEBMRecording() {
        mTotalBitRate += mVideoBitRate;
    }

    if (mOutputFormat != OUTPUT_FORMAT_WEBM) {
    // 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.
    // disable audio for time lapse recording
        bool disableAudio = mCaptureFpsEnable && mCaptureFps < mFrameRate;
    const bool disableAudio = mCaptureFpsEnable && mCaptureFps < mFrameRate;
    if (!disableAudio && mAudioSource != AUDIO_SOURCE_CNT) {
        err = setupAudioEncoder(writer);
        if (err != OK) return err;
        mTotalBitRate += mAudioBitRate;
    }

    if (mOutputFormat != OUTPUT_FORMAT_WEBM) {
        if (mCaptureFpsEnable) {
            mp4writer->setCaptureRate(mCaptureFps);
        }
+1 −0
Original line number Diff line number Diff line
@@ -166,6 +166,7 @@ private:
    void setupMPEG4orWEBMMetaData(sp<MetaData> *meta);
    status_t setupAMRRecording();
    status_t setupAACRecording();
    status_t setupOggRecording();
    status_t setupRawAudioRecording();
    status_t setupRTPRecording();
    status_t setupMPEG2TSRecording();
+3 −0
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ cc_library_shared {
        "MediaMuxer.cpp",
        "NuCachedSource2.cpp",
        "NuMediaExtractor.cpp",
        "OggWriter.cpp",
        "OMXClient.cpp",
        "OmxInfoBuilder.cpp",
        "RemoteMediaExtractor.cpp",
@@ -159,6 +160,7 @@ cc_library_shared {
        "libstagefright_codecbase",
        "libstagefright_foundation",
        "libstagefright_omx_utils",
        "libstagefright_opus_common",
        "libstagefright_xmlparser",
        "libRScpp",
        "libhidlallocatorutils",
@@ -179,6 +181,7 @@ cc_library_shared {
        "libstagefright_webm",
        "libstagefright_timedtext",
        "libvpx",
        "libogg",
        "libwebm",
        "libstagefright_esds",
        "libstagefright_id3",
Loading