139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber/*
239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * Copyright (C) 2010 The Android Open Source Project
339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber *
439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * you may not use this file except in compliance with the License.
639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * You may obtain a copy of the License at
739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber *
839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber *
1039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * Unless required by applicable law or agreed to in writing, software
1139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * See the License for the specific language governing permissions and
1439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * limitations under the License.
1539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber */
1639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
1739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#ifndef A_RTP_WRITER_H_
1839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
1939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#define A_RTP_WRITER_H_
2039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
2139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/ABase.h>
2239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/AHandlerReflector.h>
2339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/AString.h>
2439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/base64.h>
2539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/MediaWriter.h>
2639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
2739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <arpa/inet.h>
2839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <sys/socket.h>
2939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
3039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#define LOG_TO_FILES    0
3139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
3239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Hubernamespace android {
3339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
3439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberstruct ABuffer;
3539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberstruct MediaBuffer;
3639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
3739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberstruct ARTPWriter : public MediaWriter {
3839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    ARTPWriter(int fd);
3939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
4039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    virtual status_t addSource(const sp<MediaSource> &source);
4139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    virtual bool reachedEOS();
4239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    virtual status_t start(MetaData *params);
4337187916a486504acaf83bea30147eb5fbf46ae5James Dong    virtual status_t stop();
4437187916a486504acaf83bea30147eb5fbf46ae5James Dong    virtual status_t pause();
4539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
4639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
4739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
4839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberprotected:
4939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    virtual ~ARTPWriter();
5039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
5139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberprivate:
5239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    enum {
5339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        kWhatStart  = 'strt',
5439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        kWhatStop   = 'stop',
5539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        kWhatRead   = 'read',
5639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        kWhatSendSR = 'sr  ',
5739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    };
5839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
5939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    enum {
6039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        kFlagStarted  = 1,
6139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        kFlagEOS      = 2,
6239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    };
6339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
6439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    Mutex mLock;
6539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    Condition mCondition;
6639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    uint32_t mFlags;
6739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
6839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    int mFd;
6939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
7039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if LOG_TO_FILES
7139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    int mRTPFd;
7239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    int mRTCPFd;
7339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif
7439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
7539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<MediaSource> mSource;
7639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<ALooper> mLooper;
7739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<AHandlerReflector<ARTPWriter> > mReflector;
7839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
7939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    int mSocket;
8039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    struct sockaddr_in mRTPAddr;
8139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    struct sockaddr_in mRTCPAddr;
8239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
8339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    AString mProfileLevel;
8439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    AString mSeqParamSet;
8539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    AString mPicParamSet;
8639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
8739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    uint32_t mSourceID;
8839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    uint32_t mSeqNo;
8939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    uint32_t mRTPTimeBase;
9039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    uint32_t mNumRTPSent;
9139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    uint32_t mNumRTPOctetsSent;
9239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    uint32_t mLastRTPTime;
9339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    uint64_t mLastNTPTime;
9439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
9539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    int32_t mNumSRsSent;
9639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
9739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    enum {
9839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        INVALID,
9939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        H264,
10039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        H263,
10139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        AMR_NB,
10239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        AMR_WB,
10339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    } mMode;
10439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
10539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    static uint64_t GetNowNTP();
10639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
10739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void onRead(const sp<AMessage> &msg);
10839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void onSendSR(const sp<AMessage> &msg);
10939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
11039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void addSR(const sp<ABuffer> &buffer);
11139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void addSDES(const sp<ABuffer> &buffer);
11239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
11339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void makeH264SPropParamSets(MediaBuffer *buffer);
11439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void dumpSessionDesc();
11539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
11639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void sendBye();
11739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void sendAVCData(MediaBuffer *mediaBuf);
11839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void sendH263Data(MediaBuffer *mediaBuf);
11939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void sendAMRData(MediaBuffer *mediaBuf);
12039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
12139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    void send(const sp<ABuffer> &buffer, bool isRTCP);
12239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
12339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ARTPWriter);
12439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber};
12539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
12639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber}  // namespace android
12739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
12839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif  // A_RTP_WRITER_H_
129