houxiao
2017-08-16 ea6265546c3a91ad9d41abd5814df803599124ad
aaaaa

git-svn-id: http://192.168.1.226/svn/proxy@1014 454eff88-639b-444f-9e54-f578c98de674
4个文件已修改
283 ■■■■■ 已修改文件
RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
RtspFace/PL_AndroidMediaCodecEncoder.cpp 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
RtspFace/PL_AndroidMediaCodecEncoder.h 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
RtspFace/PL_RTSPServer2.cpp 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
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
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()
    {}
};
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())