package in.xiandan.mmrc.retriever.image;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.graphics.Paint;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import java.io.IOException;

import in.xiandan.mmrc.MediaMetadataKey;
import in.xiandan.mmrc.datasource.DataSource;
import in.xiandan.mmrc.utils.BitmapProcessor;

/**
 * 支持GIF动画的Retriever
 *
 * @author dengyuhan
 * created 2019-06-24 16:58
 */
public class GIFMediaMetadataRetriever extends BitmapMediaMetadataRetriever {
    private Movie mMovie;

    @Override
    public void setDataSource(@NonNull DataSource source) throws IOException {
        super.setDataSource(source);
        mMovie = Movie.decodeStream(getStream(false));
    }

    @Nullable
    @Override
    public Bitmap getFrameAtTime() {
        return this.getFrameAtTime(0, MediaMetadataKey.OPTION_CLOSEST_SYNC);
    }

    @Nullable
    @Override
    public Bitmap getFrameAtTime(long millis, int option) {
        mMovie.setTime((int) millis);
        Bitmap bitmap = Bitmap.createBitmap(mMovie.width(), mMovie.height(), Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(bitmap);
        mMovie.draw(canvas, 0, 0,new Paint(Paint.ANTI_ALIAS_FLAG));
        return bitmap;
    }

    @Nullable
    @Override
    public Bitmap getScaledFrameAtTime(long millis, int option, int dstWidth, int dstHeight) {
        final float scale = BitmapProcessor.calculateScale(mMovie.width(), mMovie.height(), dstWidth, dstHeight);
        return BitmapProcessor.floorScale(this.getFrameAtTime(millis, option), scale);
    }


    @Override
    public String extractMetadata(String keyCode) {
        if (MediaMetadataKey.DURATION.equals(keyCode)) {
            return String.valueOf(mMovie.duration());
        } else {
            return super.extractMetadata(keyCode);
        }
    }

    @Override
    protected int getWidth() {
        return mMovie.width();
    }

    @Override
    protected int getHeight() {
        return mMovie.height();
    }

    @Override
    public void release() {
        super.release();
        mMovie = null;
    }
}