You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
302 lines
8.0 KiB
302 lines
8.0 KiB
/* |
|
* Copyright (c) 2014 Intel Corporation. All rights reserved. |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
#ifndef LOG_DUMP_HELPER_INCLUDED |
|
#define LOG_DUMP_HELPER_INCLUDED |
|
|
|
#ifndef LOG_TAG |
|
#error "Before including this file, must #define LOG_TAG and #include <utils/Log.h>" |
|
#endif |
|
|
|
#if LOG_NDEBUG == 0 |
|
|
|
// We have dump routines for the structures defined in the following files: |
|
#include "VideoFrameInfo.h" |
|
#include "ProtectedDataBuffer.h" |
|
|
|
// The following helps to use these dump routines from command line unit tests: |
|
#ifdef ANDROID |
|
#define DUMP_EOL "" |
|
#else |
|
#define LOGV printf |
|
#define LOGE printf |
|
#define DUMP_EOL "\n" |
|
#endif // ANDROID |
|
|
|
#ifndef log_helper_min |
|
#define log_helper_min(a,b) ((a) < (b) ? (a) : (b)) |
|
#endif // log_helper_min |
|
|
|
static inline void Copy4Bytes(void* dst, const void* src) |
|
{ |
|
// Don't check input pointers for NULL: this is internal function, |
|
// and if you pass NULL to it, your code deserves to crash. |
|
|
|
uint8_t* bdst = (uint8_t*) dst ; |
|
const uint8_t* bsrc = (const uint8_t*) src ; |
|
|
|
*bdst++ = *bsrc++ ; |
|
*bdst++ = *bsrc++ ; |
|
*bdst++ = *bsrc++ ; |
|
*bdst = *bsrc ; |
|
} |
|
// End of Copy4Bytes() |
|
|
|
static void DumpBufferToString(char* str, uint32_t strSize, const uint8_t* start, uint32_t size) |
|
{ |
|
if (str == NULL || strSize == 0 || start == NULL || size == 0) |
|
{ |
|
LOGV("Error: invalid parameters to %s", __FUNCTION__) ; |
|
return ; |
|
} |
|
|
|
char* s = str ; |
|
char* send = str + strSize ; |
|
|
|
const uint8_t* byte = start ; |
|
const uint8_t* end = start + size ; |
|
|
|
while (byte < end && s < send) |
|
{ |
|
s += snprintf(s, strSize - (s - str), "%02x ", *byte) ; |
|
++byte ; |
|
} |
|
} |
|
// End of DumpBufferToString() |
|
|
|
static void DumpNaluDataBuffer(uint32_t nalu, const uint8_t* start, uint32_t size) |
|
{ |
|
if (start == NULL || size == 0) |
|
{ |
|
LOGV("NALU-dump: error: invalid parameters to %s", __FUNCTION__) ; |
|
return ; |
|
} |
|
|
|
const uint32_t STR_SIZE = 1024 ; |
|
char str[STR_SIZE] = {0} ; |
|
|
|
DumpBufferToString(str, STR_SIZE, start, size) ; |
|
|
|
LOGV("NALU-dump(nalu %u): data: %s" DUMP_EOL, nalu, str) ; |
|
} |
|
// End of DumpNaluDataBuffer() |
|
|
|
static void DumpBuffer(const char* prefix, const uint8_t* start, uint32_t size) |
|
{ |
|
if (start == NULL || size == 0) |
|
{ |
|
LOGV("Error: invalid parameters to %s", __FUNCTION__) ; |
|
return ; |
|
} |
|
|
|
if (prefix == NULL) |
|
{ |
|
prefix = "" ; |
|
} |
|
|
|
const uint32_t STR_SIZE = 1024 ; |
|
char str[STR_SIZE] = {0} ; |
|
|
|
DumpBufferToString(str, STR_SIZE, start, size) ; |
|
|
|
LOGV("%s: ptr=%p, size=%u, data=%s" DUMP_EOL, prefix, start, size, str) ; |
|
} |
|
// End of DumpBuffer() |
|
|
|
static void DumpNaluHeaderBuffer(const uint8_t* const start, uint32_t size) |
|
{ |
|
if (start == NULL || size == 0) |
|
{ |
|
LOGV("Error: invalid parameters to %s", __FUNCTION__) ; |
|
return ; |
|
} |
|
|
|
const uint8_t* current = start ; |
|
|
|
uint32_t numNALUs = 0 ; |
|
Copy4Bytes(&numNALUs, current) ; |
|
current += sizeof(numNALUs) ; |
|
|
|
LOGV("NALU-dump: num NALUs = %u\n", numNALUs) ; |
|
|
|
if (numNALUs > MAX_NALUS_IN_FRAME) |
|
{ |
|
LOGE("NALU-dump: ERROR, num NALUs is too big (%u)" DUMP_EOL, numNALUs) ; |
|
} |
|
|
|
for (uint32_t nalu = 0; nalu < numNALUs; ++nalu) |
|
{ |
|
uint32_t imr_offset = 0 ; |
|
Copy4Bytes(&imr_offset, current) ; |
|
current += sizeof(imr_offset) ; |
|
|
|
uint32_t nalu_size = 0 ; |
|
Copy4Bytes(&nalu_size, current) ; |
|
current += sizeof(nalu_size) ; |
|
|
|
uint32_t data_size = 0 ; |
|
Copy4Bytes(&data_size, current) ; |
|
current += sizeof(data_size) ; |
|
|
|
LOGV("NALU-dump(nalu %u): imr_offset = %u, nalu_size = %u, data_size = %u" DUMP_EOL, |
|
nalu, imr_offset, nalu_size, data_size) ; |
|
|
|
DumpNaluDataBuffer(nalu, current, data_size) ; |
|
|
|
// Skip past the data |
|
current += data_size ; |
|
} |
|
// End of for |
|
} |
|
// End of DumpNaluHeaderBuffer() |
|
|
|
static const char* DrmSchemeToString(uint32_t drmScheme) |
|
{ |
|
switch(drmScheme) |
|
{ |
|
case DRM_SCHEME_NONE: |
|
return "None" ; |
|
|
|
case DRM_SCHEME_WV_CLASSIC: |
|
return "WV Classic" ; |
|
|
|
case DRM_SCHEME_WV_MODULAR: |
|
return "WV Modular" ; |
|
|
|
#ifdef DRM_SCHEME_MCAST_SINK |
|
case DRM_SCHEME_MCAST_SINK: |
|
return "MCast Sink" ; |
|
#endif |
|
|
|
#ifdef DRM_SCHEME_PLAYREADY_ASF |
|
case DRM_SCHEME_PLAYREADY_ASF: |
|
return "PlayReady/ASF" ; |
|
#endif |
|
|
|
default: |
|
return "unknown" ; |
|
} |
|
} |
|
// End of DrmSchemeToString() |
|
|
|
static void DumpBuffer2(const char* prefix, const uint8_t* start, uint32_t size) |
|
{ |
|
if (start == NULL || size == 0) |
|
{ |
|
LOGV("Error: invalid parameters to %s", __FUNCTION__) ; |
|
return ; |
|
} |
|
|
|
if (prefix == NULL) |
|
{ |
|
prefix = "" ; |
|
} |
|
|
|
const uint32_t STR_SIZE = 1024 ; |
|
char str[STR_SIZE] = {0} ; |
|
|
|
DumpBufferToString(str, STR_SIZE, start, size) ; |
|
|
|
LOGV("%s%s" DUMP_EOL, prefix, str) ; |
|
} |
|
// End of DumpBuffer2() |
|
|
|
static void DumpProtectedDataBuffer(const char* prefix, ProtectedDataBuffer* buf) |
|
{ |
|
if (buf == NULL) |
|
{ |
|
LOGV("Error: invalid parameters to %s", __FUNCTION__) ; |
|
return ; |
|
} |
|
|
|
if (prefix == NULL) { prefix = "" ; } |
|
|
|
const uint32_t MAX_BUFFER_DUMP_LENGTH = 32 ; |
|
|
|
if (buf->magic != PROTECTED_DATA_BUFFER_MAGIC) |
|
{ |
|
const uint8_t* p = (uint8_t*) &buf->magic ; |
|
LOGV("%sWrong magic: %02x %02x %02x %02x" DUMP_EOL, prefix, p[0], p[1], p[2], p[3]) ; |
|
return ; |
|
} |
|
|
|
LOGV("%smagic: ok, drmScheme: %u (%s), clear: %u, size: %u, num PES: %u" DUMP_EOL, prefix, |
|
buf->drmScheme, DrmSchemeToString(buf->drmScheme), buf->clear, buf->size, buf->numPesBuffers) ; |
|
|
|
if (buf->numPesBuffers == 0) |
|
{ |
|
uint32_t dumpLength = log_helper_min(buf->size, MAX_BUFFER_DUMP_LENGTH) ; |
|
DumpBuffer2("data: ", buf->data, dumpLength) ; |
|
} |
|
else |
|
{ |
|
for (uint32_t i = 0; i < buf->numPesBuffers; ++i) |
|
{ |
|
const uint32_t STR_SIZE = 1024 ; |
|
char str[STR_SIZE] = {0} ; |
|
|
|
uint32_t dumpLength = log_helper_min(buf->pesBuffers[i].pesSize, MAX_BUFFER_DUMP_LENGTH) ; |
|
|
|
DumpBufferToString(str, STR_SIZE, |
|
buf->data + buf->pesBuffers[i].pesDataOffset, dumpLength) ; |
|
|
|
LOGV("PES %u: streamCounter: %u, inputCounter: %llu, offset: %u, size: %u, PES data: %s" DUMP_EOL, |
|
i, buf->pesBuffers[i].streamCounter, buf->pesBuffers[i].inputCounter, |
|
buf->pesBuffers[i].pesDataOffset, buf->pesBuffers[i].pesSize, str) ; |
|
} |
|
} |
|
} |
|
// End of DumpProtectedDataBuffer |
|
|
|
static void DumpVideoFrameInfo(frame_info_t* fInfo) |
|
{ |
|
if (fInfo == NULL) |
|
{ |
|
LOGV("Error: invalid parameters to %s", __FUNCTION__) ; |
|
return ; |
|
} |
|
|
|
LOGV("frame_info_t: data = %p, size = %u, num_nalus = %u", fInfo->data, fInfo->size, fInfo->num_nalus) ; |
|
|
|
for (uint32_t i = 0; i < fInfo->num_nalus; ++i) |
|
{ |
|
LOGV("nalu_info_t: type = %#x, offset = %u (%#x), data = %p, length = %u", |
|
fInfo->nalus[i].type, fInfo->nalus[i].offset, fInfo->nalus[i].offset, |
|
fInfo->nalus[i].data, fInfo->nalus[i].length) ; |
|
|
|
if (fInfo->nalus[i].data != NULL && fInfo->nalus[i].length > 0) |
|
{ |
|
DumpBuffer2("nalu_info_t::data: ", fInfo->nalus[i].data, fInfo->nalus[i].length) ; |
|
} |
|
} |
|
} |
|
// End of DumpVideoFrameInfo() |
|
|
|
#else |
|
|
|
// Avoid #ifdef around the dump code |
|
|
|
#define DumpBuffer(...) |
|
#define DumpBuffer2(...) |
|
#define DumpNaluHeaderBuffer(...) |
|
#define DumpProtectedDataBuffer(...) |
|
#define DumpVideoFrameInfo(...) |
|
|
|
#define DUMP_EOL |
|
|
|
#endif // LOG_NDEBUG == 0 |
|
|
|
#endif // LOG_DUMP_HELPER_INCLUDED
|
|
|