diff options
author | Andreas Huber <andih@google.com> | 2012-10-30 15:53:03 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-10-31 09:21:24 -0700 |
commit | 90a92053219ae50ddf4bb54e3d54db2d309e2b8d (patch) | |
tree | 1d624b3c800a6cd2e755c379058bb43949f91ab0 /media/libstagefright/mpeg2ts | |
parent | 2295ce2c6fcf07ffaa134440691a8cea5fe35b43 (diff) | |
download | frameworks_av-90a92053219ae50ddf4bb54e3d54db2d309e2b8d.zip frameworks_av-90a92053219ae50ddf4bb54e3d54db2d309e2b8d.tar.gz frameworks_av-90a92053219ae50ddf4bb54e3d54db2d309e2b8d.tar.bz2 |
Various tweaks to wfd
related-to-bug: 7426218
Squashed commit of the following:
commit 1553f1a1c66af998674168f7f7a3be23fcb0c794
Author: Andreas Huber <andih@google.com>
Date: Tue Oct 30 15:51:27 2012 -0700
Add LPCM, AVC and AVC HRD descriptors as necessary.
Change-Id: Ibc836fced0fe37e8a25574c2295e886765b9ea6f
commit 4e74db61d2d31ebe239acbdec8f110f88016a4ea
Author: Andreas Huber <andih@google.com>
Date: Tue Oct 30 15:50:52 2012 -0700
added copyright headers to Sender.{cpp,h}
Change-Id: If615ccb8767e32bd83ed1f0f669acc39a72489f6
commit 7144bf8ae68c5cdb8faa6e219547aabbd750f04e
Author: Andreas Huber <andih@google.com>
Date: Tue Oct 30 15:50:25 2012 -0700
Reenable suspension of the RepeaterSource
Change-Id: I765338fcde89c65e4b69be45a5949eba6bcdcf6f
commit 812164bcfa0699821d7d8eefcc0dff96b2e2cd08
Author: Andreas Huber <andih@google.com>
Date: Tue Oct 30 14:03:50 2012 -0700
Add 2 stuffing bytes to the PES headers for audio tracks.
Change-Id: I8b9c634f6a565ab7fa7ecdb610f7d8557e0b139b
commit a084a741a63015d47c92d99fcd8b980fe615dc7d
Author: Andreas Huber <andih@google.com>
Date: Tue Oct 30 13:19:38 2012 -0700
Fix PCM audio packetization in WFD.
Change-Id: I99a435f9fe6b4397f24d6c22afae5ae2505ffc14
commit c5cb9369585f701f34bce41534940d5f9b59248f
Author: Andreas Huber <andih@google.com>
Date: Tue Oct 30 13:19:12 2012 -0700
Support extraction of PCM audio from transport streams.
Change-Id: I28a0516756ebcb5587325b6588df013ac871ffb9
commit b0a0512300ae037d6b39c2d04952d34b5fc12b2d
Author: Andreas Huber <andih@google.com>
Date: Tue Oct 30 08:54:13 2012 -0700
disable suspend of the RepeaterSource
Change-Id: Ibf42a98185b0567f817ae582a82e6580f95d3d40
commit 4330e8b7668dc92a6d882b5622c0697cf292d04c
Author: Andreas Huber <andih@google.com>
Date: Mon Oct 29 14:11:25 2012 -0700
Better handling of datagrams in ANetworkSession
reduce unnecessary copy overhead.
Change-Id: I2ed8c767274ba07764f03e8d4913041168e5755f
commit a44e73c322ba3f2c336f7cc4e1d63d3a74faa75d
Author: Andreas Huber <andih@google.com>
Date: Mon Oct 29 11:14:47 2012 -0700
Network traffic is now handled on a separate thread.
Audio and video are queued to ensure proper A/V interleaving.
Scheduled packet sends according to capture timestamps to reduce
send-jitter.
Change-Id: Ibd6357c1e663086cf87bec0a98f8e54dfdfaa0e5
related-to-bug: 7426218
Change-Id: Ia440129d656c35814abf18df06da50b73d5bb554
Diffstat (limited to 'media/libstagefright/mpeg2ts')
-rw-r--r-- | media/libstagefright/mpeg2ts/ATSParser.cpp | 17 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/ATSParser.h | 1 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/ESQueue.cpp | 63 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/ESQueue.h | 2 |
4 files changed, 83 insertions, 0 deletions
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp index 27c7bf4..9faa6bc 100644 --- a/media/libstagefright/mpeg2ts/ATSParser.cpp +++ b/media/libstagefright/mpeg2ts/ATSParser.cpp @@ -131,6 +131,8 @@ private: sp<AnotherPacketSource> mSource; bool mPayloadStarted; + uint64_t mPrevPTS; + ElementaryStreamQueue *mQueue; status_t flush(); @@ -458,6 +460,7 @@ ATSParser::Stream::Stream( mPCR_PID(PCR_PID), mExpectedContinuityCounter(-1), mPayloadStarted(false), + mPrevPTS(0), mQueue(NULL) { switch (mStreamType) { case STREAMTYPE_H264: @@ -486,6 +489,11 @@ ATSParser::Stream::Stream( ElementaryStreamQueue::MPEG4_VIDEO); break; + case STREAMTYPE_PCM_AUDIO: + mQueue = new ElementaryStreamQueue( + ElementaryStreamQueue::PCM_AUDIO); + break; + default: break; } @@ -583,6 +591,7 @@ bool ATSParser::Stream::isAudio() const { case STREAMTYPE_MPEG1_AUDIO: case STREAMTYPE_MPEG2_AUDIO: case STREAMTYPE_MPEG2_AUDIO_ADTS: + case STREAMTYPE_PCM_AUDIO: return true; default: @@ -827,6 +836,14 @@ status_t ATSParser::Stream::flush() { void ATSParser::Stream::onPayloadData( unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS, const uint8_t *data, size_t size) { +#if 0 + ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld", + mStreamType, + PTS, + (int64_t)PTS - mPrevPTS); + mPrevPTS = PTS; +#endif + ALOGV("onPayloadData mStreamType=0x%02x", mStreamType); int64_t timeUs = 0ll; // no presentation timestamp available. diff --git a/media/libstagefright/mpeg2ts/ATSParser.h b/media/libstagefright/mpeg2ts/ATSParser.h index 5ccbab7..46edc45 100644 --- a/media/libstagefright/mpeg2ts/ATSParser.h +++ b/media/libstagefright/mpeg2ts/ATSParser.h @@ -87,6 +87,7 @@ struct ATSParser : public RefBase { STREAMTYPE_MPEG2_AUDIO_ADTS = 0x0f, STREAMTYPE_MPEG4_VIDEO = 0x10, STREAMTYPE_H264 = 0x1b, + STREAMTYPE_PCM_AUDIO = 0x83, }; protected: diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp index e58e9bf..82fb637 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.cpp +++ b/media/libstagefright/mpeg2ts/ESQueue.cpp @@ -31,6 +31,8 @@ #include "include/avc_utils.h" +#include <netinet/in.h> + namespace android { ElementaryStreamQueue::ElementaryStreamQueue(Mode mode, uint32_t flags) @@ -248,6 +250,11 @@ status_t ElementaryStreamQueue::appendData( break; } + case PCM_AUDIO: + { + break; + } + default: TRESPASS(); break; @@ -324,12 +331,68 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnit() { return dequeueAccessUnitMPEGVideo(); case MPEG4_VIDEO: return dequeueAccessUnitMPEG4Video(); + case PCM_AUDIO: + return dequeueAccessUnitPCMAudio(); default: CHECK_EQ((unsigned)mMode, (unsigned)MPEG_AUDIO); return dequeueAccessUnitMPEGAudio(); } } +sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitPCMAudio() { + if (mBuffer->size() < 4) { + return NULL; + } + + ABitReader bits(mBuffer->data(), 4); + CHECK_EQ(bits.getBits(8), 0xa0); + unsigned numAUs = bits.getBits(8); + bits.skipBits(8); + unsigned quantization_word_length = bits.getBits(2); + unsigned audio_sampling_frequency = bits.getBits(3); + unsigned num_channels = bits.getBits(3); + + CHECK_EQ(audio_sampling_frequency, 2); // 48kHz + CHECK_EQ(num_channels, 1u); // stereo! + + if (mFormat == NULL) { + mFormat = new MetaData; + mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW); + mFormat->setInt32(kKeyChannelCount, 2); + mFormat->setInt32(kKeySampleRate, 48000); + } + + static const size_t kFramesPerAU = 80; + size_t frameSize = 2 /* numChannels */ * sizeof(int16_t); + + size_t payloadSize = numAUs * frameSize * kFramesPerAU; + + if (mBuffer->size() < 4 + payloadSize) { + return NULL; + } + + sp<ABuffer> accessUnit = new ABuffer(payloadSize); + memcpy(accessUnit->data(), mBuffer->data() + 4, payloadSize); + + int64_t timeUs = fetchTimestamp(payloadSize + 4); + CHECK_GE(timeUs, 0ll); + accessUnit->meta()->setInt64("timeUs", timeUs); + + int16_t *ptr = (int16_t *)accessUnit->data(); + for (size_t i = 0; i < payloadSize / sizeof(int16_t); ++i) { + ptr[i] = ntohs(ptr[i]); + } + + memmove( + mBuffer->data(), + mBuffer->data() + 4 + payloadSize, + mBuffer->size() - 4 - payloadSize); + + mBuffer->setRange(0, mBuffer->size() - 4 - payloadSize); + + return accessUnit; +} + sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() { int64_t timeUs; diff --git a/media/libstagefright/mpeg2ts/ESQueue.h b/media/libstagefright/mpeg2ts/ESQueue.h index 72aa2e7..66a8087 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.h +++ b/media/libstagefright/mpeg2ts/ESQueue.h @@ -35,6 +35,7 @@ struct ElementaryStreamQueue { MPEG_AUDIO, MPEG_VIDEO, MPEG4_VIDEO, + PCM_AUDIO, }; enum Flags { @@ -69,6 +70,7 @@ private: sp<ABuffer> dequeueAccessUnitMPEGAudio(); sp<ABuffer> dequeueAccessUnitMPEGVideo(); sp<ABuffer> dequeueAccessUnitMPEG4Video(); + sp<ABuffer> dequeueAccessUnitPCMAudio(); // consume a logical (compressed) access unit of size "size", // returns its timestamp in us (or -1 if no time information). |