1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.dam.preview;
35
36 import info.magnolia.cms.core.AggregationState;
37 import info.magnolia.i18nsystem.SimpleTranslator;
38 import info.magnolia.imaging.ImagingException;
39 import info.magnolia.imaging.operations.load.FromBinaryNode;
40 import info.magnolia.objectfactory.Components;
41
42 import java.awt.Font;
43 import java.awt.FontMetrics;
44 import java.awt.Graphics;
45 import java.awt.image.BufferedImage;
46 import java.io.IOException;
47 import java.io.InputStream;
48 import java.nio.ByteBuffer;
49
50 import javax.inject.Inject;
51 import javax.inject.Provider;
52
53 import org.apache.commons.io.IOUtils;
54 import org.jcodec.api.FrameGrab;
55 import org.jcodec.common.io.ByteBufferSeekableByteChannel;
56 import org.jcodec.common.model.Picture;
57 import org.jcodec.scale.AWTUtil;
58 import org.slf4j.Logger;
59 import org.slf4j.LoggerFactory;
60
61
62
63
64 public class ViaJCodec extends FromBinaryNode {
65
66 private static final Logger log = LoggerFactory.getLogger(ViaJCodec.class);
67
68 private final SimpleTranslator translator;
69 private final Provider<AggregationState> aggregationStateProvider;
70
71 @Inject
72 public ViaJCodec(SimpleTranslator translator, Provider<AggregationState> provider) {
73 this.translator = translator;
74 this.aggregationStateProvider = provider;
75 }
76
77
78
79
80 @Deprecated
81 public ViaJCodec() {
82 this(Components.getComponent(SimpleTranslator.class), new Provider<AggregationState>() {
83 @Override
84 public AggregationState get() {
85 return Components.getComponent(AggregationState.class);
86 }
87 });
88 }
89
90 @Override
91 protected BufferedImage doReadAndClose(InputStream inputStream) throws IOException, ImagingException {
92
93 byte[] bytes = IOUtils.toByteArray(inputStream);
94 ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
95
96 ByteBufferSeekableByteChannel byteBufferSeekableByteChannel = new ByteBufferSeekableByteChannel(byteBuffer, bytes.length);
97
98
99 byteBufferSeekableByteChannel.truncate(bytes.length);
100
101 try {
102 Picture picture = FrameGrab.getFrameFromChannel(byteBufferSeekableByteChannel, 5);
103 return AWTUtil.toBufferedImage(picture);
104 } catch (Exception e) {
105 String uri = aggregationStateProvider.get().getCurrentURI();
106 log.debug("Cannot generate thumbnail for uri '{}'", uri, e);
107 return createFallbackImage();
108 }
109 }
110
111 private BufferedImage createFallbackImage() {
112 final BufferedImage image = new BufferedImage(160, 160, BufferedImage.TYPE_INT_ARGB);
113 Graphics graphics = image.getGraphics();
114 graphics.setFont(new Font(null, Font.PLAIN, 11));
115 String text = translator.translate("dam.preview.no.video.preview.available");
116 FontMetrics metrics = graphics.getFontMetrics();
117 int x = (image.getWidth() - metrics.stringWidth(text)) / 2;
118 int y = ((image.getHeight() - metrics.getHeight()) / 2) + metrics.getAscent();
119 graphics.drawString(text, x, y);
120 graphics.dispose();
121 return image;
122 }
123
124 }