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

Commit 432fb8ec authored by Hong Teng's avatar Hong Teng Committed by Android (Google) Code Review
Browse files

Merge "fix for issue 4142219 Don't hard code platform-specific limitations-jni/java part"

parents 598b6fe8 600acf14
Loading
Loading
Loading
Loading
+45 −1
Original line number Diff line number Diff line
@@ -45,6 +45,18 @@ enum camcorder_quality {
    CAMCORDER_QUALITY_TIME_LAPSE_LIST_END = 1006,
};

/**
 *Set CIF as default maximum import and export resolution of video editor.
 *The maximum import and export resolutions are platform specific,
 *which should be defined in media_profiles.xml.
 */
enum videoeditor_capability {
    VIDEOEDITOR_DEFAULT_MAX_INPUT_FRAME_WIDTH = 352,
    VIDEOEDITOR_DEFUALT_MAX_INPUT_FRAME_HEIGHT = 288,
    VIDEOEDITOR_DEFAULT_MAX_OUTPUT_FRAME_WIDTH = 352,
    VIDEOEDITOR_DEFUALT_MAX_OUTPUT_FRAME_HEIGHT = 288,
};

enum video_decoder {
    VIDEO_DECODER_WMV,
};
@@ -116,6 +128,17 @@ public:
     */
    int getVideoEncoderParamByName(const char *name, video_encoder codec) const;

    /**
     * Returns the value for the given param name for the video editor cap
     * param or -1 if error.
     * Supported param name are:
     * videoeditor.input.width.max - max input video frame width
     * videoeditor.input.height.max - max input video frame height
     * videoeditor.output.width.max - max output video frame width
     * videoeditor.output.height.max - max output video frame height
     */
    int getVideoEditorCapParamByName(const char *name) const;

    /**
     * Returns the audio encoders supported.
     */
@@ -164,7 +187,7 @@ private:

    MediaProfiles& operator=(const MediaProfiles&);  // Don't call me
    MediaProfiles(const MediaProfiles&);             // Don't call me
    MediaProfiles() {}                               // Dummy default constructor
    MediaProfiles() { mVideoEditorCap = NULL; }        // Dummy default constructor
    ~MediaProfiles();                                // Don't delete me

    struct VideoCodec {
@@ -310,6 +333,22 @@ private:
        Vector<int> mLevels;
    };

    struct VideoEditorCap {
        VideoEditorCap(int inFrameWidth, int inFrameHeight,
            int outFrameWidth, int outFrameHeight)
            : mMaxInputFrameWidth(inFrameWidth),
              mMaxInputFrameHeight(inFrameHeight),
              mMaxOutputFrameWidth(outFrameWidth),
              mMaxOutputFrameHeight(outFrameHeight) {}

        ~VideoEditorCap() {}

        int mMaxInputFrameWidth;
        int mMaxInputFrameHeight;
        int mMaxOutputFrameWidth;
        int mMaxOutputFrameHeight;
    };

    int getCamcorderProfileIndex(int cameraId, camcorder_quality quality) const;
    void initRequiredProfileRefs(const Vector<int>& cameraIds);
    int getRequiredProfileRefIndex(int cameraId);
@@ -321,6 +360,7 @@ private:
    static void logAudioEncoderCap(const AudioEncoderCap& cap);
    static void logVideoDecoderCap(const VideoDecoderCap& cap);
    static void logAudioDecoderCap(const AudioDecoderCap& cap);
    static void logVideoEditorCap(const VideoEditorCap& cap);

    // If the xml configuration file does exist, use the settings
    // from the xml
@@ -332,6 +372,8 @@ private:
    static VideoDecoderCap* createVideoDecoderCap(const char **atts);
    static VideoEncoderCap* createVideoEncoderCap(const char **atts);
    static AudioEncoderCap* createAudioEncoderCap(const char **atts);
    static VideoEditorCap* createVideoEditorCap(
                const char **atts, MediaProfiles *profiles);

    static CamcorderProfile* createCamcorderProfile(
                int cameraId, const char **atts, Vector<int>& cameraIds);
