diff options
-rw-r--r-- | include/media/stagefright/ACodec.h | 3 | ||||
-rw-r--r-- | media/libstagefright/ACodec.cpp | 34 | ||||
-rw-r--r-- | media/libstagefright/Android.mk | 10 | ||||
-rw-r--r-- | media/libstagefright/CameraSource.cpp | 5 | ||||
-rw-r--r-- | media/libstagefright/colorconversion/SoftwareRenderer.cpp | 23 |
5 files changed, 74 insertions, 1 deletions
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h index a3c3ea1..3c5a457 100644 --- a/include/media/stagefright/ACodec.h +++ b/include/media/stagefright/ACodec.h @@ -291,6 +291,9 @@ protected: status_t submitOutputMetadataBuffer(); void signalSubmitOutputMetadataBufferIfEOS_workaround(); status_t allocateOutputBuffersFromNativeWindow(); +#ifdef USE_SAMSUNG_COLORFORMAT + void setNativeWindowColorFormat(OMX_COLOR_FORMATTYPE &eNativeColorFormat); +#endif status_t cancelBufferToNativeWindow(BufferInfo *info); status_t freeOutputBuffersNotOwnedByComponent(); BufferInfo *dequeueBufferFromNativeWindow(); diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index b87423f..9ab53fa 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -55,6 +55,10 @@ #include <OMX_IndexExt.h> #include <OMX_AsString.h> +#ifdef USE_SAMSUNG_COLORFORMAT +#include <sec_format.h> +#endif + #include "include/avc_utils.h" #include <stagefright/AVExtensions.h> @@ -913,12 +917,21 @@ status_t ACodec::setupNativeWindowSizeFormatAndUsage( usage |= kVideoGrallocUsage; *finalUsage = usage; +#ifdef USE_SAMSUNG_COLORFORMAT + OMX_COLOR_FORMATTYPE eNativeColorFormat = def.format.video.eColorFormat; + setNativeWindowColorFormat(eNativeColorFormat); +#endif + ALOGV("gralloc usage: %#x(OMX) => %#x(ACodec)", omxUsage, usage); return setNativeWindowSizeFormatAndUsage( nativeWindow, def.format.video.nFrameWidth, def.format.video.nFrameHeight, +#ifdef USE_SAMSUNG_COLORFORMAT + eNativeColorFormat, +#else def.format.video.eColorFormat, +#endif mRotationDegrees, usage); } @@ -1258,6 +1271,27 @@ void ACodec::dumpBuffers(OMX_U32 portIndex) { } } +#ifdef USE_SAMSUNG_COLORFORMAT +void ACodec::setNativeWindowColorFormat(OMX_COLOR_FORMATTYPE &eNativeColorFormat) +{ + // In case of Samsung decoders, we set proper native color format for the Native Window + if (!strcasecmp(mComponentName.c_str(), "OMX.SEC.AVC.Decoder") + || !strcasecmp(mComponentName.c_str(), "OMX.SEC.FP.AVC.Decoder") + || !strcasecmp(mComponentName.c_str(), "OMX.SEC.MPEG4.Decoder") + || !strcasecmp(mComponentName.c_str(), "OMX.Exynos.AVC.Decoder")) { + switch (eNativeColorFormat) { + case OMX_COLOR_FormatYUV420SemiPlanar: + eNativeColorFormat = (OMX_COLOR_FORMATTYPE)HAL_PIXEL_FORMAT_YCbCr_420_SP; + break; + case OMX_COLOR_FormatYUV420Planar: + default: + eNativeColorFormat = (OMX_COLOR_FORMATTYPE)HAL_PIXEL_FORMAT_YCbCr_420_P; + break; + } + } +} +#endif + status_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) { CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk index 40792a0..626f838 100644 --- a/media/libstagefright/Android.mk +++ b/media/libstagefright/Android.mk @@ -192,6 +192,16 @@ endif LOCAL_C_INCLUDES += $(TOP)/external/stagefright-plugins/include #LOCAL_CFLAGS += -DLOG_NDEBUG=0 + +ifeq ($(BOARD_USE_SAMSUNG_COLORFORMAT), true) +LOCAL_CFLAGS += -DUSE_SAMSUNG_COLORFORMAT + +# Include native color format header path +LOCAL_C_INCLUDES += \ + $(TOP)/hardware/samsung/exynos4/hal/include \ + $(TOP)/hardware/samsung/exynos4/include +endif + LOCAL_MODULE:= libstagefright LOCAL_MODULE_TAGS := optional diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp index 20a0a45..10269b8 100644 --- a/media/libstagefright/CameraSource.cpp +++ b/media/libstagefright/CameraSource.cpp @@ -114,7 +114,12 @@ static int32_t getColorFormat(const char* colorFormat) { } if (!strcmp(colorFormat, CameraParameters::PIXEL_FORMAT_YUV420SP)) { +#ifdef USE_SAMSUNG_COLORFORMAT + static const int OMX_SEC_COLOR_FormatNV12LPhysicalAddress = 0x7F000002; + return OMX_SEC_COLOR_FormatNV12LPhysicalAddress; +#else return OMX_COLOR_FormatYUV420SemiPlanar; +#endif } #ifdef USE_SAMSUNG_CAMERAFORMAT_NV21 diff --git a/media/libstagefright/colorconversion/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp index e92c192..3fa29a2 100644 --- a/media/libstagefright/colorconversion/SoftwareRenderer.cpp +++ b/media/libstagefright/colorconversion/SoftwareRenderer.cpp @@ -150,11 +150,20 @@ void SoftwareRenderer::resetFormatIfChanged(const sp<AMessage> &format) { CHECK(mCropHeight > 0); CHECK(mConverter == NULL || mConverter->isValid()); +#ifdef EXYNOS4_ENHANCEMENTS + CHECK_EQ(0, + native_window_set_usage( + mNativeWindow.get(), + GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN + | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP + | GRALLOC_USAGE_HW_FIMC1)); +#else CHECK_EQ(0, native_window_set_usage( mNativeWindow.get(), GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP)); +#endif CHECK_EQ(0, native_window_set_scaling_mode( @@ -282,13 +291,25 @@ std::list<FrameRenderTracker::Info> SoftwareRenderer::render( const uint8_t *src_uv = (const uint8_t *)data + mWidth * (mHeight - mCropTop / 2); - uint8_t *dst_y = (uint8_t *)dst; +#ifdef EXYNOS4_ENHANCEMENTS + void *pYUVBuf[3]; + + CHECK_EQ(0, mapper.unlock(buf->handle)); + CHECK_EQ(0, mapper.lock( + buf->handle, GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_YUV_ADDR, bounds, pYUVBuf)); + size_t dst_c_stride = buf->stride / 2; + uint8_t *dst_y = (uint8_t *)pYUVBuf[0]; + uint8_t *dst_v = (uint8_t *)pYUVBuf[1]; + uint8_t *dst_u = (uint8_t *)pYUVBuf[2]; +#else + uint8_t *dst_y = (uint8_t *)dst; size_t dst_y_size = buf->stride * buf->height; size_t dst_c_stride = ALIGN(buf->stride / 2, 16); size_t dst_c_size = dst_c_stride * buf->height / 2; uint8_t *dst_v = dst_y + dst_y_size; uint8_t *dst_u = dst_v + dst_c_size; +#endif for (int y = 0; y < mCropHeight; ++y) { memcpy(dst_y, src_y, mCropWidth); |