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; 35ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass MediaBuffer; 3639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 3739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberstruct ARTPWriter : public MediaWriter { 3840d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh explicit ARTPWriter(int fd); 3939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 40b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t addSource(const sp<IMediaSource> &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 75b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<IMediaSource> 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