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