diff options
author | Steve Kondik <shade@chemlab.org> | 2013-04-17 21:43:17 -0700 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2013-04-17 21:43:17 -0700 |
commit | 320c939ef471644fcb618cd3b5688e68694170a9 (patch) | |
tree | 8e0dbe1ea2c67bc377199713d584b9aefd040af2 | |
parent | 7219980a19c026fb454c1decdd2eacd22691df6b (diff) | |
parent | e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0 (diff) | |
download | android_hardware_samsung_slsi_exynos5-cm-10.1.0-RC2.tar.gz android_hardware_samsung_slsi_exynos5-cm-10.1.0-RC2.tar.bz2 android_hardware_samsung_slsi_exynos5-cm-10.1.0-RC2.zip |
Merge tag 'android-4.2.2_r1.2' of https://android.googlesource.com/platform/hardware/samsung_slsi/exynos5 into cm-10.1cm-10.1.3-RC2cm-10.1.3-RC1cm-10.1.3cm-10.1.2cm-10.1.1cm-10.1.0-RC5cm-10.1.0-RC4cm-10.1.0-RC3cm-10.1.0-RC2cm-10.1.0-RC1cm-10.1.0cm-10.1
Android 4.2.2 release 1.2
# gpg: Signature made Wed 17 Apr 2013 01:00:33 PM PDT using DSA key ID 9AB10E78
# gpg: Can't check signature: public key not found
6 files changed, 119 insertions, 20 deletions
diff --git a/exynos_omx/openmax/exynos_omx/component/common/Exynos_OMX_Basecomponent.c b/exynos_omx/openmax/exynos_omx/component/common/Exynos_OMX_Basecomponent.c index f9769ef..fac8d52 100644 --- a/exynos_omx/openmax/exynos_omx/component/common/Exynos_OMX_Basecomponent.c +++ b/exynos_omx/openmax/exynos_omx/component/common/Exynos_OMX_Basecomponent.c @@ -201,7 +201,7 @@ OMX_ERRORTYPE Exynos_OMX_ComponentStateSet(OMX_COMPONENTTYPE *pOMXComponent, OMX Exynos_OMX_Release_Resource(pOMXComponent); } - Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "destState: %d", destState); + Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "destState: %d currentState: %d", destState, currentState); switch (destState) { case OMX_StateInvalid: switch (currentState) { @@ -357,6 +357,8 @@ OMX_ERRORTYPE Exynos_OMX_ComponentStateSet(OMX_COMPONENTTYPE *pOMXComponent, OMX /* * if (CHECK_PORT_TUNNELED == OMX_TRUE) thenTunnel Buffer Free */ + Exynos_OSAL_SignalSet(pExynosComponent->abendStateEvent); + Exynos_OMX_Release_Resource(pOMXComponent); goto EXIT; } if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) { diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h index cb5f110..072c2b4 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h @@ -99,6 +99,7 @@ typedef struct _EXYNOS_OMX_VIDEOENC_COMPONENT OMX_BOOL IntraRefreshVOP; OMX_VIDEO_CONTROLRATETYPE eControlRate[ALL_PORT_NUM]; OMX_VIDEO_PARAM_QUANTIZATIONTYPE quantization; + OMX_VIDEO_PARAM_INTRAREFRESHTYPE intraRefresh; OMX_BOOL bFirstInput; OMX_BOOL bFirstOutput; diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c index e8c8647..42bcc38 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c @@ -1196,6 +1196,25 @@ OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetParameter( #endif } break; + case OMX_IndexParamVideoIntraRefresh: + { + OMX_VIDEO_PARAM_INTRAREFRESHTYPE *pIntraRefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)ComponentParameterStructure; + OMX_U32 portIndex = pIntraRefresh->nPortIndex; + EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; + + if (portIndex != OUTPUT_PORT_INDEX) { + ret = OMX_ErrorBadPortIndex; + goto EXIT; + } else { + pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; + pIntraRefresh->eRefreshMode = pVideoEnc->intraRefresh.eRefreshMode; + pIntraRefresh->nAirMBs = pVideoEnc->intraRefresh.nAirMBs; + pIntraRefresh->nAirRef = pVideoEnc->intraRefresh.nAirRef; + pIntraRefresh->nCirMBs = pVideoEnc->intraRefresh.nCirMBs; + } + ret = OMX_ErrorNone; + } + break; default: { ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure); @@ -1358,6 +1377,30 @@ OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetParameter( ret = OMX_ErrorNone; } break; + case OMX_IndexParamVideoIntraRefresh: + { + OMX_VIDEO_PARAM_INTRAREFRESHTYPE *pIntraRefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)ComponentParameterStructure; + OMX_U32 portIndex = pIntraRefresh->nPortIndex; + EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; + + if (portIndex != OUTPUT_PORT_INDEX) { + ret = OMX_ErrorBadPortIndex; + goto EXIT; + } else { + pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; + if (pIntraRefresh->eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) { + pVideoEnc->intraRefresh.eRefreshMode = pIntraRefresh->eRefreshMode; + pVideoEnc->intraRefresh.nCirMBs = pIntraRefresh->nCirMBs; + Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_VIDEO_IntraRefreshCyclic Enable, nCirMBs: %d", + pVideoEnc->intraRefresh.nCirMBs); + } else { + ret = OMX_ErrorUnsupportedSetting; + goto EXIT; + } + } + ret = OMX_ErrorNone; + } + break; #ifdef USE_STOREMETADATA case OMX_IndexParamStoreMetaDataBuffer: { diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c index d17a934..d25503d 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c @@ -241,7 +241,6 @@ static void Set_H264Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight; pCommonParam->IDRPeriod = pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].nPFrames + 1; pCommonParam->SliceMode = 0; - pCommonParam->RandomIntraMBRefresh = 0; pCommonParam->Bitrate = pExynosOutputPort->portDefinition.format.video.nBitrate; pCommonParam->FrameQp = pVideoEnc->quantization.nQpI; pCommonParam->FrameQp_P = pVideoEnc->quantization.nQpP; @@ -252,6 +251,15 @@ static void Set_H264Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) pCommonParam->CbPadVal = 0; pCommonParam->CrPadVal = 0; + if (pVideoEnc->intraRefresh.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) { + /* Cyclic Mode */ + pCommonParam->RandomIntraMBRefresh = pVideoEnc->intraRefresh.nCirMBs; + Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh: %d", pCommonParam->RandomIntraMBRefresh); + } else { + /* Don't support "Adaptive" and "Cyclic + Adaptive" */ + pCommonParam->RandomIntraMBRefresh = 0; + } + if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { if (pVideoEnc->ANBColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12; @@ -362,7 +370,7 @@ static void Change_H264Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) setParam = pExynosOutputPort->portDefinition.format.video.nBitrate; pEncOps->Set_BitRate(pH264Enc->hMFCH264Handle.hMFCHandle, setParam); } - if (pH264Param->FrameRate != (int)((pExynosOutputPort->portDefinition.format.video.xFramerate) >> 16)) { + if (pH264Param->FrameRate != (int)((pExynosInputPort->portDefinition.format.video.xFramerate) >> 16)) { setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16; pEncOps->Set_FrameRate(pH264Enc->hMFCH264Handle.hMFCHandle, setParam); } @@ -1745,6 +1753,10 @@ OMX_ERRORTYPE Exynos_H264Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_ ret = H264CodecDstSetup(pOMXComponent); } + if (pVideoEnc->configChange == OMX_TRUE) { + Change_H264Enc_Param(pExynosComponent); + pVideoEnc->configChange = OMX_FALSE; + } if ((pSrcInputData->dataLen >= 0) || ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0}; diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c index 3174dea..f58ee45 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c @@ -232,7 +232,6 @@ static void Set_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight; pCommonParam->IDRPeriod = pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1; pCommonParam->SliceMode = 0; - pCommonParam->RandomIntraMBRefresh = 0; pCommonParam->Bitrate = pExynosOutputPort->portDefinition.format.video.nBitrate; pCommonParam->FrameQp = pVideoEnc->quantization.nQpI; pCommonParam->FrameQp_P = pVideoEnc->quantization.nQpP; @@ -243,6 +242,14 @@ static void Set_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) pCommonParam->CbPadVal = 0; pCommonParam->CrPadVal = 0; + if (pVideoEnc->intraRefresh.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) { + /* Cyclic Mode */ + pCommonParam->RandomIntraMBRefresh = pVideoEnc->intraRefresh.nCirMBs; + } else { + /* Don't support "Adaptive" and "Cyclic + Adaptive" */ + pCommonParam->RandomIntraMBRefresh = 0; + } + if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV21Linear) pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12; @@ -333,7 +340,6 @@ static void Set_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight; pCommonParam->IDRPeriod = pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1; pCommonParam->SliceMode = 0; - pCommonParam->RandomIntraMBRefresh = 0; pCommonParam->Bitrate = pExynosOutputPort->portDefinition.format.video.nBitrate; pCommonParam->FrameQp = pVideoEnc->quantization.nQpI; pCommonParam->FrameQp_P = pVideoEnc->quantization.nQpP; @@ -344,6 +350,14 @@ static void Set_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) pCommonParam->CbPadVal = 0; pCommonParam->CrPadVal = 0; + if (pVideoEnc->intraRefresh.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) { + /* Cyclic Mode */ + pCommonParam->RandomIntraMBRefresh = pVideoEnc->intraRefresh.nCirMBs; + } else { + /* Don't support "Adaptive" and "Cyclic + Adaptive" */ + pCommonParam->RandomIntraMBRefresh = 0; + } + if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV21Linear) pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12; @@ -437,7 +451,7 @@ static void Change_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) setParam = pExynosOutputPort->portDefinition.format.video.nBitrate; pEncOps->Set_BitRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); } - if (pMpeg4Param->TimeIncreamentRes != (int)((pExynosOutputPort->portDefinition.format.video.xFramerate) >> 16)) { + if (pMpeg4Param->TimeIncreamentRes != (int)((pExynosInputPort->portDefinition.format.video.xFramerate) >> 16)) { setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16; pEncOps->Set_FrameRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); } @@ -484,7 +498,7 @@ static void Change_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) setParam = pExynosOutputPort->portDefinition.format.video.nBitrate; pEncOps->Set_BitRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); } - if (pH263Param->FrameRate != (int)((pExynosOutputPort->portDefinition.format.video.xFramerate) >> 16)) { + if (pH263Param->FrameRate != (int)((pExynosInputPort->portDefinition.format.video.xFramerate) >> 16)) { setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16; pEncOps->Set_FrameRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam); } @@ -1955,6 +1969,13 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX ret = Mpeg4CodecDstSetup(pOMXComponent); } + if (pVideoEnc->configChange == OMX_TRUE) { + if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4) + Change_Mpeg4Enc_Param(pExynosComponent); + else + Change_H263Enc_Param(pExynosComponent); + pVideoEnc->configChange = OMX_FALSE; + } if ((pSrcInputData->dataLen >= 0) || ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0}; diff --git a/libhwc/hwc.cpp b/libhwc/hwc.cpp index c23e6f0..1a3d4a5 100644 --- a/libhwc/hwc.cpp +++ b/libhwc/hwc.cpp @@ -128,6 +128,7 @@ struct exynos5_hwc_composer_device_1_t { bool hdmi_hpd; bool hdmi_enabled; bool hdmi_blanked; + bool hdmi_fb_needed; int hdmi_w; int hdmi_h; @@ -528,6 +529,24 @@ static void hdmi_disable_layer(struct exynos5_hwc_composer_device_1_t *dev, ALOGV("%s: layer%d disabled", __func__, hl.id); } +static void hdmi_hide_layer(struct exynos5_hwc_composer_device_1_t *dev, + hdmi_layer_t &hl) +{ + if (exynos_v4l2_s_ctrl(hl.fd, V4L2_CID_TV_LAYER_PRIO, 0) < 0) + ALOGE("%s: layer%d: LAYER_PRIO failed %d", __func__, + hl.id, errno); +} + +static void hdmi_show_layer(struct exynos5_hwc_composer_device_1_t *dev, + hdmi_layer_t &hl) +{ + int prio = hl.id ? 3 : 2; + + if (exynos_v4l2_s_ctrl(hl.fd, V4L2_CID_TV_LAYER_PRIO, prio) < 0) + ALOGE("%s: layer%d: LAYER_PRIO failed %d", __func__, + hl.id, errno); +} + static int hdmi_enable(struct exynos5_hwc_composer_device_1_t *dev) { if (dev->hdmi_enabled) @@ -1009,6 +1028,8 @@ static int exynos5_prepare_hdmi(exynos5_hwc_composer_device_1_t *pdev, ALOGV("preparing %u layers for HDMI", contents->numHwLayers); hwc_layer_1_t *video_layer = NULL; + pdev->hdmi_fb_needed = false; + for (size_t i = 0; i < contents->numHwLayers; i++) { hwc_layer_1_t &layer = contents->hwLayers[i]; @@ -1036,6 +1057,7 @@ static int exynos5_prepare_hdmi(exynos5_hwc_composer_device_1_t *pdev, } } + pdev->hdmi_fb_needed = true; layer.compositionType = HWC_FRAMEBUFFER; dump_layer(&layer); } @@ -1508,7 +1530,6 @@ static int exynos5_set_fimd(exynos5_hwc_composer_device_1_t *pdev, static int exynos5_set_hdmi(exynos5_hwc_composer_device_1_t *pdev, hwc_display_contents_1_t* contents) { - hwc_layer_1_t *fb_layer = NULL; hwc_layer_1_t *video_layer = NULL; if (!pdev->hdmi_enabled) { @@ -1560,16 +1581,17 @@ static int exynos5_set_hdmi(exynos5_hwc_composer_device_1_t *pdev, } if (layer.compositionType == HWC_FRAMEBUFFER_TARGET) { - if (!layer.handle) - continue; - - ALOGV("HDMI FB layer:"); - dump_layer(&layer); - - private_handle_t *h = private_handle_t::dynamicCast(layer.handle); - hdmi_output(pdev, pdev->hdmi_layers[1], layer, h, layer.acquireFenceFd, - &layer.releaseFenceFd); - fb_layer = &layer; + if (pdev->hdmi_fb_needed && layer.handle) { + ALOGV("HDMI FB layer:"); + dump_layer(&layer); + + private_handle_t *h = private_handle_t::dynamicCast(layer.handle); + hdmi_show_layer(pdev, pdev->hdmi_layers[1]); + hdmi_output(pdev, pdev->hdmi_layers[1], layer, h, layer.acquireFenceFd, + &layer.releaseFenceFd); + } else { + hdmi_hide_layer(pdev, pdev->hdmi_layers[1]); + } } } @@ -1577,8 +1599,6 @@ static int exynos5_set_hdmi(exynos5_hwc_composer_device_1_t *pdev, hdmi_disable_layer(pdev, pdev->hdmi_layers[0]); exynos5_cleanup_gsc_m2m(pdev, HDMI_GSC_IDX); } - if (!fb_layer) - hdmi_disable_layer(pdev, pdev->hdmi_layers[1]); if (exynos_v4l2_s_ctrl(pdev->hdmi_layers[1].fd, V4L2_CID_TV_UPDATE, 1) < 0) { ALOGE("%s: s_ctrl(CID_TV_UPDATE) failed %d", __func__, errno); |