#ifndef _PL_ANDROIDMEDIACODECENCODER_H_
|
#define _PL_ANDROIDMEDIACODECENCODER_H_
|
|
#include "PipeLine.h"
|
|
|
// copy from D:\Android\sdk\sources\android-25\android\media\MediaCodecInfo.java
|
struct Android_CodecProfileLevel
|
{
|
// typeof int
|
enum _OMX_VIDEO_AVCPROFILETYPE
|
{
|
// from OMX_VIDEO_AVCPROFILETYPE
|
AVCProfileBaseline = 0x01,
|
AVCProfileMain = 0x02,
|
AVCProfileExtended = 0x04,
|
AVCProfileHigh = 0x08,
|
AVCProfileHigh10 = 0x10,
|
AVCProfileHigh422 = 0x20,
|
AVCProfileHigh444 = 0x40
|
};
|
|
|
enum _OMX_VIDEO_AVCLEVELTYPE
|
{
|
// from OMX_VIDEO_AVCLEVELTYPE
|
AVCLevel1 = 0x01,
|
AVCLevel1b = 0x02,
|
AVCLevel11 = 0x04,
|
AVCLevel12 = 0x08,
|
AVCLevel13 = 0x10,
|
AVCLevel2 = 0x20,
|
AVCLevel21 = 0x40,
|
AVCLevel22 = 0x80,
|
AVCLevel3 = 0x100,
|
AVCLevel31 = 0x200,
|
AVCLevel32 = 0x400,
|
AVCLevel4 = 0x800,
|
AVCLevel41 = 0x1000,
|
AVCLevel42 = 0x2000,
|
AVCLevel5 = 0x4000,
|
AVCLevel51 = 0x8000,
|
AVCLevel52 = 0x10000,
|
};
|
|
enum _OMX_VIDEO_H263PROFILETYPE
|
{
|
// from OMX_VIDEO_H263PROFILETYPE
|
H263ProfileBaseline = 0x01,
|
H263ProfileH320Coding = 0x02,
|
H263ProfileBackwardCompatible = 0x04,
|
H263ProfileISWV2 = 0x08,
|
H263ProfileISWV3 = 0x10,
|
H263ProfileHighCompression = 0x20,
|
H263ProfileInternet = 0x40,
|
H263ProfileInterlace = 0x80,
|
H263ProfileHighLatency = 0x100
|
};
|
|
enum _OMX_VIDEO_H263LEVELTYPE
|
{
|
// from OMX_VIDEO_H263LEVELTYPE
|
H263Level10 = 0x01,
|
H263Level20 = 0x02,
|
H263Level30 = 0x04,
|
H263Level40 = 0x08,
|
H263Level45 = 0x10,
|
H263Level50 = 0x20,
|
H263Level60 = 0x40,
|
H263Level70 = 0x80
|
};
|
|
enum _OMX_VIDEO_MPEG4PROFILETYPE
|
{
|
// from OMX_VIDEO_MPEG4PROFILETYPE
|
MPEG4ProfileSimple = 0x01,
|
MPEG4ProfileSimpleScalable = 0x02,
|
MPEG4ProfileCore = 0x04,
|
MPEG4ProfileMain = 0x08,
|
MPEG4ProfileNbit = 0x10,
|
MPEG4ProfileScalableTexture = 0x20,
|
MPEG4ProfileSimpleFace = 0x40,
|
MPEG4ProfileSimpleFBA = 0x80,
|
MPEG4ProfileBasicAnimated = 0x100,
|
MPEG4ProfileHybrid = 0x200,
|
MPEG4ProfileAdvancedRealTime = 0x400,
|
MPEG4ProfileCoreScalable = 0x800,
|
MPEG4ProfileAdvancedCoding = 0x1000,
|
MPEG4ProfileAdvancedCore = 0x2000,
|
MPEG4ProfileAdvancedScalable = 0x4000,
|
MPEG4ProfileAdvancedSimple = 0x8000
|
};
|
|
enum _OMX_VIDEO_MPEG4LEVELTYPE
|
{
|
// from OMX_VIDEO_MPEG4LEVELTYPE
|
MPEG4Level0 = 0x01,
|
MPEG4Level0b = 0x02,
|
MPEG4Level1 = 0x04,
|
MPEG4Level2 = 0x08,
|
MPEG4Level3 = 0x10,
|
MPEG4Level3b = 0x18,
|
MPEG4Level4 = 0x20,
|
MPEG4Level4a = 0x40,
|
MPEG4Level5 = 0x80,
|
MPEG4Level6 = 0x100
|
};
|
|
enum _OMX_VIDEO_MPEG2PROFILETYPE
|
{
|
// from OMX_VIDEO_MPEG2PROFILETYPE
|
MPEG2ProfileSimple = 0x00,
|
MPEG2ProfileMain = 0x01,
|
MPEG2Profile422 = 0x02,
|
MPEG2ProfileSNR = 0x03,
|
MPEG2ProfileSpatial = 0x04,
|
MPEG2ProfileHigh = 0x05
|
};
|
|
enum _OMX_VIDEO_MPEG2LEVELTYPE
|
{
|
// from OMX_VIDEO_MPEG2LEVELTYPE
|
MPEG2LevelLL = 0x00,
|
MPEG2LevelML = 0x01,
|
MPEG2LevelH14 = 0x02,
|
MPEG2LevelHL = 0x03,
|
MPEG2LevelHP = 0x04
|
};
|
|
enum _OMX_AUDIO_AACPROFILETYPE
|
{
|
// from OMX_AUDIO_AACPROFILETYPE
|
AACObjectMain = 1,
|
AACObjectLC = 2,
|
AACObjectSSR = 3,
|
AACObjectLTP = 4,
|
AACObjectHE = 5,
|
AACObjectScalable = 6,
|
AACObjectERLC = 17,
|
AACObjectLD = 23,
|
AACObjectHE_PS = 29,
|
AACObjectELD = 39
|
};
|
|
enum _OMX_VIDEO_VP8LEVELTYPE
|
{
|
// from OMX_VIDEO_VP8LEVELTYPE
|
VP8Level_Version0 = 0x01,
|
VP8Level_Version1 = 0x02,
|
VP8Level_Version2 = 0x04,
|
VP8Level_Version3 = 0x08
|
};
|
|
// // from OMX_VIDEO_VP8PROFILETYPE
|
//VP8ProfileMain = 0x01,
|
//
|
// // from OMX_VIDEO_VP9PROFILETYPE
|
//VP9Profile0 = 0x01,
|
//VP9Profile1 = 0x02,
|
//VP9Profile2 = 0x04,
|
//VP9Profile3 = 0x08,
|
// // HDR profiles also support passing HDR metadata
|
//VP9Profile2HDR = 0x1000,
|
//VP9Profile3HDR = 0x2000,
|
//
|
// // from OMX_VIDEO_VP9LEVELTYPE
|
//VP9Level1 = 0x1,
|
//VP9Level11 = 0x2,
|
//VP9Level2 = 0x4,
|
//VP9Level21 = 0x8,
|
//VP9Level3 = 0x10,
|
//VP9Level31 = 0x20,
|
//VP9Level4 = 0x40,
|
//VP9Level41 = 0x80,
|
//VP9Level5 = 0x100,
|
//VP9Level51 = 0x200,
|
//VP9Level52 = 0x400,
|
//VP9Level6 = 0x800,
|
//VP9Level61 = 0x1000,
|
//VP9Level62 = 0x2000,
|
//
|
// // from OMX_VIDEO_HEVCPROFILETYPE
|
//HEVCProfileMain = 0x01,
|
//HEVCProfileMain10 = 0x02,
|
//HEVCProfileMain10HDR10 = 0x1000,
|
//
|
// // from OMX_VIDEO_HEVCLEVELTYPE
|
//HEVCMainTierLevel1 = 0x1,
|
//HEVCHighTierLevel1 = 0x2,
|
//HEVCMainTierLevel2 = 0x4,
|
//HEVCHighTierLevel2 = 0x8,
|
//HEVCMainTierLevel21 = 0x10,
|
//HEVCHighTierLevel21 = 0x20,
|
//HEVCMainTierLevel3 = 0x40,
|
//HEVCHighTierLevel3 = 0x80,
|
//HEVCMainTierLevel31 = 0x100,
|
//HEVCHighTierLevel31 = 0x200,
|
//HEVCMainTierLevel4 = 0x400,
|
//HEVCHighTierLevel4 = 0x800,
|
//HEVCMainTierLevel41 = 0x1000,
|
//HEVCHighTierLevel41 = 0x2000,
|
//HEVCMainTierLevel5 = 0x4000,
|
//HEVCHighTierLevel5 = 0x8000,
|
//HEVCMainTierLevel51 = 0x10000,
|
//HEVCHighTierLevel51 = 0x20000,
|
//HEVCMainTierLevel52 = 0x40000,
|
//HEVCHighTierLevel52 = 0x80000,
|
//HEVCMainTierLevel6 = 0x100000,
|
//HEVCHighTierLevel6 = 0x200000,
|
//HEVCMainTierLevel61 = 0x400000,
|
//HEVCHighTierLevel61 = 0x800000,
|
//HEVCMainTierLevel62 = 0x1000000,
|
//HEVCHighTierLevel62 = 0x2000000,
|
//
|
//private static final int HEVCHighTierLevels =
|
// HEVCHighTierLevel1 | HEVCHighTierLevel2 | HEVCHighTierLevel21 | HEVCHighTierLevel3 |
|
// HEVCHighTierLevel31 | HEVCHighTierLevel4 | HEVCHighTierLevel41 | HEVCHighTierLevel5 |
|
// HEVCHighTierLevel51 | HEVCHighTierLevel52 | HEVCHighTierLevel6 | HEVCHighTierLevel61 |
|
// HEVCHighTierLevel62,
|
//
|
// // from OMX_VIDEO_DOLBYVISIONPROFILETYPE
|
//DolbyVisionProfileDvavPer = 0x1,
|
//DolbyVisionProfileDvavPen = 0x2,
|
//DolbyVisionProfileDvheDer = 0x4,
|
//DolbyVisionProfileDvheDen = 0x8,
|
//DolbyVisionProfileDvheDtr = 0x10,
|
//DolbyVisionProfileDvheStn = 0x20,
|
//DolbyVisionProfileDvheDth = 0x40,
|
//DolbyVisionProfileDvheDtb = 0x80,
|
//
|
// // from OMX_VIDEO_DOLBYVISIONLEVELTYPE
|
//DolbyVisionLevelHd24 = 0x1,
|
//DolbyVisionLevelHd30 = 0x2,
|
//DolbyVisionLevelFhd24 = 0x4,
|
//DolbyVisionLevelFhd30 = 0x8,
|
//DolbyVisionLevelFhd60 = 0x10,
|
//DolbyVisionLevelUhd24 = 0x20,
|
//DolbyVisionLevelUhd30 = 0x40,
|
//DolbyVisionLevelUhd48 = 0x80,
|
//DolbyVisionLevelUhd60 = 0x100,
|
|
|
// Defined in the OpenMAX IL specs, depending on the type of media
|
// this can be OMX_VIDEO_AVCPROFILETYPE, OMX_VIDEO_H263PROFILETYPE,
|
// OMX_VIDEO_MPEG4PROFILETYPE, OMX_VIDEO_VP8PROFILETYPE or OMX_VIDEO_VP9PROFILETYPE.
|
int profile;
|
|
// Defined in the OpenMAX IL specs, depending on the type of media
|
// this can be OMX_VIDEO_AVCLEVELTYPE, OMX_VIDEO_H263LEVELTYPE // OMX_VIDEO_MPEG4LEVELTYPE, OMX_VIDEO_VP8LEVELTYPE or OMX_VIDEO_VP9LEVELTYPE.
|
//
|
// Note that VP9 decoder on platforms before {@link android.os.Build.VERSION_CODES#N} may
|
// not advertise a profile level support. For those VP9 decoders, please use
|
// {@link VideoCapabilities} to determine the codec capabilities.
|
int level;
|
|
Android_CodecProfileLevel() : profile(0), level(0) { }
|
};
|
|
struct PL_AndroidMediaCodecEncoder_Config
|
{
|
// D:\adk\ndk-bundle\platforms\android-21\arch-arm64\usr\include\media\NdkMediaFormat.h
|
// AMEDIAFORMAT_KEY_AAC_PROFILE;
|
int32_t ak_bit_rate; // AMEDIAFORMAT_KEY_BIT_RATE;
|
// AMEDIAFORMAT_KEY_CHANNEL_COUNT;
|
// AMEDIAFORMAT_KEY_CHANNEL_MASK;
|
int32_t ak_color_format; // AMEDIAFORMAT_KEY_COLOR_FORMAT;
|
// AMEDIAFORMAT_KEY_DURATION;
|
// AMEDIAFORMAT_KEY_FLAC_COMPRESSION_LEVEL;
|
int32_t ak_frame_rate; // AMEDIAFORMAT_KEY_FRAME_RATE;
|
int32_t ak_height; // AMEDIAFORMAT_KEY_HEIGHT;
|
// AMEDIAFORMAT_KEY_IS_ADTS;
|
// AMEDIAFORMAT_KEY_IS_AUTOSELECT;
|
// AMEDIAFORMAT_KEY_IS_DEFAULT;
|
// AMEDIAFORMAT_KEY_IS_FORCED_SUBTITLE;
|
int32_t ak_i_frame_interval; // AMEDIAFORMAT_KEY_I_FRAME_INTERVAL;
|
// AMEDIAFORMAT_KEY_LANGUAGE;
|
// AMEDIAFORMAT_KEY_MAX_HEIGHT;
|
// AMEDIAFORMAT_KEY_MAX_INPUT_SIZE;
|
// AMEDIAFORMAT_KEY_MAX_WIDTH;
|
std::string ak_mime; // AMEDIAFORMAT_KEY_MIME; // video/avc
|
// AMEDIAFORMAT_KEY_PUSH_BLANK_BUFFERS_ON_STOP;
|
// AMEDIAFORMAT_KEY_REPEAT_PREVIOUS_FRAME_AFTER;
|
// AMEDIAFORMAT_KEY_SAMPLE_RATE;
|
int32_t ak_width; // AMEDIAFORMAT_KEY_WIDTH;
|
// AMEDIAFORMAT_KEY_STRIDE;
|
|
Android_CodecProfileLevel codecProfileLevel;
|
|
PL_AndroidMediaCodecEncoder_Config() :
|
ak_bit_rate(0),
|
ak_color_format(0),
|
ak_frame_rate(0),
|
ak_height(0),
|
ak_i_frame_interval(0),
|
ak_mime(),
|
ak_width(0),
|
codecProfileLevel()
|
{}
|
};
|
|
class PL_AndroidMediaCodecEncoder : public PipeLineElem
|
{
|
public:
|
PL_AndroidMediaCodecEncoder();
|
virtual ~PL_AndroidMediaCodecEncoder();
|
|
virtual bool init(void* args);
|
virtual void finit();
|
|
virtual bool pay(const PipeMaterial& pm);
|
virtual bool gain(PipeMaterial& pm);
|
|
private:
|
void* internal;
|
};
|
|
PipeLineElem* create_PL_AndroidMediaCodecEncoder();
|
|
#endif
|