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

Commit c4cb19bb authored by Mingming Yin's avatar Mingming Yin Committed by Linux Build Service Account
Browse files

audio: add support for extended audio encoding

- add support for EVRC, QCELP ,LPCM, and multichannel
  encoding.

Conflicts:
core/jni/android_media_AudioFormat.h
media/java/android/media/AudioFormat.java
media/java/android/media/MediaFile.java
Change-Id: I9542ec9dec1872237940846952d28bef3ce24285
parent febb29dd
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -32,6 +32,14 @@
#define ENCODING_AAC_HE_V1  11
#define ENCODING_AAC_HE_V2  12
#define ENCODING_IEC61937   13

#define ENCODING_AMR_NB     100
#define ENCODING_AMR_WB     101
#define ENCODING_EVRC       102
#define ENCODING_EVRC_B     103
#define ENCODING_EVRC_WB    104
#define ENCODING_EVRC_NW    105

#define ENCODING_INVALID    0
#define ENCODING_DEFAULT    1

@@ -67,6 +75,18 @@ static inline audio_format_t audioFormatToNative(int audioFormat)
        return AUDIO_FORMAT_AAC_HE_V2;
    case ENCODING_IEC61937:
        return AUDIO_FORMAT_IEC61937;
    case ENCODING_AMR_NB:
        return AUDIO_FORMAT_AMR_NB;
    case ENCODING_AMR_WB:
        return AUDIO_FORMAT_AMR_WB;
    case ENCODING_EVRC:
        return AUDIO_FORMAT_EVRC;
    case ENCODING_EVRC_B:
        return AUDIO_FORMAT_EVRCB;
    case ENCODING_EVRC_WB:
        return AUDIO_FORMAT_EVRCWB;
    case ENCODING_EVRC_NW:
        return AUDIO_FORMAT_EVRCNW;
    case ENCODING_DEFAULT:
        return AUDIO_FORMAT_DEFAULT;
    default:
@@ -108,6 +128,18 @@ static inline int audioFormatFromNative(audio_format_t nativeFormat)
        return ENCODING_AAC_HE_V2;
    case AUDIO_FORMAT_IEC61937:
        return ENCODING_IEC61937;
    case AUDIO_FORMAT_AMR_NB:
        return ENCODING_AMR_NB;
    case AUDIO_FORMAT_AMR_WB:
        return ENCODING_AMR_WB;
    case AUDIO_FORMAT_EVRC:
        return ENCODING_EVRC;
    case AUDIO_FORMAT_EVRCB:
        return ENCODING_EVRC_B;
    case AUDIO_FORMAT_EVRCWB:
        return ENCODING_EVRC_WB;
    case AUDIO_FORMAT_EVRCNW:
        return ENCODING_EVRC_NW;
    case AUDIO_FORMAT_DEFAULT:
        return ENCODING_DEFAULT;
    default:
