From ea6265546c3a91ad9d41abd5814df803599124ad Mon Sep 17 00:00:00 2001 From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674> Date: 星期三, 16 八月 2017 17:55:37 +0800 Subject: [PATCH] aaaaa --- RtspFace/PL_AndroidMediaCodecEncoder.h | 258 +++++++++++++++++++++++++++++++++++++++++++++++++++ RtspFace/PL_RTSPServer2.cpp | 6 RtspFace/PL_AndroidMediaCodecEncoder.cpp | 7 + RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp | 12 +- 4 files changed, 274 insertions(+), 9 deletions(-) diff --git a/RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp b/RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp index 099ff6b..226e45a 100644 --- a/RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp +++ b/RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp @@ -134,13 +134,15 @@ AMediaFormat_setBuffer(format, "csd-0", sps.sPropBytes, sps.sPropLength); // sps AMediaFormat_setBuffer(format, "csd-1", pps.sPropBytes, pps.sPropLength); // pps - - //uint8_t sps[] = {0x0,0x0,0x0,0x1, 0x67, 0x42, 0x00, 0x2A, 0x95, 0xA8, 0x1E, 0x00, 0x89, 0xF9, 0x61, 0x00, 0x00, 0x07, 0x08, 0x00, 0x01, 0x5F, 0x90, 0x04}; - //uint8_t pps[] = {0x0,0x0,0x0,0x1, 0x68, 0xCE, 0x3C, 0x80}; - //AMediaFormat_setBuffer(format, "csd-0", sps, sizeof(sps)); // sps - //AMediaFormat_setBuffer(format, "csd-1", pps, sizeof(pps)); // pps */ + // J0LgKI1oCgPaEAAAAwAQAAADAoDxB6gA,KM4ySA== + uint8_t sps[] = {0x27,0x42,0xe0,0x28,0x8d,0x68,0x0a,0x03,0xda,0x10,0x00,0x00,0x03,0x00,0x10,0x00,0x00,0x03,0x02,0x80,0xf1,0x07,0xa8,0x00}; + uint8_t pps[] = {0x28,0xce,0x32,0x48}; + AMediaFormat_setBuffer(format, "csd-0", sps, sizeof(sps)); // sps + AMediaFormat_setBuffer(format, "csd-1", pps, sizeof(pps)); // pps + + // should like: // mime: string(video/avc), durationUs: int64(10000000), width: int32(480), height: int32(360), max-input-size: int32(55067), csd-0: data, csd-1: data} const char* fmt = AMediaFormat_toString(format); diff --git a/RtspFace/PL_AndroidMediaCodecEncoder.cpp b/RtspFace/PL_AndroidMediaCodecEncoder.cpp index 2484cd5..94d3fea 100644 --- a/RtspFace/PL_AndroidMediaCodecEncoder.cpp +++ b/RtspFace/PL_AndroidMediaCodecEncoder.cpp @@ -82,6 +82,7 @@ PL_AndroidMediaCodecEncoder_Config* config = (PL_AndroidMediaCodecEncoder_Config*)args; in->config = *config; + // see: developer.android.com/reference/android/media/MediaFormat.html#KEY_PROFILE AMediaFormat* format = AMediaFormat_new(); AMediaFormat_setString(format, AMEDIAFORMAT_KEY_MIME, config->ak_mime.c_str()); @@ -99,6 +100,12 @@ AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_COLOR_FORMAT, config->ak_color_format); //AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_STRIDE, config->ak_width * 2); + if (config->codecProfileLevel.profile != 0) + AMediaFormat_setInt32(format, "profile", config->codecProfileLevel.profile); + if (config->codecProfileLevel.level != 0) + AMediaFormat_setInt32(format, "level", config->codecProfileLevel.level); + + //uint8_t sps[] = {0x0,0x0,0x0,0x1, 0x67, 0x42, 0x00, 0x2A, 0x95, 0xA8, 0x1E, 0x00, 0x89, 0xF9, 0x61, 0x00, 0x00, 0x07, 0x08, 0x00, 0x01, 0x5F, 0x90, 0x04}; //uint8_t pps[] = {0x0,0x0,0x0,0x1, 0x68, 0xCE, 0x3C, 0x80}; //AMediaFormat_setBuffer(format, "csd-0", sps, sizeof(sps)); // sps diff --git a/RtspFace/PL_AndroidMediaCodecEncoder.h b/RtspFace/PL_AndroidMediaCodecEncoder.h index 90ec190..b2420f1 100644 --- a/RtspFace/PL_AndroidMediaCodecEncoder.h +++ b/RtspFace/PL_AndroidMediaCodecEncoder.h @@ -3,6 +3,259 @@ #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 @@ -31,6 +284,8 @@ int32_t ak_width; // AMEDIAFORMAT_KEY_WIDTH; // AMEDIAFORMAT_KEY_STRIDE; + Android_CodecProfileLevel codecProfileLevel; + PL_AndroidMediaCodecEncoder_Config() : ak_bit_rate(0), ak_color_format(0), @@ -38,7 +293,8 @@ ak_height(0), ak_i_frame_interval(0), ak_mime(), - ak_width(0) + ak_width(0), + codecProfileLevel() {} }; diff --git a/RtspFace/PL_RTSPServer2.cpp b/RtspFace/PL_RTSPServer2.cpp index adc8d6c..f45038b 100644 --- a/RtspFace/PL_RTSPServer2.cpp +++ b/RtspFace/PL_RTSPServer2.cpp @@ -164,9 +164,9 @@ if (_this->lastBuffer == nullptr) return false; - buffer = _this->lastBuffer->buffer; + buffer = _this->lastBuffer->buffer; // #todo send nalu buffSize = _this->lastBuffer->buffSize; - LOG_WARN << "sizeS=" << buffSize << LOG_ENDL; + //LOG_WARN << "sizeS=" << buffSize << LOG_ENDL; //LOG_INFO << "DeliverFrameCallback buffSize=" << buffSize << LOG_ENDL; //static size_t f = 0; @@ -300,7 +300,7 @@ if (frame->buffer == nullptr || frame->buffSize == 0) return false; - LOG_WARN << "sizeR=" << frame->buffSize << LOG_ENDL; + //LOG_WARN << "sizeR=" << frame->buffSize << LOG_ENDL; ScopeLocker<pthread_mutex_t>(in->queue_mutex); //if (in->frameQueue->Full()) -- Gitblit v1.8.0