static void addESDSFromCodecPrivate( const sp<MetaData> &meta, bool isAudio, const void *priv, size_t privSize) { int privSizeBytesRequired = bytesForSize(privSize); int esdsSize2 = 14 + privSizeBytesRequired + privSize; int esdsSize2BytesRequired = bytesForSize(esdsSize2); int esdsSize1 = 4 + esdsSize2BytesRequired + esdsSize2; int esdsSize1BytesRequired = bytesForSize(esdsSize1); size_t esdsSize = 1 + esdsSize1BytesRequired + esdsSize1; uint8_t *esds = new uint8_t[esdsSize]; size_t idx = 0; esds[idx++] = 0x03; storeSize(esds, idx, esdsSize1); esds[idx++] = 0x00; // ES_ID esds[idx++] = 0x00; // ES_ID esds[idx++] = 0x00; // streamDependenceFlag, URL_Flag, OCRstreamFlag esds[idx++] = 0x04; storeSize(esds, idx, esdsSize2); esds[idx++] = isAudio ? 0x40 // Audio ISO/IEC 14496-3 : 0x20; // Visual ISO/IEC 14496-2 for (int i = 0; i < 12; i++) { esds[idx++] = 0x00; } esds[idx++] = 0x05; storeSize(esds, idx, privSize); memcpy(esds + idx, priv, privSize); meta->setData(kKeyESDS, 0, esds, esdsSize); delete[] esds; esds = NULL; }
static void addESDSFromCodecPrivate( const sp<MetaData> &meta, bool isAudio, const void *priv, size_t privSize) { if(isAudio) { ABitReader br((const uint8_t *)priv, privSize); uint32_t objectType = br.getBits(5); if (objectType == 31) { // AAC-ELD => additional 6 bits objectType = 32 + br.getBits(6); } if(objectType == 1) { //AAC Main profile ALOGV("Found AAC mainprofile in Matroska Extractor"); } meta->setInt32(kKeyAACAOT, objectType); } int privSizeBytesRequired = bytesForSize(privSize); int esdsSize2 = 14 + privSizeBytesRequired + privSize; int esdsSize2BytesRequired = bytesForSize(esdsSize2); int esdsSize1 = 4 + esdsSize2BytesRequired + esdsSize2; int esdsSize1BytesRequired = bytesForSize(esdsSize1); size_t esdsSize = 1 + esdsSize1BytesRequired + esdsSize1; uint8_t *esds = new uint8_t[esdsSize]; size_t idx = 0; esds[idx++] = 0x03; storeSize(esds, idx, esdsSize1); esds[idx++] = 0x00; // ES_ID esds[idx++] = 0x00; // ES_ID esds[idx++] = 0x00; // streamDependenceFlag, URL_Flag, OCRstreamFlag esds[idx++] = 0x04; storeSize(esds, idx, esdsSize2); esds[idx++] = isAudio ? 0x40 // Audio ISO/IEC 14496-3 : 0x20; // Visual ISO/IEC 14496-2 for (int i = 0; i < 12; i++) { esds[idx++] = 0x00; } esds[idx++] = 0x05; storeSize(esds, idx, privSize); memcpy(esds + idx, priv, privSize); meta->setData(kKeyESDS, 0, esds, esdsSize); delete[] esds; esds = NULL; }
static void storeSize(uint8_t *data, size_t &idx, size_t size) { int numBytes = bytesForSize(size); idx += numBytes; data += idx; size_t next = 0; while (numBytes--) { *--data = (size & 0x7f) | next; size >>= 7; next = 0x80; } }