Merge "Bug fix: 3419287 Deleted images and video clips invalidate the entire project" into honeycomb
This commit is contained in:
committed by
Android (Google) Code Review
commit
ed2c513337
@@ -33,6 +33,8 @@ import org.xmlpull.v1.XmlSerializer;
|
|||||||
|
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
|
import android.media.videoeditor.MediaImageItem;
|
||||||
|
import android.media.videoeditor.MediaItem;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Xml;
|
import android.util.Xml;
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
@@ -772,8 +774,7 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
return mediaItem;
|
return mediaItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized MediaItem removeMediaItem(String mediaItemId,
|
private synchronized MediaItem removeMediaItem(String mediaItemId, boolean flag) {
|
||||||
boolean flag) {
|
|
||||||
final String firstItemString = mMediaItems.get(0).getId();
|
final String firstItemString = mMediaItems.get(0).getId();
|
||||||
|
|
||||||
final MediaItem mediaItem = getMediaItem(mediaItemId);
|
final MediaItem mediaItem = getMediaItem(mediaItemId);
|
||||||
@@ -879,14 +880,15 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
/**
|
/**
|
||||||
* the project form XML
|
* the project form XML
|
||||||
*/
|
*/
|
||||||
private void load() throws FileNotFoundException, XmlPullParserException,
|
private void load() throws FileNotFoundException, XmlPullParserException, IOException {
|
||||||
IOException {
|
|
||||||
final File file = new File(mProjectPath, PROJECT_FILENAME);
|
final File file = new File(mProjectPath, PROJECT_FILENAME);
|
||||||
/**
|
/**
|
||||||
* Load the metadata
|
* Load the metadata
|
||||||
*/
|
*/
|
||||||
final FileInputStream fis = new FileInputStream(file);
|
final FileInputStream fis = new FileInputStream(file);
|
||||||
try {
|
try {
|
||||||
|
final List<String> ignoredMediaItems = new ArrayList<String>();
|
||||||
|
|
||||||
final XmlPullParser parser = Xml.newPullParser();
|
final XmlPullParser parser = Xml.newPullParser();
|
||||||
parser.setInput(fis, "UTF-8");
|
parser.setInput(fis, "UTF-8");
|
||||||
int eventType = parser.getEventType();
|
int eventType = parser.getEventType();
|
||||||
@@ -898,74 +900,43 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
case XmlPullParser.START_TAG: {
|
case XmlPullParser.START_TAG: {
|
||||||
name = parser.getName();
|
name = parser.getName();
|
||||||
if (TAG_PROJECT.equals(name)) {
|
if (TAG_PROJECT.equals(name)) {
|
||||||
mAspectRatio =
|
mAspectRatio = Integer.parseInt(parser.getAttributeValue("",
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_ASPECT_RATIO));
|
ATTR_ASPECT_RATIO));
|
||||||
|
|
||||||
final boolean mRegenPCM =
|
final boolean mRegenPCM =
|
||||||
Boolean.parseBoolean(parser.getAttributeValue("",
|
Boolean.parseBoolean(parser.getAttributeValue("",
|
||||||
ATTR_REGENERATE_PCM));
|
ATTR_REGENERATE_PCM));
|
||||||
mMANativeHelper.setAudioflag(mRegenPCM);
|
mMANativeHelper.setAudioflag(mRegenPCM);
|
||||||
|
|
||||||
} else if (TAG_MEDIA_ITEM.equals(name)) {
|
} else if (TAG_MEDIA_ITEM.equals(name)) {
|
||||||
final String mediaItemId =
|
final String mediaItemId = parser.getAttributeValue("", ATTR_ID);
|
||||||
parser.getAttributeValue("", ATTR_ID);
|
try {
|
||||||
final String type =
|
currentMediaItem = parseMediaItem(parser);
|
||||||
parser.getAttributeValue("", ATTR_TYPE);
|
|
||||||
final String filename =
|
|
||||||
parser.getAttributeValue("", ATTR_FILENAME);
|
|
||||||
final int renderingMode =
|
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_RENDERING_MODE));
|
|
||||||
|
|
||||||
if (MediaImageItem.class.getSimpleName().equals(type)) {
|
|
||||||
final long durationMs = Long.parseLong(parser.getAttributeValue("",
|
|
||||||
ATTR_DURATION));
|
|
||||||
currentMediaItem = new MediaImageItem(this, mediaItemId, filename,
|
|
||||||
durationMs, renderingMode);
|
|
||||||
} else if (MediaVideoItem.class.getSimpleName().equals(type)) {
|
|
||||||
final long beginMs = Long.parseLong(parser.getAttributeValue("",
|
|
||||||
ATTR_BEGIN_TIME));
|
|
||||||
final long endMs = Long.parseLong(parser.getAttributeValue("",
|
|
||||||
ATTR_END_TIME));
|
|
||||||
final int volume = Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_VOLUME));
|
|
||||||
final boolean muted = Boolean.parseBoolean(parser.getAttributeValue("",
|
|
||||||
ATTR_MUTED));
|
|
||||||
final String audioWaveformFilename = parser.getAttributeValue("",
|
|
||||||
ATTR_AUDIO_WAVEFORM_FILENAME);
|
|
||||||
currentMediaItem = new MediaVideoItem(this, mediaItemId, filename,
|
|
||||||
renderingMode, beginMs, endMs, volume, muted,
|
|
||||||
audioWaveformFilename);
|
|
||||||
|
|
||||||
final long beginTimeMs = Long.parseLong(parser.getAttributeValue("",
|
|
||||||
ATTR_BEGIN_TIME));
|
|
||||||
final long endTimeMs = Long.parseLong(parser.getAttributeValue("",
|
|
||||||
ATTR_END_TIME));
|
|
||||||
((MediaVideoItem)currentMediaItem).setExtractBoundaries(beginTimeMs,
|
|
||||||
endTimeMs);
|
|
||||||
|
|
||||||
final int volumePercent = Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_VOLUME));
|
|
||||||
((MediaVideoItem)currentMediaItem).setVolume(volumePercent);
|
|
||||||
} else {
|
|
||||||
Log.e(TAG, "Unknown media item type: " + type);
|
|
||||||
currentMediaItem = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currentMediaItem != null) {
|
|
||||||
mMediaItems.add(currentMediaItem);
|
mMediaItems.add(currentMediaItem);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Log.w(TAG, "Cannot load media item: " + mediaItemId, ex);
|
||||||
|
currentMediaItem = null;
|
||||||
|
// Ignore the media item
|
||||||
|
ignoredMediaItems.add(mediaItemId);
|
||||||
}
|
}
|
||||||
} else if (TAG_TRANSITION.equals(name)) {
|
} else if (TAG_TRANSITION.equals(name)) {
|
||||||
final Transition transition = parseTransition(parser);
|
try {
|
||||||
|
final Transition transition = parseTransition(parser,
|
||||||
|
ignoredMediaItems);
|
||||||
|
// The transition will be null if the bounding
|
||||||
|
// media items are ignored
|
||||||
if (transition != null) {
|
if (transition != null) {
|
||||||
mTransitions.add(transition);
|
mTransitions.add(transition);
|
||||||
}
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Log.w(TAG, "Cannot load transition", ex);
|
||||||
|
}
|
||||||
} else if (TAG_OVERLAY.equals(name)) {
|
} else if (TAG_OVERLAY.equals(name)) {
|
||||||
if (currentMediaItem != null) {
|
if (currentMediaItem != null) {
|
||||||
|
try {
|
||||||
currentOverlay = parseOverlay(parser, currentMediaItem);
|
currentOverlay = parseOverlay(parser, currentMediaItem);
|
||||||
if (currentOverlay != null) {
|
|
||||||
currentMediaItem.addOverlay(currentOverlay);
|
currentMediaItem.addOverlay(currentOverlay);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Log.w(TAG, "Cannot load overlay", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (TAG_OVERLAY_USER_ATTRIBUTES.equals(name)) {
|
} else if (TAG_OVERLAY_USER_ATTRIBUTES.equals(name)) {
|
||||||
@@ -978,16 +949,16 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
}
|
}
|
||||||
} else if (TAG_EFFECT.equals(name)) {
|
} else if (TAG_EFFECT.equals(name)) {
|
||||||
if (currentMediaItem != null) {
|
if (currentMediaItem != null) {
|
||||||
|
try {
|
||||||
final Effect effect = parseEffect(parser, currentMediaItem);
|
final Effect effect = parseEffect(parser, currentMediaItem);
|
||||||
if (effect != null) {
|
|
||||||
currentMediaItem.addEffect(effect);
|
currentMediaItem.addEffect(effect);
|
||||||
}
|
|
||||||
if (effect instanceof EffectKenBurns) {
|
if (effect instanceof EffectKenBurns) {
|
||||||
final boolean isImageClipGenerated =
|
final boolean isImageClipGenerated =
|
||||||
Boolean.parseBoolean(parser.getAttributeValue("",
|
Boolean.parseBoolean(parser.getAttributeValue("",
|
||||||
ATTR_IS_IMAGE_CLIP_GENERATED));
|
ATTR_IS_IMAGE_CLIP_GENERATED));
|
||||||
if(isImageClipGenerated) {
|
if(isImageClipGenerated) {
|
||||||
String filename = parser.getAttributeValue("",
|
final String filename = parser.getAttributeValue("",
|
||||||
ATTR_GENERATED_IMAGE_CLIP);
|
ATTR_GENERATED_IMAGE_CLIP);
|
||||||
if (new File(filename).exists() == true) {
|
if (new File(filename).exists() == true) {
|
||||||
((MediaImageItem)currentMediaItem).
|
((MediaImageItem)currentMediaItem).
|
||||||
@@ -1007,11 +978,16 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
setRegenerateClip(true);
|
setRegenerateClip(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Log.w(TAG, "Cannot load effect", ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (TAG_AUDIO_TRACK.equals(name)) {
|
} else if (TAG_AUDIO_TRACK.equals(name)) {
|
||||||
|
try {
|
||||||
final AudioTrack audioTrack = parseAudioTrack(parser);
|
final AudioTrack audioTrack = parseAudioTrack(parser);
|
||||||
if (audioTrack != null) {
|
|
||||||
addAudioTrack(audioTrack);
|
addAudioTrack(audioTrack);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Log.w(TAG, "Cannot load audio track", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1041,35 +1017,82 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the media item
|
||||||
|
*
|
||||||
|
* @param parser The parser
|
||||||
|
* @return The media item
|
||||||
|
*/
|
||||||
|
private MediaItem parseMediaItem(XmlPullParser parser) throws IOException {
|
||||||
|
final String mediaItemId = parser.getAttributeValue("", ATTR_ID);
|
||||||
|
final String type = parser.getAttributeValue("", ATTR_TYPE);
|
||||||
|
final String filename = parser.getAttributeValue("", ATTR_FILENAME);
|
||||||
|
final int renderingMode = Integer.parseInt(parser.getAttributeValue("",
|
||||||
|
ATTR_RENDERING_MODE));
|
||||||
|
|
||||||
|
final MediaItem currentMediaItem;
|
||||||
|
if (MediaImageItem.class.getSimpleName().equals(type)) {
|
||||||
|
final long durationMs = Long.parseLong(parser.getAttributeValue("", ATTR_DURATION));
|
||||||
|
currentMediaItem = new MediaImageItem(this, mediaItemId, filename,
|
||||||
|
durationMs, renderingMode);
|
||||||
|
} else if (MediaVideoItem.class.getSimpleName().equals(type)) {
|
||||||
|
final long beginMs = Long.parseLong(parser.getAttributeValue("", ATTR_BEGIN_TIME));
|
||||||
|
final long endMs = Long.parseLong(parser.getAttributeValue("", ATTR_END_TIME));
|
||||||
|
final int volume = Integer.parseInt(parser.getAttributeValue("", ATTR_VOLUME));
|
||||||
|
final boolean muted = Boolean.parseBoolean(parser.getAttributeValue("", ATTR_MUTED));
|
||||||
|
final String audioWaveformFilename = parser.getAttributeValue("",
|
||||||
|
ATTR_AUDIO_WAVEFORM_FILENAME);
|
||||||
|
currentMediaItem = new MediaVideoItem(this, mediaItemId, filename,
|
||||||
|
renderingMode, beginMs, endMs, volume, muted, audioWaveformFilename);
|
||||||
|
|
||||||
|
final long beginTimeMs = Long.parseLong(parser.getAttributeValue("", ATTR_BEGIN_TIME));
|
||||||
|
final long endTimeMs = Long.parseLong(parser.getAttributeValue("", ATTR_END_TIME));
|
||||||
|
((MediaVideoItem)currentMediaItem).setExtractBoundaries(beginTimeMs, endTimeMs);
|
||||||
|
|
||||||
|
final int volumePercent = Integer.parseInt(parser.getAttributeValue("", ATTR_VOLUME));
|
||||||
|
((MediaVideoItem)currentMediaItem).setVolume(volumePercent);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Unknown media item type: " + type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return currentMediaItem;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse the transition
|
* Parse the transition
|
||||||
*
|
*
|
||||||
* @param parser The parser
|
* @param parser The parser
|
||||||
|
* @param ignoredMediaItems The list of ignored media items
|
||||||
|
*
|
||||||
* @return The transition
|
* @return The transition
|
||||||
*/
|
*/
|
||||||
private Transition parseTransition(XmlPullParser parser) {
|
private Transition parseTransition(XmlPullParser parser, List<String> ignoredMediaItems) {
|
||||||
final String transitionId = parser.getAttributeValue("", ATTR_ID);
|
final String transitionId = parser.getAttributeValue("", ATTR_ID);
|
||||||
final String type = parser.getAttributeValue("", ATTR_TYPE);
|
final String type = parser.getAttributeValue("", ATTR_TYPE);
|
||||||
final long durationMs = Long.parseLong(parser.getAttributeValue("",
|
final long durationMs = Long.parseLong(parser.getAttributeValue("", ATTR_DURATION));
|
||||||
ATTR_DURATION));
|
final int behavior = Integer.parseInt(parser.getAttributeValue("", ATTR_BEHAVIOR));
|
||||||
final int behavior = Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_BEHAVIOR));
|
|
||||||
final boolean isTransitionGenerated;
|
|
||||||
|
|
||||||
|
final String beforeMediaItemId = parser.getAttributeValue("", ATTR_BEFORE_MEDIA_ITEM_ID);
|
||||||
final String beforeMediaItemId = parser.getAttributeValue("",
|
|
||||||
ATTR_BEFORE_MEDIA_ITEM_ID);
|
|
||||||
final MediaItem beforeMediaItem;
|
final MediaItem beforeMediaItem;
|
||||||
if (beforeMediaItemId != null) {
|
if (beforeMediaItemId != null) {
|
||||||
|
if (ignoredMediaItems.contains(beforeMediaItemId)) {
|
||||||
|
// This transition is ignored
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
beforeMediaItem = getMediaItem(beforeMediaItemId);
|
beforeMediaItem = getMediaItem(beforeMediaItemId);
|
||||||
} else {
|
} else {
|
||||||
beforeMediaItem = null;
|
beforeMediaItem = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
final String afterMediaItemId = parser.getAttributeValue("",
|
final String afterMediaItemId = parser.getAttributeValue("", ATTR_AFTER_MEDIA_ITEM_ID);
|
||||||
ATTR_AFTER_MEDIA_ITEM_ID);
|
|
||||||
final MediaItem afterMediaItem;
|
final MediaItem afterMediaItem;
|
||||||
if (afterMediaItemId != null) {
|
if (afterMediaItemId != null) {
|
||||||
|
if (ignoredMediaItems.contains(afterMediaItemId)) {
|
||||||
|
// This transition is ignored
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
afterMediaItem = getMediaItem(afterMediaItemId);
|
afterMediaItem = getMediaItem(afterMediaItemId);
|
||||||
} else {
|
} else {
|
||||||
afterMediaItem = null;
|
afterMediaItem = null;
|
||||||
@@ -1093,18 +1116,10 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
transition = new TransitionFadeBlack(transitionId, afterMediaItem, beforeMediaItem,
|
transition = new TransitionFadeBlack(transitionId, afterMediaItem, beforeMediaItem,
|
||||||
durationMs, behavior);
|
durationMs, behavior);
|
||||||
} else {
|
} else {
|
||||||
transition = null;
|
throw new IllegalArgumentException("Invalid transition type: " + type);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (beforeMediaItem != null) {
|
final boolean isTransitionGenerated = Boolean.parseBoolean(parser.getAttributeValue("",
|
||||||
beforeMediaItem.setBeginTransition(transition);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (afterMediaItem != null) {
|
|
||||||
afterMediaItem.setEndTransition(transition);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTransitionGenerated = Boolean.parseBoolean(parser.getAttributeValue("",
|
|
||||||
ATTR_IS_TRANSITION_GENERATED));
|
ATTR_IS_TRANSITION_GENERATED));
|
||||||
if (isTransitionGenerated == true) {
|
if (isTransitionGenerated == true) {
|
||||||
final String transitionFile = parser.getAttributeValue("",
|
final String transitionFile = parser.getAttributeValue("",
|
||||||
@@ -1116,9 +1131,18 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
transition.setFilename(null);
|
transition.setFilename(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return transition;
|
|
||||||
|
// Use the transition
|
||||||
|
if (beforeMediaItem != null) {
|
||||||
|
beforeMediaItem.setBeginTransition(transition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (afterMediaItem != null) {
|
||||||
|
afterMediaItem.setEndTransition(transition);
|
||||||
|
}
|
||||||
|
|
||||||
|
return transition;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse the overlay
|
* Parse the overlay
|
||||||
@@ -1131,40 +1155,32 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
private Overlay parseOverlay(XmlPullParser parser, MediaItem mediaItem) {
|
private Overlay parseOverlay(XmlPullParser parser, MediaItem mediaItem) {
|
||||||
final String overlayId = parser.getAttributeValue("", ATTR_ID);
|
final String overlayId = parser.getAttributeValue("", ATTR_ID);
|
||||||
final String type = parser.getAttributeValue("", ATTR_TYPE);
|
final String type = parser.getAttributeValue("", ATTR_TYPE);
|
||||||
final long durationMs = Long.parseLong(parser.getAttributeValue("",
|
final long durationMs = Long.parseLong(parser.getAttributeValue("", ATTR_DURATION));
|
||||||
ATTR_DURATION));
|
final long startTimeMs = Long.parseLong(parser.getAttributeValue("", ATTR_BEGIN_TIME));
|
||||||
final long startTimeMs = Long.parseLong(parser.getAttributeValue("",
|
|
||||||
ATTR_BEGIN_TIME));
|
|
||||||
|
|
||||||
final Overlay overlay;
|
final Overlay overlay;
|
||||||
if (OverlayFrame.class.getSimpleName().equals(type)) {
|
if (OverlayFrame.class.getSimpleName().equals(type)) {
|
||||||
final String filename = parser.getAttributeValue("", ATTR_FILENAME);
|
final String filename = parser.getAttributeValue("", ATTR_FILENAME);
|
||||||
overlay = new OverlayFrame(mediaItem, overlayId, filename,
|
overlay = new OverlayFrame(mediaItem, overlayId, filename, startTimeMs, durationMs);
|
||||||
startTimeMs, durationMs);
|
|
||||||
} else {
|
} else {
|
||||||
overlay = null;
|
throw new IllegalArgumentException("Invalid overlay type: " + type);
|
||||||
}
|
}
|
||||||
|
|
||||||
final String overlayRgbFileName = parser.getAttributeValue("",
|
final String overlayRgbFileName = parser.getAttributeValue("", ATTR_OVERLAY_RGB_FILENAME);
|
||||||
ATTR_OVERLAY_RGB_FILENAME);
|
|
||||||
if (overlayRgbFileName != null) {
|
if (overlayRgbFileName != null) {
|
||||||
((OverlayFrame)overlay).setFilename(overlayRgbFileName);
|
((OverlayFrame)overlay).setFilename(overlayRgbFileName);
|
||||||
|
|
||||||
final int overlayFrameWidth =
|
final int overlayFrameWidth = Integer.parseInt(parser.getAttributeValue("",
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_OVERLAY_FRAME_WIDTH));
|
ATTR_OVERLAY_FRAME_WIDTH));
|
||||||
final int overlayFrameHeight =
|
final int overlayFrameHeight = Integer.parseInt(parser.getAttributeValue("",
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_OVERLAY_FRAME_HEIGHT));
|
ATTR_OVERLAY_FRAME_HEIGHT));
|
||||||
|
|
||||||
((OverlayFrame)overlay).setOverlayFrameWidth(overlayFrameWidth);
|
((OverlayFrame)overlay).setOverlayFrameWidth(overlayFrameWidth);
|
||||||
((OverlayFrame)overlay).setOverlayFrameHeight(overlayFrameHeight);
|
((OverlayFrame)overlay).setOverlayFrameHeight(overlayFrameHeight);
|
||||||
|
|
||||||
final int resizedRGBFrameWidth =
|
final int resizedRGBFrameWidth = Integer.parseInt(parser.getAttributeValue("",
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_OVERLAY_RESIZED_RGB_FRAME_WIDTH));
|
ATTR_OVERLAY_RESIZED_RGB_FRAME_WIDTH));
|
||||||
final int resizedRGBFrameHeight =
|
final int resizedRGBFrameHeight = Integer.parseInt(parser.getAttributeValue("",
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_OVERLAY_RESIZED_RGB_FRAME_HEIGHT));
|
ATTR_OVERLAY_RESIZED_RGB_FRAME_HEIGHT));
|
||||||
|
|
||||||
((OverlayFrame)overlay).setResizedRGBSize(resizedRGBFrameWidth, resizedRGBFrameHeight);
|
((OverlayFrame)overlay).setResizedRGBSize(resizedRGBFrameWidth, resizedRGBFrameHeight);
|
||||||
@@ -1184,21 +1200,17 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
private Effect parseEffect(XmlPullParser parser, MediaItem mediaItem) {
|
private Effect parseEffect(XmlPullParser parser, MediaItem mediaItem) {
|
||||||
final String effectId = parser.getAttributeValue("", ATTR_ID);
|
final String effectId = parser.getAttributeValue("", ATTR_ID);
|
||||||
final String type = parser.getAttributeValue("", ATTR_TYPE);
|
final String type = parser.getAttributeValue("", ATTR_TYPE);
|
||||||
final long durationMs = Long.parseLong(parser.getAttributeValue("",
|
final long durationMs = Long.parseLong(parser.getAttributeValue("", ATTR_DURATION));
|
||||||
ATTR_DURATION));
|
final long startTimeMs = Long.parseLong(parser.getAttributeValue("", ATTR_BEGIN_TIME));
|
||||||
final long startTimeMs = Long.parseLong(parser.getAttributeValue("",
|
|
||||||
ATTR_BEGIN_TIME));
|
|
||||||
|
|
||||||
final Effect effect;
|
final Effect effect;
|
||||||
if (EffectColor.class.getSimpleName().equals(type)) {
|
if (EffectColor.class.getSimpleName().equals(type)) {
|
||||||
final int colorEffectType =
|
final int colorEffectType = Integer.parseInt(parser.getAttributeValue("",
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_COLOR_EFFECT_TYPE));
|
ATTR_COLOR_EFFECT_TYPE));
|
||||||
final int color;
|
final int color;
|
||||||
if (colorEffectType == EffectColor.TYPE_COLOR
|
if (colorEffectType == EffectColor.TYPE_COLOR
|
||||||
|| colorEffectType == EffectColor.TYPE_GRADIENT) {
|
|| colorEffectType == EffectColor.TYPE_GRADIENT) {
|
||||||
color = Integer.parseInt(parser.getAttributeValue("",
|
color = Integer.parseInt(parser.getAttributeValue("", ATTR_COLOR_EFFECT_VALUE));
|
||||||
ATTR_COLOR_EFFECT_VALUE));
|
|
||||||
} else {
|
} else {
|
||||||
color = 0;
|
color = 0;
|
||||||
}
|
}
|
||||||
@@ -1206,27 +1218,19 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
durationMs, colorEffectType, color);
|
durationMs, colorEffectType, color);
|
||||||
} else if (EffectKenBurns.class.getSimpleName().equals(type)) {
|
} else if (EffectKenBurns.class.getSimpleName().equals(type)) {
|
||||||
final Rect startRect = new Rect(
|
final Rect startRect = new Rect(
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
Integer.parseInt(parser.getAttributeValue("", ATTR_START_RECT_LEFT)),
|
||||||
ATTR_START_RECT_LEFT)),
|
Integer.parseInt(parser.getAttributeValue("", ATTR_START_RECT_TOP)),
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
Integer.parseInt(parser.getAttributeValue("", ATTR_START_RECT_RIGHT)),
|
||||||
ATTR_START_RECT_TOP)),
|
Integer.parseInt(parser.getAttributeValue("", ATTR_START_RECT_BOTTOM)));
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_START_RECT_RIGHT)),
|
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_START_RECT_BOTTOM)));
|
|
||||||
final Rect endRect = new Rect(
|
final Rect endRect = new Rect(
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
Integer.parseInt(parser.getAttributeValue("", ATTR_END_RECT_LEFT)),
|
||||||
ATTR_END_RECT_LEFT)),
|
Integer.parseInt(parser.getAttributeValue("", ATTR_END_RECT_TOP)),
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
Integer.parseInt(parser.getAttributeValue("", ATTR_END_RECT_RIGHT)),
|
||||||
ATTR_END_RECT_TOP)),
|
Integer.parseInt(parser.getAttributeValue("", ATTR_END_RECT_BOTTOM)));
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_END_RECT_RIGHT)),
|
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_END_RECT_BOTTOM)));
|
|
||||||
effect = new EffectKenBurns(mediaItem, effectId, startRect, endRect,
|
effect = new EffectKenBurns(mediaItem, effectId, startRect, endRect,
|
||||||
startTimeMs, durationMs);
|
startTimeMs, durationMs);
|
||||||
} else {
|
} else {
|
||||||
effect = null;
|
throw new IllegalArgumentException("Invalid effect type: " + type);
|
||||||
}
|
}
|
||||||
|
|
||||||
return effect;
|
return effect;
|
||||||
@@ -1239,33 +1243,23 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
*
|
*
|
||||||
* @return The audio track
|
* @return The audio track
|
||||||
*/
|
*/
|
||||||
private AudioTrack parseAudioTrack(XmlPullParser parser) {
|
private AudioTrack parseAudioTrack(XmlPullParser parser) throws IOException {
|
||||||
final String audioTrackId = parser.getAttributeValue("", ATTR_ID);
|
final String audioTrackId = parser.getAttributeValue("", ATTR_ID);
|
||||||
final String filename = parser.getAttributeValue("", ATTR_FILENAME);
|
final String filename = parser.getAttributeValue("", ATTR_FILENAME);
|
||||||
final long startTimeMs = Long.parseLong(parser.getAttributeValue("",
|
final long startTimeMs = Long.parseLong(parser.getAttributeValue("", ATTR_START_TIME));
|
||||||
ATTR_START_TIME));
|
final long beginMs = Long.parseLong(parser.getAttributeValue("", ATTR_BEGIN_TIME));
|
||||||
final long beginMs = Long.parseLong(parser.getAttributeValue("",
|
final long endMs = Long.parseLong(parser.getAttributeValue("", ATTR_END_TIME));
|
||||||
ATTR_BEGIN_TIME));
|
final int volume = Integer.parseInt(parser.getAttributeValue("", ATTR_VOLUME));
|
||||||
final long endMs = Long.parseLong(parser.getAttributeValue("",
|
final boolean muted = Boolean.parseBoolean(parser.getAttributeValue("", ATTR_MUTED));
|
||||||
ATTR_END_TIME));
|
final boolean loop = Boolean.parseBoolean(parser.getAttributeValue("", ATTR_LOOP));
|
||||||
final int volume = Integer.parseInt(parser.getAttributeValue("",
|
final boolean duckingEnabled = Boolean.parseBoolean(
|
||||||
ATTR_VOLUME));
|
parser.getAttributeValue("", ATTR_DUCK_ENABLED));
|
||||||
final boolean muted = Boolean.parseBoolean(parser.getAttributeValue("",
|
final int duckThreshold = Integer.parseInt(
|
||||||
ATTR_MUTED));
|
parser.getAttributeValue("", ATTR_DUCK_THRESHOLD));
|
||||||
final boolean loop = Boolean.parseBoolean(parser.getAttributeValue("",
|
final int duckedTrackVolume = Integer.parseInt(parser.getAttributeValue("",
|
||||||
ATTR_LOOP));
|
|
||||||
final boolean duckingEnabled =
|
|
||||||
Boolean.parseBoolean(parser.getAttributeValue("",
|
|
||||||
ATTR_DUCK_ENABLED));
|
|
||||||
final int duckThreshold = Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_DUCK_THRESHOLD));
|
|
||||||
final int duckedTrackVolume =
|
|
||||||
Integer.parseInt(parser.getAttributeValue("",
|
|
||||||
ATTR_DUCKED_TRACK_VOLUME));
|
ATTR_DUCKED_TRACK_VOLUME));
|
||||||
|
|
||||||
final String waveformFilename = parser.getAttributeValue("",
|
final String waveformFilename = parser.getAttributeValue("", ATTR_AUDIO_WAVEFORM_FILENAME);
|
||||||
ATTR_AUDIO_WAVEFORM_FILENAME);
|
|
||||||
try {
|
|
||||||
final AudioTrack audioTrack = new AudioTrack(this, audioTrackId,
|
final AudioTrack audioTrack = new AudioTrack(this, audioTrackId,
|
||||||
filename, startTimeMs,
|
filename, startTimeMs,
|
||||||
beginMs, endMs, loop,
|
beginMs, endMs, loop,
|
||||||
@@ -1276,11 +1270,7 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
waveformFilename);
|
waveformFilename);
|
||||||
|
|
||||||
return audioTrack;
|
return audioTrack;
|
||||||
} catch (IOException ex) {
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
@@ -1424,7 +1414,8 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
Integer.toString(endRect.bottom));
|
Integer.toString(endRect.bottom));
|
||||||
final MediaItem mItem = effect.getMediaItem();
|
final MediaItem mItem = effect.getMediaItem();
|
||||||
if(((MediaImageItem)mItem).getGeneratedImageClip() != null) {
|
if(((MediaImageItem)mItem).getGeneratedImageClip() != null) {
|
||||||
serializer.attribute("", ATTR_IS_IMAGE_CLIP_GENERATED,Boolean.toString(true));
|
serializer.attribute("", ATTR_IS_IMAGE_CLIP_GENERATED,
|
||||||
|
Boolean.toString(true));
|
||||||
serializer.attribute("", ATTR_GENERATED_IMAGE_CLIP,
|
serializer.attribute("", ATTR_GENERATED_IMAGE_CLIP,
|
||||||
((MediaImageItem)mItem).getGeneratedImageClip());
|
((MediaImageItem)mItem).getGeneratedImageClip());
|
||||||
} else {
|
} else {
|
||||||
@@ -1447,28 +1438,22 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
for (Transition transition : mTransitions) {
|
for (Transition transition : mTransitions) {
|
||||||
serializer.startTag("", TAG_TRANSITION);
|
serializer.startTag("", TAG_TRANSITION);
|
||||||
serializer.attribute("", ATTR_ID, transition.getId());
|
serializer.attribute("", ATTR_ID, transition.getId());
|
||||||
serializer.attribute("", ATTR_TYPE,
|
serializer.attribute("", ATTR_TYPE, transition.getClass().getSimpleName());
|
||||||
transition.getClass().getSimpleName());
|
serializer.attribute("", ATTR_DURATION, Long.toString(transition.getDuration()));
|
||||||
serializer.attribute("", ATTR_DURATION,
|
serializer.attribute("", ATTR_BEHAVIOR, Integer.toString(transition.getBehavior()));
|
||||||
Long.toString(transition.getDuration()));
|
|
||||||
serializer.attribute("", ATTR_BEHAVIOR,
|
|
||||||
Integer.toString(transition.getBehavior()));
|
|
||||||
serializer.attribute("", ATTR_IS_TRANSITION_GENERATED,
|
serializer.attribute("", ATTR_IS_TRANSITION_GENERATED,
|
||||||
Boolean.toString(transition.isGenerated()));
|
Boolean.toString(transition.isGenerated()));
|
||||||
if (transition.isGenerated() == true) {
|
if (transition.isGenerated() == true) {
|
||||||
serializer.attribute("", ATTR_GENERATED_TRANSITION_CLIP,
|
serializer.attribute("", ATTR_GENERATED_TRANSITION_CLIP, transition.mFilename);
|
||||||
transition.mFilename);
|
|
||||||
}
|
}
|
||||||
final MediaItem afterMediaItem = transition.getAfterMediaItem();
|
final MediaItem afterMediaItem = transition.getAfterMediaItem();
|
||||||
if (afterMediaItem != null) {
|
if (afterMediaItem != null) {
|
||||||
serializer.attribute("", ATTR_AFTER_MEDIA_ITEM_ID,
|
serializer.attribute("", ATTR_AFTER_MEDIA_ITEM_ID, afterMediaItem.getId());
|
||||||
afterMediaItem.getId());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final MediaItem beforeMediaItem = transition.getBeforeMediaItem();
|
final MediaItem beforeMediaItem = transition.getBeforeMediaItem();
|
||||||
if (beforeMediaItem != null) {
|
if (beforeMediaItem != null) {
|
||||||
serializer.attribute("", ATTR_BEFORE_MEDIA_ITEM_ID,
|
serializer.attribute("", ATTR_BEFORE_MEDIA_ITEM_ID, beforeMediaItem.getId());
|
||||||
beforeMediaItem.getId());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transition instanceof TransitionSliding) {
|
if (transition instanceof TransitionSliding) {
|
||||||
@@ -1492,14 +1477,10 @@ public class VideoEditorImpl implements VideoEditor {
|
|||||||
serializer.startTag("", TAG_AUDIO_TRACK);
|
serializer.startTag("", TAG_AUDIO_TRACK);
|
||||||
serializer.attribute("", ATTR_ID, at.getId());
|
serializer.attribute("", ATTR_ID, at.getId());
|
||||||
serializer.attribute("", ATTR_FILENAME, at.getFilename());
|
serializer.attribute("", ATTR_FILENAME, at.getFilename());
|
||||||
serializer.attribute("", ATTR_START_TIME,
|
serializer.attribute("", ATTR_START_TIME, Long.toString(at.getStartTime()));
|
||||||
Long.toString(at.getStartTime()));
|
serializer.attribute("", ATTR_BEGIN_TIME, Long.toString(at.getBoundaryBeginTime()));
|
||||||
serializer.attribute("", ATTR_BEGIN_TIME,
|
serializer.attribute("", ATTR_END_TIME, Long.toString(at.getBoundaryEndTime()));
|
||||||
Long.toString(at.getBoundaryBeginTime()));
|
serializer.attribute("", ATTR_VOLUME, Integer.toString(at.getVolume()));
|
||||||
serializer.attribute("", ATTR_END_TIME,
|
|
||||||
Long.toString(at.getBoundaryEndTime()));
|
|
||||||
serializer.attribute("", ATTR_VOLUME,
|
|
||||||
Integer.toString(at.getVolume()));
|
|
||||||
serializer.attribute("", ATTR_DUCK_ENABLED,
|
serializer.attribute("", ATTR_DUCK_ENABLED,
|
||||||
Boolean.toString(at.isDuckingEnabled()));
|
Boolean.toString(at.isDuckingEnabled()));
|
||||||
serializer.attribute("", ATTR_DUCKED_TRACK_VOLUME,
|
serializer.attribute("", ATTR_DUCKED_TRACK_VOLUME,
|
||||||
|
|||||||
Reference in New Issue
Block a user