bool IsAVCReferenceFrame(const sp<ABuffer> &accessUnit) { const uint8_t *data = accessUnit->data(); size_t size = accessUnit->size(); if (data == NULL) { ALOGE("IsAVCReferenceFrame: called on NULL data (%p, %zu)", accessUnit.get(), size); return false; } const uint8_t *nalStart; size_t nalSize; while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { if (nalSize == 0) { ALOGE("IsAVCReferenceFrame: invalid nalSize: 0 (%p, %zu)", accessUnit.get(), size); return false; } unsigned nalType = nalStart[0] & 0x1f; if (nalType == 5) { return true; } else if (nalType == 1) { unsigned nal_ref_idc = (nalStart[0] >> 5) & 3; return nal_ref_idc != 0; } }
static sp<ABuffer> FindNAL(const uint8_t *data, size_t size, unsigned nalType) { const uint8_t *nalStart; size_t nalSize; while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { if (nalSize > 0 && (nalStart[0] & 0x1f) == nalType) { sp<ABuffer> buffer = new ABuffer(nalSize); memcpy(buffer->data(), nalStart, nalSize); return buffer; } } return NULL; }
bool IsAVCReferenceFrame(const sp<ABuffer> &accessUnit) { const uint8_t *data = accessUnit->data(); size_t size = accessUnit->size(); const uint8_t *nalStart; size_t nalSize; while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { CHECK_GT(nalSize, 0u); unsigned nalType = nalStart[0] & 0x1f; if (nalType == 5) { return true; } else if (nalType == 1) { unsigned nal_ref_idc = (nalStart[0] >> 5) & 3; return nal_ref_idc != 0; } }
bool IsIDR(const sp<ABuffer> &buffer) { const uint8_t *data = buffer->data(); size_t size = buffer->size(); bool foundIDR = false; const uint8_t *nalStart; size_t nalSize; while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { CHECK_GT(nalSize, 0u); unsigned nalType = nalStart[0] & 0x1f; if (nalType == 5) { foundIDR = true; break; } } return foundIDR; }
bool IsIDR(const uint8_t *data, size_t size) { // const uint8_t *data = buffer->data(); // size_t size = buffer->size(); bool foundIDR = false; const uint8_t *nalStart; size_t nalSize; while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { if (nalSize == 0u) { ALOGW("skipping empty nal unit from potentially malformed bitstream"); continue; } unsigned nalType = nalStart[0] & 0x1f; if (nalType == 5) { foundIDR = true; break; } } return foundIDR; }