Loading media/libstagefright/codecs/avcdec/SoftAVCDec.cpp +55 −1 Original line number Diff line number Diff line Loading @@ -381,6 +381,48 @@ void SoftAVC::onReset() { resetPlugin(); } bool SoftAVC::getVUIParams() { IV_API_CALL_STATUS_T status; ih264d_ctl_get_vui_params_ip_t s_ctl_get_vui_params_ip; ih264d_ctl_get_vui_params_op_t s_ctl_get_vui_params_op; s_ctl_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL; s_ctl_get_vui_params_ip.e_sub_cmd = (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_VUI_PARAMS; s_ctl_get_vui_params_ip.u4_size = sizeof(ih264d_ctl_get_vui_params_ip_t); s_ctl_get_vui_params_op.u4_size = sizeof(ih264d_ctl_get_vui_params_op_t); status = ivdec_api_function( (iv_obj_t *)mCodecCtx, (void *)&s_ctl_get_vui_params_ip, (void *)&s_ctl_get_vui_params_op); if (status != IV_SUCCESS) { ALOGW("Error in getting VUI params: 0x%x", s_ctl_get_vui_params_op.u4_error_code); return false; } int32_t primaries = s_ctl_get_vui_params_op.u1_colour_primaries; int32_t transfer = s_ctl_get_vui_params_op.u1_tfr_chars; int32_t coeffs = s_ctl_get_vui_params_op.u1_matrix_coeffs; bool fullRange = s_ctl_get_vui_params_op.u1_video_full_range_flag; ColorAspects colorAspects; ColorUtils::convertIsoColorAspectsToCodecAspects( primaries, transfer, coeffs, fullRange, colorAspects); // Update color aspects if necessary. if (colorAspectsDiffer(colorAspects, mBitstreamColorAspects)) { mBitstreamColorAspects = colorAspects; status_t err = handleColorAspectsChange(); CHECK(err == OK); } return true; } bool SoftAVC::setDecodeArgs( ivd_video_decode_ip_t *ps_dec_ip, ivd_video_decode_op_t *ps_dec_op, Loading Loading @@ -606,6 +648,8 @@ void SoftAVC::onQueueFilled(OMX_U32 portIndex) { bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF)); getVUIParams(); GETTIME(&mTimeEnd, NULL); /* Compute time taken for decode() */ TIME_DIFF(mTimeStart, mTimeEnd, timeTaken); Loading Loading @@ -641,16 +685,22 @@ void SoftAVC::onQueueFilled(OMX_U32 portIndex) { continue; } // Combine the resolution change and coloraspects change in one PortSettingChange event // if necessary. if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) { uint32_t width = s_dec_op.u4_pic_wd; uint32_t height = s_dec_op.u4_pic_ht; bool portWillReset = false; handlePortSettingsChange(&portWillReset, width, height); if (portWillReset) { resetDecoder(); return; } } else if (mUpdateColorAspects) { notify(OMX_EventPortSettingsChanged, kOutputPortIndex, kDescribeColorAspectsIndex, NULL); mUpdateColorAspects = false; return; } if (s_dec_op.u4_output_present) { Loading Loading @@ -705,6 +755,10 @@ void SoftAVC::onQueueFilled(OMX_U32 portIndex) { } } int SoftAVC::getColorAspectPreference() { return kPreferBitstream; } } // namespace android android::SoftOMXComponent *createSoftOMXComponent( Loading media/libstagefright/codecs/avcdec/SoftAVCDec.h +3 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ protected: virtual void onQueueFilled(OMX_U32 portIndex); virtual void onPortFlushCompleted(OMX_U32 portIndex); virtual void onReset(); virtual int getColorAspectPreference(); private: // Number of input and output buffers enum { Loading Loading @@ -116,6 +117,8 @@ private: OMX_BUFFERHEADERTYPE *outHeader, size_t timeStampIx); bool getVUIParams(); DISALLOW_EVIL_CONSTRUCTORS(SoftAVC); }; Loading media/libstagefright/include/SoftVideoDecoderOMXComponent.h +45 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include "SimpleSoftOMXComponent.h" #include <media/stagefright/foundation/AHandlerReflector.h> #include <media/stagefright/foundation/ColorUtils.h> #include <media/IOMX.h> #include <utils/RefBase.h> Loading @@ -43,6 +44,16 @@ struct SoftVideoDecoderOMXComponent : public SimpleSoftOMXComponent { OMX_COMPONENTTYPE **component); protected: enum { kDescribeColorAspectsIndex = kPrepareForAdaptivePlaybackIndex + 1, }; enum { kNotSupported, kPreferBitstream, kPreferContainer, }; virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled); virtual void onReset(); Loading @@ -55,9 +66,16 @@ protected: virtual OMX_ERRORTYPE getConfig( OMX_INDEXTYPE index, OMX_PTR params); virtual OMX_ERRORTYPE setConfig( OMX_INDEXTYPE index, const OMX_PTR params); virtual OMX_ERRORTYPE getExtensionIndex( const char *name, OMX_INDEXTYPE *index); virtual bool supportsDescribeColorAspects(); virtual int getColorAspectPreference(); void initPorts(OMX_U32 numInputBuffers, OMX_U32 inputBufferSize, OMX_U32 numOutputBuffers, Loading @@ -74,6 +92,10 @@ protected: kCropSet, kCropChanged, }; // This function will handle several port change events which include // size changed, crop changed, stride changed and coloraspects changed. // It will trigger OMX_EventPortSettingsChanged event if necessary. void handlePortSettingsChange( bool *portWillReset, uint32_t width, uint32_t height, CropSettingsMode cropSettingsMode = kCropUnSet, bool fakeStride = false); Loading @@ -99,6 +121,29 @@ protected: AWAITING_ENABLED } mOutputPortSettingsChange; bool mUpdateColorAspects; Mutex mColorAspectsLock; // color aspects passed from the framework. ColorAspects mDefaultColorAspects; // color aspects parsed from the bitstream. ColorAspects mBitstreamColorAspects; // final color aspects after combining the above two aspects. ColorAspects mFinalColorAspects; bool colorAspectsDiffer(const ColorAspects &a, const ColorAspects &b); // This functions takes two color aspects and updates the mFinalColorAspects // based on |preferredAspects|. void updateFinalColorAspects( const ColorAspects &otherAspects, const ColorAspects &preferredAspects); // This function will update the mFinalColorAspects based on codec preference. status_t handleColorAspectsChange(); // Helper function to dump the ColorAspects. void dumpColorAspects(const ColorAspects &colorAspects); private: uint32_t mMinInputBufferSize; uint32_t mMinCompressionRatio; Loading media/libstagefright/omx/SoftVideoDecoderOMXComponent.cpp +129 −1 Original line number Diff line number Diff line Loading @@ -68,6 +68,11 @@ SoftVideoDecoderOMXComponent::SoftVideoDecoderOMXComponent( mCodingType(codingType), mProfileLevels(profileLevels), mNumProfileLevels(numProfileLevels) { // init all the color aspects to be Unspecified. memset(&mDefaultColorAspects, 0, sizeof(ColorAspects)); memset(&mBitstreamColorAspects, 0, sizeof(ColorAspects)); memset(&mFinalColorAspects, 0, sizeof(ColorAspects)); } void SoftVideoDecoderOMXComponent::initPorts( Loading Loading @@ -224,7 +229,64 @@ void SoftVideoDecoderOMXComponent::handlePortSettingsChange( notify(OMX_EventPortSettingsChanged, kOutputPortIndex, OMX_IndexConfigCommonOutputCrop, NULL); } } else if (mUpdateColorAspects) { notify(OMX_EventPortSettingsChanged, kOutputPortIndex, kDescribeColorAspectsIndex, NULL); mUpdateColorAspects = false; } } void SoftVideoDecoderOMXComponent::dumpColorAspects(const ColorAspects &colorAspects) { ALOGD("dumpColorAspects: (R:%d(%s), P:%d(%s), M:%d(%s), T:%d(%s)) ", colorAspects.mRange, asString(colorAspects.mRange), colorAspects.mPrimaries, asString(colorAspects.mPrimaries), colorAspects.mMatrixCoeffs, asString(colorAspects.mMatrixCoeffs), colorAspects.mTransfer, asString(colorAspects.mTransfer)); } bool SoftVideoDecoderOMXComponent::colorAspectsDiffer( const ColorAspects &a, const ColorAspects &b) { if (a.mRange != b.mRange || a.mPrimaries != b.mPrimaries || a.mTransfer != b.mTransfer || a.mMatrixCoeffs != b.mMatrixCoeffs) { return true; } return false; } void SoftVideoDecoderOMXComponent::updateFinalColorAspects( const ColorAspects &otherAspects, const ColorAspects &preferredAspects) { Mutex::Autolock autoLock(mColorAspectsLock); ColorAspects newAspects; newAspects.mRange = preferredAspects.mRange != ColorAspects::RangeUnspecified ? preferredAspects.mRange : otherAspects.mRange; newAspects.mPrimaries = preferredAspects.mPrimaries != ColorAspects::PrimariesUnspecified ? preferredAspects.mPrimaries : otherAspects.mPrimaries; newAspects.mTransfer = preferredAspects.mTransfer != ColorAspects::TransferUnspecified ? preferredAspects.mTransfer : otherAspects.mTransfer; newAspects.mMatrixCoeffs = preferredAspects.mMatrixCoeffs != ColorAspects::MatrixUnspecified ? preferredAspects.mMatrixCoeffs : otherAspects.mMatrixCoeffs; // Check to see if need update mFinalColorAspects. if (colorAspectsDiffer(mFinalColorAspects, newAspects)) { mFinalColorAspects = newAspects; mUpdateColorAspects = true; } } status_t SoftVideoDecoderOMXComponent::handleColorAspectsChange() { int perference = getColorAspectPreference(); ALOGD("Color Aspects preference: %d ", perference); if (perference == kPreferBitstream) { updateFinalColorAspects(mDefaultColorAspects, mBitstreamColorAspects); } else if (perference == kPreferContainer) { updateFinalColorAspects(mBitstreamColorAspects, mDefaultColorAspects); } else { return OMX_ErrorUnsupportedSetting; } return OK; } void SoftVideoDecoderOMXComponent::copyYV12FrameToOutputBuffer( Loading Loading @@ -450,7 +512,7 @@ OMX_ERRORTYPE SoftVideoDecoderOMXComponent::internalSetParameter( OMX_ERRORTYPE SoftVideoDecoderOMXComponent::getConfig( OMX_INDEXTYPE index, OMX_PTR params) { switch (index) { switch ((int)index) { case OMX_IndexConfigCommonOutputCrop: { OMX_CONFIG_RECTTYPE *rectParams = (OMX_CONFIG_RECTTYPE *)params; Loading @@ -470,22 +532,88 @@ OMX_ERRORTYPE SoftVideoDecoderOMXComponent::getConfig( return OMX_ErrorNone; } case kDescribeColorAspectsIndex: { if (!supportsDescribeColorAspects()) { return OMX_ErrorUnsupportedIndex; } DescribeColorAspectsParams* colorAspectsParams = (DescribeColorAspectsParams *)params; if (colorAspectsParams->nPortIndex != kOutputPortIndex) { return OMX_ErrorBadParameter; } colorAspectsParams->sAspects = mFinalColorAspects; if (colorAspectsParams->bRequestingDataSpace || colorAspectsParams->bDataSpaceChanged) { return OMX_ErrorUnsupportedSetting; } return OMX_ErrorNone; } default: return OMX_ErrorUnsupportedIndex; } } OMX_ERRORTYPE SoftVideoDecoderOMXComponent::setConfig( OMX_INDEXTYPE index, const OMX_PTR params){ switch ((int)index) { case kDescribeColorAspectsIndex: { if (!supportsDescribeColorAspects()) { return OMX_ErrorUnsupportedIndex; } const DescribeColorAspectsParams* colorAspectsParams = (const DescribeColorAspectsParams *)params; if (!isValidOMXParam(colorAspectsParams)) { return OMX_ErrorBadParameter; } if (colorAspectsParams->nPortIndex != kOutputPortIndex) { return OMX_ErrorBadParameter; } // Update color aspects if necessary. if (colorAspectsDiffer(colorAspectsParams->sAspects, mDefaultColorAspects)) { mDefaultColorAspects = colorAspectsParams->sAspects; status_t err = handleColorAspectsChange(); CHECK(err == OK); } return OMX_ErrorNone; } default: return OMX_ErrorUnsupportedIndex; } } OMX_ERRORTYPE SoftVideoDecoderOMXComponent::getExtensionIndex( const char *name, OMX_INDEXTYPE *index) { if (!strcmp(name, "OMX.google.android.index.prepareForAdaptivePlayback")) { *(int32_t*)index = kPrepareForAdaptivePlaybackIndex; return OMX_ErrorNone; } else if (!strcmp(name, "OMX.google.android.index.describeColorAspects") && supportsDescribeColorAspects()) { *(int32_t*)index = kDescribeColorAspectsIndex; return OMX_ErrorNone; } return SimpleSoftOMXComponent::getExtensionIndex(name, index); } bool SoftVideoDecoderOMXComponent::supportsDescribeColorAspects() { return getColorAspectPreference() != kNotSupported; } int SoftVideoDecoderOMXComponent::getColorAspectPreference() { return kNotSupported; } void SoftVideoDecoderOMXComponent::onReset() { mOutputPortSettingsChange = NONE; } Loading Loading
media/libstagefright/codecs/avcdec/SoftAVCDec.cpp +55 −1 Original line number Diff line number Diff line Loading @@ -381,6 +381,48 @@ void SoftAVC::onReset() { resetPlugin(); } bool SoftAVC::getVUIParams() { IV_API_CALL_STATUS_T status; ih264d_ctl_get_vui_params_ip_t s_ctl_get_vui_params_ip; ih264d_ctl_get_vui_params_op_t s_ctl_get_vui_params_op; s_ctl_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL; s_ctl_get_vui_params_ip.e_sub_cmd = (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_VUI_PARAMS; s_ctl_get_vui_params_ip.u4_size = sizeof(ih264d_ctl_get_vui_params_ip_t); s_ctl_get_vui_params_op.u4_size = sizeof(ih264d_ctl_get_vui_params_op_t); status = ivdec_api_function( (iv_obj_t *)mCodecCtx, (void *)&s_ctl_get_vui_params_ip, (void *)&s_ctl_get_vui_params_op); if (status != IV_SUCCESS) { ALOGW("Error in getting VUI params: 0x%x", s_ctl_get_vui_params_op.u4_error_code); return false; } int32_t primaries = s_ctl_get_vui_params_op.u1_colour_primaries; int32_t transfer = s_ctl_get_vui_params_op.u1_tfr_chars; int32_t coeffs = s_ctl_get_vui_params_op.u1_matrix_coeffs; bool fullRange = s_ctl_get_vui_params_op.u1_video_full_range_flag; ColorAspects colorAspects; ColorUtils::convertIsoColorAspectsToCodecAspects( primaries, transfer, coeffs, fullRange, colorAspects); // Update color aspects if necessary. if (colorAspectsDiffer(colorAspects, mBitstreamColorAspects)) { mBitstreamColorAspects = colorAspects; status_t err = handleColorAspectsChange(); CHECK(err == OK); } return true; } bool SoftAVC::setDecodeArgs( ivd_video_decode_ip_t *ps_dec_ip, ivd_video_decode_op_t *ps_dec_op, Loading Loading @@ -606,6 +648,8 @@ void SoftAVC::onQueueFilled(OMX_U32 portIndex) { bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF)); getVUIParams(); GETTIME(&mTimeEnd, NULL); /* Compute time taken for decode() */ TIME_DIFF(mTimeStart, mTimeEnd, timeTaken); Loading Loading @@ -641,16 +685,22 @@ void SoftAVC::onQueueFilled(OMX_U32 portIndex) { continue; } // Combine the resolution change and coloraspects change in one PortSettingChange event // if necessary. if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) { uint32_t width = s_dec_op.u4_pic_wd; uint32_t height = s_dec_op.u4_pic_ht; bool portWillReset = false; handlePortSettingsChange(&portWillReset, width, height); if (portWillReset) { resetDecoder(); return; } } else if (mUpdateColorAspects) { notify(OMX_EventPortSettingsChanged, kOutputPortIndex, kDescribeColorAspectsIndex, NULL); mUpdateColorAspects = false; return; } if (s_dec_op.u4_output_present) { Loading Loading @@ -705,6 +755,10 @@ void SoftAVC::onQueueFilled(OMX_U32 portIndex) { } } int SoftAVC::getColorAspectPreference() { return kPreferBitstream; } } // namespace android android::SoftOMXComponent *createSoftOMXComponent( Loading
media/libstagefright/codecs/avcdec/SoftAVCDec.h +3 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ protected: virtual void onQueueFilled(OMX_U32 portIndex); virtual void onPortFlushCompleted(OMX_U32 portIndex); virtual void onReset(); virtual int getColorAspectPreference(); private: // Number of input and output buffers enum { Loading Loading @@ -116,6 +117,8 @@ private: OMX_BUFFERHEADERTYPE *outHeader, size_t timeStampIx); bool getVUIParams(); DISALLOW_EVIL_CONSTRUCTORS(SoftAVC); }; Loading
media/libstagefright/include/SoftVideoDecoderOMXComponent.h +45 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include "SimpleSoftOMXComponent.h" #include <media/stagefright/foundation/AHandlerReflector.h> #include <media/stagefright/foundation/ColorUtils.h> #include <media/IOMX.h> #include <utils/RefBase.h> Loading @@ -43,6 +44,16 @@ struct SoftVideoDecoderOMXComponent : public SimpleSoftOMXComponent { OMX_COMPONENTTYPE **component); protected: enum { kDescribeColorAspectsIndex = kPrepareForAdaptivePlaybackIndex + 1, }; enum { kNotSupported, kPreferBitstream, kPreferContainer, }; virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled); virtual void onReset(); Loading @@ -55,9 +66,16 @@ protected: virtual OMX_ERRORTYPE getConfig( OMX_INDEXTYPE index, OMX_PTR params); virtual OMX_ERRORTYPE setConfig( OMX_INDEXTYPE index, const OMX_PTR params); virtual OMX_ERRORTYPE getExtensionIndex( const char *name, OMX_INDEXTYPE *index); virtual bool supportsDescribeColorAspects(); virtual int getColorAspectPreference(); void initPorts(OMX_U32 numInputBuffers, OMX_U32 inputBufferSize, OMX_U32 numOutputBuffers, Loading @@ -74,6 +92,10 @@ protected: kCropSet, kCropChanged, }; // This function will handle several port change events which include // size changed, crop changed, stride changed and coloraspects changed. // It will trigger OMX_EventPortSettingsChanged event if necessary. void handlePortSettingsChange( bool *portWillReset, uint32_t width, uint32_t height, CropSettingsMode cropSettingsMode = kCropUnSet, bool fakeStride = false); Loading @@ -99,6 +121,29 @@ protected: AWAITING_ENABLED } mOutputPortSettingsChange; bool mUpdateColorAspects; Mutex mColorAspectsLock; // color aspects passed from the framework. ColorAspects mDefaultColorAspects; // color aspects parsed from the bitstream. ColorAspects mBitstreamColorAspects; // final color aspects after combining the above two aspects. ColorAspects mFinalColorAspects; bool colorAspectsDiffer(const ColorAspects &a, const ColorAspects &b); // This functions takes two color aspects and updates the mFinalColorAspects // based on |preferredAspects|. void updateFinalColorAspects( const ColorAspects &otherAspects, const ColorAspects &preferredAspects); // This function will update the mFinalColorAspects based on codec preference. status_t handleColorAspectsChange(); // Helper function to dump the ColorAspects. void dumpColorAspects(const ColorAspects &colorAspects); private: uint32_t mMinInputBufferSize; uint32_t mMinCompressionRatio; Loading
media/libstagefright/omx/SoftVideoDecoderOMXComponent.cpp +129 −1 Original line number Diff line number Diff line Loading @@ -68,6 +68,11 @@ SoftVideoDecoderOMXComponent::SoftVideoDecoderOMXComponent( mCodingType(codingType), mProfileLevels(profileLevels), mNumProfileLevels(numProfileLevels) { // init all the color aspects to be Unspecified. memset(&mDefaultColorAspects, 0, sizeof(ColorAspects)); memset(&mBitstreamColorAspects, 0, sizeof(ColorAspects)); memset(&mFinalColorAspects, 0, sizeof(ColorAspects)); } void SoftVideoDecoderOMXComponent::initPorts( Loading Loading @@ -224,7 +229,64 @@ void SoftVideoDecoderOMXComponent::handlePortSettingsChange( notify(OMX_EventPortSettingsChanged, kOutputPortIndex, OMX_IndexConfigCommonOutputCrop, NULL); } } else if (mUpdateColorAspects) { notify(OMX_EventPortSettingsChanged, kOutputPortIndex, kDescribeColorAspectsIndex, NULL); mUpdateColorAspects = false; } } void SoftVideoDecoderOMXComponent::dumpColorAspects(const ColorAspects &colorAspects) { ALOGD("dumpColorAspects: (R:%d(%s), P:%d(%s), M:%d(%s), T:%d(%s)) ", colorAspects.mRange, asString(colorAspects.mRange), colorAspects.mPrimaries, asString(colorAspects.mPrimaries), colorAspects.mMatrixCoeffs, asString(colorAspects.mMatrixCoeffs), colorAspects.mTransfer, asString(colorAspects.mTransfer)); } bool SoftVideoDecoderOMXComponent::colorAspectsDiffer( const ColorAspects &a, const ColorAspects &b) { if (a.mRange != b.mRange || a.mPrimaries != b.mPrimaries || a.mTransfer != b.mTransfer || a.mMatrixCoeffs != b.mMatrixCoeffs) { return true; } return false; } void SoftVideoDecoderOMXComponent::updateFinalColorAspects( const ColorAspects &otherAspects, const ColorAspects &preferredAspects) { Mutex::Autolock autoLock(mColorAspectsLock); ColorAspects newAspects; newAspects.mRange = preferredAspects.mRange != ColorAspects::RangeUnspecified ? preferredAspects.mRange : otherAspects.mRange; newAspects.mPrimaries = preferredAspects.mPrimaries != ColorAspects::PrimariesUnspecified ? preferredAspects.mPrimaries : otherAspects.mPrimaries; newAspects.mTransfer = preferredAspects.mTransfer != ColorAspects::TransferUnspecified ? preferredAspects.mTransfer : otherAspects.mTransfer; newAspects.mMatrixCoeffs = preferredAspects.mMatrixCoeffs != ColorAspects::MatrixUnspecified ? preferredAspects.mMatrixCoeffs : otherAspects.mMatrixCoeffs; // Check to see if need update mFinalColorAspects. if (colorAspectsDiffer(mFinalColorAspects, newAspects)) { mFinalColorAspects = newAspects; mUpdateColorAspects = true; } } status_t SoftVideoDecoderOMXComponent::handleColorAspectsChange() { int perference = getColorAspectPreference(); ALOGD("Color Aspects preference: %d ", perference); if (perference == kPreferBitstream) { updateFinalColorAspects(mDefaultColorAspects, mBitstreamColorAspects); } else if (perference == kPreferContainer) { updateFinalColorAspects(mBitstreamColorAspects, mDefaultColorAspects); } else { return OMX_ErrorUnsupportedSetting; } return OK; } void SoftVideoDecoderOMXComponent::copyYV12FrameToOutputBuffer( Loading Loading @@ -450,7 +512,7 @@ OMX_ERRORTYPE SoftVideoDecoderOMXComponent::internalSetParameter( OMX_ERRORTYPE SoftVideoDecoderOMXComponent::getConfig( OMX_INDEXTYPE index, OMX_PTR params) { switch (index) { switch ((int)index) { case OMX_IndexConfigCommonOutputCrop: { OMX_CONFIG_RECTTYPE *rectParams = (OMX_CONFIG_RECTTYPE *)params; Loading @@ -470,22 +532,88 @@ OMX_ERRORTYPE SoftVideoDecoderOMXComponent::getConfig( return OMX_ErrorNone; } case kDescribeColorAspectsIndex: { if (!supportsDescribeColorAspects()) { return OMX_ErrorUnsupportedIndex; } DescribeColorAspectsParams* colorAspectsParams = (DescribeColorAspectsParams *)params; if (colorAspectsParams->nPortIndex != kOutputPortIndex) { return OMX_ErrorBadParameter; } colorAspectsParams->sAspects = mFinalColorAspects; if (colorAspectsParams->bRequestingDataSpace || colorAspectsParams->bDataSpaceChanged) { return OMX_ErrorUnsupportedSetting; } return OMX_ErrorNone; } default: return OMX_ErrorUnsupportedIndex; } } OMX_ERRORTYPE SoftVideoDecoderOMXComponent::setConfig( OMX_INDEXTYPE index, const OMX_PTR params){ switch ((int)index) { case kDescribeColorAspectsIndex: { if (!supportsDescribeColorAspects()) { return OMX_ErrorUnsupportedIndex; } const DescribeColorAspectsParams* colorAspectsParams = (const DescribeColorAspectsParams *)params; if (!isValidOMXParam(colorAspectsParams)) { return OMX_ErrorBadParameter; } if (colorAspectsParams->nPortIndex != kOutputPortIndex) { return OMX_ErrorBadParameter; } // Update color aspects if necessary. if (colorAspectsDiffer(colorAspectsParams->sAspects, mDefaultColorAspects)) { mDefaultColorAspects = colorAspectsParams->sAspects; status_t err = handleColorAspectsChange(); CHECK(err == OK); } return OMX_ErrorNone; } default: return OMX_ErrorUnsupportedIndex; } } OMX_ERRORTYPE SoftVideoDecoderOMXComponent::getExtensionIndex( const char *name, OMX_INDEXTYPE *index) { if (!strcmp(name, "OMX.google.android.index.prepareForAdaptivePlayback")) { *(int32_t*)index = kPrepareForAdaptivePlaybackIndex; return OMX_ErrorNone; } else if (!strcmp(name, "OMX.google.android.index.describeColorAspects") && supportsDescribeColorAspects()) { *(int32_t*)index = kDescribeColorAspectsIndex; return OMX_ErrorNone; } return SimpleSoftOMXComponent::getExtensionIndex(name, index); } bool SoftVideoDecoderOMXComponent::supportsDescribeColorAspects() { return getColorAspectPreference() != kNotSupported; } int SoftVideoDecoderOMXComponent::getColorAspectPreference() { return kNotSupported; } void SoftVideoDecoderOMXComponent::onReset() { mOutputPortSettingsChange = NONE; } Loading