From c68a48c474f609df3eeb7d9738675d6ac8835e0a Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Fri, 8 Oct 2010 12:06:27 -0700 Subject: 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 --- media/libstagefright/mpeg2ts/ESQueue.cpp | 150 ------------------------------- 1 file changed, 150 deletions(-) (limited to 'media/libstagefright/mpeg2ts/ESQueue.cpp') 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 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 ElementaryStreamQueue::dequeueAccessUnitH264() { return NULL; } -static sp 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 buffer = new ABuffer(nalSize); - memcpy(buffer->data(), nalStart, nalSize); - return buffer; - } - } - - return NULL; -} - -sp ElementaryStreamQueue::MakeAVCCodecSpecificData( - const sp &accessUnit) { - const uint8_t *data = accessUnit->data(); - size_t size = accessUnit->size(); - - sp seqParamSet = FindNAL(data, size, 7, NULL); - if (seqParamSet == NULL) { - return NULL; - } - - int32_t width, height; - FindAVCDimensions(seqParamSet, &width, &height); - - size_t stopOffset; - sp 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 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 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 -- cgit v1.1