diff options
author | Andreas Huber <andih@google.com> | 2010-10-08 12:06:27 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-10-08 12:06:27 -0700 |
commit | c68a48c474f609df3eeb7d9738675d6ac8835e0a (patch) | |
tree | 4513bc3b15dc583bbca45db9c67f4d0aba8b1172 /media/libstagefright/mpeg2ts/ESQueue.cpp | |
parent | 6f3cba53efdd985ab13734c7ad90eb373ae9b9f7 (diff) | |
download | frameworks_av-c68a48c474f609df3eeb7d9738675d6ac8835e0a.zip frameworks_av-c68a48c474f609df3eeb7d9738675d6ac8835e0a.tar.gz frameworks_av-c68a48c474f609df3eeb7d9738675d6ac8835e0a.tar.bz2 |
Refactor some more h.264 utility code out into avc_utils. Work around a hardware decoder issue by making sure the first access unit submitted to a decoder at startup or after seek is an IDR.
Change-Id: I61936601e55df7e4c23a8c13087579a4f85bd6e6
Diffstat (limited to 'media/libstagefright/mpeg2ts/ESQueue.cpp')
-rw-r--r-- | media/libstagefright/mpeg2ts/ESQueue.cpp | 150 |
1 files changed, 0 insertions, 150 deletions
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp index 4a75ee4..a13287e 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.cpp +++ b/media/libstagefright/mpeg2ts/ESQueue.cpp @@ -40,81 +40,6 @@ sp<MetaData> ElementaryStreamQueue::getFormat() { return mFormat; } -static status_t getNextNALUnit( - const uint8_t **_data, size_t *_size, - const uint8_t **nalStart, size_t *nalSize, - bool startCodeFollows = false) { - const uint8_t *data = *_data; - size_t size = *_size; - - *nalStart = NULL; - *nalSize = 0; - - if (size == 0) { - return -EAGAIN; - } - - // Skip any number of leading 0x00. - - size_t offset = 0; - while (offset < size && data[offset] == 0x00) { - ++offset; - } - - if (offset == size) { - return -EAGAIN; - } - - // A valid startcode consists of at least two 0x00 bytes followed by 0x01. - - if (offset < 2 || data[offset] != 0x01) { - return ERROR_MALFORMED; - } - - ++offset; - - size_t startOffset = offset; - - for (;;) { - while (offset < size && data[offset] != 0x01) { - ++offset; - } - - if (offset == size) { - if (startCodeFollows) { - offset = size + 2; - break; - } - - return -EAGAIN; - } - - if (data[offset - 1] == 0x00 && data[offset - 2] == 0x00) { - break; - } - - ++offset; - } - - size_t endOffset = offset - 2; - while (data[endOffset - 1] == 0x00) { - --endOffset; - } - - *nalStart = &data[startOffset]; - *nalSize = endOffset - startOffset; - - if (offset + 2 < size) { - *_data = &data[offset - 2]; - *_size = size - offset + 2; - } else { - *_data = NULL; - *_size = 0; - } - - return OK; -} - void ElementaryStreamQueue::clear() { mBuffer->setRange(0, 0); mFormat.clear(); @@ -433,79 +358,4 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitH264() { return NULL; } -static sp<ABuffer> FindNAL( - const uint8_t *data, size_t size, unsigned nalType, - size_t *stopOffset) { - const uint8_t *nalStart; - size_t nalSize; - while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { - if ((nalStart[0] & 0x1f) == nalType) { - sp<ABuffer> buffer = new ABuffer(nalSize); - memcpy(buffer->data(), nalStart, nalSize); - return buffer; - } - } - - return NULL; -} - -sp<MetaData> ElementaryStreamQueue::MakeAVCCodecSpecificData( - const sp<ABuffer> &accessUnit) { - const uint8_t *data = accessUnit->data(); - size_t size = accessUnit->size(); - - sp<ABuffer> seqParamSet = FindNAL(data, size, 7, NULL); - if (seqParamSet == NULL) { - return NULL; - } - - int32_t width, height; - FindAVCDimensions(seqParamSet, &width, &height); - - size_t stopOffset; - sp<ABuffer> picParamSet = FindNAL(data, size, 8, &stopOffset); - CHECK(picParamSet != NULL); - - size_t csdSize = - 1 + 3 + 1 + 1 - + 2 * 1 + seqParamSet->size() - + 1 + 2 * 1 + picParamSet->size(); - - sp<ABuffer> csd = new ABuffer(csdSize); - uint8_t *out = csd->data(); - - *out++ = 0x01; // configurationVersion - memcpy(out, seqParamSet->data() + 1, 3); // profile/level... - out += 3; - *out++ = (0x3f << 2) | 1; // lengthSize == 2 bytes - *out++ = 0xe0 | 1; - - *out++ = seqParamSet->size() >> 8; - *out++ = seqParamSet->size() & 0xff; - memcpy(out, seqParamSet->data(), seqParamSet->size()); - out += seqParamSet->size(); - - *out++ = 1; - - *out++ = picParamSet->size() >> 8; - *out++ = picParamSet->size() & 0xff; - memcpy(out, picParamSet->data(), picParamSet->size()); - -#if 0 - LOGI("AVC seq param set"); - hexdump(seqParamSet->data(), seqParamSet->size()); -#endif - - sp<MetaData> meta = new MetaData; - meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); - - meta->setData(kKeyAVCC, 0, csd->data(), csd->size()); - meta->setInt32(kKeyWidth, width); - meta->setInt32(kKeyHeight, height); - - LOGI("found AVC codec config (%d x %d)", width, height); - - return meta; -} - } // namespace android |