diff options
Diffstat (limited to 'media/java')
4 files changed, 92 insertions, 83 deletions
diff --git a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java index 5bfdcdb..8caa04c 100644 --- a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java +++ b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java @@ -3781,72 +3781,62 @@ class MediaArtistNativeHelper { * @param startMs The starting time in ms * @param endMs The end time in ms * @param thumbnailCount The number of frames to be extracted + * @param indices The indices of thumbnails wanted + * @param callback The callback used to pass back the bitmaps * from startMs to endMs * * @return The frames as bitmaps in bitmap array **/ - Bitmap[] getPixelsList(String filename, int width, int height, long startMs, long endMs, - int thumbnailCount) { - int[] rgb888 = null; - int thumbnailSize = 0; - Bitmap tempBitmap = null; - + void getPixelsList(String filename, final int width, final int height, + long startMs, long endMs, int thumbnailCount, int[] indices, + final MediaItem.GetThumbnailListCallback callback) { /* Make width and height as even */ final int newWidth = (width + 1) & 0xFFFFFFFE; final int newHeight = (height + 1) & 0xFFFFFFFE; - thumbnailSize = newWidth * newHeight * 4; + final int thumbnailSize = newWidth * newHeight; /* Create a temp bitmap for resized thumbnails */ - if ((newWidth != width) || (newHeight != height)) { - tempBitmap = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888); - } - int i = 0; - int deltaTime = (int)(endMs - startMs) / thumbnailCount; - Bitmap[] bitmaps = null; - - try { - // This may result in out of Memory Error - rgb888 = new int[thumbnailSize * thumbnailCount]; - bitmaps = new Bitmap[thumbnailCount]; - } catch (Throwable e) { - // Allocating to new size with Fixed count - try { - rgb888 = new int[thumbnailSize * MAX_THUMBNAIL_PERMITTED]; - bitmaps = new Bitmap[MAX_THUMBNAIL_PERMITTED]; - thumbnailCount = MAX_THUMBNAIL_PERMITTED; - } catch (Throwable ex) { - throw new RuntimeException("Memory allocation fails, thumbnail count too large: " - + thumbnailCount); - } - } - IntBuffer tmpBuffer = IntBuffer.allocate(thumbnailSize); - nativeGetPixelsList(filename, rgb888, newWidth, newHeight, deltaTime, thumbnailCount, - startMs, endMs); + final Bitmap tempBitmap = + (newWidth != width || newHeight != height) + ? Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888) + : null; + + final int[] rgb888 = new int[thumbnailSize]; + final IntBuffer tmpBuffer = IntBuffer.allocate(thumbnailSize); + nativeGetPixelsList(filename, rgb888, newWidth, newHeight, + thumbnailCount, startMs, endMs, indices, + new NativeGetPixelsListCallback() { + public void onThumbnail(int index) { + Bitmap bitmap = Bitmap.createBitmap( + width, height, Bitmap.Config.ARGB_8888); + tmpBuffer.put(rgb888, 0, thumbnailSize); + tmpBuffer.rewind(); + + if ((newWidth == width) && (newHeight == height)) { + bitmap.copyPixelsFromBuffer(tmpBuffer); + } else { + /* Copy the out rgb buffer to temp bitmap */ + tempBitmap.copyPixelsFromBuffer(tmpBuffer); - for (; i < thumbnailCount; i++) { - bitmaps[i] = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - tmpBuffer.put(rgb888, (i * thumbnailSize), thumbnailSize); - tmpBuffer.rewind(); + /* Create a canvas to resize */ + final Canvas canvas = new Canvas(bitmap); + canvas.drawBitmap(tempBitmap, + new Rect(0, 0, newWidth, newHeight), + new Rect(0, 0, width, height), sResizePaint); - if ((newWidth == width) && (newHeight == height)) { - bitmaps[i].copyPixelsFromBuffer(tmpBuffer); - } else { - /* Copy the out rgb buffer to temp bitmap */ - tempBitmap.copyPixelsFromBuffer(tmpBuffer); - - /* Create a canvas to resize */ - final Canvas canvas = new Canvas(bitmaps[i]); - canvas.drawBitmap(tempBitmap, new Rect(0, 0, newWidth, newHeight), - new Rect(0, 0, width, height), sResizePaint); - canvas.setBitmap(null); + canvas.setBitmap(null); + } + callback.onThumbnail(bitmap, index); } - } + }); if (tempBitmap != null) { tempBitmap.recycle(); } + } - return bitmaps; + interface NativeGetPixelsListCallback { + public void onThumbnail(int index); } /** @@ -3957,8 +3947,9 @@ class MediaArtistNativeHelper { private native int nativeGetPixels(String fileName, int[] pixelArray, int width, int height, long timeMS); - private native int nativeGetPixelsList(String fileName, int[] pixelArray, int width, int height, - int timeMS, int nosofTN, long startTimeMs, long endTimeMs); + private native int nativeGetPixelsList(String fileName, int[] pixelArray, + int width, int height, int nosofTN, long startTimeMs, long endTimeMs, + int[] indices, NativeGetPixelsListCallback callback); /** * Releases the JNI and cleans up the core native module.. Should be called diff --git a/media/java/android/media/videoeditor/MediaImageItem.java b/media/java/android/media/videoeditor/MediaImageItem.java index f0cc1fe..4ca6fad 100755 --- a/media/java/android/media/videoeditor/MediaImageItem.java +++ b/media/java/android/media/videoeditor/MediaImageItem.java @@ -616,17 +616,18 @@ public class MediaImageItem extends MediaItem { * {@inheritDoc} */ @Override - public Bitmap[] getThumbnailList(int width, int height, long startMs, long endMs, - int thumbnailCount) throws IOException { + public void getThumbnailList(int width, int height, + long startMs, long endMs, + int thumbnailCount, + int[] indices, + GetThumbnailListCallback callback) + throws IOException { //KenBurns was not applied on this. if (getGeneratedImageClip() == null) { final Bitmap thumbnail = scaleImage(mFilename, width, height); - final Bitmap[] thumbnailArray = new Bitmap[thumbnailCount]; - for (int i = 0; i < thumbnailCount; i++) { - thumbnailArray[i] = thumbnail; + for (int i = 0; i < indices.length; i++) { + callback.onThumbnail(thumbnail, i); } - - return thumbnailArray; } else { if (startMs > endMs) { throw new IllegalArgumentException("Start time is greater than end time"); @@ -636,15 +637,8 @@ public class MediaImageItem extends MediaItem { throw new IllegalArgumentException("End time is greater than file duration"); } - if (startMs == endMs) { - Bitmap[] bitmap = new Bitmap[1]; - bitmap[0] = mMANativeHelper.getPixels(getGeneratedImageClip(), - width, height,startMs); - return bitmap; - } - - return mMANativeHelper.getPixelsList(getGeneratedImageClip(), width, - height,startMs,endMs,thumbnailCount); + mMANativeHelper.getPixelsList(getGeneratedImageClip(), width, + height, startMs, endMs, thumbnailCount, indices, callback); } } diff --git a/media/java/android/media/videoeditor/MediaItem.java b/media/java/android/media/videoeditor/MediaItem.java index 8c4841f..4e9ea75 100755 --- a/media/java/android/media/videoeditor/MediaItem.java +++ b/media/java/android/media/videoeditor/MediaItem.java @@ -564,15 +564,41 @@ public abstract class MediaItem { * @param startMs The start of time range in milliseconds * @param endMs The end of the time range in milliseconds * @param thumbnailCount The thumbnail count - * - * @return The array of Bitmaps + * @param indices The indices of the thumbnails wanted + * @param callback The callback used to pass back the bitmaps * * @throws IOException if a file error occurs */ - public abstract Bitmap[] getThumbnailList(int width, int height, - long startMs, long endMs, - int thumbnailCount) - throws IOException; + public abstract void getThumbnailList(int width, int height, + long startMs, long endMs, + int thumbnailCount, + int[] indices, + GetThumbnailListCallback callback) + throws IOException; + + public interface GetThumbnailListCallback { + public void onThumbnail(Bitmap bitmap, int index); + } + + // This is for compatibility, only used in tests. + public Bitmap[] getThumbnailList(int width, int height, + long startMs, long endMs, + int thumbnailCount) + throws IOException { + final Bitmap[] bitmaps = new Bitmap[thumbnailCount]; + int[] indices = new int[thumbnailCount]; + for (int i = 0; i < thumbnailCount; i++) { + indices[i] = i; + } + getThumbnailList(width, height, startMs, endMs, + thumbnailCount, indices, new GetThumbnailListCallback() { + public void onThumbnail(Bitmap bitmap, int index) { + bitmaps[index] = bitmap; + } + }); + + return bitmaps; + } /* * {@inheritDoc} diff --git a/media/java/android/media/videoeditor/MediaVideoItem.java b/media/java/android/media/videoeditor/MediaVideoItem.java index 6248651..0ac354b 100755 --- a/media/java/android/media/videoeditor/MediaVideoItem.java +++ b/media/java/android/media/videoeditor/MediaVideoItem.java @@ -293,8 +293,12 @@ public class MediaVideoItem extends MediaItem { * {@inheritDoc} */ @Override - public Bitmap[] getThumbnailList(int width, int height, long startMs, - long endMs, int thumbnailCount) throws IOException { + public void getThumbnailList(int width, int height, + long startMs, long endMs, + int thumbnailCount, + int[] indices, + GetThumbnailListCallback callback) + throws IOException { if (startMs > endMs) { throw new IllegalArgumentException("Start time is greater than end time"); } @@ -307,14 +311,8 @@ public class MediaVideoItem extends MediaItem { throw new IllegalArgumentException("Invalid dimension"); } - if (startMs == endMs) { - final Bitmap[] bitmap = new Bitmap[1]; - bitmap[0] = mMANativeHelper.getPixels(super.getFilename(), width, height,startMs); - return bitmap; - } - - return mMANativeHelper.getPixelsList(super.getFilename(), width, - height,startMs,endMs,thumbnailCount); + mMANativeHelper.getPixelsList(super.getFilename(), width, + height, startMs, endMs, thumbnailCount, indices, callback); } /* |