Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0dbe3a4 authored by Andreas Huber's avatar Andreas Huber
Browse files

Colorconverter may not support some src/dst bitmap configurations.

Let it return an appropriate error code instead of asserting.

Change-Id: I7fe0dfa169e1cbdecb04c5fcbe8501e73362d05e
related-to-bug: 3328212
parent eec06d36
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <sys/types.h>

#include <stdint.h>
#include <utils/Errors.h>

#include <OMX_Video.h>

@@ -32,7 +33,7 @@ struct ColorConverter {

    bool isValid() const;

    void convert(
    status_t convert(
            const void *srcBits,
            size_t srcWidth, size_t srcHeight,
            size_t srcCropLeft, size_t srcCropTop,
@@ -63,16 +64,16 @@ private:

    uint8_t *initClip();

    void convertCbYCrY(
    status_t convertCbYCrY(
            const BitmapParams &src, const BitmapParams &dst);

    void convertYUV420Planar(
    status_t convertYUV420Planar(
            const BitmapParams &src, const BitmapParams &dst);

    void convertQCOMYUV420SemiPlanar(
    status_t convertQCOMYUV420SemiPlanar(
            const BitmapParams &src, const BitmapParams &dst);

    void convertYUV420SemiPlanar(
    status_t convertYUV420SemiPlanar(
            const BitmapParams &src, const BitmapParams &dst);

    ColorConverter(const ColorConverter &);
+8 −1
Original line number Diff line number Diff line
@@ -238,7 +238,7 @@ static VideoFrame *extractVideoFrameWithCodecFlags(
            (OMX_COLOR_FORMATTYPE)srcFormat, OMX_COLOR_Format16bitRGB565);
    CHECK(converter.isValid());

    converter.convert(
    err = converter.convert(
            (const uint8_t *)buffer->data() + buffer->range_offset(),
            width, height,
            crop_left, crop_top, crop_right, crop_bottom,
@@ -252,6 +252,13 @@ static VideoFrame *extractVideoFrameWithCodecFlags(

    decoder->stop();

    if (err != OK) {
        LOGE("Colorconverter failed to convert frame.");

        delete frame;
        frame = NULL;
    }

    return frame;
}

+49 −26
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#include <media/stagefright/ColorConverter.h>
#include <media/stagefright/MediaDebug.h>
#include <media/stagefright/MediaErrors.h>

namespace android {

@@ -72,7 +73,7 @@ size_t ColorConverter::BitmapParams::cropHeight() const {
    return mCropBottom - mCropTop + 1;
}

void ColorConverter::convert(
status_t ColorConverter::convert(
        const void *srcBits,
        size_t srcWidth, size_t srcHeight,
        size_t srcCropLeft, size_t srcCropTop,
@@ -81,7 +82,9 @@ void ColorConverter::convert(
        size_t dstWidth, size_t dstHeight,
        size_t dstCropLeft, size_t dstCropTop,
        size_t dstCropRight, size_t dstCropBottom) {
    CHECK_EQ(mDstFormat, OMX_COLOR_Format16bitRGB565);
    if (mDstFormat != OMX_COLOR_Format16bitRGB565) {
        return ERROR_UNSUPPORTED;
    }

    BitmapParams src(
            const_cast<void *>(srcBits),
@@ -93,21 +96,23 @@ void ColorConverter::convert(
            dstWidth, dstHeight,
            dstCropLeft, dstCropTop, dstCropRight, dstCropBottom);

    status_t err;

    switch (mSrcFormat) {
        case OMX_COLOR_FormatYUV420Planar:
            convertYUV420Planar(src, dst);
            err = convertYUV420Planar(src, dst);
            break;

        case OMX_COLOR_FormatCbYCrY:
            convertCbYCrY(src, dst);
            err = convertCbYCrY(src, dst);
            break;

        case OMX_QCOM_COLOR_FormatYVU420SemiPlanar:
            convertQCOMYUV420SemiPlanar(src, dst);
            err = convertQCOMYUV420SemiPlanar(src, dst);
            break;

        case OMX_COLOR_FormatYUV420SemiPlanar:
            convertYUV420SemiPlanar(src, dst);
            err = convertYUV420SemiPlanar(src, dst);
            break;

        default:
@@ -116,17 +121,21 @@ void ColorConverter::convert(
            break;
        }
    }

    return err;
}

void ColorConverter::convertCbYCrY(
status_t ColorConverter::convertCbYCrY(
        const BitmapParams &src, const BitmapParams &dst) {
    // XXX Untested

    uint8_t *kAdjustedClip = initClip();

    CHECK((src.mCropLeft & 1) == 0);
    CHECK_EQ(src.cropWidth(), dst.cropWidth());
    CHECK_EQ(src.cropHeight(), dst.cropHeight());
    if (!((src.mCropLeft & 1) == 0
        && src.cropWidth() == dst.cropWidth()
        && src.cropHeight() == dst.cropHeight())) {
        return ERROR_UNSUPPORTED;
    }

    uint32_t *dst_ptr = (uint32_t *)dst.mBits
        + (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
@@ -172,16 +181,20 @@ void ColorConverter::convertCbYCrY(
        src_ptr += src.mWidth * 2;
        dst_ptr += dst.mWidth / 2;
    }

    return OK;
}

void ColorConverter::convertYUV420Planar(
status_t ColorConverter::convertYUV420Planar(
        const BitmapParams &src, const BitmapParams &dst) {
    uint8_t *kAdjustedClip = initClip();
    if (!((dst.mWidth & 3) == 0
            && (src.mCropLeft & 1) == 0
            && src.cropWidth() == dst.cropWidth()
            && src.cropHeight() == dst.cropHeight())) {
        return ERROR_UNSUPPORTED;
    }

    CHECK((dst.mWidth & 3) == 0);
    CHECK((src.mCropLeft & 1) == 0);
    CHECK_EQ(src.cropWidth(), dst.cropWidth());
    CHECK_EQ(src.cropHeight(), dst.cropHeight());
    uint8_t *kAdjustedClip = initClip();

    uint32_t *dst_ptr = (uint32_t *)dst.mBits
        + (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
@@ -259,16 +272,20 @@ void ColorConverter::convertYUV420Planar(

        dst_ptr += dst.mWidth / 2;
    }

    return OK;
}

void ColorConverter::convertQCOMYUV420SemiPlanar(
status_t ColorConverter::convertQCOMYUV420SemiPlanar(
        const BitmapParams &src, const BitmapParams &dst) {
    uint8_t *kAdjustedClip = initClip();

    CHECK((dst.mWidth & 3) == 0);
    CHECK((src.mCropLeft & 1) == 0);
    CHECK_EQ(src.cropWidth(), dst.cropWidth());
    CHECK_EQ(src.cropHeight(), dst.cropHeight());
    if (!((dst.mWidth & 3) == 0
            && (src.mCropLeft & 1) == 0
            && src.cropWidth() == dst.cropWidth()
            && src.cropHeight() == dst.cropHeight())) {
        return ERROR_UNSUPPORTED;
    }

    uint32_t *dst_ptr = (uint32_t *)dst.mBits
        + (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
@@ -324,18 +341,22 @@ void ColorConverter::convertQCOMYUV420SemiPlanar(

        dst_ptr += dst.mWidth / 2;
    }

    return OK;
}

void ColorConverter::convertYUV420SemiPlanar(
status_t ColorConverter::convertYUV420SemiPlanar(
        const BitmapParams &src, const BitmapParams &dst) {
    // XXX Untested

    uint8_t *kAdjustedClip = initClip();

    CHECK((dst.mWidth & 3) == 0);
    CHECK((src.mCropLeft & 1) == 0);
    CHECK_EQ(src.cropWidth(), dst.cropWidth());
    CHECK_EQ(src.cropHeight(), dst.cropHeight());
    if (!((dst.mWidth & 3) == 0
            && (src.mCropLeft & 1) == 0
            && src.cropWidth() == dst.cropWidth()
            && src.cropHeight() == dst.cropHeight())) {
        return ERROR_UNSUPPORTED;
    }

    uint32_t *dst_ptr = (uint32_t *)dst.mBits
        + (dst.mCropTop * dst.mWidth + dst.mCropLeft) / 2;
@@ -391,6 +412,8 @@ void ColorConverter::convertYUV420SemiPlanar(

        dst_ptr += dst.mWidth / 2;
    }

    return OK;
}

uint8_t *ColorConverter::initClip() {