C2SoftMpeg2Dec: properly support color aspect configurations
These are part of the configuration interface.
Bug: 110225406
Change-Id: Ie87f20a5c07c803435cf379a0eeb3f595a3e08f7
diff --git a/media/codecs/mpeg2/C2SoftMpeg2Dec.cpp b/media/codecs/mpeg2/C2SoftMpeg2Dec.cpp
index db1b4c1..855598d 100644
--- a/media/codecs/mpeg2/C2SoftMpeg2Dec.cpp
+++ b/media/codecs/mpeg2/C2SoftMpeg2Dec.cpp
@@ -22,6 +22,7 @@
#include <C2Debug.h>
#include <C2PlatformSupport.h>
+#include <Codec2Mapper.h>
#include <SimpleC2Interface.h>
#include "C2SoftMpeg2Dec.h"
@@ -118,7 +119,7 @@
addParameter(
DefineParam(mDefaultColorAspects, C2_PARAMKEY_DEFAULT_COLOR_ASPECTS)
- .withDefault(new C2StreamColorAspectsTuning::input(
+ .withDefault(new C2StreamColorAspectsTuning::output(
0u, C2Color::RANGE_UNSPECIFIED, C2Color::PRIMARIES_UNSPECIFIED,
C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
.withFields({
@@ -135,9 +136,9 @@
.build());
addParameter(
- DefineParam(mCodedColorAspects, C2_PARAMKEY_DEFAULT_COLOR_ASPECTS)
+ DefineParam(mCodedColorAspects, C2_PARAMKEY_VUI_COLOR_ASPECTS)
.withDefault(new C2StreamColorAspectsInfo::input(
- 0u, C2Color::RANGE_UNSPECIFIED, C2Color::PRIMARIES_UNSPECIFIED,
+ 0u, C2Color::RANGE_LIMITED, C2Color::PRIMARIES_UNSPECIFIED,
C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
.withFields({
C2F(mCodedColorAspects, range).inRange(
@@ -218,41 +219,66 @@
return C2R::Ok();
}
- static C2R DefaultColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsTuning::input> &me) {
+ static C2R DefaultColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsTuning::output> &me) {
(void)mayBlock;
- (void)me;
- // take all values
+ if (me.v.range > C2Color::RANGE_OTHER) {
+ me.set().range = C2Color::RANGE_OTHER;
+ }
+ if (me.v.primaries > C2Color::PRIMARIES_OTHER) {
+ me.set().primaries = C2Color::PRIMARIES_OTHER;
+ }
+ if (me.v.transfer > C2Color::TRANSFER_OTHER) {
+ me.set().transfer = C2Color::TRANSFER_OTHER;
+ }
+ if (me.v.matrix > C2Color::MATRIX_OTHER) {
+ me.set().matrix = C2Color::MATRIX_OTHER;
+ }
return C2R::Ok();
}
static C2R CodedColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsInfo::input> &me) {
(void)mayBlock;
- (void)me;
- // take all values
+ if (me.v.range > C2Color::RANGE_OTHER) {
+ me.set().range = C2Color::RANGE_OTHER;
+ }
+ if (me.v.primaries > C2Color::PRIMARIES_OTHER) {
+ me.set().primaries = C2Color::PRIMARIES_OTHER;
+ }
+ if (me.v.transfer > C2Color::TRANSFER_OTHER) {
+ me.set().transfer = C2Color::TRANSFER_OTHER;
+ }
+ if (me.v.matrix > C2Color::MATRIX_OTHER) {
+ me.set().matrix = C2Color::MATRIX_OTHER;
+ }
return C2R::Ok();
}
static C2R ColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsInfo::output> &me,
- const C2P<C2StreamColorAspectsTuning::input> &def,
+ const C2P<C2StreamColorAspectsTuning::output> &def,
const C2P<C2StreamColorAspectsInfo::input> &coded) {
(void)mayBlock;
// take default values for all unspecified fields, and coded values for specified ones
me.set().range = coded.v.range == RANGE_UNSPECIFIED ? def.v.range : coded.v.range;
- me.set().primaries = coded.v.primaries == PRIMARIES_UNSPECIFIED ? def.v.primaries : coded.v.primaries;
- me.set().transfer = coded.v.transfer == TRANSFER_UNSPECIFIED ? def.v.transfer : coded.v.transfer;
+ me.set().primaries = coded.v.primaries == PRIMARIES_UNSPECIFIED
+ ? def.v.primaries : coded.v.primaries;
+ me.set().transfer = coded.v.transfer == TRANSFER_UNSPECIFIED
+ ? def.v.transfer : coded.v.transfer;
me.set().matrix = coded.v.matrix == MATRIX_UNSPECIFIED ? def.v.matrix : coded.v.matrix;
- // TODO: validate
return C2R::Ok();
}
+ std::shared_ptr<C2StreamColorAspectsInfo::output> getColorAspects_l() {
+ return mColorAspects;
+ }
+
private:
std::shared_ptr<C2StreamProfileLevelInfo::input> mProfileLevel;
std::shared_ptr<C2StreamPictureSizeInfo::output> mSize;
std::shared_ptr<C2StreamMaxPictureSizeTuning::output> mMaxSize;
std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mMaxInputSize;
std::shared_ptr<C2StreamColorInfo::output> mColorInfo;
- std::shared_ptr<C2StreamColorAspectsTuning::input> mDefaultColorAspects;
std::shared_ptr<C2StreamColorAspectsInfo::input> mCodedColorAspects;
+ std::shared_ptr<C2StreamColorAspectsTuning::output> mDefaultColorAspects;
std::shared_ptr<C2StreamColorAspectsInfo::output> mColorAspects;
std::shared_ptr<C2StreamPixelFormatInfo::output> mPixelFormat;
};
@@ -537,11 +563,6 @@
mNumCores = MIN(getCpuCoreCount(), MAX_NUM_CORES);
mStride = ALIGN64(mWidth);
mSignalledError = false;
- mPreference = kPreferBitstream;
- memset(&mDefaultColorAspects, 0, sizeof(ColorAspects));
- memset(&mBitstreamColorAspects, 0, sizeof(ColorAspects));
- memset(&mFinalColorAspects, 0, sizeof(ColorAspects));
- mUpdateColorAspects = false;
resetPlugin();
(void) setNumCores();
if (OK != setParams(mStride)) return UNKNOWN_ERROR;
@@ -596,47 +617,6 @@
return true;
}
-bool C2SoftMpeg2Dec::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 C2SoftMpeg2Dec::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 C2SoftMpeg2Dec::handleColorAspectsChange() {
- if (mPreference == kPreferBitstream) {
- updateFinalColorAspects(mDefaultColorAspects, mBitstreamColorAspects);
- } else if (mPreference == kPreferContainer) {
- updateFinalColorAspects(mBitstreamColorAspects, mDefaultColorAspects);
- } else {
- return C2_CORRUPTED;
- }
- return C2_OK;
-}
bool C2SoftMpeg2Dec::getSeqInfo() {
ivdext_ctl_get_seq_info_ip_t s_ctl_get_seq_info_ip;
@@ -655,21 +635,35 @@
return false;
}
- int32_t primaries = s_ctl_get_seq_info_op.u1_colour_primaries;
- int32_t transfer = s_ctl_get_seq_info_op.u1_transfer_characteristics;
- int32_t coeffs = s_ctl_get_seq_info_op.u1_matrix_coefficients;
- bool full_range = false; // mpeg2 video has limited range.
+ VuiColorAspects vuiColorAspects;
+ vuiColorAspects.primaries = s_ctl_get_seq_info_op.u1_colour_primaries;
+ vuiColorAspects.transfer = s_ctl_get_seq_info_op.u1_transfer_characteristics;
+ vuiColorAspects.coeffs = s_ctl_get_seq_info_op.u1_matrix_coefficients;
+ vuiColorAspects.fullRange = false; // mpeg2 video has limited range.
- ColorAspects colorAspects;
- ColorUtils::convertIsoColorAspectsToCodecAspects(
- primaries, transfer, coeffs, full_range, colorAspects);
- // Update color aspects if necessary.
- if (colorAspectsDiffer(colorAspects, mBitstreamColorAspects)) {
- mBitstreamColorAspects = colorAspects;
- status_t err = handleColorAspectsChange();
- CHECK(err == OK);
+ // convert vui aspects to C2 values if changed
+ if (!(vuiColorAspects == mBitstreamColorAspects)) {
+ mBitstreamColorAspects = vuiColorAspects;
+ ColorAspects sfAspects;
+ C2StreamColorAspectsInfo::input codedAspects = { 0u };
+ ColorUtils::convertIsoColorAspectsToCodecAspects(
+ vuiColorAspects.primaries, vuiColorAspects.transfer, vuiColorAspects.coeffs,
+ vuiColorAspects.fullRange, sfAspects);
+ if (!C2Mapper::map(sfAspects.mPrimaries, &codedAspects.primaries)) {
+ codedAspects.primaries = C2Color::PRIMARIES_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mRange, &codedAspects.range)) {
+ codedAspects.range = C2Color::RANGE_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mMatrixCoeffs, &codedAspects.matrix)) {
+ codedAspects.matrix = C2Color::MATRIX_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mTransfer, &codedAspects.transfer)) {
+ codedAspects.transfer = C2Color::TRANSFER_UNSPECIFIED;
+ }
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ (void)mIntf->config({&codedAspects}, C2_MAY_BLOCK, &failures);
}
-
return true;
}
@@ -765,13 +759,9 @@
std::shared_ptr<C2Buffer> buffer = createGraphicBuffer(std::move(mOutBlock),
C2Rect(mWidth, mHeight));
mOutBlock = nullptr;
- if (mUpdateColorAspects) {
- buffer->setInfo(std::make_shared<C2StreamColorAspectsInfo::output>(
- 0u, (C2Color::range_t)mFinalColorAspects.mRange,
- (C2Color::primaries_t)mFinalColorAspects.mPrimaries,
- (C2Color::transfer_t)mFinalColorAspects.mTransfer,
- (C2Color::matrix_t)mFinalColorAspects.mMatrixCoeffs));
- mUpdateColorAspects = false;
+ {
+ IntfImpl::Lock lock = mIntf->lock();
+ buffer->setInfo(mIntf->getColorAspects_l());
}
auto fillWork = [buffer, index](const std::unique_ptr<C2Work> &work) {
diff --git a/media/codecs/mpeg2/C2SoftMpeg2Dec.h b/media/codecs/mpeg2/C2SoftMpeg2Dec.h
index 779fd17..2ea3d85 100644
--- a/media/codecs/mpeg2/C2SoftMpeg2Dec.h
+++ b/media/codecs/mpeg2/C2SoftMpeg2Dec.h
@@ -125,13 +125,6 @@
size_t inSize,
uint32_t tsMarker);
bool getSeqInfo();
- // TODO:This is not the right place for colorAspects functions. These should
- // be part of c2-vndk so that they can be accessed by all video plugins
- // until then, make them feel at home
- bool colorAspectsDiffer(const ColorAspects &a, const ColorAspects &b);
- void updateFinalColorAspects(
- const ColorAspects &otherAspects, const ColorAspects &preferredAspects);
- status_t handleColorAspectsChange();
c2_status_t ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool);
void finishWork(uint64_t index, const std::unique_ptr<C2Work> &work);
status_t setFlushMode();
@@ -170,13 +163,23 @@
bool mSignalledOutputEos;
bool mSignalledError;
- // ColorAspects
- Mutex mColorAspectsLock;
- int mPreference;
- ColorAspects mDefaultColorAspects;
- ColorAspects mBitstreamColorAspects;
- ColorAspects mFinalColorAspects;
- bool mUpdateColorAspects;
+ // Color aspects. These are ISO values and are meant to detect changes in aspects to avoid
+ // converting them to C2 values for each frame
+ struct VuiColorAspects {
+ uint8_t primaries;
+ uint8_t transfer;
+ uint8_t coeffs;
+ uint8_t fullRange;
+
+ // default color aspects
+ VuiColorAspects()
+ : primaries(2), transfer(2), coeffs(2), fullRange(0) { }
+
+ bool operator==(const VuiColorAspects &o) {
+ return primaries == o.primaries && transfer == o.transfer && coeffs == o.coeffs
+ && fullRange == o.fullRange;
+ }
+ } mBitstreamColorAspects;
std::map<uint64_t , uint64_t > mFrameIndices;