Loading include/media/stagefright/MPEG4Writer.h +1 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ public: status_t setGeoData(int latitudex10000, int longitudex10000); status_t setCaptureRate(float captureFps); status_t setTemporalLayerCount(uint32_t layerCount); virtual void setStartTimeOffsetMs(int ms) { mStartTimeOffsetMs = ms; } virtual int32_t getStartTimeOffsetMs() const { return mStartTimeOffsetMs; } Loading include/media/stagefright/MetaData.h +2 −0 Original line number Diff line number Diff line Loading @@ -204,6 +204,8 @@ enum { // transfer Function, value defined by ColorAspects.Transfer. kKeyColorMatrix = 'cMtx', // int32_t, // color Matrix, value defined by ColorAspects.MatrixCoeffs. kKeyTemporalLayerId = 'iLyr', // int32_t, temporal layer-id. 0-based (0 => base layer) kKeyTemporalLayerCount = 'cLyr', // int32_t, number of temporal layers encoded }; enum { Loading media/libstagefright/MPEG4Extractor.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ #include <byteswap.h> #include "include/ID3.h" #include "include/avc_utils.h" #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) Loading Loading @@ -2574,6 +2575,15 @@ status_t MPEG4Extractor::parseQTMetaVal( if (!strcasecmp(mMetaKeyMap[index].c_str(), "com.android.capture.fps")) { mFileMetaData->setFloat(kKeyCaptureFramerate, *(float *)&val); } } else if (dataType == 67 && dataSize >= 4) { // BE signed int32 uint32_t val; if (!mDataSource->getUInt32(offset, &val)) { return ERROR_MALFORMED; } if (!strcasecmp(mMetaKeyMap[index].c_str(), "com.android.video.temporal_layers_count")) { mFileMetaData->setInt32(kKeyTemporalLayerCount, val); } } else { // add more keys if needed ALOGV("ignoring key: type %d, size %d", dataType, dataSize); Loading Loading @@ -4567,6 +4577,12 @@ status_t MPEG4Source::read( kKeyTargetTime, targetSampleTimeUs); } if (mIsAVC) { uint32_t layerId = FindAVCLayerId( (const uint8_t *)mBuffer->data(), mBuffer->range_length()); mBuffer->meta_data()->setInt32(kKeyTemporalLayerId, layerId); } if (isSyncSample) { mBuffer->meta_data()->setInt32(kKeyIsSyncFrame, 1); } Loading Loading @@ -4730,6 +4746,12 @@ status_t MPEG4Source::fragmentedRead( kKeyTargetTime, targetSampleTimeUs); } if (mIsAVC) { uint32_t layerId = FindAVCLayerId( (const uint8_t *)mBuffer->data(), mBuffer->range_length()); mBuffer->meta_data()->setInt32(kKeyTemporalLayerId, layerId); } if (isSyncSample) { mBuffer->meta_data()->setInt32(kKeyIsSyncFrame, 1); } Loading media/libstagefright/MPEG4Writer.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ static const char kMetaKey_Model[] = "com.android.model"; static const char kMetaKey_Build[] = "com.android.build"; #endif static const char kMetaKey_CaptureFps[] = "com.android.capture.fps"; static const char kMetaKey_TemporalLayerCount[] = "com.android.video.temporal_layers_count"; static const uint8_t kMandatoryHevcNalUnitTypes[3] = { kHevcNalUnitTypeVps, Loading Loading @@ -1381,6 +1382,19 @@ status_t MPEG4Writer::setCaptureRate(float captureFps) { return OK; } status_t MPEG4Writer::setTemporalLayerCount(uint32_t layerCount) { if (layerCount > 9) { return BAD_VALUE; } if (layerCount > 0) { mMetaKeys->setInt32(kMetaKey_TemporalLayerCount, layerCount); mMoovExtraSize += sizeof(kMetaKey_TemporalLayerCount) + 4 + 32; } return OK; } void MPEG4Writer::write(const void *data, size_t size) { write(data, 1, size); } Loading media/libstagefright/avc_utils.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -491,6 +491,28 @@ bool IsAVCReferenceFrame(const sp<ABuffer> &accessUnit) { return true; } uint32_t FindAVCLayerId(const uint8_t *data, size_t size) { CHECK(data != NULL); const unsigned kSvcNalType = 0xE; const unsigned kSvcNalSearchRange = 32; // SVC NAL // |---0 1110|1--- ----|---- ----|iii- ---| // ^ ^ // NAL-type = 0xE layer-Id // // layer_id 0 is for base layer, while 1, 2, ... are enhancement layers. // Layer n uses reference frames from layer 0, 1, ..., n-1. uint32_t layerId = 0; sp<ABuffer> svcNAL = FindNAL( data, size > kSvcNalSearchRange ? kSvcNalSearchRange : size, kSvcNalType); if (svcNAL != NULL && svcNAL->size() >= 4) { layerId = (*(svcNAL->data() + 3) >> 5) & 0x7; } return layerId; } sp<MetaData> MakeAACCodecSpecificData( unsigned profile, unsigned sampling_freq_index, unsigned channel_configuration) { Loading Loading
include/media/stagefright/MPEG4Writer.h +1 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ public: status_t setGeoData(int latitudex10000, int longitudex10000); status_t setCaptureRate(float captureFps); status_t setTemporalLayerCount(uint32_t layerCount); virtual void setStartTimeOffsetMs(int ms) { mStartTimeOffsetMs = ms; } virtual int32_t getStartTimeOffsetMs() const { return mStartTimeOffsetMs; } Loading
include/media/stagefright/MetaData.h +2 −0 Original line number Diff line number Diff line Loading @@ -204,6 +204,8 @@ enum { // transfer Function, value defined by ColorAspects.Transfer. kKeyColorMatrix = 'cMtx', // int32_t, // color Matrix, value defined by ColorAspects.MatrixCoeffs. kKeyTemporalLayerId = 'iLyr', // int32_t, temporal layer-id. 0-based (0 => base layer) kKeyTemporalLayerCount = 'cLyr', // int32_t, number of temporal layers encoded }; enum { Loading
media/libstagefright/MPEG4Extractor.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ #include <byteswap.h> #include "include/ID3.h" #include "include/avc_utils.h" #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) Loading Loading @@ -2574,6 +2575,15 @@ status_t MPEG4Extractor::parseQTMetaVal( if (!strcasecmp(mMetaKeyMap[index].c_str(), "com.android.capture.fps")) { mFileMetaData->setFloat(kKeyCaptureFramerate, *(float *)&val); } } else if (dataType == 67 && dataSize >= 4) { // BE signed int32 uint32_t val; if (!mDataSource->getUInt32(offset, &val)) { return ERROR_MALFORMED; } if (!strcasecmp(mMetaKeyMap[index].c_str(), "com.android.video.temporal_layers_count")) { mFileMetaData->setInt32(kKeyTemporalLayerCount, val); } } else { // add more keys if needed ALOGV("ignoring key: type %d, size %d", dataType, dataSize); Loading Loading @@ -4567,6 +4577,12 @@ status_t MPEG4Source::read( kKeyTargetTime, targetSampleTimeUs); } if (mIsAVC) { uint32_t layerId = FindAVCLayerId( (const uint8_t *)mBuffer->data(), mBuffer->range_length()); mBuffer->meta_data()->setInt32(kKeyTemporalLayerId, layerId); } if (isSyncSample) { mBuffer->meta_data()->setInt32(kKeyIsSyncFrame, 1); } Loading Loading @@ -4730,6 +4746,12 @@ status_t MPEG4Source::fragmentedRead( kKeyTargetTime, targetSampleTimeUs); } if (mIsAVC) { uint32_t layerId = FindAVCLayerId( (const uint8_t *)mBuffer->data(), mBuffer->range_length()); mBuffer->meta_data()->setInt32(kKeyTemporalLayerId, layerId); } if (isSyncSample) { mBuffer->meta_data()->setInt32(kKeyIsSyncFrame, 1); } Loading
media/libstagefright/MPEG4Writer.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ static const char kMetaKey_Model[] = "com.android.model"; static const char kMetaKey_Build[] = "com.android.build"; #endif static const char kMetaKey_CaptureFps[] = "com.android.capture.fps"; static const char kMetaKey_TemporalLayerCount[] = "com.android.video.temporal_layers_count"; static const uint8_t kMandatoryHevcNalUnitTypes[3] = { kHevcNalUnitTypeVps, Loading Loading @@ -1381,6 +1382,19 @@ status_t MPEG4Writer::setCaptureRate(float captureFps) { return OK; } status_t MPEG4Writer::setTemporalLayerCount(uint32_t layerCount) { if (layerCount > 9) { return BAD_VALUE; } if (layerCount > 0) { mMetaKeys->setInt32(kMetaKey_TemporalLayerCount, layerCount); mMoovExtraSize += sizeof(kMetaKey_TemporalLayerCount) + 4 + 32; } return OK; } void MPEG4Writer::write(const void *data, size_t size) { write(data, 1, size); } Loading
media/libstagefright/avc_utils.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -491,6 +491,28 @@ bool IsAVCReferenceFrame(const sp<ABuffer> &accessUnit) { return true; } uint32_t FindAVCLayerId(const uint8_t *data, size_t size) { CHECK(data != NULL); const unsigned kSvcNalType = 0xE; const unsigned kSvcNalSearchRange = 32; // SVC NAL // |---0 1110|1--- ----|---- ----|iii- ---| // ^ ^ // NAL-type = 0xE layer-Id // // layer_id 0 is for base layer, while 1, 2, ... are enhancement layers. // Layer n uses reference frames from layer 0, 1, ..., n-1. uint32_t layerId = 0; sp<ABuffer> svcNAL = FindNAL( data, size > kSvcNalSearchRange ? kSvcNalSearchRange : size, kSvcNalType); if (svcNAL != NULL && svcNAL->size() >= 4) { layerId = (*(svcNAL->data() + 3) >> 5) & 0x7; } return layerId; } sp<MetaData> MakeAACCodecSpecificData( unsigned profile, unsigned sampling_freq_index, unsigned channel_configuration) { Loading