18ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li/* 28ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * Copyright (C) 2011 The Android Open Source Project 38ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * 48ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License"); 58ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * you may not use this file except in compliance with the License. 68ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * You may obtain a copy of the License at 78ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * 88ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * http://www.apache.org/licenses/LICENSE-2.0 98ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * 108ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * Unless required by applicable law or agreed to in writing, software 118ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS, 128ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * See the License for the specific language governing permissions and 148ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * limitations under the License. 158ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li */ 168ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li 178ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Lipackage com.android.camera; 188ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li 198ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.graphics.Bitmap; 207648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Liimport android.media.MediaMetadataRetriever; 218ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li 22eb47ed18eb3eec902d1ce18d20530e296bd83d9eWu-cheng Liimport java.io.FileDescriptor; 238ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li 24a907c122ccec649c6cedf3a45b1c426a5fca932eAngus Kongpublic class Thumbnail { 251859aaff81561d7bf0b28f6164839731f886c15dAngus Kong public static Bitmap createVideoThumbnailBitmap(FileDescriptor fd, int targetWidth) { 261859aaff81561d7bf0b28f6164839731f886c15dAngus Kong return createVideoThumbnailBitmap(null, fd, targetWidth); 27eb47ed18eb3eec902d1ce18d20530e296bd83d9eWu-cheng Li } 28eb47ed18eb3eec902d1ce18d20530e296bd83d9eWu-cheng Li 291859aaff81561d7bf0b28f6164839731f886c15dAngus Kong public static Bitmap createVideoThumbnailBitmap(String filePath, int targetWidth) { 301859aaff81561d7bf0b28f6164839731f886c15dAngus Kong return createVideoThumbnailBitmap(filePath, null, targetWidth); 31eb47ed18eb3eec902d1ce18d20530e296bd83d9eWu-cheng Li } 32eb47ed18eb3eec902d1ce18d20530e296bd83d9eWu-cheng Li 331859aaff81561d7bf0b28f6164839731f886c15dAngus Kong private static Bitmap createVideoThumbnailBitmap(String filePath, FileDescriptor fd, 341859aaff81561d7bf0b28f6164839731f886c15dAngus Kong int targetWidth) { 357648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li Bitmap bitmap = null; 367648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 377648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li try { 38eb47ed18eb3eec902d1ce18d20530e296bd83d9eWu-cheng Li if (filePath != null) { 39eb47ed18eb3eec902d1ce18d20530e296bd83d9eWu-cheng Li retriever.setDataSource(filePath); 40eb47ed18eb3eec902d1ce18d20530e296bd83d9eWu-cheng Li } else { 41eb47ed18eb3eec902d1ce18d20530e296bd83d9eWu-cheng Li retriever.setDataSource(fd); 42eb47ed18eb3eec902d1ce18d20530e296bd83d9eWu-cheng Li } 437648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li bitmap = retriever.getFrameAtTime(-1); 447648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li } catch (IllegalArgumentException ex) { 457648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li // Assume this is a corrupt video file 467648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li } catch (RuntimeException ex) { 477648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li // Assume this is a corrupt video file. 487648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li } finally { 497648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li try { 507648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li retriever.release(); 517648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li } catch (RuntimeException ex) { 527648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li // Ignore failures while cleaning up. 537648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li } 547648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li } 557648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li if (bitmap == null) return null; 567648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li 577648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li // Scale down the bitmap if it is bigger than we need. 587648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li int width = bitmap.getWidth(); 597648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li int height = bitmap.getHeight(); 607648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li if (width > targetWidth) { 617648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li float scale = (float) targetWidth / width; 627648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li int w = Math.round(scale * width); 637648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li int h = Math.round(scale * height); 647648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true); 657648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li } 667648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li return bitmap; 677648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li } 688ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li} 69