diff options
-rw-r--r-- | include/media/MediaProfiles.h | 46 | ||||
-rw-r--r-- | media/java/android/media/videoeditor/MediaArtistNativeHelper.java | 9 | ||||
-rwxr-xr-x | media/java/android/media/videoeditor/MediaImageItem.java | 117 | ||||
-rwxr-xr-x | media/java/android/media/videoeditor/MediaProperties.java | 35 | ||||
-rwxr-xr-x | media/java/android/media/videoeditor/MediaVideoItem.java | 16 | ||||
-rwxr-xr-x | media/java/android/media/videoeditor/VideoEditor.java | 4 | ||||
-rwxr-xr-x | media/java/android/media/videoeditor/VideoEditorImpl.java | 22 | ||||
-rwxr-xr-x | media/java/android/media/videoeditor/VideoEditorProfile.java | 82 | ||||
-rw-r--r-- | media/jni/android_media_MediaProfiles.cpp | 52 | ||||
-rwxr-xr-x | media/jni/mediaeditor/VideoEditorClasses.cpp | 7 | ||||
-rwxr-xr-x | media/jni/mediaeditor/VideoEditorPropertiesMain.cpp | 12 | ||||
-rw-r--r-- | media/libmedia/MediaProfiles.cpp | 64 |
12 files changed, 377 insertions, 89 deletions
diff --git a/include/media/MediaProfiles.h b/include/media/MediaProfiles.h index ed26e63..69d5001 100644 --- a/include/media/MediaProfiles.h +++ b/include/media/MediaProfiles.h @@ -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, }; @@ -117,6 +129,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. */ Vector<audio_encoder> getAudioEncoders() const; @@ -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 diff --git a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java index 0d2bcd5..6b0fb12 100644 --- a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java +++ b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java @@ -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) diff --git a/media/java/android/media/videoeditor/MediaImageItem.java b/media/java/android/media/videoeditor/MediaImageItem.java index 4faa83a..73cc7e2 100755 --- a/media/java/android/media/videoeditor/MediaImageItem.java +++ b/media/java/android/media/videoeditor/MediaImageItem.java @@ -503,51 +503,75 @@ 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); } /** @@ -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(); diff --git a/media/java/android/media/videoeditor/MediaProperties.java b/media/java/android/media/videoeditor/MediaProperties.java index 0225807..ff13e5d 100755 --- a/media/java/android/media/videoeditor/MediaProperties.java +++ b/media/java/android/media/videoeditor/MediaProperties.java @@ -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; } /** diff --git a/media/java/android/media/videoeditor/MediaVideoItem.java b/media/java/android/media/videoeditor/MediaVideoItem.java index 4758de6..6248651 100755 --- a/media/java/android/media/videoeditor/MediaVideoItem.java +++ b/media/java/android/media/videoeditor/MediaVideoItem.java @@ -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: diff --git a/media/java/android/media/videoeditor/VideoEditor.java b/media/java/android/media/videoeditor/VideoEditor.java index 59e4540..720e8022 100755 --- a/media/java/android/media/videoeditor/VideoEditor.java +++ b/media/java/android/media/videoeditor/VideoEditor.java @@ -370,7 +370,7 @@ public interface VideoEditor { */ public void export(String filename, int height, int bitrate, ExportProgressListener listener) - throws IOException; + throws IOException; /** * Create the output movie based on all media items added and the applied @@ -413,7 +413,7 @@ public interface VideoEditor { */ public void export(String filename, int height, int bitrate, int audioCodec, int videoCodec, ExportProgressListener listener) - throws IOException; + throws IOException; /** * Cancel the running export operation. This method blocks until the export diff --git a/media/java/android/media/videoeditor/VideoEditorImpl.java b/media/java/android/media/videoeditor/VideoEditorImpl.java index 649b98a..ea7fe63 100755 --- a/media/java/android/media/videoeditor/VideoEditorImpl.java +++ b/media/java/android/media/videoeditor/VideoEditorImpl.java @@ -337,7 +337,8 @@ public class VideoEditorImpl implements VideoEditor { */ public void export(String filename, int height, int bitrate, int audioCodec, int videoCodec, - ExportProgressListener listener) throws IOException { + ExportProgressListener listener) + throws IOException { switch (audioCodec) { case MediaProperties.ACODEC_AAC_LC: @@ -372,7 +373,8 @@ public class VideoEditorImpl implements VideoEditor { * {@inheritDoc} */ public void export(String filename, int height, int bitrate, - ExportProgressListener listener) throws IOException { + ExportProgressListener listener) + throws IOException { if (filename == null) { throw new IllegalArgumentException("export: filename is null"); } @@ -386,6 +388,20 @@ public class VideoEditorImpl implements VideoEditor { throw new IllegalStateException("No MediaItems added"); } + /** 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 maxOutputHeight = veProfile.maxOutputVideoFrameHeight; + final int maxOutputWidth = veProfile.maxOutputVideoFrameWidth; + if (height > maxOutputHeight) { + throw new IllegalArgumentException( + "Unsupported export resolution. Supported maximum width:" + + maxOutputWidth + " height:" + maxOutputHeight + + " current height:" + height); + } + switch (height) { case MediaProperties.HEIGHT_144: break; @@ -397,6 +413,8 @@ public class VideoEditorImpl implements VideoEditor { break; case MediaProperties.HEIGHT_720: break; + case MediaProperties.HEIGHT_1080: + break; default: { String message = "Unsupported height value " + height; diff --git a/media/java/android/media/videoeditor/VideoEditorProfile.java b/media/java/android/media/videoeditor/VideoEditorProfile.java new file mode 100755 index 0000000..7d9fc8f --- /dev/null +++ b/media/java/android/media/videoeditor/VideoEditorProfile.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.media.videoeditor; + +/** + * The VideoEditorProfile class is used to retrieve the + * predefined videoeditor profile settings for videoeditor applications. + * These settings are read-only. + * + * <p>The videoeditor profile specifies the following set of parameters: + * <ul> + * <li> max input video frame width + * <li> max input video frame height + * <li> max output video frame width + * <li> max output video frame height + * </ul> + * {@hide} + */ +public class VideoEditorProfile +{ + /** + * The max input video frame width + */ + public int maxInputVideoFrameWidth; + + /** + * The max input video frame height + */ + public int maxInputVideoFrameHeight; + + /** + * The max ouput video frame width + */ + public int maxOutputVideoFrameWidth; + + /** + * The max ouput video frame height + */ + public int maxOutputVideoFrameHeight; + + /** + * Returns the videoeditor profile + */ + public static VideoEditorProfile get() { + return native_get_videoeditor_profile(); + } + + static { + System.loadLibrary("media_jni"); + native_init(); + } + + // Private constructor called by JNI + private VideoEditorProfile(int inputWidth, + int inputHeight, + int outputWidth, + int outputHeight) { + + this.maxInputVideoFrameWidth = inputWidth; + this.maxInputVideoFrameHeight = inputHeight; + this.maxOutputVideoFrameWidth = outputWidth; + this.maxOutputVideoFrameHeight = outputHeight; + } + + // Methods implemented by JNI + private static native final void native_init(); + private static native final VideoEditorProfile + native_get_videoeditor_profile(); +} diff --git a/media/jni/android_media_MediaProfiles.cpp b/media/jni/android_media_MediaProfiles.cpp index 08a6de1..2b8dfe4 100644 --- a/media/jni/android_media_MediaProfiles.cpp +++ b/media/jni/android_media_MediaProfiles.cpp @@ -286,6 +286,44 @@ android_media_MediaProfiles_native_get_image_encoding_quality_level(JNIEnv *env, } return static_cast<jint>(levels[index]); } +static jobject +android_media_MediaProfiles_native_get_videoeditor_profile(JNIEnv *env, jobject thiz) +{ + LOGV("native_get_videoeditor_profile"); + + int maxInputFrameWidth = + sProfiles->getVideoEditorCapParamByName("videoeditor.input.width.max"); + int maxInputFrameHeight = + sProfiles->getVideoEditorCapParamByName("videoeditor.input.height.max"); + int maxOutputFrameWidth = + sProfiles->getVideoEditorCapParamByName("videoeditor.output.width.max"); + int maxOutputFrameHeight = + sProfiles->getVideoEditorCapParamByName("videoeditor.output.height.max"); + + // Check on the values retrieved + if (maxInputFrameWidth == -1 || maxInputFrameHeight == -1 || + maxOutputFrameWidth == -1 || maxOutputFrameHeight == -1) { + + jniThrowException(env, "java/lang/RuntimeException",\ + "Error retrieving videoeditor profile params"); + return NULL; + } + LOGV("native_get_videoeditor_profile \ + inWidth:%d inHeight:%d,outWidth:%d, outHeight:%d",\ + maxInputFrameWidth,maxInputFrameHeight,\ + maxOutputFrameWidth,maxOutputFrameHeight); + + jclass VideoEditorProfileClazz = + env->FindClass("android/media/videoeditor/VideoEditorProfile"); + jmethodID VideoEditorProfileConstructorMethodID = + env->GetMethodID(VideoEditorProfileClazz, "<init>", "(IIII)V"); + return env->NewObject(VideoEditorProfileClazz, + VideoEditorProfileConstructorMethodID, + maxInputFrameWidth, + maxInputFrameHeight, + maxOutputFrameWidth, + maxOutputFrameHeight); +} static JNINativeMethod gMethodsForEncoderCapabilitiesClass[] = { {"native_init", "()V", (void *)android_media_MediaProfiles_native_init}, @@ -324,10 +362,17 @@ static JNINativeMethod gMethodsForCameraProfileClass[] = { {"native_get_image_encoding_quality_level","(II)I", (void *)android_media_MediaProfiles_native_get_image_encoding_quality_level}, }; +static JNINativeMethod gMethodsForVideoEditorProfileClass[] = { + {"native_init", "()V", (void *)android_media_MediaProfiles_native_init}, + {"native_get_videoeditor_profile", "()Landroid/media/videoeditor/VideoEditorProfile;", + (void *)android_media_MediaProfiles_native_get_videoeditor_profile}, +}; + static const char* const kEncoderCapabilitiesClassPathName = "android/media/EncoderCapabilities"; static const char* const kDecoderCapabilitiesClassPathName = "android/media/DecoderCapabilities"; static const char* const kCamcorderProfileClassPathName = "android/media/CamcorderProfile"; static const char* const kCameraProfileClassPathName = "android/media/CameraProfile"; +static const char* const kVideoEditorProfileClassPathName = "android/media/videoeditor/VideoEditorProfile"; // This function only registers the native methods, and is called from // JNI_OnLoad in android_media_MediaPlayer.cpp @@ -353,6 +398,11 @@ int register_android_media_MediaProfiles(JNIEnv *env) gMethodsForCameraProfileClass, NELEM(gMethodsForCameraProfileClass)); + int ret5 = AndroidRuntime::registerNativeMethods(env, + kVideoEditorProfileClassPathName, + gMethodsForVideoEditorProfileClass, + NELEM(gMethodsForVideoEditorProfileClass)); + // Success if all return values from above are 0 - return (ret1 || ret2 || ret3 || ret4); + return (ret1 || ret2 || ret3 || ret4 || ret5); } diff --git a/media/jni/mediaeditor/VideoEditorClasses.cpp b/media/jni/mediaeditor/VideoEditorClasses.cpp index 277e16c..4c0e731 100755 --- a/media/jni/mediaeditor/VideoEditorClasses.cpp +++ b/media/jni/mediaeditor/VideoEditorClasses.cpp @@ -439,9 +439,10 @@ VIDEOEDIT_JAVA_DEFINE_CONSTANTS(VideoFrameSize) VIDEOEDIT_JAVA_CONSTANT_INIT("NTSC", M4VIDEOEDITING_kNTSC), VIDEOEDIT_JAVA_CONSTANT_INIT("nHD", M4VIDEOEDITING_k640_360), VIDEOEDIT_JAVA_CONSTANT_INIT("WVGA16x9", M4VIDEOEDITING_k854_480), - VIDEOEDIT_JAVA_CONSTANT_INIT("V720p", M4VIDEOEDITING_kHD1280), - VIDEOEDIT_JAVA_CONSTANT_INIT("W720p", M4VIDEOEDITING_kHD1080), - VIDEOEDIT_JAVA_CONSTANT_INIT("S720p", M4VIDEOEDITING_kHD960) + VIDEOEDIT_JAVA_CONSTANT_INIT("V720p", M4VIDEOEDITING_k1280_720), + VIDEOEDIT_JAVA_CONSTANT_INIT("W720p", M4VIDEOEDITING_k1080_720), + VIDEOEDIT_JAVA_CONSTANT_INIT("S720p", M4VIDEOEDITING_k960_720), + VIDEOEDIT_JAVA_CONSTANT_INIT("V1080p", M4VIDEOEDITING_k1920_1080) }; VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(VideoFrameSize, VIDEO_FRAME_SIZE_CLASS_NAME, diff --git a/media/jni/mediaeditor/VideoEditorPropertiesMain.cpp b/media/jni/mediaeditor/VideoEditorPropertiesMain.cpp index 9de7207..93fe702 100755 --- a/media/jni/mediaeditor/VideoEditorPropertiesMain.cpp +++ b/media/jni/mediaeditor/VideoEditorPropertiesMain.cpp @@ -214,18 +214,6 @@ jobject videoEditProp_getProperties( "Invalid File or File not found "); } - /** - * Max resolution supported is 1280 x 720. - */ - if ( (pClipProperties->uiVideoWidth > 1280) - || (pClipProperties->uiVideoHeight > 720) ) - { - result = M4MCS_ERR_INVALID_INPUT_VIDEO_FRAME_SIZE; - videoEditJava_checkAndThrowIllegalArgumentException( - &gotten, pEnv, (M4NO_ERROR != result), - "Unsupported input video frame size"); - } - #ifdef USE_SOFTWARE_DECODER /** * Input clip with non-multiples of 16 is not supported. diff --git a/media/libmedia/MediaProfiles.cpp b/media/libmedia/MediaProfiles.cpp index 069bbb7..f0f07a2 100644 --- a/media/libmedia/MediaProfiles.cpp +++ b/media/libmedia/MediaProfiles.cpp @@ -132,6 +132,16 @@ MediaProfiles::logAudioDecoderCap(const MediaProfiles::AudioDecoderCap& cap) LOGV("codec = %d", cap.mCodec); } +/*static*/ void +MediaProfiles::logVideoEditorCap(const MediaProfiles::VideoEditorCap& cap) +{ + LOGV("videoeditor cap:"); + LOGV("mMaxInputFrameWidth = %d", cap.mMaxInputFrameWidth); + LOGV("mMaxInputFrameHeight = %d", cap.mMaxInputFrameHeight); + LOGV("mMaxOutputFrameWidth = %d", cap.mMaxOutputFrameWidth); + LOGV("mMaxOutputFrameHeight = %d", cap.mMaxOutputFrameHeight); +} + /*static*/ int MediaProfiles::findTagForName(const MediaProfiles::NameToTagMap *map, size_t nMappings, const char *name) { @@ -368,6 +378,24 @@ void MediaProfiles::addStartTimeOffset(int cameraId, const char** atts) mStartTimeOffsets.replaceValueFor(cameraId, offsetTimeMs); } +/*static*/ MediaProfiles::VideoEditorCap* +MediaProfiles::createVideoEditorCap(const char **atts, MediaProfiles *profiles) +{ + CHECK(!strcmp("maxInputFrameWidth", atts[0]) && + !strcmp("maxInputFrameHeight", atts[2]) && + !strcmp("maxOutputFrameWidth", atts[4]) && + !strcmp("maxOutputFrameHeight", atts[6])); + + MediaProfiles::VideoEditorCap *pVideoEditorCap = + new MediaProfiles::VideoEditorCap(atoi(atts[1]), atoi(atts[3]), + atoi(atts[5]), atoi(atts[7])); + + logVideoEditorCap(*pVideoEditorCap); + profiles->mVideoEditorCap = pVideoEditorCap; + + return pVideoEditorCap; +} + /*static*/ void MediaProfiles::startElementHandler(void *userData, const char *name, const char **atts) { @@ -398,6 +426,8 @@ MediaProfiles::startElementHandler(void *userData, const char *name, const char createCamcorderProfile(profiles->mCurrentCameraId, atts, profiles->mCameraIds)); } else if (strcmp("ImageEncoding", name) == 0) { profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts); + } else if (strcmp("VideoEditorCap", name) == 0) { + createVideoEditorCap(atts, profiles); } } @@ -790,6 +820,17 @@ MediaProfiles::createDefaultImageEncodingQualityLevels(MediaProfiles *profiles) profiles->mImageEncodingQualityLevels.add(levels); } +/*static*/ void +MediaProfiles::createDefaultVideoEditorCap(MediaProfiles *profiles) +{ + profiles->mVideoEditorCap = + new MediaProfiles::VideoEditorCap( + VIDEOEDITOR_DEFAULT_MAX_INPUT_FRAME_WIDTH, + VIDEOEDITOR_DEFUALT_MAX_INPUT_FRAME_HEIGHT, + VIDEOEDITOR_DEFAULT_MAX_OUTPUT_FRAME_WIDTH, + VIDEOEDITOR_DEFUALT_MAX_OUTPUT_FRAME_HEIGHT); +} + /*static*/ MediaProfiles* MediaProfiles::createDefaultInstance() { @@ -801,6 +842,7 @@ MediaProfiles::createDefaultInstance() createDefaultAudioDecoders(profiles); createDefaultEncoderOutputFileFormats(profiles); createDefaultImageEncodingQualityLevels(profiles); + createDefaultVideoEditorCap(profiles); return profiles; } @@ -899,6 +941,28 @@ int MediaProfiles::getVideoEncoderParamByName(const char *name, video_encoder co return -1; } +int MediaProfiles::getVideoEditorCapParamByName(const char *name) const +{ + LOGV("getVideoEditorCapParamByName: %s", name); + + if (mVideoEditorCap == NULL) { + LOGE("The mVideoEditorCap is not created, then create default cap."); + createDefaultVideoEditorCap(sInstance); + } + + if (!strcmp("videoeditor.input.width.max", name)) + return mVideoEditorCap->mMaxInputFrameWidth; + if (!strcmp("videoeditor.input.height.max", name)) + return mVideoEditorCap->mMaxInputFrameHeight; + if (!strcmp("videoeditor.output.width.max", name)) + return mVideoEditorCap->mMaxOutputFrameWidth; + if (!strcmp("videoeditor.output.height.max", name)) + return mVideoEditorCap->mMaxOutputFrameHeight; + + LOGE("The given video editor param name %s is not found", name); + return -1; +} + Vector<audio_encoder> MediaProfiles::getAudioEncoders() const { Vector<audio_encoder> encoders; |