#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