Loading media/libstagefright/matroska/MatroskaExtractor.cpp +51 −18 Original line number Diff line number Diff line Loading @@ -605,16 +605,27 @@ status_t MatroskaSource::readBlock() { int64_t timeUs = mBlockIter.blockTimeUs(); for (int i = 0; i < block->GetFrameCount(); ++i) { MatroskaExtractor::TrackInfo *trackInfo = &mExtractor->mTracks.editItemAt(mTrackIndex); const mkvparser::Block::Frame &frame = block->GetFrame(i); size_t len = frame.len; if (SIZE_MAX - len < trackInfo->mHeaderLen) { return ERROR_MALFORMED; } len += trackInfo->mHeaderLen; MediaBuffer *mbuf = new MediaBuffer(len); uint8_t *data = static_cast<uint8_t *>(mbuf->data()); if (trackInfo->mHeader) { memcpy(data, trackInfo->mHeader, trackInfo->mHeaderLen); } MediaBuffer *mbuf = new MediaBuffer(frame.len); mbuf->meta_data()->setInt64(kKeyTime, timeUs); mbuf->meta_data()->setInt32(kKeyIsSyncFrame, block->IsKey()); status_t err = frame.Read(mExtractor->mReader, static_cast<uint8_t *>(mbuf->data())); status_t err = frame.Read(mExtractor->mReader, data + trackInfo->mHeaderLen); if (err == OK && mExtractor->mIsWebm && mExtractor->mTracks.itemAt(mTrackIndex).mEncrypted) { && trackInfo->mEncrypted) { err = setWebmBlockCryptoInfo(mbuf); } Loading Loading @@ -1164,6 +1175,42 @@ void MatroskaExtractor::getColorInformation( } } status_t MatroskaExtractor::initTrackInfo( const mkvparser::Track *track, const sp<MetaData> &meta, TrackInfo *trackInfo) { trackInfo->mTrackNum = track->GetNumber(); trackInfo->mMeta = meta; trackInfo->mExtractor = this; trackInfo->mEncrypted = false; trackInfo->mHeader = NULL; trackInfo->mHeaderLen = 0; for(size_t i = 0; i < track->GetContentEncodingCount(); i++) { const mkvparser::ContentEncoding *encoding = track->GetContentEncodingByIndex(i); for(size_t j = 0; j < encoding->GetEncryptionCount(); j++) { const mkvparser::ContentEncoding::ContentEncryption *encryption; encryption = encoding->GetEncryptionByIndex(j); trackInfo->mMeta->setData(kKeyCryptoKey, 0, encryption->key_id, encryption->key_id_len); trackInfo->mEncrypted = true; break; } for(size_t j = 0; j < encoding->GetCompressionCount(); j++) { const mkvparser::ContentEncoding::ContentCompression *compression; compression = encoding->GetCompressionByIndex(j); ALOGV("compression algo %llu settings_len %lld", compression->algo, compression->settings_len); if (compression->algo == 3 && compression->settings && compression->settings_len > 0) { trackInfo->mHeader = compression->settings; trackInfo->mHeaderLen = compression->settings_len; } } } return OK; } void MatroskaExtractor::addTracks() { const mkvparser::Tracks *tracks = mSegment->GetTracks(); Loading Loading @@ -1288,21 +1335,7 @@ void MatroskaExtractor::addTracks() { mTracks.push(); size_t n = mTracks.size() - 1; TrackInfo *trackInfo = &mTracks.editItemAt(n); trackInfo->mTrackNum = track->GetNumber(); trackInfo->mMeta = meta; trackInfo->mExtractor = this; trackInfo->mEncrypted = false; for(size_t i = 0; i < track->GetContentEncodingCount() && !trackInfo->mEncrypted; i++) { const mkvparser::ContentEncoding *encoding = track->GetContentEncodingByIndex(i); for(size_t j = 0; j < encoding->GetEncryptionCount(); j++) { const mkvparser::ContentEncoding::ContentEncryption *encryption; encryption = encoding->GetEncryptionByIndex(j); meta->setData(kKeyCryptoKey, 0, encryption->key_id, encryption->key_id_len); trackInfo->mEncrypted = true; break; } } initTrackInfo(track, meta, trackInfo); if (!strcmp("V_MPEG4/ISO/AVC", codecID) && codecPrivateSize == 0) { // Attempt to recover from AVC track without codec private data Loading media/libstagefright/matroska/MatroskaExtractor.h +7 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,12 @@ private: const MatroskaExtractor *mExtractor; Vector<const mkvparser::CuePoint*> mCuePoints; // mHeader points to memory managed by mkvparser; // mHeader would be deleted when mSegment is deleted // in ~MatroskaExtractor. unsigned char *mHeader; size_t mHeaderLen; const mkvparser::Track* getTrack() const; const mkvparser::CuePoint::TrackPosition *find(long long timeNs) const; }; Loading @@ -79,6 +85,7 @@ private: int64_t mSeekPreRollNs; status_t synthesizeAVCC(TrackInfo *trackInfo, size_t index); status_t initTrackInfo(const mkvparser::Track *track, const sp<MetaData> &meta, TrackInfo *trackInfo); void addTracks(); void findThumbnails(); void getColorInformation(const mkvparser::VideoTrack *vtrack, sp<MetaData> &meta); Loading Loading
media/libstagefright/matroska/MatroskaExtractor.cpp +51 −18 Original line number Diff line number Diff line Loading @@ -605,16 +605,27 @@ status_t MatroskaSource::readBlock() { int64_t timeUs = mBlockIter.blockTimeUs(); for (int i = 0; i < block->GetFrameCount(); ++i) { MatroskaExtractor::TrackInfo *trackInfo = &mExtractor->mTracks.editItemAt(mTrackIndex); const mkvparser::Block::Frame &frame = block->GetFrame(i); size_t len = frame.len; if (SIZE_MAX - len < trackInfo->mHeaderLen) { return ERROR_MALFORMED; } len += trackInfo->mHeaderLen; MediaBuffer *mbuf = new MediaBuffer(len); uint8_t *data = static_cast<uint8_t *>(mbuf->data()); if (trackInfo->mHeader) { memcpy(data, trackInfo->mHeader, trackInfo->mHeaderLen); } MediaBuffer *mbuf = new MediaBuffer(frame.len); mbuf->meta_data()->setInt64(kKeyTime, timeUs); mbuf->meta_data()->setInt32(kKeyIsSyncFrame, block->IsKey()); status_t err = frame.Read(mExtractor->mReader, static_cast<uint8_t *>(mbuf->data())); status_t err = frame.Read(mExtractor->mReader, data + trackInfo->mHeaderLen); if (err == OK && mExtractor->mIsWebm && mExtractor->mTracks.itemAt(mTrackIndex).mEncrypted) { && trackInfo->mEncrypted) { err = setWebmBlockCryptoInfo(mbuf); } Loading Loading @@ -1164,6 +1175,42 @@ void MatroskaExtractor::getColorInformation( } } status_t MatroskaExtractor::initTrackInfo( const mkvparser::Track *track, const sp<MetaData> &meta, TrackInfo *trackInfo) { trackInfo->mTrackNum = track->GetNumber(); trackInfo->mMeta = meta; trackInfo->mExtractor = this; trackInfo->mEncrypted = false; trackInfo->mHeader = NULL; trackInfo->mHeaderLen = 0; for(size_t i = 0; i < track->GetContentEncodingCount(); i++) { const mkvparser::ContentEncoding *encoding = track->GetContentEncodingByIndex(i); for(size_t j = 0; j < encoding->GetEncryptionCount(); j++) { const mkvparser::ContentEncoding::ContentEncryption *encryption; encryption = encoding->GetEncryptionByIndex(j); trackInfo->mMeta->setData(kKeyCryptoKey, 0, encryption->key_id, encryption->key_id_len); trackInfo->mEncrypted = true; break; } for(size_t j = 0; j < encoding->GetCompressionCount(); j++) { const mkvparser::ContentEncoding::ContentCompression *compression; compression = encoding->GetCompressionByIndex(j); ALOGV("compression algo %llu settings_len %lld", compression->algo, compression->settings_len); if (compression->algo == 3 && compression->settings && compression->settings_len > 0) { trackInfo->mHeader = compression->settings; trackInfo->mHeaderLen = compression->settings_len; } } } return OK; } void MatroskaExtractor::addTracks() { const mkvparser::Tracks *tracks = mSegment->GetTracks(); Loading Loading @@ -1288,21 +1335,7 @@ void MatroskaExtractor::addTracks() { mTracks.push(); size_t n = mTracks.size() - 1; TrackInfo *trackInfo = &mTracks.editItemAt(n); trackInfo->mTrackNum = track->GetNumber(); trackInfo->mMeta = meta; trackInfo->mExtractor = this; trackInfo->mEncrypted = false; for(size_t i = 0; i < track->GetContentEncodingCount() && !trackInfo->mEncrypted; i++) { const mkvparser::ContentEncoding *encoding = track->GetContentEncodingByIndex(i); for(size_t j = 0; j < encoding->GetEncryptionCount(); j++) { const mkvparser::ContentEncoding::ContentEncryption *encryption; encryption = encoding->GetEncryptionByIndex(j); meta->setData(kKeyCryptoKey, 0, encryption->key_id, encryption->key_id_len); trackInfo->mEncrypted = true; break; } } initTrackInfo(track, meta, trackInfo); if (!strcmp("V_MPEG4/ISO/AVC", codecID) && codecPrivateSize == 0) { // Attempt to recover from AVC track without codec private data Loading
media/libstagefright/matroska/MatroskaExtractor.h +7 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,12 @@ private: const MatroskaExtractor *mExtractor; Vector<const mkvparser::CuePoint*> mCuePoints; // mHeader points to memory managed by mkvparser; // mHeader would be deleted when mSegment is deleted // in ~MatroskaExtractor. unsigned char *mHeader; size_t mHeaderLen; const mkvparser::Track* getTrack() const; const mkvparser::CuePoint::TrackPosition *find(long long timeNs) const; }; Loading @@ -79,6 +85,7 @@ private: int64_t mSeekPreRollNs; status_t synthesizeAVCC(TrackInfo *trackInfo, size_t index); status_t initTrackInfo(const mkvparser::Track *track, const sp<MetaData> &meta, TrackInfo *trackInfo); void addTracks(); void findThumbnails(); void getColorInformation(const mkvparser::VideoTrack *vtrack, sp<MetaData> &meta); Loading