Loading media/libmedia/MediaProfiles.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -48,7 +48,8 @@ const MediaProfiles::NameToTagMap MediaProfiles::sAudioEncoderNameMap[] = { {"amrwb", AUDIO_ENCODER_AMR_WB}, {"amrwb", AUDIO_ENCODER_AMR_WB}, {"aac", AUDIO_ENCODER_AAC}, {"aac", AUDIO_ENCODER_AAC}, {"heaac", AUDIO_ENCODER_HE_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[] = { const MediaProfiles::NameToTagMap MediaProfiles::sFileFormatMap[] = { Loading media/libmedia/include/media/mediarecorder.h +5 −1 Original line number Original line Diff line number Diff line Loading @@ -81,6 +81,9 @@ enum output_format { /* HEIC data in a HEIF container */ /* HEIC data in a HEIF container */ OUTPUT_FORMAT_HEIF = 10, 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 OUTPUT_FORMAT_LIST_END // must be last - used to validate format type }; }; Loading @@ -92,6 +95,7 @@ enum audio_encoder { AUDIO_ENCODER_HE_AAC = 4, AUDIO_ENCODER_HE_AAC = 4, AUDIO_ENCODER_AAC_ELD = 5, AUDIO_ENCODER_AAC_ELD = 5, AUDIO_ENCODER_VORBIS = 6, AUDIO_ENCODER_VORBIS = 6, AUDIO_ENCODER_OPUS = 7, AUDIO_ENCODER_LIST_END // must be the last - used to validate the audio encoder type AUDIO_ENCODER_LIST_END // must be the last - used to validate the audio encoder type }; }; Loading media/libmediaplayerservice/StagefrightRecorder.cpp +28 −12 Original line number Original line Diff line number Diff line Loading @@ -46,6 +46,7 @@ #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/MediaCodecSource.h> #include <media/stagefright/MediaCodecSource.h> #include <media/stagefright/OggWriter.h> #include <media/stagefright/PersistentSurface.h> #include <media/stagefright/PersistentSurface.h> #include <media/MediaProfiles.h> #include <media/MediaProfiles.h> #include <camera/CameraParameters.h> #include <camera/CameraParameters.h> Loading Loading @@ -948,6 +949,10 @@ status_t StagefrightRecorder::prepareInternal() { status = setupMPEG2TSRecording(); status = setupMPEG2TSRecording(); break; break; case OUTPUT_FORMAT_OGG: status = setupOggRecording(); break; default: default: ALOGE("Unsupported output file format: %d", mOutputFormat); ALOGE("Unsupported output file format: %d", mOutputFormat); status = UNKNOWN_ERROR; status = UNKNOWN_ERROR; Loading Loading @@ -1013,6 +1018,7 @@ status_t StagefrightRecorder::start() { case OUTPUT_FORMAT_AAC_ADTS: case OUTPUT_FORMAT_AAC_ADTS: case OUTPUT_FORMAT_RTP_AVP: case OUTPUT_FORMAT_RTP_AVP: case OUTPUT_FORMAT_MPEG2TS: case OUTPUT_FORMAT_MPEG2TS: case OUTPUT_FORMAT_OGG: { { sp<MetaData> meta = new MetaData; sp<MetaData> meta = new MetaData; int64_t startTimeUs = systemTime() / 1000; int64_t startTimeUs = systemTime() / 1000; Loading Loading @@ -1113,6 +1119,9 @@ sp<MediaCodecSource> StagefrightRecorder::createAudioSource() { format->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); format->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); format->setInt32("aac-profile", OMX_AUDIO_AACObjectELD); format->setInt32("aac-profile", OMX_AUDIO_AACObjectELD); break; break; case AUDIO_ENCODER_OPUS: format->setString("mime", MEDIA_MIMETYPE_AUDIO_OPUS); break; default: default: ALOGE("Unknown audio encoder: %d", mAudioEncoder); ALOGE("Unknown audio encoder: %d", mAudioEncoder); Loading Loading @@ -1169,6 +1178,13 @@ status_t StagefrightRecorder::setupAACRecording() { return setupRawAudioRecording(); return setupRawAudioRecording(); } } status_t StagefrightRecorder::setupOggRecording() { CHECK_EQ(mOutputFormat, OUTPUT_FORMAT_OGG); mWriter = new OggWriter(mOutputFd); return setupRawAudioRecording(); } status_t StagefrightRecorder::setupAMRRecording() { status_t StagefrightRecorder::setupAMRRecording() { CHECK(mOutputFormat == OUTPUT_FORMAT_AMR_NB || CHECK(mOutputFormat == OUTPUT_FORMAT_AMR_NB || mOutputFormat == OUTPUT_FORMAT_AMR_WB); mOutputFormat == OUTPUT_FORMAT_AMR_WB); Loading Loading @@ -1813,6 +1829,7 @@ status_t StagefrightRecorder::setupAudioEncoder(const sp<MediaWriter>& writer) { case AUDIO_ENCODER_AAC: case AUDIO_ENCODER_AAC: case AUDIO_ENCODER_HE_AAC: case AUDIO_ENCODER_HE_AAC: case AUDIO_ENCODER_AAC_ELD: case AUDIO_ENCODER_AAC_ELD: case AUDIO_ENCODER_OPUS: break; break; default: default: Loading Loading @@ -1863,19 +1880,18 @@ status_t StagefrightRecorder::setupMPEG4orWEBMRecording() { mTotalBitRate += mVideoBitRate; mTotalBitRate += mVideoBitRate; } } if (mOutputFormat != OUTPUT_FORMAT_WEBM) { // Audio source is added at the end if it exists. // Audio source is added at the end if it exists. // This help make sure that the "recoding" sound is suppressed for // This help make sure that the "recoding" sound is suppressed for // camcorder applications in the recorded files. // camcorder applications in the recorded files. // TODO Audio source is currently unsupported for webm output; vorbis encoder needed. // disable audio for time lapse recording // disable audio for time lapse recording bool disableAudio = mCaptureFpsEnable && mCaptureFps < mFrameRate; const bool disableAudio = mCaptureFpsEnable && mCaptureFps < mFrameRate; if (!disableAudio && mAudioSource != AUDIO_SOURCE_CNT) { if (!disableAudio && mAudioSource != AUDIO_SOURCE_CNT) { err = setupAudioEncoder(writer); err = setupAudioEncoder(writer); if (err != OK) return err; if (err != OK) return err; mTotalBitRate += mAudioBitRate; mTotalBitRate += mAudioBitRate; } } if (mOutputFormat != OUTPUT_FORMAT_WEBM) { if (mCaptureFpsEnable) { if (mCaptureFpsEnable) { mp4writer->setCaptureRate(mCaptureFps); mp4writer->setCaptureRate(mCaptureFps); } } Loading media/libmediaplayerservice/StagefrightRecorder.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -166,6 +166,7 @@ private: void setupMPEG4orWEBMMetaData(sp<MetaData> *meta); void setupMPEG4orWEBMMetaData(sp<MetaData> *meta); status_t setupAMRRecording(); status_t setupAMRRecording(); status_t setupAACRecording(); status_t setupAACRecording(); status_t setupOggRecording(); status_t setupRawAudioRecording(); status_t setupRawAudioRecording(); status_t setupRTPRecording(); status_t setupRTPRecording(); status_t setupMPEG2TSRecording(); status_t setupMPEG2TSRecording(); Loading media/libstagefright/Android.bp +3 −0 Original line number Original line Diff line number Diff line Loading @@ -120,6 +120,7 @@ cc_library_shared { "MediaMuxer.cpp", "MediaMuxer.cpp", "NuCachedSource2.cpp", "NuCachedSource2.cpp", "NuMediaExtractor.cpp", "NuMediaExtractor.cpp", "OggWriter.cpp", "OMXClient.cpp", "OMXClient.cpp", "OmxInfoBuilder.cpp", "OmxInfoBuilder.cpp", "RemoteMediaExtractor.cpp", "RemoteMediaExtractor.cpp", Loading Loading @@ -159,6 +160,7 @@ cc_library_shared { "libstagefright_codecbase", "libstagefright_codecbase", "libstagefright_foundation", "libstagefright_foundation", "libstagefright_omx_utils", "libstagefright_omx_utils", "libstagefright_opus_common", "libstagefright_xmlparser", "libstagefright_xmlparser", "libRScpp", "libRScpp", "libhidlallocatorutils", "libhidlallocatorutils", Loading @@ -179,6 +181,7 @@ cc_library_shared { "libstagefright_webm", "libstagefright_webm", "libstagefright_timedtext", "libstagefright_timedtext", "libvpx", "libvpx", "libogg", "libwebm", "libwebm", "libstagefright_esds", "libstagefright_esds", "libstagefright_id3", "libstagefright_id3", Loading Loading
media/libmedia/MediaProfiles.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -48,7 +48,8 @@ const MediaProfiles::NameToTagMap MediaProfiles::sAudioEncoderNameMap[] = { {"amrwb", AUDIO_ENCODER_AMR_WB}, {"amrwb", AUDIO_ENCODER_AMR_WB}, {"aac", AUDIO_ENCODER_AAC}, {"aac", AUDIO_ENCODER_AAC}, {"heaac", AUDIO_ENCODER_HE_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[] = { const MediaProfiles::NameToTagMap MediaProfiles::sFileFormatMap[] = { Loading
media/libmedia/include/media/mediarecorder.h +5 −1 Original line number Original line Diff line number Diff line Loading @@ -81,6 +81,9 @@ enum output_format { /* HEIC data in a HEIF container */ /* HEIC data in a HEIF container */ OUTPUT_FORMAT_HEIF = 10, 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 OUTPUT_FORMAT_LIST_END // must be last - used to validate format type }; }; Loading @@ -92,6 +95,7 @@ enum audio_encoder { AUDIO_ENCODER_HE_AAC = 4, AUDIO_ENCODER_HE_AAC = 4, AUDIO_ENCODER_AAC_ELD = 5, AUDIO_ENCODER_AAC_ELD = 5, AUDIO_ENCODER_VORBIS = 6, AUDIO_ENCODER_VORBIS = 6, AUDIO_ENCODER_OPUS = 7, AUDIO_ENCODER_LIST_END // must be the last - used to validate the audio encoder type AUDIO_ENCODER_LIST_END // must be the last - used to validate the audio encoder type }; }; Loading
media/libmediaplayerservice/StagefrightRecorder.cpp +28 −12 Original line number Original line Diff line number Diff line Loading @@ -46,6 +46,7 @@ #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/MediaCodecSource.h> #include <media/stagefright/MediaCodecSource.h> #include <media/stagefright/OggWriter.h> #include <media/stagefright/PersistentSurface.h> #include <media/stagefright/PersistentSurface.h> #include <media/MediaProfiles.h> #include <media/MediaProfiles.h> #include <camera/CameraParameters.h> #include <camera/CameraParameters.h> Loading Loading @@ -948,6 +949,10 @@ status_t StagefrightRecorder::prepareInternal() { status = setupMPEG2TSRecording(); status = setupMPEG2TSRecording(); break; break; case OUTPUT_FORMAT_OGG: status = setupOggRecording(); break; default: default: ALOGE("Unsupported output file format: %d", mOutputFormat); ALOGE("Unsupported output file format: %d", mOutputFormat); status = UNKNOWN_ERROR; status = UNKNOWN_ERROR; Loading Loading @@ -1013,6 +1018,7 @@ status_t StagefrightRecorder::start() { case OUTPUT_FORMAT_AAC_ADTS: case OUTPUT_FORMAT_AAC_ADTS: case OUTPUT_FORMAT_RTP_AVP: case OUTPUT_FORMAT_RTP_AVP: case OUTPUT_FORMAT_MPEG2TS: case OUTPUT_FORMAT_MPEG2TS: case OUTPUT_FORMAT_OGG: { { sp<MetaData> meta = new MetaData; sp<MetaData> meta = new MetaData; int64_t startTimeUs = systemTime() / 1000; int64_t startTimeUs = systemTime() / 1000; Loading Loading @@ -1113,6 +1119,9 @@ sp<MediaCodecSource> StagefrightRecorder::createAudioSource() { format->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); format->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); format->setInt32("aac-profile", OMX_AUDIO_AACObjectELD); format->setInt32("aac-profile", OMX_AUDIO_AACObjectELD); break; break; case AUDIO_ENCODER_OPUS: format->setString("mime", MEDIA_MIMETYPE_AUDIO_OPUS); break; default: default: ALOGE("Unknown audio encoder: %d", mAudioEncoder); ALOGE("Unknown audio encoder: %d", mAudioEncoder); Loading Loading @@ -1169,6 +1178,13 @@ status_t StagefrightRecorder::setupAACRecording() { return setupRawAudioRecording(); return setupRawAudioRecording(); } } status_t StagefrightRecorder::setupOggRecording() { CHECK_EQ(mOutputFormat, OUTPUT_FORMAT_OGG); mWriter = new OggWriter(mOutputFd); return setupRawAudioRecording(); } status_t StagefrightRecorder::setupAMRRecording() { status_t StagefrightRecorder::setupAMRRecording() { CHECK(mOutputFormat == OUTPUT_FORMAT_AMR_NB || CHECK(mOutputFormat == OUTPUT_FORMAT_AMR_NB || mOutputFormat == OUTPUT_FORMAT_AMR_WB); mOutputFormat == OUTPUT_FORMAT_AMR_WB); Loading Loading @@ -1813,6 +1829,7 @@ status_t StagefrightRecorder::setupAudioEncoder(const sp<MediaWriter>& writer) { case AUDIO_ENCODER_AAC: case AUDIO_ENCODER_AAC: case AUDIO_ENCODER_HE_AAC: case AUDIO_ENCODER_HE_AAC: case AUDIO_ENCODER_AAC_ELD: case AUDIO_ENCODER_AAC_ELD: case AUDIO_ENCODER_OPUS: break; break; default: default: Loading Loading @@ -1863,19 +1880,18 @@ status_t StagefrightRecorder::setupMPEG4orWEBMRecording() { mTotalBitRate += mVideoBitRate; mTotalBitRate += mVideoBitRate; } } if (mOutputFormat != OUTPUT_FORMAT_WEBM) { // Audio source is added at the end if it exists. // Audio source is added at the end if it exists. // This help make sure that the "recoding" sound is suppressed for // This help make sure that the "recoding" sound is suppressed for // camcorder applications in the recorded files. // camcorder applications in the recorded files. // TODO Audio source is currently unsupported for webm output; vorbis encoder needed. // disable audio for time lapse recording // disable audio for time lapse recording bool disableAudio = mCaptureFpsEnable && mCaptureFps < mFrameRate; const bool disableAudio = mCaptureFpsEnable && mCaptureFps < mFrameRate; if (!disableAudio && mAudioSource != AUDIO_SOURCE_CNT) { if (!disableAudio && mAudioSource != AUDIO_SOURCE_CNT) { err = setupAudioEncoder(writer); err = setupAudioEncoder(writer); if (err != OK) return err; if (err != OK) return err; mTotalBitRate += mAudioBitRate; mTotalBitRate += mAudioBitRate; } } if (mOutputFormat != OUTPUT_FORMAT_WEBM) { if (mCaptureFpsEnable) { if (mCaptureFpsEnable) { mp4writer->setCaptureRate(mCaptureFps); mp4writer->setCaptureRate(mCaptureFps); } } Loading
media/libmediaplayerservice/StagefrightRecorder.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -166,6 +166,7 @@ private: void setupMPEG4orWEBMMetaData(sp<MetaData> *meta); void setupMPEG4orWEBMMetaData(sp<MetaData> *meta); status_t setupAMRRecording(); status_t setupAMRRecording(); status_t setupAACRecording(); status_t setupAACRecording(); status_t setupOggRecording(); status_t setupRawAudioRecording(); status_t setupRawAudioRecording(); status_t setupRTPRecording(); status_t setupRTPRecording(); status_t setupMPEG2TSRecording(); status_t setupMPEG2TSRecording(); Loading
media/libstagefright/Android.bp +3 −0 Original line number Original line Diff line number Diff line Loading @@ -120,6 +120,7 @@ cc_library_shared { "MediaMuxer.cpp", "MediaMuxer.cpp", "NuCachedSource2.cpp", "NuCachedSource2.cpp", "NuMediaExtractor.cpp", "NuMediaExtractor.cpp", "OggWriter.cpp", "OMXClient.cpp", "OMXClient.cpp", "OmxInfoBuilder.cpp", "OmxInfoBuilder.cpp", "RemoteMediaExtractor.cpp", "RemoteMediaExtractor.cpp", Loading Loading @@ -159,6 +160,7 @@ cc_library_shared { "libstagefright_codecbase", "libstagefright_codecbase", "libstagefright_foundation", "libstagefright_foundation", "libstagefright_omx_utils", "libstagefright_omx_utils", "libstagefright_opus_common", "libstagefright_xmlparser", "libstagefright_xmlparser", "libRScpp", "libRScpp", "libhidlallocatorutils", "libhidlallocatorutils", Loading @@ -179,6 +181,7 @@ cc_library_shared { "libstagefright_webm", "libstagefright_webm", "libstagefright_timedtext", "libstagefright_timedtext", "libvpx", "libvpx", "libogg", "libwebm", "libwebm", "libstagefright_esds", "libstagefright_esds", "libstagefright_id3", "libstagefright_id3", Loading