RawEncoder.cpp 2.49 KB
Newer Older
xiongziliang committed
1
/*
2 3 4 5 6 7 8 9 10 11 12 13
 * Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
 *
 * This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
 *
 * Use of this source code is governed by MIT license that can be found in the
 * LICENSE file in the root of the source tree. All contributing project authors
 * may be found in the AUTHORS file in the root of the source tree.
 */

#if defined(ENABLE_RTPPROXY)

#include "RawEncoder.h"
14
#include "Extension/Factory.h"
15 16 17 18
#include "Rtsp/RtspMuxer.h"

using namespace toolkit;

19
namespace mediakit {
20

21
RawEncoderImp::RawEncoderImp(uint32_t ssrc, uint8_t payload_type, bool send_audio)
ziyue committed
22
    : _send_audio(send_audio)
23
    , _payload_type(payload_type)
ziyue committed
24
    , _ssrc(ssrc) {}
25 26 27 28 29

RawEncoderImp::~RawEncoderImp() {
    InfoL << this << " " << printSSRC(_ssrc);
}

30 31
bool RawEncoderImp::addTrack(const Track::Ptr &track) {
    if (_send_audio && track->getTrackType() == TrackType::TrackAudio && !_rtp_encoder) { // audio
32 33
        _rtp_encoder = createRtpEncoder(track);
        _rtp_encoder->setRtpRing(std::make_shared<RtpRing::RingType>());
34 35
        _rtp_encoder->getRtpRing()->setDelegate(std::make_shared<RingDelegateHelper>(
            [this](RtpPacket::Ptr rtp, bool is_key) { onRTP(std::move(rtp), true); }));
36 37 38
        return true;
    }

39 40 41 42 43
    if (!_send_audio && track->getTrackType() == TrackType::TrackVideo && !_rtp_encoder) {
        _rtp_encoder = createRtpEncoder(track);
        _rtp_encoder->setRtpRing(std::make_shared<RtpRing::RingType>());
        _rtp_encoder->getRtpRing()->setDelegate(std::make_shared<RingDelegateHelper>(
            [this](RtpPacket::Ptr rtp, bool is_key) { onRTP(std::move(rtp), is_key); }));
44 45 46 47 48
        return true;
    }
    return true;
}

49
void RawEncoderImp::resetTracks() {
50 51 52
    return;
}

53 54
bool RawEncoderImp::inputFrame(const Frame::Ptr &frame) {
    if (frame->getTrackType() == TrackType::TrackAudio && _send_audio && _rtp_encoder) {
55 56 57
        _rtp_encoder->inputFrame(frame);
    }

58 59
    if (frame->getTrackType() == TrackType::TrackVideo && !_send_audio && _rtp_encoder) {
        _rtp_encoder->inputFrame(frame);
60 61 62 63
    }
    return true;
}

64
RtpCodec::Ptr RawEncoderImp::createRtpEncoder(const Track::Ptr &track) {
65
    uint32_t sample_rate = 90000;
66 67
    if (track->getTrackType() == TrackType::TrackAudio) {
        sample_rate = std::static_pointer_cast<AudioTrack>(track)->getAudioSampleRate();
68
    }
69
    return Factory::getRtpEncoderByCodecId(track->getCodecId(), sample_rate, _payload_type, _ssrc);
70 71
}

72
} // namespace mediakit
73

74
#endif // defined(ENABLE_RTPPROXY)