@@ -375,6 +417,7 @@ private:
    static void createDefaultEncoderOutputFileFormats(MediaProfiles *profiles);
    static void createDefaultImageEncodingQualityLevels(MediaProfiles *profiles);
    static void createDefaultImageDecodingMaxMemory(MediaProfiles *profiles);
    static void createDefaultVideoEditorCap(MediaProfiles *profiles);
    static VideoEncoderCap* createDefaultH263VideoEncoderCap();
    static VideoEncoderCap* createDefaultM4vVideoEncoderCap();
    static AudioEncoderCap* createDefaultAmrNBEncoderCap();
@@ -431,6 +474,7 @@ private:

    RequiredProfiles *mRequiredProfileRefs;
    Vector<int>              mCameraIds;
    VideoEditorCap* mVideoEditorCap;
};

}; // namespace android
+7 −2
Original line number Diff line number Diff line
@@ -912,11 +912,14 @@ class MediaArtistNativeHelper {
        /** 720p 1280 X 720 */
        public static final int V720p = 10;

        /** 1080 x 720 */
        /** W720p 1080 x 720 */
        public static final int W720p = 11;

        /** 1080 960 x 720 */
        /** S720p 960 x 720 */
        public static final int S720p = 12;

        /** 1080p 1920 x 1080 */
        public static final int V1080p = 13;
    }

    /**
@@ -3548,6 +3551,8 @@ class MediaArtistNativeHelper {
                    retValue = VideoFrameSize.WVGA16x9;
                else if (height == MediaProperties.HEIGHT_720)
                    retValue = VideoFrameSize.V720p;
                else if (height == MediaProperties.HEIGHT_1080)
                    retValue = VideoFrameSize.V1080p;
                break;
            case MediaProperties.ASPECT_RATIO_4_3:
                if (height == MediaProperties.HEIGHT_480)
+56 −61
Original line number Diff line number Diff line
@@ -503,53 +503,77 @@ public class MediaImageItem extends MediaItem {

        return adjustedOverlays;
    }


    /**
     * This function sets the Ken Burn effect generated clip
     * name.
     * This function get the proper width by given aspect ratio
     * and height.
     *
     * @param generatedFilePath The name of the generated clip
     * @param aspectRatio  Given aspect ratio
     * @param height  Given height
     */
    @Override
    void setGeneratedImageClip(String generatedFilePath) {
        super.setGeneratedImageClip(generatedFilePath);

    private int getWidthByAspectRatioAndHeight(int aspectRatio, int height) {
        int width = 0;

        // set the Kenburns clip width and height
        mGeneratedClipHeight = getScaledHeight();
        switch (mVideoEditor.getAspectRatio()) {
        switch (aspectRatio) {
            case MediaProperties.ASPECT_RATIO_3_2:
                if (mGeneratedClipHeight == MediaProperties.HEIGHT_480)
                    mGeneratedClipWidth = 720;
                else if (mGeneratedClipHeight == MediaProperties.HEIGHT_720)
                    mGeneratedClipWidth = 1080;
                if (height == MediaProperties.HEIGHT_480)
                    width = 720;
                else if (height == MediaProperties.HEIGHT_720)
                    width = 1080;
                break;

            case MediaProperties.ASPECT_RATIO_16_9:
                if (mGeneratedClipHeight == MediaProperties.HEIGHT_360)
                    mGeneratedClipWidth = 640;
                else if (mGeneratedClipHeight == MediaProperties.HEIGHT_480)
                    mGeneratedClipWidth = 854;
                else if (mGeneratedClipHeight == MediaProperties.HEIGHT_720)
                    mGeneratedClipWidth = 1280;
                if (height == MediaProperties.HEIGHT_360)
                    width = 640;
                else if (height == MediaProperties.HEIGHT_480)
                    width = 854;
                else if (height == MediaProperties.HEIGHT_720)
                    width = 1280;
                else if (height == MediaProperties.HEIGHT_1080)
                    width = 1920;
                break;

            case MediaProperties.ASPECT_RATIO_4_3:
                if (mGeneratedClipHeight == MediaProperties.HEIGHT_480)
                    mGeneratedClipWidth = 640;
                if (mGeneratedClipHeight == MediaProperties.HEIGHT_720)
                    mGeneratedClipWidth = 960;
                if (height == MediaProperties.HEIGHT_480)
                    width = 640;
                if (height == MediaProperties.HEIGHT_720)
                    width = 960;
                break;

            case MediaProperties.ASPECT_RATIO_5_3:
                if (mGeneratedClipHeight == MediaProperties.HEIGHT_480)
                    mGeneratedClipWidth = 800;
                if (height == MediaProperties.HEIGHT_480)
                    width = 800;
                break;

            case MediaProperties.ASPECT_RATIO_11_9:
                if (mGeneratedClipHeight == MediaProperties.HEIGHT_144)
                    mGeneratedClipWidth = 176;
                if (height == MediaProperties.HEIGHT_144)
                    width = 176;
                break;

            default : {
                throw new IllegalArgumentException(
                    "Illegal arguments for aspectRatio");
            }
        }

        return width;
    }

    /**
     * This function sets the Ken Burn effect generated clip
     * name.
     *
     * @param generatedFilePath The name of the generated clip
     */
    @Override
    void setGeneratedImageClip(String generatedFilePath) {
        super.setGeneratedImageClip(generatedFilePath);

        // set the Kenburns clip width and height
        mGeneratedClipHeight = getScaledHeight();
        mGeneratedClipWidth = getWidthByAspectRatioAndHeight(
                mVideoEditor.getAspectRatio(), mGeneratedClipHeight);
    }

    /**
     * @return The name of the image clip
     * generated with ken burns effect.
@@ -841,37 +865,8 @@ public class MediaImageItem extends MediaItem {
            clipSettings.fileType = FileType.THREE_GPP;

            mGeneratedClipHeight = getScaledHeight();
            switch (mVideoEditor.getAspectRatio()) {
                case MediaProperties.ASPECT_RATIO_3_2:
                    if (mGeneratedClipHeight == MediaProperties.HEIGHT_480)
                        mGeneratedClipWidth = 720;
                    else if (mGeneratedClipHeight == MediaProperties.HEIGHT_720)
                        mGeneratedClipWidth = 1080;
                    break;
                case MediaProperties.ASPECT_RATIO_16_9:
                    if (mGeneratedClipHeight == MediaProperties.HEIGHT_360)
                        mGeneratedClipWidth = 640;
                    else if (mGeneratedClipHeight == MediaProperties.HEIGHT_480)
                        mGeneratedClipWidth = 854;
                    else if (mGeneratedClipHeight == MediaProperties.HEIGHT_720)
                        mGeneratedClipWidth = 1280;
                    break;
                case MediaProperties.ASPECT_RATIO_4_3:
                    if (mGeneratedClipHeight == MediaProperties.HEIGHT_480)
                        mGeneratedClipWidth = 640;
                    if (mGeneratedClipHeight == MediaProperties.HEIGHT_720)
                        mGeneratedClipWidth = 960;
                    break;
                case MediaProperties.ASPECT_RATIO_5_3:
                    if (mGeneratedClipHeight == MediaProperties.HEIGHT_480)
                        mGeneratedClipWidth = 800;
                    break;
                case MediaProperties.ASPECT_RATIO_11_9:
                    if (mGeneratedClipHeight == MediaProperties.HEIGHT_144)
                        mGeneratedClipWidth = 176;
                    break;
            }

            mGeneratedClipWidth = getWidthByAspectRatioAndHeight(
                    mVideoEditor.getAspectRatio(), mGeneratedClipHeight);
        } else {
            if (getGeneratedImageClip() == null) {
                clipSettings.clipPath = getDecodedImageFileName();
+30 −5
Original line number Diff line number Diff line
@@ -17,8 +17,9 @@

package android.media.videoeditor;

import android.media.videoeditor.VideoEditorProfile;
import android.util.Pair;

import java.lang.System;
/**
 * This class defines all properties of a media file such as supported height,
 * aspect ratio, bitrate for export function.
@@ -33,7 +34,7 @@ public class MediaProperties {
    public static final int HEIGHT_360 = 360;
    public static final int HEIGHT_480 = 480;
    public static final int HEIGHT_720 = 720;
    public static final int HEIGHT_1088 = 1088;
    public static final int HEIGHT_1080 = 1080;

    /**
     *  Supported aspect ratios
@@ -63,8 +64,7 @@ public class MediaProperties {
    private static final Pair<Integer, Integer>[] ASPECT_RATIO_3_2_RESOLUTIONS =
        new Pair[] {
        new Pair<Integer, Integer>(720, HEIGHT_480),
//*tmpLSA*/        new Pair<Integer, Integer>(1080, HEIGHT_720)
/*tmpLSA*/        new Pair<Integer, Integer>(1088, HEIGHT_720)
        new Pair<Integer, Integer>(1080, HEIGHT_720)
    };

    @SuppressWarnings({"unchecked"})
@@ -92,6 +92,7 @@ public class MediaProperties {
        new Pair[] {
        new Pair<Integer, Integer>(848, HEIGHT_480),
        new Pair<Integer, Integer>(1280, HEIGHT_720),
        new Pair<Integer, Integer>(1920, HEIGHT_1080),
    };

    /**
@@ -345,7 +346,31 @@ public class MediaProperties {
            }
        }

        return resolutions;
        /** Check the platform specific maximum export resolution */
        VideoEditorProfile veProfile = VideoEditorProfile.get();
        if (veProfile == null) {
            throw new RuntimeException("Can't get the video editor profile");
        }
        final int maxWidth = veProfile.maxOutputVideoFrameWidth;
        final int maxHeight = veProfile.maxOutputVideoFrameHeight;
        Pair<Integer, Integer>[] tmpResolutions = new Pair[resolutions.length];
        int numSupportedResolution = 0;
        int i = 0;

        /** Get supported resolution list */
        for (i = 0; i < resolutions.length; i++) {
            if ((resolutions[i].first <= maxWidth) &&
                (resolutions[i].second <= maxHeight)) {
                tmpResolutions[numSupportedResolution] = resolutions[i];
                numSupportedResolution++;
            }
        }
        final Pair<Integer, Integer>[] supportedResolutions =
            new Pair[numSupportedResolution];
        System.arraycopy(tmpResolutions, 0,
            supportedResolutions, 0, numSupportedResolution);

        return supportedResolutions;
    }

    /**
+16 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import java.lang.ref.SoftReference;
import android.graphics.Bitmap;
import android.media.videoeditor.MediaArtistNativeHelper.ClipSettings;
import android.media.videoeditor.MediaArtistNativeHelper.Properties;
import android.media.videoeditor.VideoEditorProfile;
import android.view.Surface;
import android.view.SurfaceHolder;

@@ -118,6 +119,21 @@ public class MediaVideoItem extends MediaItem {
            throw new IllegalArgumentException(e.getMessage() + " : " + filename);
        }

        /** Check the platform specific maximum import resolution */
        VideoEditorProfile veProfile = VideoEditorProfile.get();
        if (veProfile == null) {
            throw new RuntimeException("Can't get the video editor profile");
        }
        final int maxInputWidth = veProfile.maxInputVideoFrameWidth;
        final int maxInputHeight = veProfile.maxInputVideoFrameHeight;
        if ((properties.width > maxInputWidth) ||
            (properties.height > maxInputHeight)) {
            throw new IllegalArgumentException(
                "Unsupported import resolution. Supported maximum width:" +
                maxInputWidth + " height:" + maxInputHeight +
                ", current width:" + properties.width +
                " height:" + properties.height);
        }
        switch (mMANativeHelper.getFileType(properties.fileType)) {
            case MediaProperties.FILE_3GP:
            case MediaProperties.FILE_MP4:
Loading