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

Commit 70da852e authored by Ren-Pei Zeng's avatar Ren-Pei Zeng Committed by Wei-Cheng Hsu
Browse files

Camera: Filter out video sizes lower than encoder supported min size

Fix the supported video sizes of API1 not to include the sizes lower
than the minimum size of encoders defined in media profiles.

Bug: 146030606
Bug: 210948502
Test: CTS MediaPlayerTest#testRecordedVideoPlayback{0,90,180,270},
Verified it on cuttlefish and forrest.
Change-Id: I6e6be6b8ca8668aa139ebc8302c679ebf1eb0d52
(cherry picked from commit da0b4fe7959f3517114f57890d147d7bdc0282d4)
parent 9c08a22f
Loading
Loading
Loading
Loading
+37 −13
Original line number Diff line number Diff line
@@ -75,23 +75,43 @@ status_t Parameters::initialize(CameraDeviceBase *device, int deviceVersion) {
    // Treat the H.264 max size as the max supported video size.
    MediaProfiles *videoEncoderProfiles = MediaProfiles::getInstance();
    Vector<video_encoder> encoders = videoEncoderProfiles->getVideoEncoders();
    int32_t minVideoWidth = MAX_PREVIEW_WIDTH;
    int32_t minVideoHeight = MAX_PREVIEW_HEIGHT;
    int32_t maxVideoWidth = 0;
    int32_t maxVideoHeight = 0;
    for (size_t i = 0; i < encoders.size(); i++) {
        int width = videoEncoderProfiles->getVideoEncoderParamByName(
        int w0 = videoEncoderProfiles->getVideoEncoderParamByName(
                "enc.vid.width.min", encoders[i]);
        int h0 = videoEncoderProfiles->getVideoEncoderParamByName(
                "enc.vid.height.min", encoders[i]);
        int w1 = videoEncoderProfiles->getVideoEncoderParamByName(
                "enc.vid.width.max", encoders[i]);
        int height = videoEncoderProfiles->getVideoEncoderParamByName(
        int h1 = videoEncoderProfiles->getVideoEncoderParamByName(
                "enc.vid.height.max", encoders[i]);
        // Assume the min size is 0 if it's not reported by encoder
        if (w0 == -1) {
            w0 = 0;
        }
        if (h0 == -1) {
            h0 = 0;
        }
        // Treat width/height separately here to handle the case where different
        // profile might report max size of different aspect ratio
        if (width > maxVideoWidth) {
            maxVideoWidth = width;
        // profile might report min/max size of different aspect ratio
        if (w0 < minVideoWidth) {
            minVideoWidth = w0;
        }
        if (h0 < minVideoHeight) {
            minVideoHeight = h0;
        }
        if (w1 > maxVideoWidth) {
            maxVideoWidth = w1;
        }
        if (height > maxVideoHeight) {
            maxVideoHeight = height;
        if (h1 > maxVideoHeight) {
            maxVideoHeight = h1;
        }
    }
    // This is just an upper bound and may not be an actually valid video size
    // These are upper/lower bounds and may not be an actually valid video size
    const Size VIDEO_SIZE_LOWER_BOUND = {minVideoWidth, minVideoHeight};
    Size videoSizeUpperBound = {maxVideoWidth, maxVideoHeight};

    if (fastInfo.supportsPreferredConfigs) {
@@ -99,9 +119,10 @@ status_t Parameters::initialize(CameraDeviceBase *device, int deviceVersion) {
        videoSizeUpperBound = getMaxSize(getPreferredVideoSizes());
    }

    res = getFilteredSizes(maxPreviewSize, &availablePreviewSizes);
    res = getFilteredSizes(Size{0, 0}, maxPreviewSize, &availablePreviewSizes);
    if (res != OK) return res;
    res = getFilteredSizes(videoSizeUpperBound, &availableVideoSizes);
    res = getFilteredSizes(
        VIDEO_SIZE_LOWER_BOUND, videoSizeUpperBound, &availableVideoSizes);
    if (res != OK) return res;

    // Select initial preview and video size that's under the initial bound and
@@ -1055,7 +1076,8 @@ status_t Parameters::buildFastInfo(CameraDeviceBase *device) {
    if (fastInfo.supportsPreferredConfigs) {
        previewSizeBound = getMaxSize(getPreferredPreviewSizes());
    }
    status_t res = getFilteredSizes(previewSizeBound, &supportedPreviewSizes);
    status_t res = getFilteredSizes(
        Size{0, 0}, previewSizeBound, &supportedPreviewSizes);
    if (res != OK) return res;
    for (size_t i=0; i < availableFpsRanges.count; i += 2) {
        if (!isFpsSupported(supportedPreviewSizes,
@@ -2998,7 +3020,8 @@ int Parameters::arrayYToNormalizedWithCrop(int y,
    }
}

status_t Parameters::getFilteredSizes(Size limit, Vector<Size> *sizes) {
status_t Parameters::getFilteredSizes(const Size &lower, const Size &upper,
        Vector<Size> *sizes) {
    if (info == NULL) {
        ALOGE("%s: Static metadata is not initialized", __FUNCTION__);
        return NO_INIT;
@@ -3014,7 +3037,8 @@ status_t Parameters::getFilteredSizes(Size limit, Vector<Size> *sizes) {
        const StreamConfiguration &sc = scs[i];
        if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
                sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
                ((sc.width * sc.height) <= (limit.width * limit.height))) {
                ((sc.width * sc.height) >= (lower.width * lower.height)) &&
                ((sc.width * sc.height) <= (upper.width * upper.height))) {
            int64_t minFrameDuration = getMinFrameDurationNs(
                    {sc.width, sc.height}, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED);
            if (minFrameDuration > MAX_PREVIEW_RECORD_DURATION_NS) {
+3 −2
Original line number Diff line number Diff line
@@ -396,9 +396,10 @@ private:

    Vector<Size> availablePreviewSizes;
    Vector<Size> availableVideoSizes;
    // Get size list (that are no larger than limit) from static metadata.
    // Get size list (that fall within lower/upper bounds) from static metadata.
    // This method filtered size with minFrameDuration < MAX_PREVIEW_RECORD_DURATION_NS
    status_t getFilteredSizes(Size limit, Vector<Size> *sizes);
    status_t getFilteredSizes(const Size &lower, const Size &upper,
            Vector<Size> *sizes);
    // Get max size (from the size array) that matches the given aspect ratio.
    Size getMaxSizeForRatio(float ratio, const int32_t* sizeArray, size_t count);