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