1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.mediaframeworktest.functional.videoeditor; 18 19import java.io.File; 20 21import android.graphics.Bitmap; 22import android.graphics.Rect; 23import android.media.videoeditor.AudioTrack; 24import android.media.videoeditor.EffectColor; 25import android.media.videoeditor.EffectKenBurns; 26import android.media.videoeditor.MediaImageItem; 27import android.media.videoeditor.MediaItem; 28import android.media.videoeditor.MediaProperties; 29import android.media.videoeditor.MediaVideoItem; 30import android.media.videoeditor.OverlayFrame; 31import android.media.videoeditor.Transition; 32import android.media.videoeditor.TransitionAlpha; 33import android.media.videoeditor.TransitionCrossfade; 34import android.media.videoeditor.TransitionFadeBlack; 35import android.media.videoeditor.TransitionSliding; 36import android.media.videoeditor.VideoEditor; 37import android.media.videoeditor.VideoEditor.ExportProgressListener; 38import android.media.videoeditor.VideoEditor.MediaProcessingProgressListener; 39import android.os.Environment; 40import android.test.ActivityInstrumentationTestCase; 41 42 43import android.util.Log; 44 45import com.android.mediaframeworktest.MediaFrameworkTest; 46import android.test.suitebuilder.annotation.LargeTest; 47import android.test.suitebuilder.annotation.Suppress; 48import com.android.mediaframeworktest.VideoEditorHelper; 49 50public class VideoEditorExportTest extends 51 ActivityInstrumentationTestCase<MediaFrameworkTest> { 52 private final String TAG = "TransitionTest"; 53 54 private final String PROJECT_LOCATION = VideoEditorHelper.PROJECT_LOCATION_COMMON; 55 56 private final String INPUT_FILE_PATH = VideoEditorHelper.INPUT_FILE_PATH_COMMON; 57 58 private VideoEditor mVideoEditor; 59 60 private VideoEditorHelper mVideoEditorHelper; 61 62 // Declares the annotation for Preview Test Cases 63 public @interface TransitionTests { 64 } 65 66 public VideoEditorExportTest() { 67 super("com.android.mediaframeworktest", MediaFrameworkTest.class); 68 } 69 70 @Override 71 protected void setUp() throws Exception { 72 // setup for each test case. 73 super.setUp(); 74 mVideoEditorHelper = new VideoEditorHelper(); 75 // Create a random String which will be used as project path, where all 76 // project related files will be stored. 77 final String projectPath = 78 mVideoEditorHelper.createRandomFile(PROJECT_LOCATION); 79 mVideoEditor = mVideoEditorHelper.createVideoEditor(projectPath); 80 } 81 82 @Override 83 protected void tearDown() throws Exception { 84 mVideoEditorHelper.destroyVideoEditor(mVideoEditor); 85 // Clean the directory created as project path 86 mVideoEditorHelper.deleteProject(new File(mVideoEditor.getPath())); 87 System.gc(); 88 super.tearDown(); 89 } 90 91 /** 92 * To Test export : Merge and Trim different types of Video and Image files 93 */ 94 @LargeTest 95 public void testExportMergeTrim() throws Exception { 96 final String videoItemFilename1 = INPUT_FILE_PATH 97 + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_0_26.3gp"; 98 final String imageItemFilename1 = INPUT_FILE_PATH + "IMG_1600x1200.jpg"; 99 final String videoItemFilename2 = INPUT_FILE_PATH 100 + "H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4"; 101 final String videoItemFilename3 = INPUT_FILE_PATH 102 + "MPEG4_SP_720x480_30fps_280kbps_AACLC_48kHz_96kbps_s_0_21.mp4"; 103 final String imageItemFilename2 = INPUT_FILE_PATH + "IMG_176x144.jpg"; 104 final String imageItemFilename3 = INPUT_FILE_PATH + "IMG_640x480.jpg"; 105 final String outFilename = mVideoEditorHelper 106 .createRandomFile(mVideoEditor.getPath() + "/") 107 + ".3gp"; 108 109 final MediaVideoItem mediaVideoItem1 = 110 mVideoEditorHelper.createMediaItem(mVideoEditor, "m1", 111 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER); 112 mediaVideoItem1.setExtractBoundaries(2000, 7000); 113 mVideoEditor.addMediaItem(mediaVideoItem1); 114 115 final MediaImageItem mediaImageItem2 = 116 mVideoEditorHelper.createMediaItem(mVideoEditor, "m2", 117 imageItemFilename1, 3000, MediaItem.RENDERING_MODE_BLACK_BORDER); 118 mVideoEditor.addMediaItem(mediaImageItem2); 119 120 final MediaVideoItem mediaVideoItem3 = 121 mVideoEditorHelper.createMediaItem(mVideoEditor, "m3", 122 videoItemFilename2, MediaItem.RENDERING_MODE_BLACK_BORDER); 123 mediaVideoItem3.setExtractBoundaries(0, 2000); 124 mVideoEditor.addMediaItem(mediaVideoItem3); 125 126 final MediaVideoItem mediaVideoItem4 = 127 mVideoEditorHelper.createMediaItem(mVideoEditor, "m4", 128 videoItemFilename3, MediaItem.RENDERING_MODE_BLACK_BORDER); 129 mediaVideoItem4.setExtractBoundaries(mediaVideoItem4.getDuration()-5000, 130 mediaVideoItem4.getDuration()); 131 mVideoEditor.addMediaItem(mediaVideoItem4); 132 133 final MediaImageItem mediaImageItem5 = 134 mVideoEditorHelper.createMediaItem(mVideoEditor, "m5", 135 imageItemFilename2, 4000, MediaItem.RENDERING_MODE_BLACK_BORDER); 136 mVideoEditor.addMediaItem(mediaImageItem5); 137 138 final MediaImageItem mediaImageItem6 = 139 mVideoEditorHelper.createMediaItem(mVideoEditor, "m6", 140 imageItemFilename3, 2000, MediaItem.RENDERING_MODE_BLACK_BORDER); 141 mVideoEditor.addMediaItem(mediaImageItem6); 142 143 mVideoEditor.generatePreview(new MediaProcessingProgressListener() { 144 public void onProgress(Object item, int action, int progress) { 145 } 146 }); 147 148 try { 149 final int[] progressUpdate = new int[100]; 150 mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720, 151 MediaProperties.BITRATE_800K, new ExportProgressListener() { 152 int i = 0; 153 public void onProgress(VideoEditor ve, String outFileName, 154 int progress) { 155 progressUpdate[i++] = progress; 156 } 157 }); 158 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 159 } catch (Exception e) { 160 assertTrue("Error in Export" + e.toString(), false); 161 } 162 final long storyBoardDuration = mediaVideoItem1.getTimelineDuration() 163 + mediaImageItem2.getDuration() + mediaVideoItem3.getTimelineDuration() 164 + mediaVideoItem4.getTimelineDuration() + mediaImageItem5.getDuration() 165 + mediaImageItem6.getDuration(); 166 mVideoEditorHelper.validateExport(mVideoEditor, outFilename, 167 MediaProperties.HEIGHT_720, 0, storyBoardDuration, 168 MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC); 169 mVideoEditorHelper.checkDeleteExistingFile(outFilename); 170 } 171 172 /** 173 *To Test export : With Effect and Overlays on Different Media Items 174 */ 175 @LargeTest 176 public void testExportEffectOverlay() throws Exception { 177 final String videoItemFilename1 = INPUT_FILE_PATH 178 + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_0_26.3gp"; 179 final String imageItemFilename1 = INPUT_FILE_PATH + "IMG_1600x1200.jpg"; 180 final String videoItemFilename2 = INPUT_FILE_PATH 181 + "H264_BP_640x480_15fps_1200Kbps_AACLC_48KHz_64kps_m_0_27.3gp"; 182 final String videoItemFilename3 = INPUT_FILE_PATH 183 + "MPEG4_SP_720x480_30fps_280kbps_AACLC_48kHz_96kbps_s_0_21.mp4"; 184 final String imageItemFilename2 = INPUT_FILE_PATH + "IMG_176x144.jpg"; 185 final String imageItemFilename3 = INPUT_FILE_PATH + "IMG_640x480.jpg"; 186 final String outFilename = mVideoEditorHelper 187 .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp"; 188 189 final String overlayFile = INPUT_FILE_PATH + "IMG_640x480_Overlay1.png"; 190 191 final MediaVideoItem mediaVideoItem1 = 192 mVideoEditorHelper.createMediaItem(mVideoEditor, "m1", 193 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER); 194 mediaVideoItem1.setExtractBoundaries(2000, 7000); 195 mVideoEditor.addMediaItem(mediaVideoItem1); 196 197 final EffectColor effectPink = 198 mVideoEditorHelper.createEffectItem(mediaVideoItem1, "effectPink", 199 0, 2000, EffectColor.TYPE_COLOR, EffectColor.PINK); 200 mediaVideoItem1.addEffect(effectPink); 201 202 final EffectColor effectNegative = 203 mVideoEditorHelper.createEffectItem(mediaVideoItem1, "effectNegative", 204 3000, 4000, EffectColor.TYPE_NEGATIVE, 0); 205 mediaVideoItem1.addEffect(effectNegative); 206 207 final MediaImageItem mediaImageItem2 = 208 mVideoEditorHelper.createMediaItem(mVideoEditor, "m2", 209 imageItemFilename1, 3000, MediaItem.RENDERING_MODE_BLACK_BORDER); 210 mVideoEditor.addMediaItem(mediaImageItem2); 211 212 final EffectColor effectFifties = 213 mVideoEditorHelper.createEffectItem(mediaImageItem2, "effectFifties", 214 0, 3000, EffectColor.TYPE_FIFTIES, 0); 215 mediaImageItem2.addEffect(effectFifties); 216 217 final MediaVideoItem mediaVideoItem3 = 218 mVideoEditorHelper.createMediaItem(mVideoEditor, "m3", 219 videoItemFilename2, MediaItem.RENDERING_MODE_BLACK_BORDER); 220 mVideoEditor.addMediaItem(mediaVideoItem3); 221 mediaVideoItem3.setExtractBoundaries(0, 8000); 222 223 final Bitmap mBitmap = mVideoEditorHelper.getBitmap(overlayFile, 224 640, 480); 225 final OverlayFrame overlayFrame = 226 mVideoEditorHelper.createOverlay(mediaVideoItem3, "overlay", 227 mBitmap, 2000, 5000); 228 mediaVideoItem3.addOverlay(overlayFrame); 229 230 final EffectColor effectGreen = 231 mVideoEditorHelper.createEffectItem(mediaVideoItem3, "effectGreen", 232 0, 2000, EffectColor.TYPE_COLOR, EffectColor.GREEN); 233 mediaVideoItem3.addEffect(effectGreen); 234 235 final MediaVideoItem mediaVideoItem4 = 236 mVideoEditorHelper.createMediaItem(mVideoEditor, "m4", 237 videoItemFilename3, MediaItem.RENDERING_MODE_BLACK_BORDER); 238 mediaVideoItem4.setExtractBoundaries(mediaVideoItem4.getDuration()-5000, 239 mediaVideoItem4.getDuration()); 240 mVideoEditor.addMediaItem(mediaVideoItem4); 241 242 final EffectColor effectSepia = 243 mVideoEditorHelper.createEffectItem(mediaVideoItem4, "effectSepia", 244 0, 2000, EffectColor.TYPE_SEPIA, 0); 245 mediaVideoItem4.addEffect(effectSepia); 246 247 final MediaImageItem mediaImageItem5 = 248 mVideoEditorHelper.createMediaItem(mVideoEditor, "m5", 249 imageItemFilename2, 4000, MediaItem.RENDERING_MODE_BLACK_BORDER); 250 mVideoEditor.addMediaItem(mediaImageItem5); 251 252 final EffectColor effectGray = 253 mVideoEditorHelper.createEffectItem(mediaImageItem5, "effectGray", 254 0, 2000, EffectColor.TYPE_COLOR, EffectColor.GRAY); 255 mediaImageItem5.addEffect(effectGray); 256 257 final MediaImageItem mediaImageItem6 = 258 mVideoEditorHelper.createMediaItem(mVideoEditor, "m6", 259 imageItemFilename3, 2000, MediaItem.RENDERING_MODE_BLACK_BORDER); 260 mVideoEditor.addMediaItem(mediaImageItem6); 261 262 final EffectColor effectGradient = 263 mVideoEditorHelper.createEffectItem(mediaImageItem6, 264 "effectGradient", 0, 2000, EffectColor.TYPE_GRADIENT, 265 EffectColor.PINK); 266 mediaImageItem6.addEffect(effectGradient); 267 268 mVideoEditor.generatePreview(new MediaProcessingProgressListener() { 269 public void onProgress(Object item, int action, int progress) { 270 } 271 }); 272 273 try { 274 final int[] progressUpdate = new int[100]; 275 mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720, 276 MediaProperties.BITRATE_800K, new ExportProgressListener() { 277 int i = 0; 278 public void onProgress(VideoEditor ve, String outFileName, 279 int progress) { 280 progressUpdate[i++] = progress; 281 } 282 }); 283 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 284 } catch (Exception e) { 285 assertTrue("Error in Export" + e.toString(), false); 286 } 287 final long storyBoardDuration = mediaVideoItem1.getTimelineDuration() 288 + mediaImageItem2.getDuration() 289 + mediaVideoItem3.getTimelineDuration() 290 + mediaVideoItem4.getTimelineDuration() 291 + mediaImageItem5.getDuration() 292 + mediaImageItem6.getDuration(); 293 mVideoEditorHelper.validateExport(mVideoEditor, outFilename, 294 MediaProperties.HEIGHT_720, 0, storyBoardDuration, 295 MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC); 296 mVideoEditorHelper.checkDeleteExistingFile(outFilename); 297 } 298 299 /** 300 * To test export : with Image with KenBurnEffect 301 */ 302 @LargeTest 303 public void testExportEffectKenBurn() throws Exception { 304 final String imageItemFileName = INPUT_FILE_PATH + "IMG_640x480.jpg"; 305 final int imageItemRenderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER; 306 final String outFilename = mVideoEditorHelper 307 .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp"; 308 309 final MediaImageItem mediaImageItem = 310 mVideoEditorHelper.createMediaItem(mVideoEditor, "mediaImageItem1", 311 imageItemFileName, 5000, imageItemRenderingMode); 312 mVideoEditor.addMediaItem(mediaImageItem); 313 314 final Rect startRect = new Rect((mediaImageItem.getHeight() / 3), 315 (mediaImageItem.getWidth() / 3), (mediaImageItem.getHeight() / 2), 316 (mediaImageItem.getWidth() / 2)); 317 318 final Rect endRect = new Rect(0, 0, mediaImageItem.getWidth(), 319 mediaImageItem.getHeight()); 320 321 final EffectKenBurns kbEffectOnMediaItem = new EffectKenBurns( 322 mediaImageItem, "KBOnM2", startRect, endRect, 500, 3000); 323 assertNotNull("EffectKenBurns", kbEffectOnMediaItem); 324 mediaImageItem.addEffect(kbEffectOnMediaItem); 325 326 assertEquals("KenBurn Start Rect", startRect, 327 kbEffectOnMediaItem.getStartRect()); 328 assertEquals("KenBurn End Rect", endRect, 329 kbEffectOnMediaItem.getEndRect()); 330 331 mVideoEditor.generatePreview(new MediaProcessingProgressListener() { 332 public void onProgress(Object item, int action, int progress) { 333 } 334 }); 335 336 try { 337 final int[] progressUpdate = new int[100]; 338 mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720, 339 MediaProperties.BITRATE_800K, new ExportProgressListener() { 340 int i = 0; 341 public void onProgress(VideoEditor ve, String outFileName, 342 int progress) { 343 progressUpdate[i++] = progress; 344 } 345 }); 346 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 347 } catch (Exception e) { 348 assertTrue("Error in Export" + e.toString(), false); 349 } 350 mVideoEditorHelper.validateExport(mVideoEditor, outFilename, 351 MediaProperties.HEIGHT_720, 0, mediaImageItem.getDuration(), 352 MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC); 353 mVideoEditorHelper.checkDeleteExistingFile(outFilename); 354 } 355 356 /** 357 * To Test Export : With Video and Image and An Audio BackGround Track 358 */ 359 @LargeTest 360 public void testExportAudio() throws Exception { 361 final String videoItemFileName = INPUT_FILE_PATH 362 + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_0_26.3gp"; 363 final String imageItemFileName = INPUT_FILE_PATH + "IMG_1600x1200.jpg"; 364 final String outFilename = mVideoEditorHelper 365 .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp"; 366 final String audioTrackFilename = INPUT_FILE_PATH + 367 "AMRNB_8KHz_12.2Kbps_m_1_17.3gp"; 368 369 final MediaVideoItem mediaVideoItem = 370 mVideoEditorHelper.createMediaItem(mVideoEditor, "m1", 371 videoItemFileName, MediaItem.RENDERING_MODE_BLACK_BORDER); 372 mediaVideoItem.setExtractBoundaries(0, 10000); 373 mVideoEditor.addMediaItem(mediaVideoItem); 374 375 final MediaImageItem mediaImageItem = 376 mVideoEditorHelper.createMediaItem(mVideoEditor, "m2", 377 imageItemFileName, 5000, MediaItem.RENDERING_MODE_BLACK_BORDER); 378 mVideoEditor.addMediaItem(mediaImageItem); 379 380 final AudioTrack audioTrack = mVideoEditorHelper.createAudio( 381 mVideoEditor, "a1", audioTrackFilename); 382 audioTrack.setExtractBoundaries(2000, 5000); 383 mVideoEditor.addAudioTrack(audioTrack); 384 385 audioTrack.disableDucking(); 386 audioTrack.enableLoop(); 387 audioTrack.setVolume(75); 388 389 mVideoEditor.generatePreview(new MediaProcessingProgressListener() { 390 public void onProgress(Object item, int action, int progress) { 391 } 392 }); 393 394 try { 395 final int[] progressUpdate = new int[100]; 396 mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720, 397 MediaProperties.BITRATE_800K, new ExportProgressListener() { 398 int i = 0; 399 public void onProgress(VideoEditor ve, String outFileName, 400 int progress) { 401 progressUpdate[i++] = progress; 402 } 403 }); 404 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 405 } catch (Exception e) { 406 assertTrue("Error in Export" + e.toString(), false); 407 } 408 mVideoEditorHelper.validateExport(mVideoEditor, outFilename, 409 MediaProperties.HEIGHT_720, 0, (mediaVideoItem.getTimelineDuration() + 410 mediaImageItem.getDuration()), 411 MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC); 412 413 mVideoEditorHelper.checkDeleteExistingFile(outFilename); 414 } 415 416 /** 417 *To Test export : With Transition on Different Media Items 418 */ 419 @LargeTest 420 public void testExportTransition() throws Exception { 421 final String videoItemFilename1 = INPUT_FILE_PATH 422 + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_0_26.3gp"; 423 final String imageItemFilename1 = INPUT_FILE_PATH + "IMG_1600x1200.jpg"; 424 final String videoItemFilename2 = INPUT_FILE_PATH 425 + "H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4"; 426 final String videoItemFilename3 = INPUT_FILE_PATH + 427 "MPEG4_SP_720x480_30fps_280kbps_AACLC_48kHz_96kbps_s_0_21.mp4"; 428 429 final String imageItemFilename2 = INPUT_FILE_PATH + "IMG_176x144.jpg"; 430 final String imageItemFilename3 = INPUT_FILE_PATH + "IMG_640x480.jpg"; 431 final String outFilename = mVideoEditorHelper 432 .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp"; 433 final String maskFilename = INPUT_FILE_PATH + 434 "TransitionSpiral_QVGA.jpg"; 435 436 final MediaVideoItem mediaItem1 = 437 mVideoEditorHelper.createMediaItem(mVideoEditor, "m1", 438 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER); 439 mediaItem1.setExtractBoundaries(2000, 7000); 440 mVideoEditor.addMediaItem(mediaItem1); 441 442 final TransitionAlpha transition1 = 443 mVideoEditorHelper.createTAlpha("transition1", null, mediaItem1, 444 2000, Transition.BEHAVIOR_LINEAR, maskFilename, 50, true); 445 mVideoEditor.addTransition(transition1); 446 447 final MediaImageItem mediaItem2 = 448 mVideoEditorHelper.createMediaItem(mVideoEditor, "m2", 449 imageItemFilename1, 8000, MediaItem.RENDERING_MODE_BLACK_BORDER); 450 mVideoEditor.addMediaItem(mediaItem2); 451 452 final MediaVideoItem mediaItem3 = 453 mVideoEditorHelper.createMediaItem(mVideoEditor, "m3", 454 videoItemFilename2, MediaItem.RENDERING_MODE_BLACK_BORDER); 455 mediaItem3.setExtractBoundaries(0, 8000); 456 mVideoEditor.addMediaItem(mediaItem3); 457 458 final TransitionSliding transition2And3 = 459 mVideoEditorHelper.createTSliding("transition2", mediaItem2, 460 mediaItem3, 4000, Transition.BEHAVIOR_MIDDLE_FAST, 461 TransitionSliding.DIRECTION_RIGHT_OUT_LEFT_IN); 462 mVideoEditor.addTransition(transition2And3); 463 464 final MediaVideoItem mediaItem4 = 465 mVideoEditorHelper.createMediaItem(mVideoEditor, "m4", 466 videoItemFilename3, MediaItem.RENDERING_MODE_BLACK_BORDER); 467 mVideoEditor.addMediaItem(mediaItem4); 468 mediaItem4.setExtractBoundaries(0, 8000); 469 470 final TransitionCrossfade transition3And4 = 471 mVideoEditorHelper.createTCrossFade("transition3", mediaItem3, 472 mediaItem4, 3500, Transition.BEHAVIOR_MIDDLE_SLOW); 473 mVideoEditor.addTransition(transition3And4); 474 475 final MediaImageItem mediaItem5 = 476 mVideoEditorHelper.createMediaItem(mVideoEditor, "m5", 477 imageItemFilename2, 7000, MediaItem.RENDERING_MODE_BLACK_BORDER); 478 mVideoEditor.addMediaItem(mediaItem5); 479 480 final TransitionFadeBlack transition4And5 = 481 mVideoEditorHelper.createTFadeBlack("transition4", mediaItem4, 482 mediaItem5, 3500, Transition.BEHAVIOR_SPEED_DOWN); 483 mVideoEditor.addTransition(transition4And5); 484 485 final MediaImageItem mediaItem6 = 486 mVideoEditorHelper.createMediaItem(mVideoEditor, "m6", 487 imageItemFilename3, 3000, MediaItem.RENDERING_MODE_BLACK_BORDER); 488 mVideoEditor.addMediaItem(mediaItem6); 489 490 final TransitionSliding transition5And6 = 491 mVideoEditorHelper.createTSliding("transition5", mediaItem5, 492 mediaItem6, 1000/*4000*/, Transition.BEHAVIOR_SPEED_UP, 493 TransitionSliding.DIRECTION_LEFT_OUT_RIGHT_IN); 494 mVideoEditor.addTransition(transition5And6); 495 496 final TransitionSliding transition6 = 497 mVideoEditorHelper.createTSliding("transition6", mediaItem6, null, 498 1000 /*4000*/, Transition.BEHAVIOR_SPEED_UP, 499 TransitionSliding.DIRECTION_TOP_OUT_BOTTOM_IN); 500 mVideoEditor.addTransition(transition6); 501 502 mVideoEditor.generatePreview(new MediaProcessingProgressListener() { 503 public void onProgress(Object item, int action, int progress) { 504 } 505 }); 506 507 try { 508 final int[] progressUpdate = new int[100]; 509 mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720, 510 MediaProperties.BITRATE_800K, new ExportProgressListener() { 511 int i = 0; 512 public void onProgress(VideoEditor ve, String outFileName, 513 int progress) { 514 progressUpdate[i++] = progress; 515 } 516 }); 517 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 518 } catch (Exception e) { 519 assertTrue("Error in Export" + e.toString(), false); 520 } 521 final long storyBoardDuration = mediaItem1.getTimelineDuration() 522 + mediaItem2.getTimelineDuration() 523 + mediaItem3.getTimelineDuration() - transition2And3.getDuration() 524 + mediaItem4.getTimelineDuration() - transition3And4.getDuration() 525 + mediaItem5.getTimelineDuration() - transition4And5.getDuration() 526 + mediaItem6.getTimelineDuration() - transition5And6.getDuration(); 527 mVideoEditorHelper.validateExport(mVideoEditor, outFilename, 528 MediaProperties.HEIGHT_720, 0, storyBoardDuration, 529 MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC); 530 mVideoEditorHelper.checkDeleteExistingFile(outFilename); 531 } 532 533 /** 534 * To Test Export : Without any Media Items in the story Board 535 * 536 * @throws Exception 537 */ 538 @LargeTest 539 public void testExportWithoutMediaItems() throws Exception { 540 boolean flagForException = false; 541 try { 542 final int[] progressUpdate = new int[100]; 543 mVideoEditor.export("/sdcard/Test.3gp", MediaProperties.HEIGHT_720, 544 MediaProperties.BITRATE_800K, new ExportProgressListener() { 545 int i = 0; 546 public void onProgress(VideoEditor ve, String outFileName, 547 int progress) { 548 progressUpdate[i++] = progress; 549 } 550 }); 551 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 552 } catch (IllegalStateException e) { 553 flagForException = true; 554 } 555 assertTrue("Export without any MediaItems", flagForException); 556 } 557 558 /** 559 * To Test Export : With Media Items add and removed in the story Board 560 * 561 * @throws Exception 562 */ 563 @LargeTest 564 public void testExportWithoutMediaItemsAddRemove() throws Exception { 565 final String videoItemFilename1 = INPUT_FILE_PATH + 566 "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_1_17.3gp"; 567 final String imageItemFilename1 = INPUT_FILE_PATH + "IMG_640x480.jpg"; 568 final String maskFilename = INPUT_FILE_PATH + "TransitionSpiral_QVGA.jpg"; 569 boolean flagForException = false; 570 571 final MediaVideoItem mediaItem1 = 572 mVideoEditorHelper.createMediaItem(mVideoEditor, "m1", 573 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER); 574 mediaItem1.setExtractBoundaries(0, 15000); 575 mVideoEditor.addMediaItem(mediaItem1); 576 577 final MediaImageItem mediaItem2 = 578 mVideoEditorHelper.createMediaItem(mVideoEditor, "m2", 579 imageItemFilename1, 15000, 580 MediaItem.RENDERING_MODE_BLACK_BORDER); 581 mVideoEditor.addMediaItem(mediaItem2); 582 583 final TransitionAlpha transition1 = 584 mVideoEditorHelper.createTAlpha("transition1", mediaItem1, mediaItem2, 585 3000, Transition.BEHAVIOR_LINEAR, maskFilename, 50, false); 586 mVideoEditor.addTransition(transition1); 587 588 final EffectColor effectColor = 589 mVideoEditorHelper.createEffectItem(mediaItem2, "effect", 12000, 590 3000, EffectColor.TYPE_COLOR, EffectColor.PINK); 591 mediaItem2.addEffect(effectColor); 592 593 mVideoEditor.removeMediaItem(mediaItem1.getId()); 594 mVideoEditor.removeMediaItem(mediaItem2.getId()); 595 try { 596 final int[] progressUpdate = new int[100]; 597 mVideoEditor.export("/sdcard/Test.3gp", MediaProperties.HEIGHT_720, 598 MediaProperties.BITRATE_800K, new ExportProgressListener() { 599 int i = 0; 600 public void onProgress(VideoEditor ve, String outFileName, 601 int progress) { 602 progressUpdate[i++] = progress; 603 } 604 }); 605 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 606 } catch (IllegalStateException e) { 607 flagForException = true; 608 } 609 assertTrue("Export with MediaItem added and removed", flagForException); 610 } 611 612 /** 613 * To Test Export : With Video and Image : MMS use case 614 * 615 * @throws Exception 616 */ 617 @LargeTest 618 public void testExportMMS() throws Exception { 619 final String videoItemFilename1 = INPUT_FILE_PATH 620 + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_1_17.3gp"; 621 final String imageItemFilename1 = INPUT_FILE_PATH + "IMG_1600x1200.jpg"; 622 final String videoItemFilename2 = INPUT_FILE_PATH 623 + "H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4"; 624 final String maskFilename = INPUT_FILE_PATH + "TransitionSpiral_QVGA.jpg"; 625 final String outFilename = mVideoEditorHelper 626 .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp"; 627 628 final MediaVideoItem mediaItem1 = 629 mVideoEditorHelper.createMediaItem(mVideoEditor, "m1", 630 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER); 631 mediaItem1.setExtractBoundaries(2000, 7000); 632 mVideoEditor.addMediaItem(mediaItem1); 633 634 final TransitionAlpha transition1 = 635 mVideoEditorHelper.createTAlpha("transition1", null, mediaItem1, 636 2000, Transition.BEHAVIOR_LINEAR, maskFilename, 50, true); 637 mVideoEditor.addTransition(transition1); 638 639 final MediaImageItem mediaItem2 = 640 mVideoEditorHelper.createMediaItem(mVideoEditor, "m2", 641 imageItemFilename1, 8000, MediaItem.RENDERING_MODE_BLACK_BORDER); 642 mVideoEditor.addMediaItem(mediaItem2); 643 644 final MediaVideoItem mediaItem3 = 645 mVideoEditorHelper.createMediaItem(mVideoEditor, "m3", 646 videoItemFilename2, MediaItem.RENDERING_MODE_BLACK_BORDER); 647 mediaItem3.setExtractBoundaries(0, 8000); 648 mVideoEditor.addMediaItem(mediaItem3); 649 650 final TransitionSliding transition2And3 = 651 mVideoEditorHelper.createTSliding("transition2", mediaItem2, 652 mediaItem3, 4000, Transition.BEHAVIOR_MIDDLE_FAST, 653 TransitionSliding.DIRECTION_RIGHT_OUT_LEFT_IN); 654 mVideoEditor.addTransition(transition2And3); 655 656 final TransitionCrossfade transition3 = 657 mVideoEditorHelper.createTCrossFade("transition3", mediaItem3, null, 658 3500, Transition.BEHAVIOR_MIDDLE_SLOW); 659 mVideoEditor.addTransition(transition3); 660 661 final EffectColor effectColor = 662 mVideoEditorHelper.createEffectItem(mediaItem2, "effect", 0, 663 3000, EffectColor.TYPE_COLOR, EffectColor.PINK); 664 mediaItem2.addEffect(effectColor); 665 666 mVideoEditor.setAspectRatio(MediaProperties.ASPECT_RATIO_11_9); 667 668 try { 669 final int[] progressUpdate = new int[100]; 670 mVideoEditor.export(outFilename, MediaProperties.HEIGHT_144, 671 MediaProperties.BITRATE_800K, new ExportProgressListener() { 672 int i = 0; 673 public void onProgress(VideoEditor ve, String outFileName, 674 int progress) { 675 progressUpdate[i++] = progress; 676 } 677 }); 678 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 679 } catch (Exception e) { 680 assertTrue("Error in Export" + e.toString(), false); 681 } 682 final long storyBoardDuration = mediaItem1.getTimelineDuration() 683 + mediaItem2.getTimelineDuration() + mediaItem3.getTimelineDuration() 684 - transition2And3.getDuration(); 685 686 mVideoEditorHelper.validateExport(mVideoEditor, outFilename, 687 MediaProperties.HEIGHT_144, 0, storyBoardDuration, 688 MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC); 689 mVideoEditorHelper.checkDeleteExistingFile(outFilename); 690 } 691 692 /** 693 * To Test Export :Media Item having duration of 1 Hour 694 * 695 * @throws Exception 696 */ 697 @Suppress 698 @LargeTest 699 public void testExportDuration1Hour() throws Exception { 700 final String videoItemFilename1 = INPUT_FILE_PATH + 701 "H264_BP_640x480_15fps_384kbps_60_0.mp4"; 702 final String outFilename = mVideoEditorHelper.createRandomFile( 703 mVideoEditor.getPath() + "/") + ".3gp"; 704 705 final MediaVideoItem mediaItem1 = 706 mVideoEditorHelper.createMediaItem(mVideoEditor, "m1", 707 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER); 708 mVideoEditor.addMediaItem(mediaItem1); 709 try { 710 final int[] progressUpdate = new int[100]; 711 mVideoEditor.export(outFilename, MediaProperties.HEIGHT_144, 712 MediaProperties.BITRATE_800K, new ExportProgressListener() { 713 int i = 0; 714 public void onProgress(VideoEditor ve, String outFileName, 715 int progress) { 716 progressUpdate[i++] = progress; 717 } 718 }); 719 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 720 }catch (Exception e) { 721 assertTrue("Error in Export" + e.toString(), false); 722 } 723 mVideoEditorHelper.validateExport(mVideoEditor, outFilename, 724 MediaProperties.HEIGHT_720, 0, mediaItem1.getDuration(), 725 MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC); 726 mVideoEditorHelper.checkDeleteExistingFile(outFilename); 727 } 728 729 /** 730 * To Test Export : Storage location having very less space (Less than 100 731 * KB) 732 * 733 * @throws Exception 734 */ 735 @LargeTest 736 public void testExportWithStorageFull() throws Exception { 737 final String videoItemFilename1 = INPUT_FILE_PATH 738 + "H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4"; 739 final String outFilename = mVideoEditorHelper 740 .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp"; 741 boolean flagForException = false; 742 743 mVideoEditorHelper.createMediaItem(mVideoEditor, "m1", videoItemFilename1, 744 MediaItem.RENDERING_MODE_BLACK_BORDER); 745 try { 746 final int[] progressUpdate = new int[100]; 747 mVideoEditor.export(outFilename, MediaProperties.HEIGHT_144, 748 MediaProperties.BITRATE_800K, new ExportProgressListener() { 749 int i = 0; 750 public void onProgress(VideoEditor ve, String outFileName, 751 int progress) { 752 progressUpdate[i++] = progress; 753 } 754 }); 755 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 756 } catch (Exception e) { 757 flagForException = true; 758 } 759 assertTrue("Error in exporting file due to lack of storage space", 760 flagForException); 761 } 762 763 /** 764 * To Test Export :Two Media Items added 765 * 766 * @throws Exception 767 */ 768 @LargeTest 769 public void testExportTwoVideos() throws Exception { 770 final String videoItemFileName = INPUT_FILE_PATH 771 + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_1_17.3gp"; 772 final String videoItemFileName1 = INPUT_FILE_PATH + 773 "H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4"; 774 final String outFilename = mVideoEditorHelper 775 .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp"; 776 777 final MediaVideoItem mediaVideoItem = 778 mVideoEditorHelper.createMediaItem(mVideoEditor, "m1", 779 videoItemFileName, MediaItem.RENDERING_MODE_BLACK_BORDER); 780 mVideoEditor.addMediaItem(mediaVideoItem); 781 782 final MediaVideoItem mediaVideoItem1 = 783 mVideoEditorHelper.createMediaItem(mVideoEditor, "m2", 784 videoItemFileName1, MediaItem.RENDERING_MODE_BLACK_BORDER); 785 mVideoEditor.addMediaItem(mediaVideoItem1); 786 787 mVideoEditor.generatePreview(new MediaProcessingProgressListener() { 788 public void onProgress(Object item, int action, int progress) { 789 } 790 }); 791 792 try { 793 final int[] progressUpdate = new int[100]; 794 mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720, 795 MediaProperties.BITRATE_800K, new ExportProgressListener() { 796 int i = 0; 797 public void onProgress(VideoEditor ve, String outFileName, 798 int progress) { 799 progressUpdate[i++] = progress; 800 } 801 }); 802 mVideoEditorHelper.checkProgressCBValues(progressUpdate); 803 } catch (Exception e) { 804 assertTrue("Error in Export" + e.toString(), false); 805 } 806 mVideoEditorHelper.validateExport(mVideoEditor, outFilename, 807 MediaProperties.HEIGHT_720, 0, 808 (mediaVideoItem.getDuration()+ mediaVideoItem1.getDuration()), 809 MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC); 810 mVideoEditorHelper.checkDeleteExistingFile(outFilename); 811 } 812} 813