package com.bumptech.glide.load.resource.bitmap; import android.graphics.Bitmap; import android.media.MediaMetadataRetriever; import android.os.ParcelFileDescriptor; import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import java.io.IOException; /** * An {@link com.bumptech.glide.load.resource.bitmap.BitmapDecoder} that can decode a thumbnail frame * {@link Bitmap} from a {@link android.os.ParcelFileDescriptor} containing a video. * * @see android.media.MediaMetadataRetriever */ public class VideoBitmapDecoder implements BitmapDecoder { private static final MediaMetadataRetrieverFactory DEFAULT_FACTORY = new MediaMetadataRetrieverFactory(); private MediaMetadataRetrieverFactory factory; public VideoBitmapDecoder() { this(DEFAULT_FACTORY); } VideoBitmapDecoder(MediaMetadataRetrieverFactory factory) { this.factory = factory; } @Override public Bitmap decode(ParcelFileDescriptor resource, BitmapPool bitmapPool, int outWidth, int outHeight, DecodeFormat decodeFormat) throws IOException { MediaMetadataRetriever mediaMetadataRetriever = factory.build(); mediaMetadataRetriever.setDataSource(resource.getFileDescriptor()); Bitmap result = mediaMetadataRetriever.getFrameAtTime(); mediaMetadataRetriever.release(); resource.close(); return result; } @Override public String getId() { return "VideoBitmapDecoder.com.bumptech.glide.load.resource.bitmap"; } // Visible for testing. static class MediaMetadataRetrieverFactory { public MediaMetadataRetriever build() { return new MediaMetadataRetriever(); } } }