diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/img_utils/src/TiffEntry.cpp | 10 | ||||
-rw-r--r-- | media/img_utils/src/TiffWriter.cpp | 8 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerFactory.cpp | 10 | ||||
-rw-r--r-- | media/libstagefright/ACodec.cpp | 104 | ||||
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 12 | ||||
-rw-r--r-- | media/libstagefright/foundation/ABuffer.cpp | 8 |
6 files changed, 140 insertions, 12 deletions
diff --git a/media/img_utils/src/TiffEntry.cpp b/media/img_utils/src/TiffEntry.cpp index 9cea721..1b20e36 100644 --- a/media/img_utils/src/TiffEntry.cpp +++ b/media/img_utils/src/TiffEntry.cpp @@ -203,14 +203,20 @@ String8 TiffEntry::toString() const { } break; } - case FLOAT: - case DOUBLE: { + case FLOAT: { const float* typed_data = getData<float>(); for (size_t i = 0; i < cappedCount; ++i) { output.appendFormat("%f ", typed_data[i]); } break; } + case DOUBLE: { + const double* typed_data = getData<double>(); + for (size_t i = 0; i < cappedCount; ++i) { + output.appendFormat("%f ", typed_data[i]); + } + break; + } default: { output.append("unknown type "); break; diff --git a/media/img_utils/src/TiffWriter.cpp b/media/img_utils/src/TiffWriter.cpp index d85289e..ac41734 100644 --- a/media/img_utils/src/TiffWriter.cpp +++ b/media/img_utils/src/TiffWriter.cpp @@ -66,10 +66,6 @@ status_t TiffWriter::write(Output* out, StripSource** sources, size_t sourcesCou return BAD_VALUE; } - if (LOG_NDEBUG == 0) { - log(); - } - uint32_t totalSize = getTotalSize(); KeyedVector<uint32_t, uint32_t> offsetVector; @@ -104,7 +100,9 @@ status_t TiffWriter::write(Output* out, StripSource** sources, size_t sourcesCou ifd = ifd->getNextIfd(); } - log(); + if (LOG_NDEBUG == 0) { + log(); + } for (size_t i = 0; i < offVecSize; ++i) { uint32_t ifdKey = offsetVector.keyAt(i); diff --git a/media/libmediaplayerservice/MediaPlayerFactory.cpp b/media/libmediaplayerservice/MediaPlayerFactory.cpp index e9c5e8e..dacb144 100644 --- a/media/libmediaplayerservice/MediaPlayerFactory.cpp +++ b/media/libmediaplayerservice/MediaPlayerFactory.cpp @@ -62,18 +62,18 @@ status_t MediaPlayerFactory::registerFactory_l(IFactory* factory, player_type MediaPlayerFactory::getDefaultPlayerType() { char value[PROPERTY_VALUE_MAX]; - if (property_get("media.stagefright.use-nuplayer", value, NULL) + if (property_get("media.stagefright.use-awesome", value, NULL) && (!strcmp("1", value) || !strcasecmp("true", value))) { - return NU_PLAYER; + return STAGEFRIGHT_PLAYER; } // TODO: remove this EXPERIMENTAL developer settings property - if (property_get("persist.sys.media.use-nuplayer", value, NULL) + if (property_get("persist.sys.media.use-awesome", value, NULL) && !strcasecmp("true", value)) { - return NU_PLAYER; + return STAGEFRIGHT_PLAYER; } - return STAGEFRIGHT_PLAYER; + return NU_PLAYER; } status_t MediaPlayerFactory::registerFactory(IFactory* factory, diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index b6cc742..1b1d7a9 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -2709,6 +2709,83 @@ void ACodec::processDeferredMessages() { } } +// static +void ACodec::describeDefaultColorFormat(DescribeColorFormatParams ¶ms) { + MediaImage &image = params.sMediaImage; + memset(&image, 0, sizeof(image)); + + image.mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; + image.mNumPlanes = 0; + + const OMX_COLOR_FORMATTYPE fmt = params.eColorFormat; + // we need stride and slice-height to be non-zero + if (params.nStride == 0 || params.nSliceHeight == 0) { + ALOGW("cannot describe color format 0x%x = %d with stride=%u and sliceHeight=%u", + fmt, fmt, params.nStride, params.nSliceHeight); + return; + } + + image.mWidth = params.nFrameWidth; + image.mHeight = params.nFrameHeight; + + // only supporting YUV420 + if (fmt != OMX_COLOR_FormatYUV420Planar && + fmt != OMX_COLOR_FormatYUV420PackedPlanar && + fmt != OMX_COLOR_FormatYUV420SemiPlanar && + fmt != OMX_COLOR_FormatYUV420PackedSemiPlanar) { + ALOGW("do not know color format 0x%x = %d", fmt, fmt); + return; + } + + // set-up YUV format + image.mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; + image.mNumPlanes = 3; + image.mBitDepth = 8; + image.mPlane[image.Y].mOffset = 0; + image.mPlane[image.Y].mColInc = 1; + image.mPlane[image.Y].mRowInc = params.nStride; + image.mPlane[image.Y].mHorizSubsampling = 1; + image.mPlane[image.Y].mVertSubsampling = 1; + + switch (fmt) { + case OMX_COLOR_FormatYUV420Planar: // used for YV12 + case OMX_COLOR_FormatYUV420PackedPlanar: + image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; + image.mPlane[image.U].mColInc = 1; + image.mPlane[image.U].mRowInc = params.nStride / 2; + image.mPlane[image.U].mHorizSubsampling = 2; + image.mPlane[image.U].mVertSubsampling = 2; + + image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset + + (params.nStride * params.nSliceHeight / 4); + image.mPlane[image.V].mColInc = 1; + image.mPlane[image.V].mRowInc = params.nStride / 2; + image.mPlane[image.V].mHorizSubsampling = 2; + image.mPlane[image.V].mVertSubsampling = 2; + break; + + case OMX_COLOR_FormatYUV420SemiPlanar: + // FIXME: NV21 for sw-encoder, NV12 for decoder and hw-encoder + case OMX_COLOR_FormatYUV420PackedSemiPlanar: + // NV12 + image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; + image.mPlane[image.U].mColInc = 2; + image.mPlane[image.U].mRowInc = params.nStride; + image.mPlane[image.U].mHorizSubsampling = 2; + image.mPlane[image.U].mVertSubsampling = 2; + + image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset + 1; + image.mPlane[image.V].mColInc = 2; + image.mPlane[image.V].mRowInc = params.nStride; + image.mPlane[image.V].mHorizSubsampling = 2; + image.mPlane[image.V].mVertSubsampling = 2; + break; + + default: + TRESPASS(); + } +} + status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { // TODO: catch errors an return them instead of using CHECK OMX_PARAM_PORTDEFINITIONTYPE def; @@ -2736,6 +2813,33 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { notify->setInt32("slice-height", videoDef->nSliceHeight); notify->setInt32("color-format", videoDef->eColorFormat); + + DescribeColorFormatParams describeParams; + InitOMXParams(&describeParams); + describeParams.eColorFormat = videoDef->eColorFormat; + describeParams.nFrameWidth = videoDef->nFrameWidth; + describeParams.nFrameHeight = videoDef->nFrameHeight; + describeParams.nStride = videoDef->nStride; + describeParams.nSliceHeight = videoDef->nSliceHeight; + + OMX_INDEXTYPE describeColorFormatIndex; + if (mOMX->getExtensionIndex( + mNode, "OMX.google.android.index.describeColorFormat", + &describeColorFormatIndex) || + mOMX->getParameter( + mNode, describeColorFormatIndex, + &describeParams, sizeof(describeParams))) { + describeDefaultColorFormat(describeParams); + } + + if (describeParams.sMediaImage.mType != MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN) { + notify->setBuffer( + "image-data", + ABuffer::CreateAsCopy( + &describeParams.sMediaImage, + sizeof(describeParams.sMediaImage))); + } + OMX_CONFIG_RECTTYPE rect; InitOMXParams(&rect); rect.nPortIndex = kPortIndexOutput; diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index 15e062e..e944766 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -1948,6 +1948,18 @@ ssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) { Mutex::Autolock al(mBufferLock); info->mFormat = portIndex == kPortIndexInput ? mInputFormat : mOutputFormat; info->mOwnedByClient = true; + + // set image-data + if (info->mFormat != NULL) { + sp<ABuffer> imageData; + if (info->mFormat->findBuffer("image-data", &imageData)) { + info->mData->meta()->setBuffer("image-data", imageData); + } + int32_t left, top, right, bottom; + if (info->mFormat->findRect("crop", &left, &top, &right, &bottom)) { + info->mData->meta()->setRect("crop-rect", left, top, right, bottom); + } + } } return index; diff --git a/media/libstagefright/foundation/ABuffer.cpp b/media/libstagefright/foundation/ABuffer.cpp index 6173db4..c93c7e8 100644 --- a/media/libstagefright/foundation/ABuffer.cpp +++ b/media/libstagefright/foundation/ABuffer.cpp @@ -40,6 +40,14 @@ ABuffer::ABuffer(void *data, size_t capacity) mOwnsData(false) { } +// static +sp<ABuffer> ABuffer::CreateAsCopy(const void *data, size_t capacity) +{ + sp<ABuffer> res = new ABuffer(capacity); + memcpy(res->data(), data, capacity); + return res; +} + ABuffer::~ABuffer() { if (mOwnsData) { if (mData != NULL) { |