+63 −1
Original line number Diff line number Diff line
@@ -264,6 +264,30 @@ public final class AudioFormat implements Parcelable {
     */
    public static final int ENCODING_IEC61937 = 13;

    /** Audio data format: AMRNB
     * @hide
     * */
    public static final int ENCODING_AMRNB = 100;
    /** Audio data format: AMRWB
     * @hide
     * */
    public static final int ENCODING_AMRWB = 101;
    /** Audio data format: EVRC
     * @hide
     * */
    public static final int ENCODING_EVRC = 102;
    /** Audio data format: EVRCB
     * @hide
     * */
    public static final int ENCODING_EVRCB = 103;
    /** Audio data format: EVRCWB
     * @hide
     * */
    public static final int ENCODING_EVRCWB = 104;
    /** Audio data format: EVRCNW
     * @hide
     * */
    public static final int ENCODING_EVRCNW = 105;
    /** Invalid audio channel configuration */
    /** @deprecated Use {@link #CHANNEL_INVALID} instead.  */
    @Deprecated    public static final int CHANNEL_CONFIGURATION_INVALID   = 0;
@@ -439,6 +463,11 @@ public final class AudioFormat implements Parcelable {
    public static final int CHANNEL_IN_STEREO = (CHANNEL_IN_LEFT | CHANNEL_IN_RIGHT);
    /** @hide */
    public static final int CHANNEL_IN_FRONT_BACK = CHANNEL_IN_FRONT | CHANNEL_IN_BACK;
    /** @hide */
    public static final int CHANNEL_IN_5POINT1 = (CHANNEL_IN_LEFT |
            CHANNEL_IN_RIGHT | CHANNEL_IN_FRONT | CHANNEL_IN_BACK |
            CHANNEL_IN_LEFT_PROCESSED | CHANNEL_IN_RIGHT_PROCESSED);

    // CHANNEL_IN_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_IN_ALL

    /** @hide */
@@ -453,6 +482,15 @@ public final class AudioFormat implements Parcelable {
            return 2;
        case ENCODING_PCM_FLOAT:
            return 4;
        case ENCODING_AMRNB:
            return 32;
        case ENCODING_AMRWB:
            return 61;
        case ENCODING_EVRC:
        case ENCODING_EVRCB:
        case ENCODING_EVRCWB:
        case ENCODING_EVRCNW:
            return 23;
        case ENCODING_INVALID:
        default:
            throw new IllegalArgumentException("Bad audio format " + audioFormat);
@@ -475,6 +513,12 @@ public final class AudioFormat implements Parcelable {
        case ENCODING_AAC_HE_V1:
        case ENCODING_AAC_HE_V2:
        case ENCODING_IEC61937:
        case ENCODING_AMRNB:
        case ENCODING_AMRWB:
        case ENCODING_EVRC:
        case ENCODING_EVRCB:
        case ENCODING_EVRCWB:
        case ENCODING_EVRCNW:
            return true;
        default:
            return false;
@@ -517,6 +561,12 @@ public final class AudioFormat implements Parcelable {
        case ENCODING_AAC_HE_V1:
        case ENCODING_AAC_HE_V2:
        case ENCODING_IEC61937: // wrapped in PCM but compressed
        case ENCODING_AMRNB:
        case ENCODING_AMRWB:
        case ENCODING_EVRC:
        case ENCODING_EVRCB:
        case ENCODING_EVRCWB:
        case ENCODING_EVRCNW:
            return false;
        case ENCODING_INVALID:
        default:
@@ -773,6 +823,12 @@ public final class AudioFormat implements Parcelable {
                case ENCODING_DTS:
                case ENCODING_DTS_HD:
                case ENCODING_IEC61937:
                case ENCODING_AMRNB:
                case ENCODING_AMRWB:
                case ENCODING_EVRC:
                case ENCODING_EVRCB:
                case ENCODING_EVRCWB:
                case ENCODING_EVRCNW:
                    mEncoding = encoding;
                    break;
                case ENCODING_INVALID:
@@ -980,7 +1036,13 @@ public final class AudioFormat implements Parcelable {
        ENCODING_E_AC3,
        ENCODING_DTS,
        ENCODING_DTS_HD,
        ENCODING_IEC61937
        ENCODING_IEC61937,
        ENCODING_AMRNB,
        ENCODING_AMRWB,
        ENCODING_EVRC,
        ENCODING_EVRCB,
        ENCODING_EVRCWB,
        ENCODING_EVRCNW
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface Encoding {}
+9 −0
Original line number Diff line number Diff line
@@ -700,6 +700,12 @@ public class AudioRecord implements AudioRouting
        case AudioFormat.ENCODING_PCM_FLOAT:
        case AudioFormat.ENCODING_PCM_16BIT:
        case AudioFormat.ENCODING_PCM_8BIT:
        case AudioFormat.ENCODING_AMRNB:
        case AudioFormat.ENCODING_AMRWB:
        case AudioFormat.ENCODING_EVRC:
        case AudioFormat.ENCODING_EVRCB:
        case AudioFormat.ENCODING_EVRCWB:
        case AudioFormat.ENCODING_EVRCNW:
            mAudioFormat = audioFormat;
            break;
        default:
@@ -936,6 +942,9 @@ public class AudioRecord implements AudioRouting
        case (AudioFormat.CHANNEL_IN_FRONT | AudioFormat.CHANNEL_IN_BACK):
            channelCount = 2;
            break;
        case AudioFormat.CHANNEL_IN_5POINT1:
            channelCount = 6;
            break;
        case AudioFormat.CHANNEL_INVALID:
        default:
            loge("getMinBufferSize(): Invalid channel configuration.");
+21 −1
Original line number Diff line number Diff line
@@ -46,6 +46,18 @@ public class MediaFile {
    private static final int FIRST_AUDIO_FILE_TYPE = FILE_TYPE_MP3;
    private static final int LAST_AUDIO_FILE_TYPE = FILE_TYPE_FLAC;

    // More audio file types
    public static final int FILE_TYPE_DTS   = 300;
    public static final int FILE_TYPE_3GPA  = 301;
    public static final int FILE_TYPE_AC3   = 302;
    public static final int FILE_TYPE_QCP   = 303;
    public static final int FILE_TYPE_PCM   = 304;
    public static final int FILE_TYPE_EC3   = 305;
    public static final int FILE_TYPE_AIFF  = 306;
    public static final int FILE_TYPE_APE   = 307;
    private static final int FIRST_AUDIO_FILE_TYPE_EXT = FILE_TYPE_DTS;
    private static final int LAST_AUDIO_FILE_TYPE_EXT = FILE_TYPE_APE;

    // MIDI file types
    public static final int FILE_TYPE_MID     = 11;
    public static final int FILE_TYPE_SMF     = 12;
@@ -265,13 +277,21 @@ public class MediaFile {
        addFileType("ZIP", FILE_TYPE_ZIP, "application/zip");
        addFileType("MPG", FILE_TYPE_MP2PS, "video/mp2p");
        addFileType("MPEG", FILE_TYPE_MP2PS, "video/mp2p");
        addFileType("QCP", FILE_TYPE_QCP, "audio/qcelp");
        addFileType("AC3", FILE_TYPE_AC3, "audio/ac3");
        addFileType("EC3", FILE_TYPE_EC3, "audio/eac3");
        addFileType("AIF", FILE_TYPE_AIFF, "audio/x-aiff");
        addFileType("AIFF", FILE_TYPE_AIFF, "audio/x-aiff");
        addFileType("APE", FILE_TYPE_APE, "audio/x-ape");
    }

    public static boolean isAudioFileType(int fileType) {
        return ((fileType >= FIRST_AUDIO_FILE_TYPE &&
                fileType <= LAST_AUDIO_FILE_TYPE) ||
                (fileType >= FIRST_MIDI_FILE_TYPE &&
                fileType <= LAST_MIDI_FILE_TYPE));
                fileType <= LAST_MIDI_FILE_TYPE) ||
                (fileType >= FIRST_AUDIO_FILE_TYPE_EXT &&
                fileType <= LAST_AUDIO_FILE_TYPE_EXT));
    }

    public static boolean isVideoFileType(int fileType) {
+13 −0
Original line number Diff line number Diff line
@@ -394,6 +394,13 @@ public class MediaRecorder

        /** VP8/VORBIS data in a WEBM container */
        public static final int WEBM = 9;

        /** @hide QCP file format */
        public static final int QCP = 20;

        /** @hide WAVE media file format*/
        public static final int WAVE = 21;

    };

    /**
@@ -418,6 +425,12 @@ public class MediaRecorder
        public static final int AAC_ELD = 5;
        /** Ogg Vorbis audio codec */
        public static final int VORBIS = 6;
        /** @hide EVRC audio codec */
        public static final int EVRC = 10;
        /** @hide QCELP audio codec */
        public static final int QCELP = 11;
        /** @hide Linear PCM audio codec */
        public static final int LPCM = 12;
    }

    /**