summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <shade@chemlab.org>2013-04-17 21:43:17 -0700
committerSteve Kondik <shade@chemlab.org>2013-04-17 21:43:17 -0700
commit320c939ef471644fcb618cd3b5688e68694170a9 (patch)
tree8e0dbe1ea2c67bc377199713d584b9aefd040af2
parent7219980a19c026fb454c1decdd2eacd22691df6b (diff)
parente1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0 (diff)
downloadandroid_hardware_samsung_slsi_exynos5-cm-10.1.0-RC1.tar.gz
android_hardware_samsung_slsi_exynos5-cm-10.1.0-RC1.tar.bz2
android_hardware_samsung_slsi_exynos5-cm-10.1.0-RC1.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
-rw-r--r--exynos_omx/openmax/exynos_omx/component/common/Exynos_OMX_Basecomponent.c4
-rw-r--r--exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h1
-rw-r--r--exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c43
-rw-r--r--exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c16
-rw-r--r--exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c29
-rw-r--r--libhwc/hwc.cpp46
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);