Home | History | Annotate | Download | only in rtsp
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 //#define LOG_NDEBUG 0
     18 #define LOG_TAG "ARawAudioAssembler"
     19 #include <utils/Log.h>
     20 
     21 #include "ARawAudioAssembler.h"
     22 
     23 #include "ARTPSource.h"
     24 #include "ASessionDescription.h"
     25 
     26 #include <media/stagefright/foundation/ABuffer.h>
     27 #include <media/stagefright/foundation/ADebug.h>
     28 #include <media/stagefright/foundation/AMessage.h>
     29 #include <media/stagefright/foundation/hexdump.h>
     30 #include <media/stagefright/MediaDefs.h>
     31 #include <media/stagefright/MetaData.h>
     32 #include <media/stagefright/Utils.h>
     33 
     34 namespace android {
     35 
     36 ARawAudioAssembler::ARawAudioAssembler(
     37         const sp<AMessage> &notify, const char *desc, const AString &params)
     38     : mNotifyMsg(notify),
     39       mNextExpectedSeqNoValid(false),
     40       mNextExpectedSeqNo(0) {
     41 }
     42 
     43 ARawAudioAssembler::~ARawAudioAssembler() {
     44 }
     45 
     46 ARTPAssembler::AssemblyStatus ARawAudioAssembler::assembleMore(
     47         const sp<ARTPSource> &source) {
     48     return addPacket(source);
     49 }
     50 
     51 ARTPAssembler::AssemblyStatus ARawAudioAssembler::addPacket(
     52         const sp<ARTPSource> &source) {
     53     List<sp<ABuffer> > *queue = source->queue();
     54 
     55     if (queue->empty()) {
     56         return NOT_ENOUGH_DATA;
     57     }
     58 
     59     if (mNextExpectedSeqNoValid) {
     60         List<sp<ABuffer> >::iterator it = queue->begin();
     61         while (it != queue->end()) {
     62             if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) {
     63                 break;
     64             }
     65 
     66             it = queue->erase(it);
     67         }
     68 
     69         if (queue->empty()) {
     70             return NOT_ENOUGH_DATA;
     71         }
     72     }
     73 
     74     sp<ABuffer> buffer = *queue->begin();
     75 
     76     if (!mNextExpectedSeqNoValid) {
     77         mNextExpectedSeqNoValid = true;
     78         mNextExpectedSeqNo = (uint32_t)buffer->int32Data();
     79     } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) {
     80         ALOGV("Not the sequence number I expected");
     81 
     82         return WRONG_SEQUENCE_NUMBER;
     83     }
     84 
     85     // hexdump(buffer->data(), buffer->size());
     86 
     87     if (buffer->size() < 1) {
     88         queue->erase(queue->begin());
     89         ++mNextExpectedSeqNo;
     90 
     91         ALOGV("raw audio packet too short.");
     92 
     93         return MALFORMED_PACKET;
     94     }
     95 
     96     sp<AMessage> msg = mNotifyMsg->dup();
     97     msg->setBuffer("access-unit", buffer);
     98     msg->post();
     99 
    100     queue->erase(queue->begin());
    101     ++mNextExpectedSeqNo;
    102 
    103     return OK;
    104 }
    105 
    106 void ARawAudioAssembler::packetLost() {
    107     CHECK(mNextExpectedSeqNoValid);
    108     ++mNextExpectedSeqNo;
    109 }
    110 
    111 void ARawAudioAssembler::onByeReceived() {
    112     sp<AMessage> msg = mNotifyMsg->dup();
    113     msg->setInt32("eos", true);
    114     msg->post();
    115 }
    116 
    117 // static
    118 bool ARawAudioAssembler::Supports(const char *desc) {
    119     return !strncmp(desc, "PCMU/", 5)
    120         || !strncmp(desc, "PCMA/", 5);
    121 }
    122 
    123 // static
    124 void ARawAudioAssembler::MakeFormat(
    125         const char *desc, const sp<MetaData> &format) {
    126     if (!strncmp(desc, "PCMU/", 5)) {
    127         format->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_G711_MLAW);
    128     } else if (!strncmp(desc, "PCMA/", 5)) {
    129         format->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_G711_ALAW);
    130     } else {
    131         TRESPASS();
    132     }
    133 
    134     int32_t sampleRate, numChannels;
    135     ASessionDescription::ParseFormatDesc(
    136             desc, &sampleRate, &numChannels);
    137 
    138     format->setInt32(kKeySampleRate, sampleRate);
    139     format->setInt32(kKeyChannelCount, numChannels);
    140 }
    141 
    142 }  // namespace android
    143 
    144