• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_TAG "LibAAH_RTP"
18 //#define LOG_NDEBUG 0
19 #include <utils/Log.h>
20 
21 #include <poll.h>
22 #include <pthread.h>
23 
24 #include <common_time/cc_helper.h>
25 #include <media/AudioSystem.h>
26 #include <media/AudioTrack.h>
27 #include <media/stagefright/foundation/ADebug.h>
28 #include <media/stagefright/MetaData.h>
29 #include <media/stagefright/OMXClient.h>
30 #include <media/stagefright/OMXCodec.h>
31 #include <media/stagefright/Utils.h>
32 #include <utils/Timers.h>
33 #include <utils/threads.h>
34 
35 #include "aah_decoder_pump.h"
36 
37 namespace android {
38 
39 static const long long kLongDecodeErrorThreshold = 1000000ll;
40 static const uint32_t kMaxLongErrorsBeforeFatal = 3;
41 static const uint32_t kMaxErrorsBeforeFatal = 60;
42 
AAH_DecoderPump(OMXClient & omx)43 AAH_DecoderPump::AAH_DecoderPump(OMXClient& omx)
44     : omx_(omx)
45     , thread_status_(OK)
46     , renderer_(NULL)
47     , last_queued_pts_valid_(false)
48     , last_queued_pts_(0)
49     , last_ts_transform_valid_(false)
50     , last_volume_(0xFF) {
51     thread_ = new ThreadWrapper(this);
52 }
53 
~AAH_DecoderPump()54 AAH_DecoderPump::~AAH_DecoderPump() {
55     shutdown();
56 }
57 
initCheck()58 status_t AAH_DecoderPump::initCheck() {
59     if (thread_ == NULL) {
60         ALOGE("Failed to allocate thread");
61         return NO_MEMORY;
62     }
63 
64     return OK;
65 }
66 
queueForDecode(MediaBuffer * buf)67 status_t AAH_DecoderPump::queueForDecode(MediaBuffer* buf) {
68     if (NULL == buf) {
69         return BAD_VALUE;
70     }
71 
72     if (OK != thread_status_) {
73         return thread_status_;
74     }
75 
76     {   // Explicit scope for AutoMutex pattern.
77         AutoMutex lock(&thread_lock_);
78         in_queue_.push_back(buf);
79     }
80 
81     thread_cond_.signal();
82 
83     return OK;
84 }
85 
queueToRenderer(MediaBuffer * decoded_sample)86 void AAH_DecoderPump::queueToRenderer(MediaBuffer* decoded_sample) {
87     Mutex::Autolock lock(&render_lock_);
88     sp<MetaData> meta;
89     int64_t ts;
90     status_t res;
91 
92     // Fetch the metadata and make sure the sample has a timestamp.  We
93     // cannot render samples which are missing PTSs.
94     meta = decoded_sample->meta_data();
95     if ((meta == NULL) || (!meta->findInt64(kKeyTime, &ts))) {
96         ALOGV("Decoded sample missing timestamp, cannot render.");
97         CHECK(false);
98     } else {
99         // If we currently are not holding on to a renderer, go ahead and
100         // make one now.
101         if (NULL == renderer_) {
102             renderer_ = new TimedAudioTrack();
103             if (NULL != renderer_) {
104                 int frameCount;
105                 AudioTrack::getMinFrameCount(&frameCount,
106                         AUDIO_STREAM_DEFAULT,
107                         static_cast<int>(format_sample_rate_));
108                 audio_channel_mask_t ch_format =
109                         audio_channel_out_mask_from_count(format_channels_);
110 
111                 res = renderer_->set(AUDIO_STREAM_DEFAULT,
112                         format_sample_rate_,
113                         AUDIO_FORMAT_PCM_16_BIT,
114                         ch_format,
115                         frameCount);
116                 if (res != OK) {
117                     ALOGE("Failed to setup audio renderer. (res = %d)", res);
118                     delete renderer_;
119                     renderer_ = NULL;
120                 } else {
121                     CHECK(last_ts_transform_valid_);
122 
123                     res = renderer_->setMediaTimeTransform(
124                             last_ts_transform_, TimedAudioTrack::COMMON_TIME);
125                     if (res != NO_ERROR) {
126                         ALOGE("Failed to set media time transform on AudioTrack"
127                               " (res = %d)", res);
128                         delete renderer_;
129                         renderer_ = NULL;
130                     } else {
131                         float volume = static_cast<float>(last_volume_)
132                                      / 255.0f;
133                         if (renderer_->setVolume(volume, volume) != OK) {
134                             ALOGW("%s: setVolume failed", __FUNCTION__);
135                         }
136 
137                         renderer_->start();
138                     }
139                 }
140             } else {
141                 ALOGE("Failed to allocate AudioTrack to use as a renderer.");
142             }
143         }
144 
145         if (NULL != renderer_) {
146             uint8_t* decoded_data =
147                 reinterpret_cast<uint8_t*>(decoded_sample->data());
148             uint32_t decoded_amt  = decoded_sample->range_length();
149             decoded_data += decoded_sample->range_offset();
150 
151             sp<IMemory> pcm_payload;
152             res = renderer_->allocateTimedBuffer(decoded_amt, &pcm_payload);
153             if (res != OK) {
154                 ALOGE("Failed to allocate %d byte audio track buffer."
155                       " (res = %d)", decoded_amt, res);
156             } else {
157                 memcpy(pcm_payload->pointer(), decoded_data, decoded_amt);
158 
159                 res = renderer_->queueTimedBuffer(pcm_payload, ts);
160                 if (res != OK) {
161                     ALOGE("Failed to queue %d byte audio track buffer with"
162                           " media PTS %lld. (res = %d)", decoded_amt, ts, res);
163                 } else {
164                     last_queued_pts_valid_ = true;
165                     last_queued_pts_ = ts;
166                 }
167             }
168 
169         } else {
170             ALOGE("No renderer, dropping audio payload.");
171         }
172     }
173 }
174 
stopAndCleanupRenderer()175 void AAH_DecoderPump::stopAndCleanupRenderer() {
176     if (NULL == renderer_) {
177         return;
178     }
179 
180     renderer_->stop();
181     delete renderer_;
182     renderer_ = NULL;
183 }
184 
setRenderTSTransform(const LinearTransform & trans)185 void AAH_DecoderPump::setRenderTSTransform(const LinearTransform& trans) {
186     Mutex::Autolock lock(&render_lock_);
187 
188     if (last_ts_transform_valid_ && !memcmp(&trans,
189                                             &last_ts_transform_,
190                                             sizeof(trans))) {
191         return;
192     }
193 
194     last_ts_transform_       = trans;
195     last_ts_transform_valid_ = true;
196 
197     if (NULL != renderer_) {
198         status_t res = renderer_->setMediaTimeTransform(
199                 last_ts_transform_, TimedAudioTrack::COMMON_TIME);
200         if (res != NO_ERROR) {
201             ALOGE("Failed to set media time transform on AudioTrack"
202                   " (res = %d)", res);
203         }
204     }
205 }
206 
setRenderVolume(uint8_t volume)207 void AAH_DecoderPump::setRenderVolume(uint8_t volume) {
208     Mutex::Autolock lock(&render_lock_);
209 
210     if (volume == last_volume_) {
211         return;
212     }
213 
214     last_volume_ = volume;
215     if (renderer_ != NULL) {
216         float volume = static_cast<float>(last_volume_) / 255.0f;
217         if (renderer_->setVolume(volume, volume) != OK) {
218             ALOGW("%s: setVolume failed", __FUNCTION__);
219         }
220     }
221 }
222 
223 // isAboutToUnderflow is something of a hack used to figure out when it might be
224 // time to give up on trying to fill in a gap in the RTP sequence and simply
225 // move on with a discontinuity.  If we had perfect knowledge of when we were
226 // going to underflow, it would not be a hack, but unfortunately we do not.
227 // Right now, we just take the PTS of the last sample queued, and check to see
228 // if its presentation time is within kAboutToUnderflowThreshold from now.  If
229 // it is, then we say that we are about to underflow.  This decision is based on
230 // two (possibly invalid) assumptions.
231 //
232 // 1) The transmitter is leading the clock by more than
233 //    kAboutToUnderflowThreshold.
234 // 2) The delta between the PTS of the last sample queued and the next sample
235 //    is less than the transmitter's clock lead amount.
236 //
237 // Right now, the default transmitter lead time is 1 second, which is a pretty
238 // large number and greater than the 50mSec that kAboutToUnderflowThreshold is
239 // currently set to.  This should satisfy assumption #1 for now, but changes to
240 // the transmitter clock lead time could effect this.
241 //
242 // For non-sparse streams with a homogeneous sample rate (the vast majority of
243 // streams in the world), the delta between any two adjacent PTSs will always be
244 // the homogeneous sample period.  It is very uncommon to see a sample period
245 // greater than the 1 second clock lead we are currently using, and you
246 // certainly will not see it in an MP3 file which should satisfy assumption #2.
247 // Sparse audio streams (where no audio is transmitted for long periods of
248 // silence) and extremely low framerate video stream (like an MPEG-2 slideshow
249 // or the video stream for a pay TV audio channel) are examples of streams which
250 // might violate assumption #2.
isAboutToUnderflow(int64_t threshold)251 bool AAH_DecoderPump::isAboutToUnderflow(int64_t threshold) {
252     Mutex::Autolock lock(&render_lock_);
253 
254     // If we have never queued anything to the decoder, we really don't know if
255     // we are going to underflow or not.
256     if (!last_queued_pts_valid_ || !last_ts_transform_valid_) {
257         return false;
258     }
259 
260     // Don't have access to Common Time?  If so, then things are Very Bad
261     // elsewhere in the system; it pretty much does not matter what we do here.
262     // Since we cannot really tell if we are about to underflow or not, its
263     // probably best to assume that we are not and proceed accordingly.
264     int64_t tt_now;
265     if (OK != cc_helper_.getCommonTime(&tt_now)) {
266         return false;
267     }
268 
269     // Transform from media time to common time.
270     int64_t last_queued_pts_tt;
271     if (!last_ts_transform_.doForwardTransform(last_queued_pts_,
272                 &last_queued_pts_tt)) {
273         return false;
274     }
275 
276     // Check to see if we are underflowing.
277     return ((tt_now + threshold - last_queued_pts_tt) > 0);
278 }
279 
workThread()280 void* AAH_DecoderPump::workThread() {
281     // No need to lock when accessing decoder_ from the thread.  The
282     // implementation of init and shutdown ensure that other threads never touch
283     // decoder_ while the work thread is running.
284     CHECK(decoder_ != NULL);
285     CHECK(format_  != NULL);
286 
287     // Start the decoder and note its result code.  If something goes horribly
288     // wrong, callers of queueForDecode and getOutput will be able to detect
289     // that the thread encountered a fatal error and shut down by examining
290     // thread_status_.
291     thread_status_ = decoder_->start(format_.get());
292     if (OK != thread_status_) {
293         ALOGE("AAH_DecoderPump's work thread failed to start decoder"
294               " (res = %d)", thread_status_);
295         return NULL;
296     }
297 
298     DurationTimer decode_timer;
299     uint32_t consecutive_long_errors = 0;
300     uint32_t consecutive_errors = 0;
301 
302     while (!thread_->exitPending()) {
303         status_t res;
304         MediaBuffer* bufOut = NULL;
305 
306         decode_timer.start();
307         res = decoder_->read(&bufOut);
308         decode_timer.stop();
309 
310         if (res == INFO_FORMAT_CHANGED) {
311             // Format has changed.  Destroy our current renderer so that a new
312             // one can be created during queueToRenderer with the proper format.
313             //
314             // TODO : In order to transition seamlessly, we should change this
315             // to put the old renderer in a queue to play out completely before
316             // we destroy it.  We can still create a new renderer, the timed
317             // nature of the renderer should ensure a seamless splice.
318             stopAndCleanupRenderer();
319             res = OK;
320         }
321 
322         // Try to be a little nuanced in our handling of actual decode errors.
323         // Errors could happen because of minor stream corruption or because of
324         // transient resource limitations.  In these cases, we would rather drop
325         // a little bit of output and ride out the unpleasantness then throw up
326         // our hands and abort everything.
327         //
328         // OTOH - When things are really bad (like we have a non-transient
329         // resource or bookkeeping issue, or the stream being fed to us is just
330         // complete and total garbage) we really want to terminate playback and
331         // raise an error condition all the way up to the application level so
332         // they can deal with it.
333         //
334         // Unfortunately, the error codes returned by the decoder can be a
335         // little non-specific.  For example, if an OMXCodec times out
336         // attempting to obtain an output buffer, the error we get back is a
337         // generic -1.  Try to distinguish between this resource timeout error
338         // and ES corruption error by timing how long the decode operation
339         // takes.  Maintain accounting for both errors and "long errors".  If we
340         // get more than a certain number consecutive errors of either type,
341         // consider it fatal and shutdown (which will cause the error to
342         // propagate all of the way up to the application level).  The threshold
343         // for "long errors" is deliberately much lower than that of normal
344         // decode errors, both because of how long they take to happen and
345         // because they generally indicate resource limitation errors which are
346         // unlikely to go away in pathologically bad cases (in contrast to
347         // stream corruption errors which might happen 20 times in a row and
348         // then be suddenly OK again)
349         if (res != OK) {
350             consecutive_errors++;
351             if (decode_timer.durationUsecs() >= kLongDecodeErrorThreshold)
352                 consecutive_long_errors++;
353 
354             CHECK(NULL == bufOut);
355 
356             ALOGW("%s: Failed to decode data (res = %d)",
357                     __PRETTY_FUNCTION__, res);
358 
359             if ((consecutive_errors      >= kMaxErrorsBeforeFatal) ||
360                 (consecutive_long_errors >= kMaxLongErrorsBeforeFatal)) {
361                 ALOGE("%s: Maximum decode error threshold has been reached."
362                       " There have been %d consecutive decode errors, and %d"
363                       " consecutive decode operations which resulted in errors"
364                       " and took more than %lld uSec to process.  The last"
365                       " decode operation took %lld uSec.",
366                       __PRETTY_FUNCTION__,
367                       consecutive_errors, consecutive_long_errors,
368                       kLongDecodeErrorThreshold, decode_timer.durationUsecs());
369                 thread_status_ = res;
370                 break;
371             }
372 
373             continue;
374         }
375 
376         if (NULL == bufOut) {
377             ALOGW("%s: Successful decode, but no buffer produced",
378                     __PRETTY_FUNCTION__);
379             continue;
380         }
381 
382         // Successful decode (with actual output produced).  Clear the error
383         // counters.
384         consecutive_errors = 0;
385         consecutive_long_errors = 0;
386 
387         queueToRenderer(bufOut);
388         bufOut->release();
389     }
390 
391     decoder_->stop();
392     stopAndCleanupRenderer();
393 
394     return NULL;
395 }
396 
init(const sp<MetaData> & params)397 status_t AAH_DecoderPump::init(const sp<MetaData>& params) {
398     Mutex::Autolock lock(&init_lock_);
399 
400     if (decoder_ != NULL) {
401         // already inited
402         return OK;
403     }
404 
405     if (params == NULL) {
406         return BAD_VALUE;
407     }
408 
409     if (!params->findInt32(kKeyChannelCount, &format_channels_)) {
410         return BAD_VALUE;
411     }
412 
413     if (!params->findInt32(kKeySampleRate, &format_sample_rate_)) {
414         return BAD_VALUE;
415     }
416 
417     CHECK(OK == thread_status_);
418     CHECK(decoder_ == NULL);
419 
420     status_t ret_val = UNKNOWN_ERROR;
421 
422     // Cache the format and attempt to create the decoder.
423     format_  = params;
424     decoder_ = OMXCodec::Create(
425             omx_.interface(),       // IOMX Handle
426             format_,                // Metadata for substream (indicates codec)
427             false,                  // Make a decoder, not an encoder
428             sp<MediaSource>(this)); // We will be the source for this codec.
429 
430     if (decoder_ == NULL) {
431       ALOGE("Failed to allocate decoder in %s", __PRETTY_FUNCTION__);
432       goto bailout;
433     }
434 
435     // Fire up the pump thread.  It will take care of starting and stopping the
436     // decoder.
437     ret_val = thread_->run("aah_decode_pump", ANDROID_PRIORITY_AUDIO);
438     if (OK != ret_val) {
439         ALOGE("Failed to start work thread in %s (res = %d)",
440                 __PRETTY_FUNCTION__, ret_val);
441         goto bailout;
442     }
443 
444 bailout:
445     if (OK != ret_val) {
446         decoder_ = NULL;
447         format_  = NULL;
448     }
449 
450     return OK;
451 }
452 
shutdown()453 status_t AAH_DecoderPump::shutdown() {
454     Mutex::Autolock lock(&init_lock_);
455     return shutdown_l();
456 }
457 
shutdown_l()458 status_t AAH_DecoderPump::shutdown_l() {
459     thread_->requestExit();
460     thread_cond_.signal();
461     thread_->requestExitAndWait();
462 
463     for (MBQueue::iterator iter = in_queue_.begin();
464          iter != in_queue_.end();
465          ++iter) {
466         (*iter)->release();
467     }
468     in_queue_.clear();
469 
470     last_queued_pts_valid_   = false;
471     last_ts_transform_valid_ = false;
472     last_volume_             = 0xFF;
473     thread_status_           = OK;
474 
475     decoder_ = NULL;
476     format_  = NULL;
477 
478     return OK;
479 }
480 
read(MediaBuffer ** buffer,const ReadOptions * options)481 status_t AAH_DecoderPump::read(MediaBuffer **buffer,
482                                const ReadOptions *options) {
483     if (!buffer) {
484         return BAD_VALUE;
485     }
486 
487     *buffer = NULL;
488 
489     // While its not time to shut down, and we have no data to process, wait.
490     AutoMutex lock(&thread_lock_);
491     while (!thread_->exitPending() && in_queue_.empty())
492         thread_cond_.wait(thread_lock_);
493 
494     // At this point, if its not time to shutdown then we must have something to
495     // process.  Go ahead and pop the front of the queue for processing.
496     if (!thread_->exitPending()) {
497         CHECK(!in_queue_.empty());
498 
499         *buffer = *(in_queue_.begin());
500         in_queue_.erase(in_queue_.begin());
501     }
502 
503     // If we managed to get a buffer, then everything must be OK.  If not, then
504     // we must be shutting down.
505     return (NULL == *buffer) ? INVALID_OPERATION : OK;
506 }
507 
ThreadWrapper(AAH_DecoderPump * owner)508 AAH_DecoderPump::ThreadWrapper::ThreadWrapper(AAH_DecoderPump* owner)
509     : Thread(false /* canCallJava*/ )
510     , owner_(owner) {
511 }
512 
threadLoop()513 bool AAH_DecoderPump::ThreadWrapper::threadLoop() {
514     CHECK(NULL != owner_);
515     owner_->workThread();
516     return false;
517 }
518 
519 }  // namespace android
520