Home | History | Annotate | Download | only in resource
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.camera.captureintent.resource;
     18 
     19 import com.android.camera.async.RefCountBase;
     20 import com.android.camera.captureintent.PreviewTransformCalculator;
     21 import com.android.camera.util.AspectRatio;
     22 import com.android.camera.util.Size;
     23 
     24 import android.graphics.SurfaceTexture;
     25 
     26 import javax.annotation.ParametersAreNonnullByDefault;
     27 
     28 /**
     29  * Workaround for TextureView/HAL issues in API1 / API2 Legacy Mode
     30  * (b/19271661) for 16:9 preview streams on Nexus 4.
     31  *
     32  * This workaround for 16:9 consists of:
     33  * 1) For any 16x9 resolution, the largest 4:3 preview size will be chosen for
     34  *    SurfaceTexture default buffer. Noted that though the surface is 4:3, the
     35  *    surface content (the preview) provided by HAL is 16:9.
     36  * 2) Enable auto transform in TextureViewHelper rather than using
     37  *    PreviewTransformCalculator. Since the preview content is still 16:9, we
     38  *    still need to call {@link com.android.camera.TextureViewHelper#updateAspectRatio}
     39  *    with 16:9 aspect ratio to get correct transform matrix.
     40  */
     41 @ParametersAreNonnullByDefault
     42 public final class ResourceSurfaceTextureNexus4Impl extends ResourceSurfaceTextureImpl {
     43     private static final Size LARGEST_4x3_PREVIEW_SIZE_NEXUS4 = new Size(1280, 960);
     44 
     45     /**
     46      * Creates a reference counted {@link ResourceSurfaceTextureNexus4Impl}
     47      * object.
     48      */
     49     public static RefCountBase<ResourceSurfaceTexture> create(
     50             RefCountBase<ResourceConstructed> resourceConstructed,
     51             SurfaceTexture surfaceTexture) {
     52         ResourceSurfaceTexture resourceSurfaceTexture = new ResourceSurfaceTextureNexus4Impl(
     53                 resourceConstructed,
     54                 surfaceTexture,
     55                 new PreviewTransformCalculator(resourceConstructed.get().getOrientationManager()));
     56         return new RefCountBase<>(resourceSurfaceTexture);
     57     }
     58 
     59     private ResourceSurfaceTextureNexus4Impl(
     60             RefCountBase<ResourceConstructed> resourceConstructed,
     61             SurfaceTexture surfaceTexture,
     62             PreviewTransformCalculator previewTransformCalculator) {
     63         super(resourceConstructed, surfaceTexture, previewTransformCalculator);
     64     }
     65 
     66     @Override
     67     public void setPreviewSize(Size previewSize) {
     68         super.setPreviewSize(previewSize);
     69 
     70         final AspectRatio previewAspectRatio = AspectRatio.of(previewSize);
     71         getResourceConstructed().get().getMainThread().execute(new Runnable() {
     72             @Override
     73             public void run() {
     74                 getResourceConstructed().get().getModuleUI()
     75                         .updatePreviewAspectRatio(previewAspectRatio.toFloat());
     76             }
     77         });
     78 
     79         // Override the preview selection logic to the largest N4 4:3
     80         // preview size but pass in 16:9 aspect ratio in
     81         // updatePreviewTransform() later.
     82         if (previewAspectRatio.equals(AspectRatio.of16x9())) {
     83             updateSurfaceTextureDefaultBufferSize(LARGEST_4x3_PREVIEW_SIZE_NEXUS4);
     84         }
     85     }
     86 
     87     @Override
     88     public void updatePreviewTransform() {
     89         // Override and let it be no-op since TextureViewHelper auto transform
     90         // is enabled!
     91     }
     92 }
     93