|
3 | 3 | import android.annotation.TargetApi;
|
4 | 4 | import android.content.res.AssetFileDescriptor;
|
5 | 5 | import android.graphics.Bitmap;
|
| 6 | +import android.media.MediaDataSource; |
6 | 7 | import android.media.MediaMetadataRetriever;
|
7 | 8 | import android.os.Build;
|
8 | 9 | import android.os.Build.VERSION_CODES;
|
9 | 10 | import android.os.ParcelFileDescriptor;
|
10 | 11 | import android.util.Log;
|
11 | 12 | import androidx.annotation.NonNull;
|
12 | 13 | import androidx.annotation.Nullable;
|
| 14 | +import androidx.annotation.RequiresApi; |
13 | 15 | import androidx.annotation.VisibleForTesting;
|
14 | 16 | import com.bumptech.glide.load.Option;
|
15 | 17 | import com.bumptech.glide.load.Options;
|
@@ -120,6 +122,11 @@ public static ResourceDecoder<ParcelFileDescriptor, Bitmap> parcel(BitmapPool bi
|
120 | 122 | return new VideoDecoder<>(bitmapPool, new ParcelFileDescriptorInitializer());
|
121 | 123 | }
|
122 | 124 |
|
| 125 | + @RequiresApi(api = VERSION_CODES.M) |
| 126 | + public static ResourceDecoder<ByteBuffer, Bitmap> byteBuffer(BitmapPool bitmapPool) { |
| 127 | + return new VideoDecoder<>(bitmapPool, new ByteBufferInitializer()); |
| 128 | + } |
| 129 | + |
123 | 130 | VideoDecoder(BitmapPool bitmapPool, MediaMetadataRetrieverInitializer<T> initializer) {
|
124 | 131 | this(bitmapPool, initializer, DEFAULT_FACTORY);
|
125 | 132 | }
|
@@ -299,4 +306,34 @@ public void initialize(MediaMetadataRetriever retriever, ParcelFileDescriptor da
|
299 | 306 | retriever.setDataSource(data.getFileDescriptor());
|
300 | 307 | }
|
301 | 308 | }
|
| 309 | + |
| 310 | + @RequiresApi(Build.VERSION_CODES.M) |
| 311 | + static final class ByteBufferInitializer |
| 312 | + implements MediaMetadataRetrieverInitializer<ByteBuffer> { |
| 313 | + |
| 314 | + @Override |
| 315 | + public void initialize(MediaMetadataRetriever retriever, final ByteBuffer data) { |
| 316 | + retriever.setDataSource( |
| 317 | + new MediaDataSource() { |
| 318 | + @Override |
| 319 | + public int readAt(long position, byte[] buffer, int offset, int size) { |
| 320 | + if (position >= data.limit()) { |
| 321 | + return -1; |
| 322 | + } |
| 323 | + data.position((int) position); |
| 324 | + int numBytesRead = Math.min(size, data.remaining()); |
| 325 | + data.get(buffer, offset, numBytesRead); |
| 326 | + return numBytesRead; |
| 327 | + } |
| 328 | + |
| 329 | + @Override |
| 330 | + public long getSize() { |
| 331 | + return data.limit(); |
| 332 | + } |
| 333 | + |
| 334 | + @Override |
| 335 | + public void close() {} |
| 336 | + }); |
| 337 | + } |
| 338 | + } |
302 | 339 | }
|
0 commit comments