1package eu.siacs.conversations.utils;
2
3import android.media.MediaCodecInfo;
4import android.media.MediaFormat;
5import android.os.Build;
6import android.support.annotation.RequiresApi;
7import android.util.Log;
8
9import net.ypresto.androidtranscoder.format.MediaFormatExtraConstants;
10import net.ypresto.androidtranscoder.format.MediaFormatStrategy;
11import net.ypresto.androidtranscoder.format.OutputFormatUnavailableException;
12
13import eu.siacs.conversations.Config;
14
15public class Android720pFormatStrategy implements MediaFormatStrategy {
16
17 private static final int LONGER_LENGTH = 1280;
18 private static final int SHORTER_LENGTH = 720;
19 private static final int DEFAULT_VIDEO_BITRATE = 2000 * 1000;
20 private static final int DEFAULT_AUDIO_BITRATE = 192 * 1000;
21 private final int mVideoBitrate;
22 private final int mAudioBitrate;
23 private final int mAudioChannels;
24
25 public Android720pFormatStrategy() {
26 mVideoBitrate = DEFAULT_VIDEO_BITRATE;
27 mAudioBitrate = DEFAULT_AUDIO_BITRATE;
28 mAudioChannels = 2;
29 }
30
31 @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
32 @Override
33 public MediaFormat createVideoOutputFormat(MediaFormat inputFormat) {
34 int width = inputFormat.getInteger(MediaFormat.KEY_WIDTH);
35 int height = inputFormat.getInteger(MediaFormat.KEY_HEIGHT);
36 int longer, shorter, outWidth, outHeight;
37 if (width >= height) {
38 longer = width;
39 shorter = height;
40 outWidth = LONGER_LENGTH;
41 outHeight = SHORTER_LENGTH;
42 } else {
43 shorter = width;
44 longer = height;
45 outWidth = SHORTER_LENGTH;
46 outHeight = LONGER_LENGTH;
47 }
48 if (longer * 9 != shorter * 16) {
49 throw new OutputFormatUnavailableException("This video is not 16:9, and is not able to transcode. (" + width + "x" + height + ")");
50 }
51 if (shorter <= SHORTER_LENGTH) {
52 Log.d(Config.LOGTAG, "This video is less or equal to 720p, pass-through. (" + width + "x" + height + ")");
53 return null;
54 }
55 MediaFormat format = MediaFormat.createVideoFormat("video/avc", outWidth, outHeight);
56 // From Nexus 4 Camera in 720p
57 format.setInteger(MediaFormat.KEY_BIT_RATE, mVideoBitrate);
58 format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
59 format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 3);
60 format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
61 return format;
62 }
63
64 @Override
65 public MediaFormat createAudioOutputFormat(MediaFormat inputFormat) {
66 final MediaFormat format = MediaFormat.createAudioFormat(MediaFormatExtraConstants.MIMETYPE_AUDIO_AAC, inputFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE), mAudioChannels);
67 format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
68 format.setInteger(MediaFormat.KEY_BIT_RATE, mAudioBitrate);
69 return format;
70 }
71
72}